1 /*-------------------------------------------------------------------------
2  * drawElements Quality Program OpenGL ES Utilities
3  * ------------------------------------------------
4  *
5  * Copyright 2014 The Android Open Source Project
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  *//*!
20  * \file
21  * \brief Reference context utils
22  *//*--------------------------------------------------------------------*/
23 
24 #include "sglrReferenceUtils.hpp"
25 #include "glwEnums.hpp"
26 
27 namespace sglr
28 {
29 namespace rr_util
30 {
31 
mapGLPureIntegerVertexAttributeType(deUint32 type)32 rr::VertexAttribType mapGLPureIntegerVertexAttributeType (deUint32 type)
33 {
34 	switch (type)
35 	{
36 		case GL_UNSIGNED_BYTE:					return rr::VERTEXATTRIBTYPE_PURE_UINT8;
37 		case GL_UNSIGNED_SHORT:					return rr::VERTEXATTRIBTYPE_PURE_UINT16;
38 		case GL_UNSIGNED_INT:					return rr::VERTEXATTRIBTYPE_PURE_UINT32;
39 		case GL_BYTE:							return rr::VERTEXATTRIBTYPE_PURE_INT8;
40 		case GL_SHORT:							return rr::VERTEXATTRIBTYPE_PURE_INT16;
41 		case GL_INT:							return rr::VERTEXATTRIBTYPE_PURE_INT32;
42 		default:
43 			DE_ASSERT(false);
44 			return rr::VERTEXATTRIBTYPE_LAST;
45 	}
46 }
47 
mapGLFloatVertexAttributeType(deUint32 type,bool normalizedInteger,int size,glu::ContextType ctxType)48 rr::VertexAttribType mapGLFloatVertexAttributeType (deUint32 type, bool normalizedInteger, int size, glu::ContextType ctxType)
49 {
50 	const bool useClampingNormalization	= (ctxType.getProfile() == glu::PROFILE_ES && ctxType.getMajorVersion() >= 3) ||
51 										  (ctxType.getMajorVersion() == 4 && ctxType.getMinorVersion() >= 2);
52 	const bool bgraComponentOrder		= (size == GL_BGRA);
53 
54 	switch (type)
55 	{
56 		case GL_FLOAT:
57 			return rr::VERTEXATTRIBTYPE_FLOAT;
58 
59 		case GL_HALF_FLOAT:
60 			return rr::VERTEXATTRIBTYPE_HALF;
61 
62 		case GL_FIXED:
63 			return rr::VERTEXATTRIBTYPE_FIXED;
64 
65 		case GL_DOUBLE:
66 			return rr::VERTEXATTRIBTYPE_DOUBLE;
67 
68 		case GL_UNSIGNED_BYTE:
69 			if (!normalizedInteger)
70 				return rr::VERTEXATTRIBTYPE_NONPURE_UINT8;
71 			else
72 				return (!bgraComponentOrder) ? (rr::VERTEXATTRIBTYPE_NONPURE_UNORM8) : (rr::VERTEXATTRIBTYPE_NONPURE_UNORM8_BGRA);
73 
74 		case GL_UNSIGNED_SHORT:
75 			if (!normalizedInteger)
76 				return rr::VERTEXATTRIBTYPE_NONPURE_UINT16;
77 			else
78 				return rr::VERTEXATTRIBTYPE_NONPURE_UNORM16;
79 
80 		case GL_UNSIGNED_INT:
81 			if (!normalizedInteger)
82 				return rr::VERTEXATTRIBTYPE_NONPURE_UINT32;
83 			else
84 				return rr::VERTEXATTRIBTYPE_NONPURE_UNORM32;
85 
86 		case GL_UNSIGNED_INT_2_10_10_10_REV:
87 			if (!normalizedInteger)
88 				return rr::VERTEXATTRIBTYPE_NONPURE_UINT_2_10_10_10_REV;
89 			else
90 				return (!bgraComponentOrder) ? (rr::VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV) : (rr::VERTEXATTRIBTYPE_NONPURE_UNORM_2_10_10_10_REV_BGRA);
91 
92 		case GL_BYTE:
93 			if (!normalizedInteger)
94 				return rr::VERTEXATTRIBTYPE_NONPURE_INT8;
95 			else if (useClampingNormalization)
96 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM8_CLAMP;
97 			else
98 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM8_SCALE;
99 
100 		case GL_SHORT:
101 			if (!normalizedInteger)
102 				return rr::VERTEXATTRIBTYPE_NONPURE_INT16;
103 			else if (useClampingNormalization)
104 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM16_CLAMP;
105 			else
106 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM16_SCALE;
107 
108 		case GL_INT:
109 			if (!normalizedInteger)
110 				return rr::VERTEXATTRIBTYPE_NONPURE_INT32;
111 			else if (useClampingNormalization)
112 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM32_CLAMP;
113 			else
114 				return rr::VERTEXATTRIBTYPE_NONPURE_SNORM32_SCALE;
115 
116 		case GL_INT_2_10_10_10_REV:
117 			if (!normalizedInteger)
118 				return rr::VERTEXATTRIBTYPE_NONPURE_INT_2_10_10_10_REV;
119 			else if (useClampingNormalization)
120 				return (!bgraComponentOrder) ? (rr::VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP) : (rr::VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_CLAMP_BGRA);
121 			else
122 				return (!bgraComponentOrder) ? (rr::VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE) : (rr::VERTEXATTRIBTYPE_NONPURE_SNORM_2_10_10_10_REV_SCALE_BGRA);
123 
124 		default:
125 			DE_ASSERT(false);
126 			return rr::VERTEXATTRIBTYPE_LAST;
127 	}
128 }
129 
mapGLSize(int size)130 int mapGLSize (int size)
131 {
132 	switch (size)
133 	{
134 		case 1:			return 1;
135 		case 2:			return 2;
136 		case 3:			return 3;
137 		case 4:			return 4;
138 		case GL_BGRA:	return 4;
139 
140 		default:
141 			DE_ASSERT(false);
142 			return 0;
143 	}
144 }
145 
mapGLPrimitiveType(deUint32 type)146 rr::PrimitiveType mapGLPrimitiveType (deUint32 type)
147 {
148 	switch (type)
149 	{
150 		case GL_TRIANGLES:					return rr::PRIMITIVETYPE_TRIANGLES;
151 		case GL_TRIANGLE_STRIP:				return rr::PRIMITIVETYPE_TRIANGLE_STRIP;
152 		case GL_TRIANGLE_FAN:				return rr::PRIMITIVETYPE_TRIANGLE_FAN;
153 		case GL_LINES:						return rr::PRIMITIVETYPE_LINES;
154 		case GL_LINE_STRIP:					return rr::PRIMITIVETYPE_LINE_STRIP;
155 		case GL_LINE_LOOP:					return rr::PRIMITIVETYPE_LINE_LOOP;
156 		case GL_POINTS:						return rr::PRIMITIVETYPE_POINTS;
157 		case GL_LINES_ADJACENCY:			return rr::PRIMITIVETYPE_LINES_ADJACENCY;
158 		case GL_LINE_STRIP_ADJACENCY:		return rr::PRIMITIVETYPE_LINE_STRIP_ADJACENCY;
159 		case GL_TRIANGLES_ADJACENCY:		return rr::PRIMITIVETYPE_TRIANGLES_ADJACENCY;
160 		case GL_TRIANGLE_STRIP_ADJACENCY:	return rr::PRIMITIVETYPE_TRIANGLE_STRIP_ADJACENCY;
161 		default:
162 			DE_ASSERT(false);
163 			return rr::PRIMITIVETYPE_LAST;
164 	}
165 }
166 
mapGLIndexType(deUint32 type)167 rr::IndexType mapGLIndexType (deUint32 type)
168 {
169 	switch (type)
170 	{
171 		case GL_UNSIGNED_BYTE:	return rr::INDEXTYPE_UINT8;
172 		case GL_UNSIGNED_SHORT:	return rr::INDEXTYPE_UINT16;
173 		case GL_UNSIGNED_INT:	return rr::INDEXTYPE_UINT32;
174 		default:
175 			DE_ASSERT(false);
176 			return rr::INDEXTYPE_LAST;
177 	}
178 }
179 
180 
mapGLGeometryShaderOutputType(deUint32 primitive)181 rr::GeometryShaderOutputType mapGLGeometryShaderOutputType (deUint32 primitive)
182 {
183 	switch (primitive)
184 	{
185 		case GL_POINTS:				return rr::GEOMETRYSHADEROUTPUTTYPE_POINTS;
186 		case GL_LINE_STRIP:			return rr::GEOMETRYSHADEROUTPUTTYPE_LINE_STRIP;
187 		case GL_TRIANGLE_STRIP:		return rr::GEOMETRYSHADEROUTPUTTYPE_TRIANGLE_STRIP;
188 		default:
189 			DE_ASSERT(DE_FALSE);
190 			return rr::GEOMETRYSHADEROUTPUTTYPE_LAST;
191 	}
192 }
193 
mapGLGeometryShaderInputType(deUint32 primitive)194 rr::GeometryShaderInputType mapGLGeometryShaderInputType (deUint32 primitive)
195 {
196 	switch (primitive)
197 	{
198 		case GL_POINTS:						return rr::GEOMETRYSHADERINPUTTYPE_POINTS;
199 		case GL_LINES:						return rr::GEOMETRYSHADERINPUTTYPE_LINES;
200 		case GL_LINE_STRIP:					return rr::GEOMETRYSHADERINPUTTYPE_LINES;
201 		case GL_LINE_LOOP:					return rr::GEOMETRYSHADERINPUTTYPE_LINES;
202 		case GL_TRIANGLES:					return rr::GEOMETRYSHADERINPUTTYPE_TRIANGLES;
203 		case GL_TRIANGLE_STRIP:				return rr::GEOMETRYSHADERINPUTTYPE_TRIANGLES;
204 		case GL_TRIANGLE_FAN:				return rr::GEOMETRYSHADERINPUTTYPE_TRIANGLES;
205 		case GL_LINES_ADJACENCY:			return rr::GEOMETRYSHADERINPUTTYPE_LINES_ADJACENCY;
206 		case GL_LINE_STRIP_ADJACENCY:		return rr::GEOMETRYSHADERINPUTTYPE_LINES_ADJACENCY;
207 		case GL_TRIANGLES_ADJACENCY:		return rr::GEOMETRYSHADERINPUTTYPE_TRIANGLES_ADJACENCY;
208 		case GL_TRIANGLE_STRIP_ADJACENCY:	return rr::GEOMETRYSHADERINPUTTYPE_TRIANGLES_ADJACENCY;
209 		default:
210 			DE_ASSERT(DE_FALSE);
211 			return rr::GEOMETRYSHADERINPUTTYPE_LAST;
212 	}
213 }
214 
mapGLTestFunc(deUint32 func)215 rr::TestFunc mapGLTestFunc (deUint32 func)
216 {
217 	switch (func)
218 	{
219 		case GL_ALWAYS:		return rr::TESTFUNC_ALWAYS;
220 		case GL_EQUAL:		return rr::TESTFUNC_EQUAL;
221 		case GL_GEQUAL:		return rr::TESTFUNC_GEQUAL;
222 		case GL_GREATER:	return rr::TESTFUNC_GREATER;
223 		case GL_LEQUAL:		return rr::TESTFUNC_LEQUAL;
224 		case GL_LESS:		return rr::TESTFUNC_LESS;
225 		case GL_NEVER:		return rr::TESTFUNC_NEVER;
226 		case GL_NOTEQUAL:	return rr::TESTFUNC_NOTEQUAL;
227 		default:
228 			DE_ASSERT(false);
229 			return rr::TESTFUNC_LAST;
230 	}
231 }
232 
mapGLStencilOp(deUint32 op)233 rr::StencilOp mapGLStencilOp (deUint32 op)
234 {
235 	switch (op)
236 	{
237 		case GL_KEEP:		return rr::STENCILOP_KEEP;
238 		case GL_ZERO:		return rr::STENCILOP_ZERO;
239 		case GL_REPLACE:	return rr::STENCILOP_REPLACE;
240 		case GL_INCR:		return rr::STENCILOP_INCR;
241 		case GL_DECR:		return rr::STENCILOP_DECR;
242 		case GL_INCR_WRAP:	return rr::STENCILOP_INCR_WRAP;
243 		case GL_DECR_WRAP:	return rr::STENCILOP_DECR_WRAP;
244 		case GL_INVERT:		return rr::STENCILOP_INVERT;
245 		default:
246 			DE_ASSERT(false);
247 			return rr::STENCILOP_LAST;
248 	}
249 }
250 
mapGLBlendEquation(deUint32 equation)251 rr::BlendEquation mapGLBlendEquation (deUint32 equation)
252 {
253 	switch (equation)
254 	{
255 		case GL_FUNC_ADD:				return rr::BLENDEQUATION_ADD;
256 		case GL_FUNC_SUBTRACT:			return rr::BLENDEQUATION_SUBTRACT;
257 		case GL_FUNC_REVERSE_SUBTRACT:	return rr::BLENDEQUATION_REVERSE_SUBTRACT;
258 		case GL_MIN:					return rr::BLENDEQUATION_MIN;
259 		case GL_MAX:					return rr::BLENDEQUATION_MAX;
260 		default:
261 			DE_ASSERT(false);
262 			return rr::BLENDEQUATION_LAST;
263 	}
264 }
265 
mapGLBlendEquationAdvanced(deUint32 equation)266 rr::BlendEquationAdvanced mapGLBlendEquationAdvanced (deUint32 equation)
267 {
268 	switch (equation)
269 	{
270 		case GL_MULTIPLY_KHR:		return rr::BLENDEQUATION_ADVANCED_MULTIPLY;
271 		case GL_SCREEN_KHR:			return rr::BLENDEQUATION_ADVANCED_SCREEN;
272 		case GL_OVERLAY_KHR:		return rr::BLENDEQUATION_ADVANCED_OVERLAY;
273 		case GL_DARKEN_KHR:			return rr::BLENDEQUATION_ADVANCED_DARKEN;
274 		case GL_LIGHTEN_KHR:		return rr::BLENDEQUATION_ADVANCED_LIGHTEN;
275 		case GL_COLORDODGE_KHR:		return rr::BLENDEQUATION_ADVANCED_COLORDODGE;
276 		case GL_COLORBURN_KHR:		return rr::BLENDEQUATION_ADVANCED_COLORBURN;
277 		case GL_HARDLIGHT_KHR:		return rr::BLENDEQUATION_ADVANCED_HARDLIGHT;
278 		case GL_SOFTLIGHT_KHR:		return rr::BLENDEQUATION_ADVANCED_SOFTLIGHT;
279 		case GL_DIFFERENCE_KHR:		return rr::BLENDEQUATION_ADVANCED_DIFFERENCE;
280 		case GL_EXCLUSION_KHR:		return rr::BLENDEQUATION_ADVANCED_EXCLUSION;
281 		case GL_HSL_HUE_KHR:		return rr::BLENDEQUATION_ADVANCED_HSL_HUE;
282 		case GL_HSL_SATURATION_KHR:	return rr::BLENDEQUATION_ADVANCED_HSL_SATURATION;
283 		case GL_HSL_COLOR_KHR:		return rr::BLENDEQUATION_ADVANCED_HSL_COLOR;
284 		case GL_HSL_LUMINOSITY_KHR:	return rr::BLENDEQUATION_ADVANCED_HSL_LUMINOSITY;
285 		default:
286 			DE_ASSERT(false);
287 			return rr::BLENDEQUATION_ADVANCED_LAST;
288 	}
289 }
290 
mapGLBlendFunc(deUint32 func)291 rr::BlendFunc mapGLBlendFunc (deUint32 func)
292 {
293 	switch (func)
294 	{
295 		case GL_ZERO:						return rr::BLENDFUNC_ZERO;
296 		case GL_ONE:						return rr::BLENDFUNC_ONE;
297 		case GL_SRC_COLOR:					return rr::BLENDFUNC_SRC_COLOR;
298 		case GL_ONE_MINUS_SRC_COLOR:		return rr::BLENDFUNC_ONE_MINUS_SRC_COLOR;
299 		case GL_DST_COLOR:					return rr::BLENDFUNC_DST_COLOR;
300 		case GL_ONE_MINUS_DST_COLOR:		return rr::BLENDFUNC_ONE_MINUS_DST_COLOR;
301 		case GL_SRC_ALPHA:					return rr::BLENDFUNC_SRC_ALPHA;
302 		case GL_ONE_MINUS_SRC_ALPHA:		return rr::BLENDFUNC_ONE_MINUS_SRC_ALPHA;
303 		case GL_DST_ALPHA:					return rr::BLENDFUNC_DST_ALPHA;
304 		case GL_ONE_MINUS_DST_ALPHA:		return rr::BLENDFUNC_ONE_MINUS_DST_ALPHA;
305 		case GL_CONSTANT_COLOR:				return rr::BLENDFUNC_CONSTANT_COLOR;
306 		case GL_ONE_MINUS_CONSTANT_COLOR:	return rr::BLENDFUNC_ONE_MINUS_CONSTANT_COLOR;
307 		case GL_CONSTANT_ALPHA:				return rr::BLENDFUNC_CONSTANT_ALPHA;
308 		case GL_ONE_MINUS_CONSTANT_ALPHA:	return rr::BLENDFUNC_ONE_MINUS_CONSTANT_ALPHA;
309 		case GL_SRC_ALPHA_SATURATE:			return rr::BLENDFUNC_SRC_ALPHA_SATURATE;
310 		case GL_SRC1_COLOR:					return rr::BLENDFUNC_SRC1_COLOR;
311 		case GL_ONE_MINUS_SRC1_COLOR:		return rr::BLENDFUNC_ONE_MINUS_SRC1_COLOR;
312 		case GL_SRC1_ALPHA:					return rr::BLENDFUNC_SRC1_ALPHA;
313 		case GL_ONE_MINUS_SRC1_ALPHA:		return rr::BLENDFUNC_ONE_MINUS_SRC1_ALPHA;
314 		default:
315 			DE_ASSERT(false);
316 			return rr::BLENDFUNC_LAST;
317 	}
318 }
319 
320 } // rr_util
321 } // sglr
322