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