1e5c31af7Sopenharmony_ci#ifndef _GLUDRAWUTIL_HPP
2e5c31af7Sopenharmony_ci#define _GLUDRAWUTIL_HPP
3e5c31af7Sopenharmony_ci/*-------------------------------------------------------------------------
4e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL Utilities
5e5c31af7Sopenharmony_ci * ---------------------------------------------
6e5c31af7Sopenharmony_ci *
7e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project
8e5c31af7Sopenharmony_ci *
9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License.
11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at
12e5c31af7Sopenharmony_ci *
13e5c31af7Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
14e5c31af7Sopenharmony_ci *
15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and
19e5c31af7Sopenharmony_ci * limitations under the License.
20e5c31af7Sopenharmony_ci *
21e5c31af7Sopenharmony_ci *//*!
22e5c31af7Sopenharmony_ci * \file
23e5c31af7Sopenharmony_ci * \brief Draw call utilities.
24e5c31af7Sopenharmony_ci *
25e5c31af7Sopenharmony_ci * Draw call utilities provide an abstraction for commonly used draw calls.
26e5c31af7Sopenharmony_ci * The objective of that abstraction is to allow moving data to buffers
27e5c31af7Sopenharmony_ci * and state to VAOs automatically if target context doesn't support
28e5c31af7Sopenharmony_ci * user pointers or default VAOs.
29e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/
30e5c31af7Sopenharmony_ci
31e5c31af7Sopenharmony_ci#include "gluDefs.hpp"
32e5c31af7Sopenharmony_ci
33e5c31af7Sopenharmony_ci#include <string>
34e5c31af7Sopenharmony_ci
35e5c31af7Sopenharmony_cinamespace glu
36e5c31af7Sopenharmony_ci{
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ciclass RenderContext;
39e5c31af7Sopenharmony_ci
40e5c31af7Sopenharmony_cienum VertexComponentType
41e5c31af7Sopenharmony_ci{
42e5c31af7Sopenharmony_ci	// Standard types: all conversion types apply.
43e5c31af7Sopenharmony_ci	VTX_COMP_UNSIGNED_INT8		= 0,
44e5c31af7Sopenharmony_ci	VTX_COMP_UNSIGNED_INT16,
45e5c31af7Sopenharmony_ci	VTX_COMP_UNSIGNED_INT32,
46e5c31af7Sopenharmony_ci	VTX_COMP_SIGNED_INT8,
47e5c31af7Sopenharmony_ci	VTX_COMP_SIGNED_INT16,
48e5c31af7Sopenharmony_ci	VTX_COMP_SIGNED_INT32,
49e5c31af7Sopenharmony_ci
50e5c31af7Sopenharmony_ci	// Special types: only CONVERT_NONE is allowed.
51e5c31af7Sopenharmony_ci	VTX_COMP_FIXED,
52e5c31af7Sopenharmony_ci	VTX_COMP_HALF_FLOAT,
53e5c31af7Sopenharmony_ci	VTX_COMP_FLOAT,
54e5c31af7Sopenharmony_ci
55e5c31af7Sopenharmony_ci	VTX_COMP_TYPE_LAST
56e5c31af7Sopenharmony_ci};
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_cienum VertexComponentConversion
59e5c31af7Sopenharmony_ci{
60e5c31af7Sopenharmony_ci	VTX_COMP_CONVERT_NONE = 0,				//!< No conversion: integer types, or floating-point values.
61e5c31af7Sopenharmony_ci	VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT,	//!< Normalize integers to range [0,1] or [-1,1] depending on type.
62e5c31af7Sopenharmony_ci	VTX_COMP_CONVERT_CAST_TO_FLOAT,			//!< Convert to floating-point directly.
63e5c31af7Sopenharmony_ci
64e5c31af7Sopenharmony_ci	VTX_COMP_CONVERT_LAST
65e5c31af7Sopenharmony_ci};
66e5c31af7Sopenharmony_ci
67e5c31af7Sopenharmony_cienum IndexType
68e5c31af7Sopenharmony_ci{
69e5c31af7Sopenharmony_ci	INDEXTYPE_UINT8,
70e5c31af7Sopenharmony_ci	INDEXTYPE_UINT16,
71e5c31af7Sopenharmony_ci	INDEXTYPE_UINT32,
72e5c31af7Sopenharmony_ci
73e5c31af7Sopenharmony_ci	INDEXTYPE_LAST
74e5c31af7Sopenharmony_ci};
75e5c31af7Sopenharmony_ci
76e5c31af7Sopenharmony_cienum PrimitiveType
77e5c31af7Sopenharmony_ci{
78e5c31af7Sopenharmony_ci	PRIMITIVETYPE_TRIANGLES = 0,
79e5c31af7Sopenharmony_ci	PRIMITIVETYPE_TRIANGLE_STRIP,
80e5c31af7Sopenharmony_ci	PRIMITIVETYPE_TRIANGLE_FAN,
81e5c31af7Sopenharmony_ci
82e5c31af7Sopenharmony_ci	PRIMITIVETYPE_LINES,
83e5c31af7Sopenharmony_ci	PRIMITIVETYPE_LINE_STRIP,
84e5c31af7Sopenharmony_ci	PRIMITIVETYPE_LINE_LOOP,
85e5c31af7Sopenharmony_ci
86e5c31af7Sopenharmony_ci	PRIMITIVETYPE_POINTS,
87e5c31af7Sopenharmony_ci
88e5c31af7Sopenharmony_ci	PRIMITIVETYPE_PATCHES,
89e5c31af7Sopenharmony_ci
90e5c31af7Sopenharmony_ci	PRIMITIVETYPE_LAST
91e5c31af7Sopenharmony_ci};
92e5c31af7Sopenharmony_ci
93e5c31af7Sopenharmony_cistruct BindingPoint
94e5c31af7Sopenharmony_ci{
95e5c31af7Sopenharmony_ci	enum Type
96e5c31af7Sopenharmony_ci	{
97e5c31af7Sopenharmony_ci		BPTYPE_LOCATION = 0,			//!< Binding by numeric location.
98e5c31af7Sopenharmony_ci		BPTYPE_NAME,					//!< Binding by input name.
99e5c31af7Sopenharmony_ci
100e5c31af7Sopenharmony_ci		BPTYPE_LAST
101e5c31af7Sopenharmony_ci	};
102e5c31af7Sopenharmony_ci
103e5c31af7Sopenharmony_ci	Type			type;			//!< Binding type (name or location).
104e5c31af7Sopenharmony_ci	std::string		name;			//!< Input name, or empty if is not binding by name.
105e5c31af7Sopenharmony_ci	int				location;		//!< Input location, or offset to named location if binding by name.
106e5c31af7Sopenharmony_ci
107e5c31af7Sopenharmony_ci				BindingPoint (void)											: type(BPTYPE_LAST), location (0) {}
108e5c31af7Sopenharmony_ci	explicit	BindingPoint (int location_)								: type(BPTYPE_LOCATION), location(location_) {}
109e5c31af7Sopenharmony_ci	explicit	BindingPoint (const std::string& name_, int location_ = 0)	: type(BPTYPE_NAME), name(name_), location(location_) {}
110e5c31af7Sopenharmony_ci};
111e5c31af7Sopenharmony_ci
112e5c31af7Sopenharmony_cistruct VertexArrayPointer
113e5c31af7Sopenharmony_ci{
114e5c31af7Sopenharmony_ci	VertexComponentType			componentType;	//!< Component type.
115e5c31af7Sopenharmony_ci	VertexComponentConversion	convert;		//!< Component conversion type.
116e5c31af7Sopenharmony_ci	int							numComponents;	//!< Number of components per element.
117e5c31af7Sopenharmony_ci	int							numElements;	//!< Number of elements in total.
118e5c31af7Sopenharmony_ci	int							stride;			//!< Element stride.
119e5c31af7Sopenharmony_ci
120e5c31af7Sopenharmony_ci	const void*					data;			//!< Data pointer.
121e5c31af7Sopenharmony_ci
122e5c31af7Sopenharmony_ci	VertexArrayPointer (VertexComponentType componentType_, VertexComponentConversion convert_, int numComponents_, int numElements_, int stride_, const void* data_)
123e5c31af7Sopenharmony_ci		: componentType	(componentType_)
124e5c31af7Sopenharmony_ci		, convert		(convert_)
125e5c31af7Sopenharmony_ci		, numComponents	(numComponents_)
126e5c31af7Sopenharmony_ci		, numElements	(numElements_)
127e5c31af7Sopenharmony_ci		, stride		(stride_)
128e5c31af7Sopenharmony_ci		, data			(data_)
129e5c31af7Sopenharmony_ci	{
130e5c31af7Sopenharmony_ci	}
131e5c31af7Sopenharmony_ci
132e5c31af7Sopenharmony_ci	VertexArrayPointer (void)
133e5c31af7Sopenharmony_ci		: componentType	(VTX_COMP_TYPE_LAST)
134e5c31af7Sopenharmony_ci		, convert		(VTX_COMP_CONVERT_LAST)
135e5c31af7Sopenharmony_ci		, numComponents	(0)
136e5c31af7Sopenharmony_ci		, numElements	(0)
137e5c31af7Sopenharmony_ci		, stride		(0)
138e5c31af7Sopenharmony_ci		, data			(0)
139e5c31af7Sopenharmony_ci	{
140e5c31af7Sopenharmony_ci	}
141e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE;
142e5c31af7Sopenharmony_ci
143e5c31af7Sopenharmony_cistruct VertexArrayBinding
144e5c31af7Sopenharmony_ci{
145e5c31af7Sopenharmony_ci	BindingPoint		binding;
146e5c31af7Sopenharmony_ci	VertexArrayPointer	pointer;
147e5c31af7Sopenharmony_ci
148e5c31af7Sopenharmony_ci	VertexArrayBinding (const BindingPoint& binding_, const VertexArrayPointer& pointer_)
149e5c31af7Sopenharmony_ci		: binding	(binding_)
150e5c31af7Sopenharmony_ci		, pointer	(pointer_)
151e5c31af7Sopenharmony_ci	{
152e5c31af7Sopenharmony_ci	}
153e5c31af7Sopenharmony_ci
154e5c31af7Sopenharmony_ci	VertexArrayBinding (void)
155e5c31af7Sopenharmony_ci	{
156e5c31af7Sopenharmony_ci	}
157e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE;
158e5c31af7Sopenharmony_ci
159e5c31af7Sopenharmony_cistruct PrimitiveList
160e5c31af7Sopenharmony_ci{
161e5c31af7Sopenharmony_ci	PrimitiveType		type;			//!< Primitive type.
162e5c31af7Sopenharmony_ci	int					numElements;	//!< Number of elements to be drawn.
163e5c31af7Sopenharmony_ci	IndexType			indexType;		//!< Index type or INDEXTYPE_LAST if not used
164e5c31af7Sopenharmony_ci	const void*			indices;		//!< Index list or DE_NULL if not used.
165e5c31af7Sopenharmony_ci
166e5c31af7Sopenharmony_ci	PrimitiveList (PrimitiveType type_, int numElements_)
167e5c31af7Sopenharmony_ci		: type			(type_)
168e5c31af7Sopenharmony_ci		, numElements	(numElements_)
169e5c31af7Sopenharmony_ci		, indexType		(INDEXTYPE_LAST)
170e5c31af7Sopenharmony_ci		, indices		(0)
171e5c31af7Sopenharmony_ci	{
172e5c31af7Sopenharmony_ci	}
173e5c31af7Sopenharmony_ci
174e5c31af7Sopenharmony_ci	PrimitiveList (PrimitiveType type_, int numElements_, IndexType indexType_, const void* indices_)
175e5c31af7Sopenharmony_ci		: type			(type_)
176e5c31af7Sopenharmony_ci		, numElements	(numElements_)
177e5c31af7Sopenharmony_ci		, indexType		(indexType_)
178e5c31af7Sopenharmony_ci		, indices		(indices_)
179e5c31af7Sopenharmony_ci	{
180e5c31af7Sopenharmony_ci	}
181e5c31af7Sopenharmony_ci
182e5c31af7Sopenharmony_ci	PrimitiveList (void)
183e5c31af7Sopenharmony_ci		: type			(PRIMITIVETYPE_LAST)
184e5c31af7Sopenharmony_ci		, numElements	(0)
185e5c31af7Sopenharmony_ci		, indexType		(INDEXTYPE_LAST)
186e5c31af7Sopenharmony_ci		, indices		(0)
187e5c31af7Sopenharmony_ci	{
188e5c31af7Sopenharmony_ci	}
189e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE;
190e5c31af7Sopenharmony_ci
191e5c31af7Sopenharmony_ciclass DrawUtilCallback
192e5c31af7Sopenharmony_ci{
193e5c31af7Sopenharmony_cipublic:
194e5c31af7Sopenharmony_ci	virtual void	beforeDrawCall	(void) { }
195e5c31af7Sopenharmony_ci	virtual void	afterDrawCall	(void) { }
196e5c31af7Sopenharmony_ci};
197e5c31af7Sopenharmony_ci
198e5c31af7Sopenharmony_civoid	draw					(const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL);
199e5c31af7Sopenharmony_ci
200e5c31af7Sopenharmony_civoid	drawFromUserPointers	(const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL);
201e5c31af7Sopenharmony_civoid	drawFromBuffers			(const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL);
202e5c31af7Sopenharmony_civoid	drawFromVAOBuffers		(const RenderContext& context, deUint32 program, int numVertexArrays, const VertexArrayBinding* vertexArrays, const PrimitiveList& primitives, DrawUtilCallback* callback = DE_NULL);
203e5c31af7Sopenharmony_ci
204e5c31af7Sopenharmony_ci// Shorthands for PrimitiveList
205e5c31af7Sopenharmony_cinamespace pr
206e5c31af7Sopenharmony_ci{
207e5c31af7Sopenharmony_ci
208e5c31af7Sopenharmony_ci#define DECLARE_PR_CTOR(NAME, TYPE)										\
209e5c31af7Sopenharmony_ciinline PrimitiveList NAME (int numElements)								\
210e5c31af7Sopenharmony_ci{																		\
211e5c31af7Sopenharmony_ci	return PrimitiveList(TYPE, numElements);							\
212e5c31af7Sopenharmony_ci}																		\
213e5c31af7Sopenharmony_ciinline PrimitiveList NAME (int numElements, const deUint8* indices)		\
214e5c31af7Sopenharmony_ci{																		\
215e5c31af7Sopenharmony_ci	return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT8, indices);	\
216e5c31af7Sopenharmony_ci}																		\
217e5c31af7Sopenharmony_ciinline PrimitiveList NAME (int numElements, const deUint16* indices)	\
218e5c31af7Sopenharmony_ci{																		\
219e5c31af7Sopenharmony_ci	return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT16, indices);	\
220e5c31af7Sopenharmony_ci}																		\
221e5c31af7Sopenharmony_ciinline PrimitiveList NAME (int numElements, const deUint32* indices)	\
222e5c31af7Sopenharmony_ci{																		\
223e5c31af7Sopenharmony_ci	return PrimitiveList(TYPE, numElements, INDEXTYPE_UINT32, indices);	\
224e5c31af7Sopenharmony_ci}																		\
225e5c31af7Sopenharmony_cistruct DeclarePRCtor##NAME##Unused_s { int unused; }
226e5c31af7Sopenharmony_ci
227e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(Triangles,		PRIMITIVETYPE_TRIANGLES);
228e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(TriangleStrip,	PRIMITIVETYPE_TRIANGLE_STRIP);
229e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(TriangleFan,	PRIMITIVETYPE_TRIANGLE_FAN);
230e5c31af7Sopenharmony_ci
231e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(Lines,			PRIMITIVETYPE_LINES);
232e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(LineStrip,		PRIMITIVETYPE_LINE_STRIP);
233e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(LineLineLoop,	PRIMITIVETYPE_LINE_LOOP);
234e5c31af7Sopenharmony_ci
235e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(Points,			PRIMITIVETYPE_POINTS);
236e5c31af7Sopenharmony_ci
237e5c31af7Sopenharmony_ciDECLARE_PR_CTOR(Patches,		PRIMITIVETYPE_PATCHES);
238e5c31af7Sopenharmony_ci
239e5c31af7Sopenharmony_ci} // pr
240e5c31af7Sopenharmony_ci
241e5c31af7Sopenharmony_ci// Shorthands for VertexArrayBinding
242e5c31af7Sopenharmony_cinamespace va
243e5c31af7Sopenharmony_ci{
244e5c31af7Sopenharmony_ci
245e5c31af7Sopenharmony_ci#define DECLARE_VA_CTOR(NAME, DATATYPE, TYPE, CONVERT)																						\
246e5c31af7Sopenharmony_ciinline VertexArrayBinding NAME (const std::string& name, int offset, int numComponents, int numElements, int stride, const DATATYPE* data)	\
247e5c31af7Sopenharmony_ci{																																			\
248e5c31af7Sopenharmony_ci	return VertexArrayBinding(BindingPoint(name, offset), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data));		\
249e5c31af7Sopenharmony_ci}																																			\
250e5c31af7Sopenharmony_ciinline VertexArrayBinding NAME (const std::string& name, int numComponents, int numElements, int stride, const DATATYPE* data)				\
251e5c31af7Sopenharmony_ci{																																			\
252e5c31af7Sopenharmony_ci	return NAME(name, 0, numComponents, numElements, stride, data);																			\
253e5c31af7Sopenharmony_ci}																																			\
254e5c31af7Sopenharmony_ciinline VertexArrayBinding NAME (int location, int numComponents, int numElements, int stride, const DATATYPE* data)							\
255e5c31af7Sopenharmony_ci{																																			\
256e5c31af7Sopenharmony_ci	return VertexArrayBinding(BindingPoint(location), VertexArrayPointer(TYPE, CONVERT, numComponents, numElements, stride, data));			\
257e5c31af7Sopenharmony_ci}																																			\
258e5c31af7Sopenharmony_cistruct DeclareVACtor##NAME##Unused_s { int unused; }
259e5c31af7Sopenharmony_ci
260e5c31af7Sopenharmony_ci// Integer types
261e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint8,			deUint8,		VTX_COMP_UNSIGNED_INT8,		VTX_COMP_CONVERT_NONE);
262e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint16,			deUint16,		VTX_COMP_UNSIGNED_INT16,	VTX_COMP_CONVERT_NONE);
263e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint32,			deUint32,		VTX_COMP_UNSIGNED_INT32,	VTX_COMP_CONVERT_NONE);
264e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int8,			deInt8,			VTX_COMP_SIGNED_INT8,		VTX_COMP_CONVERT_NONE);
265e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int16,			deInt16,		VTX_COMP_SIGNED_INT16,		VTX_COMP_CONVERT_NONE);
266e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int32,			deInt32,		VTX_COMP_SIGNED_INT32,		VTX_COMP_CONVERT_NONE);
267e5c31af7Sopenharmony_ci
268e5c31af7Sopenharmony_ci// Normalized integers.
269e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Unorm8,			deUint8,		VTX_COMP_UNSIGNED_INT8,		VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
270e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Unorm16,		deUint16,		VTX_COMP_UNSIGNED_INT16,	VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
271e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Unorm32,		deUint32,		VTX_COMP_UNSIGNED_INT32,	VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
272e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Snorm8,			deInt8,			VTX_COMP_SIGNED_INT8,		VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
273e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Snorm16,		deInt16,		VTX_COMP_SIGNED_INT16,		VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
274e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Snorm32,		deInt32,		VTX_COMP_SIGNED_INT32,		VTX_COMP_CONVERT_NORMALIZE_TO_FLOAT);
275e5c31af7Sopenharmony_ci
276e5c31af7Sopenharmony_ci// Integers converted to float.
277e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint8Float,		deUint8,		VTX_COMP_UNSIGNED_INT8,		VTX_COMP_CONVERT_CAST_TO_FLOAT);
278e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint16Float,	deUint16,		VTX_COMP_UNSIGNED_INT16,	VTX_COMP_CONVERT_CAST_TO_FLOAT);
279e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Uint32Float,	deUint32,		VTX_COMP_UNSIGNED_INT32,	VTX_COMP_CONVERT_CAST_TO_FLOAT);
280e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int8Float,		deInt8,			VTX_COMP_SIGNED_INT8,		VTX_COMP_CONVERT_CAST_TO_FLOAT);
281e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int16Float,		deInt16,		VTX_COMP_SIGNED_INT16,		VTX_COMP_CONVERT_CAST_TO_FLOAT);
282e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Int32Float,		deInt32,		VTX_COMP_SIGNED_INT32,		VTX_COMP_CONVERT_CAST_TO_FLOAT);
283e5c31af7Sopenharmony_ci
284e5c31af7Sopenharmony_ci// Special types.
285e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Fixed,			void,			VTX_COMP_FIXED,				VTX_COMP_CONVERT_NONE);
286e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Half,			void,			VTX_COMP_HALF_FLOAT,		VTX_COMP_CONVERT_NONE);
287e5c31af7Sopenharmony_ciDECLARE_VA_CTOR(Float,			float,			VTX_COMP_FLOAT,				VTX_COMP_CONVERT_NONE);
288e5c31af7Sopenharmony_ci
289e5c31af7Sopenharmony_ci#undef DECLARE_VA_CTOR
290e5c31af7Sopenharmony_ci
291e5c31af7Sopenharmony_ci} // va
292e5c31af7Sopenharmony_ci
293e5c31af7Sopenharmony_ci} // glu
294e5c31af7Sopenharmony_ci
295e5c31af7Sopenharmony_ci#endif // _GLUDRAWUTIL_HPP
296