1 /*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "GLESv2Validation.h"
18
19 #include <sstream>
20
21 #define LIST_VALID_TEX_INTERNALFORMATS(f) \
22 f(GL_BGRA8_EXT) \
23 f(GL_R8) \
24 f(GL_R8_SNORM) \
25 f(GL_R16F) \
26 f(GL_R32F) \
27 f(GL_R8UI) \
28 f(GL_R8I) \
29 f(GL_R16UI) \
30 f(GL_R16I) \
31 f(GL_R32UI) \
32 f(GL_R32I) \
33 f(GL_RG8) \
34 f(GL_RG8_SNORM) \
35 f(GL_RG16F) \
36 f(GL_RG32F) \
37 f(GL_RG8UI) \
38 f(GL_RG8I) \
39 f(GL_RG16UI) \
40 f(GL_RG16I) \
41 f(GL_RG32UI) \
42 f(GL_RG32I) \
43 f(GL_RGB8) \
44 f(GL_SRGB8) \
45 f(GL_RGB565) \
46 f(GL_RGB8_SNORM) \
47 f(GL_R11F_G11F_B10F) \
48 f(GL_RGB9_E5) \
49 f(GL_RGB16F) \
50 f(GL_RGB32F) \
51 f(GL_RGB8UI) \
52 f(GL_RGB8I) \
53 f(GL_RGB16UI) \
54 f(GL_RGB16I) \
55 f(GL_RGB32UI) \
56 f(GL_RGB32I) \
57 f(GL_RGBA8) \
58 f(GL_SRGB8_ALPHA8) \
59 f(GL_RGBA8_SNORM) \
60 f(GL_RGB5_A1) \
61 f(GL_RGBA4) \
62 f(GL_RGB10_A2) \
63 f(GL_RGBA16F) \
64 f(GL_RGBA32F) \
65 f(GL_RGBA8UI) \
66 f(GL_RGBA8I) \
67 f(GL_RGB10_A2UI) \
68 f(GL_RGBA16UI) \
69 f(GL_RGBA16I) \
70 f(GL_RGBA32I) \
71 f(GL_RGBA32UI) \
72 f(GL_DEPTH_COMPONENT16) \
73 f(GL_DEPTH_COMPONENT24) \
74 f(GL_DEPTH_COMPONENT32F) \
75 f(GL_DEPTH24_STENCIL8) \
76 f(GL_DEPTH32F_STENCIL8) \
77 f(GL_ETC1_RGB8_OES) \
78 f(GL_COMPRESSED_R11_EAC) \
79 f(GL_COMPRESSED_SIGNED_R11_EAC) \
80 f(GL_COMPRESSED_RG11_EAC) \
81 f(GL_COMPRESSED_SIGNED_RG11_EAC) \
82 f(GL_COMPRESSED_RGB8_ETC2) \
83 f(GL_COMPRESSED_SRGB8_ETC2) \
84 f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
85 f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2) \
86 f(GL_COMPRESSED_RGBA8_ETC2_EAC) \
87 f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) \
88 f(GL_COMPRESSED_RGBA_ASTC_4x4_KHR) \
89 f(GL_COMPRESSED_RGBA_ASTC_5x4_KHR) \
90 f(GL_COMPRESSED_RGBA_ASTC_5x5_KHR) \
91 f(GL_COMPRESSED_RGBA_ASTC_6x5_KHR) \
92 f(GL_COMPRESSED_RGBA_ASTC_6x6_KHR) \
93 f(GL_COMPRESSED_RGBA_ASTC_8x5_KHR) \
94 f(GL_COMPRESSED_RGBA_ASTC_8x6_KHR) \
95 f(GL_COMPRESSED_RGBA_ASTC_8x8_KHR) \
96 f(GL_COMPRESSED_RGBA_ASTC_10x5_KHR) \
97 f(GL_COMPRESSED_RGBA_ASTC_10x6_KHR) \
98 f(GL_COMPRESSED_RGBA_ASTC_10x8_KHR) \
99 f(GL_COMPRESSED_RGBA_ASTC_10x10_KHR) \
100 f(GL_COMPRESSED_RGBA_ASTC_12x10_KHR) \
101 f(GL_COMPRESSED_RGBA_ASTC_12x12_KHR) \
102 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR) \
103 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR) \
104 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR) \
105 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR) \
106 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR) \
107 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR) \
108 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR) \
109 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR) \
110 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR) \
111 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR) \
112 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR) \
113 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR) \
114 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR) \
115 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR) \
116 f(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT) \
117 f(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT) \
118 f(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT) \
119 f(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT) \
120 f(GL_COMPRESSED_RGB_S3TC_DXT1_EXT) \
121 f(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) \
122 f(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT) \
123 f(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT) \
124 f(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT) \
125 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT) \
126 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT) \
127 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT) \
128 f(GL_COMPRESSED_RED_RGTC1_EXT) \
129 f(GL_COMPRESSED_SIGNED_RED_RGTC1_EXT) \
130 f(GL_COMPRESSED_RED_GREEN_RGTC2_EXT) \
131 f(GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT)
132
133
134 #define LIST_INTEGER_TEX_FORMATS(f) \
135 f(GL_RED_INTEGER) \
136 f(GL_RG_INTEGER) \
137 f(GL_RGB_INTEGER) \
138 f(GL_RGBA_INTEGER) \
139 f(GL_R8UI) \
140 f(GL_R8I) \
141 f(GL_R16UI) \
142 f(GL_R16I) \
143 f(GL_R32UI) \
144 f(GL_R32I) \
145 f(GL_RG8UI) \
146 f(GL_RG8I) \
147 f(GL_RG16UI) \
148 f(GL_RG16I) \
149 f(GL_RG32UI) \
150 f(GL_RG32I) \
151 f(GL_RGB8UI) \
152 f(GL_RGB8I) \
153 f(GL_RGB16UI) \
154 f(GL_RGB16I) \
155 f(GL_RGB32UI) \
156 f(GL_RGB32I) \
157 f(GL_RGBA8UI) \
158 f(GL_RGBA8I) \
159 f(GL_RGB10_A2UI) \
160 f(GL_RGBA16UI) \
161 f(GL_RGBA16I) \
162 f(GL_RGBA32I) \
163 f(GL_RGBA32UI) \
164
165 #define LIST_VALID_TEXFORMAT_COMBINATIONS(f) \
166 f(GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE) \
167 f(GL_R8, GL_RED, GL_UNSIGNED_BYTE) \
168 f(GL_R8_SNORM, GL_RED, GL_BYTE) \
169 f(GL_R16F, GL_RED, GL_FLOAT) \
170 f(GL_R16F, GL_RED, GL_HALF_FLOAT) \
171 f(GL_R32F, GL_RED, GL_FLOAT) \
172 f(GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE) \
173 f(GL_R8I, GL_RED_INTEGER, GL_BYTE) \
174 f(GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT) \
175 f(GL_R16I, GL_RED_INTEGER, GL_SHORT) \
176 f(GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT) \
177 f(GL_R32I, GL_RED_INTEGER, GL_INT) \
178 f(GL_RG8, GL_RG, GL_UNSIGNED_BYTE) \
179 f(GL_RG8_SNORM, GL_RG, GL_BYTE) \
180 f(GL_RG16F, GL_RG, GL_HALF_FLOAT) \
181 f(GL_RG16F, GL_RG, GL_FLOAT) \
182 f(GL_RG32F, GL_RG, GL_FLOAT) \
183 f(GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE) \
184 f(GL_RG8I, GL_RG_INTEGER, GL_BYTE) \
185 f(GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT) \
186 f(GL_RG16I, GL_RG_INTEGER, GL_SHORT) \
187 f(GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT) \
188 f(GL_RG32I, GL_RG_INTEGER, GL_INT) \
189 f(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE) \
190 f(GL_SRGB8, GL_RGB, GL_UNSIGNED_BYTE) \
191 f(GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE) \
192 f(GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5) \
193 f(GL_RGB8_SNORM, GL_RGB, GL_BYTE) \
194 f(GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV) \
195 f(GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT) \
196 f(GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT) \
197 f(GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV) \
198 f(GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT) \
199 f(GL_RGB9_E5, GL_RGB, GL_FLOAT) \
200 f(GL_RGB16F, GL_RGB, GL_HALF_FLOAT) \
201 f(GL_RGB16F, GL_RGB, GL_FLOAT) \
202 f(GL_RGB32F, GL_RGB, GL_FLOAT) \
203 f(GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE) \
204 f(GL_RGB8I, GL_RGB_INTEGER, GL_BYTE) \
205 f(GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT) \
206 f(GL_RGB16I, GL_RGB_INTEGER, GL_SHORT) \
207 f(GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT) \
208 f(GL_RGB32I, GL_RGB_INTEGER, GL_INT) \
209 f(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE) \
210 f(GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE) \
211 f(GL_RGBA8_SNORM, GL_RGBA, GL_BYTE) \
212 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE) \
213 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1) \
214 f(GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
215 f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE) \
216 f(GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4) \
217 f(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV) \
218 f(GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT) \
219 f(GL_RGBA16F, GL_RGBA, GL_FLOAT) \
220 f(GL_RGBA32F, GL_RGBA, GL_FLOAT) \
221 f(GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE) \
222 f(GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE) \
223 f(GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV) \
224 f(GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT) \
225 f(GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT) \
226 f(GL_RGBA32I, GL_RGBA_INTEGER, GL_INT) \
227 f(GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT) \
228 f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT) \
229 f(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
230 f(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT) \
231 f(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT) \
232 f(GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8) \
233 f(GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
234 f(GL_COMPRESSED_R11_EAC, GL_RED, GL_FLOAT) \
235 f(GL_COMPRESSED_SIGNED_R11_EAC, GL_RED, GL_FLOAT) \
236 f(GL_COMPRESSED_RG11_EAC, GL_RG, GL_FLOAT) \
237 f(GL_COMPRESSED_SIGNED_RG11_EAC, GL_RG, GL_FLOAT) \
238 f(GL_COMPRESSED_RGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
239 f(GL_COMPRESSED_SRGB8_ETC2, GL_RGB, GL_UNSIGNED_BYTE) \
240 f(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
241 f(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA, GL_UNSIGNED_BYTE) \
242 f(GL_COMPRESSED_RGBA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
243 f(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_RGBA, GL_UNSIGNED_BYTE) \
244 f(GL_COMPRESSED_RGBA_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
245 f(GL_COMPRESSED_RGBA_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
246 f(GL_COMPRESSED_RGBA_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
247 f(GL_COMPRESSED_RGBA_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
248 f(GL_COMPRESSED_RGBA_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
249 f(GL_COMPRESSED_RGBA_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
250 f(GL_COMPRESSED_RGBA_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
251 f(GL_COMPRESSED_RGBA_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
252 f(GL_COMPRESSED_RGBA_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
253 f(GL_COMPRESSED_RGBA_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
254 f(GL_COMPRESSED_RGBA_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
255 f(GL_COMPRESSED_RGBA_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
256 f(GL_COMPRESSED_RGBA_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
257 f(GL_COMPRESSED_RGBA_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
258 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
259 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
260 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
261 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
262 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
263 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
264 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
265 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
266 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
267 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
268 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
269 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
270 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
271 f(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, GL_RGBA, GL_UNSIGNED_BYTE) \
272 f(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
273 f(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
274 f(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
275 f(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
276 f(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_RGB, GL_UNSIGNED_BYTE) \
277 f(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
278 f(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
279 f(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
280 f(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
281 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
282 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
283 f(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, GL_RGBA, GL_UNSIGNED_BYTE) \
284 f(GL_COMPRESSED_RED_RGTC1_EXT, GL_RED, GL_UNSIGNED_BYTE) \
285 f(GL_COMPRESSED_SIGNED_RED_RGTC1_EXT, GL_RED, GL_BYTE) \
286 f(GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_RG, GL_UNSIGNED_BYTE) \
287 f(GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, GL_RG, GL_BYTE)
288
289
290
291 namespace GLESv2Validation {
292
293 GLbitfield allBufferMapAccessFlags =
294 GL_MAP_READ_BIT | GL_MAP_WRITE_BIT |
295 GL_MAP_INVALIDATE_RANGE_BIT |
296 GL_MAP_INVALIDATE_BUFFER_BIT |
297 GL_MAP_FLUSH_EXPLICIT_BIT |
298 GL_MAP_UNSYNCHRONIZED_BIT;
299
bufferTarget(GL2Encoder * ctx,GLenum target)300 bool bufferTarget(GL2Encoder* ctx, GLenum target) {
301 int glesMajorVersion = ctx->majorVersion();
302 int glesMinorVersion = ctx->minorVersion();
303 switch (target) {
304 case GL_ARRAY_BUFFER: // Vertex attributes
305 case GL_ELEMENT_ARRAY_BUFFER: // Vertex array indices
306 return true;
307 // GLES 3.0 buffers
308 case GL_COPY_READ_BUFFER: // Buffer copy source
309 case GL_COPY_WRITE_BUFFER: // Buffer copy destination
310 case GL_PIXEL_PACK_BUFFER: // Pixel read target
311 case GL_PIXEL_UNPACK_BUFFER: // Texture data source
312 case GL_TRANSFORM_FEEDBACK_BUFFER: // Transform feedback buffer
313 case GL_UNIFORM_BUFFER: // Uniform block storage
314 return glesMajorVersion >= 3;
315 // GLES 3.1 buffers
316 case GL_ATOMIC_COUNTER_BUFFER: // Atomic counter storage
317 case GL_DISPATCH_INDIRECT_BUFFER: // Indirect compute dispatch commands
318 case GL_DRAW_INDIRECT_BUFFER: // Indirect command arguments
319 case GL_SHADER_STORAGE_BUFFER: // Read-write storage for shaders
320 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
321 default:
322 return false;
323 }
324 }
325
bufferParam(GL2Encoder * ctx,GLenum pname)326 bool bufferParam(GL2Encoder* ctx, GLenum pname) {
327 int glesMajorVersion = ctx->majorVersion();
328 switch (pname) {
329 case GL_BUFFER_SIZE:
330 case GL_BUFFER_USAGE:
331 return true;
332 case GL_BUFFER_ACCESS_FLAGS:
333 case GL_BUFFER_MAPPED:
334 case GL_BUFFER_MAP_LENGTH:
335 case GL_BUFFER_MAP_OFFSET:
336 return glesMajorVersion >= 3;
337 default:
338 return false;
339 }
340 }
341
bufferUsage(GL2Encoder * ctx,GLenum usage)342 bool bufferUsage(GL2Encoder* ctx, GLenum usage) {
343 int glesMajorVersion = ctx->majorVersion();
344 switch(usage) {
345 case GL_STREAM_DRAW:
346 case GL_STATIC_DRAW:
347 case GL_DYNAMIC_DRAW:
348 return true;
349 case GL_STREAM_READ:
350 case GL_STATIC_READ:
351 case GL_DYNAMIC_READ:
352 case GL_STREAM_COPY:
353 case GL_STATIC_COPY:
354 case GL_DYNAMIC_COPY:
355 return glesMajorVersion >= 3;
356 }
357 return false;
358
359 }
pixelStoreParam(GL2Encoder * ctx,GLenum param)360 bool pixelStoreParam(GL2Encoder* ctx, GLenum param) {
361 int glesMajorVersion = ctx->majorVersion();
362 switch(param) {
363 case GL_UNPACK_ALIGNMENT:
364 case GL_PACK_ALIGNMENT:
365 return true;
366 case GL_UNPACK_ROW_LENGTH:
367 case GL_UNPACK_IMAGE_HEIGHT:
368 case GL_UNPACK_SKIP_PIXELS:
369 case GL_UNPACK_SKIP_ROWS:
370 case GL_UNPACK_SKIP_IMAGES:
371 case GL_PACK_ROW_LENGTH:
372 case GL_PACK_SKIP_PIXELS:
373 case GL_PACK_SKIP_ROWS:
374 return glesMajorVersion >= 3;
375 default:
376 return false;
377 }
378 }
379
pixelStoreValue(GLenum param,GLint value)380 bool pixelStoreValue(GLenum param, GLint value) {
381 switch(param) {
382 case GL_UNPACK_ALIGNMENT:
383 case GL_PACK_ALIGNMENT:
384 return (value == 1) || (value == 2) || (value == 4) || (value == 8);
385 case GL_UNPACK_ROW_LENGTH:
386 case GL_UNPACK_IMAGE_HEIGHT:
387 case GL_UNPACK_SKIP_PIXELS:
388 case GL_UNPACK_SKIP_ROWS:
389 case GL_UNPACK_SKIP_IMAGES:
390 case GL_PACK_ROW_LENGTH:
391 case GL_PACK_SKIP_PIXELS:
392 case GL_PACK_SKIP_ROWS:
393 return value >= 0;
394 default:
395 return false;
396 }
397 }
398
rboFormat(GL2Encoder * ctx,GLenum internalformat)399 bool rboFormat(GL2Encoder* ctx, GLenum internalformat) {
400 int glesMajorVersion = ctx->majorVersion();
401
402 switch (internalformat) {
403 // Funny internal formats
404 // that will cause an incomplete framebuffer
405 // attachment error pre-gles3. For dEQP,
406 // we can also just abort early here in
407 // RenderbufferStorage with a GL_INVALID_ENUM.
408 case GL_DEPTH_COMPONENT32F:
409 case GL_R8:
410 case GL_R8UI:
411 case GL_R8I:
412 case GL_R16UI:
413 case GL_R16I:
414 case GL_R32UI:
415 case GL_R32I:
416 case GL_RG8:
417 case GL_RG8UI:
418 case GL_RG8I:
419 case GL_RG16UI:
420 case GL_RG16I:
421 case GL_RG32UI:
422 case GL_RG32I:
423 case GL_SRGB8_ALPHA8:
424 case GL_RGBA8UI:
425 case GL_RGBA8I:
426 case GL_RGB10_A2:
427 case GL_RGB10_A2UI:
428 case GL_RGBA16UI:
429 case GL_RGBA16I:
430 case GL_RGBA32I:
431 case GL_RGBA32UI:
432 case GL_RGB32F:
433 return glesMajorVersion >= 3;
434 // These 4 formats are still not OK,
435 // but dEQP expects GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT or
436 // GL_FRAMEBUFFER_UNSUPPORTED if the extension is not present,
437 // not a GL_INVALID_ENUM from earlier on.
438 // So let's forward these to the rest of
439 // FBO initialization
440 // In GLES 3, these are rejected immediately if not
441 // supported.
442 case GL_R16F:
443 case GL_RG16F:
444 case GL_RGBA16F:
445 case GL_R32F:
446 case GL_RG32F:
447 case GL_RGBA32F:
448 case GL_R11F_G11F_B10F:
449 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_float");
450 case GL_RGB16F:
451 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_half_float");
452 // dEQP expects GL_FRAMEBUFFER_UNSUPPORTED or GL_FRAMEBUFFER_COMPLETE
453 // for this format
454 // These formats are OK
455 case GL_DEPTH_COMPONENT16:
456 case GL_DEPTH_COMPONENT24:
457 case GL_DEPTH_COMPONENT32_OES:
458 case GL_RGBA4:
459 case GL_RGB5_A1:
460 case GL_RGB565:
461 case GL_RGB8_OES:
462 case GL_RGBA8_OES:
463 case GL_STENCIL_INDEX8:
464 case GL_DEPTH32F_STENCIL8:
465 case GL_DEPTH24_STENCIL8_OES:
466 return true;
467 break;
468 // Everything else: still not OK,
469 // and they need the GL_INVALID_ENUM
470 }
471 return false;
472 }
473
framebufferTarget(GL2Encoder * ctx,GLenum target)474 bool framebufferTarget(GL2Encoder* ctx, GLenum target) {
475 int glesMajorVersion = ctx->majorVersion();
476 switch (target) {
477 case GL_FRAMEBUFFER:
478 return true;
479 case GL_DRAW_FRAMEBUFFER:
480 case GL_READ_FRAMEBUFFER:
481 return glesMajorVersion >= 3;
482 }
483 return false;
484 }
485
framebufferAttachment(GL2Encoder * ctx,GLenum attachment)486 bool framebufferAttachment(GL2Encoder* ctx, GLenum attachment) {
487 int glesMajorVersion = ctx->majorVersion();
488 switch (attachment) {
489 case GL_COLOR_ATTACHMENT0:
490 case GL_DEPTH_ATTACHMENT:
491 case GL_STENCIL_ATTACHMENT:
492 return true;
493 case GL_COLOR_ATTACHMENT1:
494 case GL_COLOR_ATTACHMENT2:
495 case GL_COLOR_ATTACHMENT3:
496 case GL_COLOR_ATTACHMENT4:
497 case GL_COLOR_ATTACHMENT5:
498 case GL_COLOR_ATTACHMENT6:
499 case GL_COLOR_ATTACHMENT7:
500 case GL_COLOR_ATTACHMENT8:
501 case GL_COLOR_ATTACHMENT9:
502 case GL_COLOR_ATTACHMENT10:
503 case GL_COLOR_ATTACHMENT11:
504 case GL_COLOR_ATTACHMENT12:
505 case GL_COLOR_ATTACHMENT13:
506 case GL_COLOR_ATTACHMENT14:
507 case GL_COLOR_ATTACHMENT15:
508 case GL_DEPTH_STENCIL_ATTACHMENT:
509 return glesMajorVersion >= 3;
510 }
511 return false;
512 }
513
readPixelsFormat(GLenum format)514 bool readPixelsFormat(GLenum format) {
515 switch (format) {
516 case GL_RED:
517 case GL_RED_INTEGER:
518 case GL_RG:
519 case GL_RG_INTEGER:
520 case GL_RGB:
521 case GL_RGB_INTEGER:
522 case GL_RGBA:
523 case GL_RGBA_INTEGER:
524 case GL_LUMINANCE_ALPHA:
525 case GL_LUMINANCE:
526 case GL_ALPHA:
527 return true;
528 }
529 return false;
530 }
531
readPixelsType(GLenum format)532 bool readPixelsType(GLenum format) {
533 switch (format) {
534 case GL_UNSIGNED_BYTE:
535 case GL_BYTE:
536 case GL_HALF_FLOAT:
537 case GL_FLOAT:
538 case GL_INT:
539 case GL_UNSIGNED_SHORT_5_6_5:
540 case GL_UNSIGNED_SHORT_4_4_4_4:
541 case GL_UNSIGNED_SHORT_5_5_5_1:
542 case GL_UNSIGNED_INT:
543 case GL_UNSIGNED_INT_2_10_10_10_REV:
544 case GL_UNSIGNED_INT_10F_11F_11F_REV:
545 case GL_UNSIGNED_INT_5_9_9_9_REV:
546 return true;
547 }
548 return false;
549 }
550
pixelOp(GLenum format,GLenum type)551 bool pixelOp(GLenum format,GLenum type) {
552 switch(type) {
553 case GL_UNSIGNED_SHORT_4_4_4_4:
554 case GL_UNSIGNED_SHORT_5_5_5_1:
555 return format == GL_RGBA;
556 case GL_UNSIGNED_SHORT_5_6_5:
557 return format == GL_RGB;
558 }
559 return true;
560 }
561
vertexAttribType(GL2Encoder * ctx,GLenum type)562 bool vertexAttribType(GL2Encoder* ctx, GLenum type)
563 {
564 int glesMajorVersion = ctx->majorVersion();
565 bool retval = false;
566 switch (type) {
567 case GL_BYTE:
568 case GL_UNSIGNED_BYTE:
569 case GL_SHORT:
570 case GL_UNSIGNED_SHORT:
571 case GL_FIXED:
572 case GL_FLOAT:
573 // The following are technically only available if certain GLES2 extensions are.
574 // However, they are supported by desktop GL3, which is a reasonable requirement
575 // for the desktop GL version. Therefore, consider them valid.
576 case GL_INT:
577 case GL_UNSIGNED_INT:
578 case GL_HALF_FLOAT_OES:
579 retval = true;
580 break;
581 case GL_HALF_FLOAT:
582 case GL_INT_2_10_10_10_REV:
583 case GL_UNSIGNED_INT_2_10_10_10_REV:
584 retval = glesMajorVersion >= 3;
585 break;
586 }
587 return retval;
588 }
589
readPixelsFboFormatMatch(GLenum,GLenum type,GLenum fboTexType)590 bool readPixelsFboFormatMatch(GLenum, GLenum type, GLenum fboTexType) {
591 #define INVALID_TYPE_MATCH(x, y) \
592 if (type == x && fboTexType == y) return false; \
593 if (type == y && fboTexType == x) return false; \
594
595 // These are meant to reject additional format/type mismatches
596 // not caught by underlying system.
597 INVALID_TYPE_MATCH(GL_FLOAT, GL_BYTE)
598 INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
599 INVALID_TYPE_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
600 INVALID_TYPE_MATCH(GL_FLOAT, GL_INT)
601
602 return true;
603 }
604
blitFramebufferFormat(GLenum readFormat,GLenum drawFormat)605 bool blitFramebufferFormat(GLenum readFormat, GLenum drawFormat) {
606 #define INVALID_MATCH(x, y) \
607 if (readFormat == x && drawFormat == y) return false; \
608 if (readFormat == y && drawFormat == x) return false; \
609
610 INVALID_MATCH(GL_FLOAT, GL_BYTE)
611 INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_BYTE)
612 INVALID_MATCH(GL_FLOAT, GL_UNSIGNED_INT)
613 INVALID_MATCH(GL_FLOAT, GL_INT)
614 INVALID_MATCH(GL_INT, GL_UNSIGNED_BYTE);
615 INVALID_MATCH(GL_UNSIGNED_INT, GL_UNSIGNED_BYTE);
616 INVALID_MATCH(GL_INT, GL_BYTE);
617 INVALID_MATCH(GL_UNSIGNED_INT, GL_BYTE);
618 INVALID_MATCH(GL_DEPTH32F_STENCIL8, GL_DEPTH24_STENCIL8);
619
620 return true;
621 }
622
textureTarget(GL2Encoder * ctx,GLenum target)623 bool textureTarget(GL2Encoder* ctx, GLenum target) {
624 int glesMajorVersion = ctx->majorVersion();
625 int glesMinorVersion = ctx->minorVersion();
626 switch (target) {
627 case GL_TEXTURE_EXTERNAL_OES:
628 case GL_TEXTURE_2D:
629 case GL_TEXTURE_CUBE_MAP:
630 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
631 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
632 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
633 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
634 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
635 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
636 return true;
637 case GL_TEXTURE_2D_ARRAY:
638 case GL_TEXTURE_3D:
639 return glesMajorVersion >= 3;
640 case GL_TEXTURE_2D_MULTISAMPLE:
641 return glesMajorVersion >= 3 &&
642 glesMinorVersion >= 1;
643 default:
644 break;
645 }
646 return false;
647 }
648
textureParams(GL2Encoder * ctx,GLenum param)649 bool textureParams(GL2Encoder* ctx, GLenum param) {
650 int glesMajorVersion = ctx->majorVersion();
651 int glesMinorVersion = ctx->minorVersion();
652 switch(param) {
653 case GL_TEXTURE_MIN_FILTER:
654 case GL_TEXTURE_MAG_FILTER:
655 case GL_TEXTURE_WRAP_S:
656 case GL_TEXTURE_WRAP_T:
657 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
658 return true;
659 case GL_TEXTURE_SWIZZLE_R:
660 case GL_TEXTURE_SWIZZLE_G:
661 case GL_TEXTURE_SWIZZLE_B:
662 case GL_TEXTURE_SWIZZLE_A:
663 case GL_TEXTURE_MIN_LOD:
664 case GL_TEXTURE_MAX_LOD:
665 case GL_TEXTURE_BASE_LEVEL:
666 case GL_TEXTURE_MAX_LEVEL:
667 case GL_TEXTURE_COMPARE_MODE:
668 case GL_TEXTURE_COMPARE_FUNC:
669 case GL_TEXTURE_WRAP_R:
670 case GL_TEXTURE_IMMUTABLE_FORMAT:
671 case GL_TEXTURE_IMMUTABLE_LEVELS:
672 return glesMajorVersion >= 3;
673 case GL_DEPTH_STENCIL_TEXTURE_MODE:
674 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
675 default:
676 return false;
677 }
678 }
679
samplerParams(GL2Encoder * ctx,GLenum param)680 bool samplerParams(GL2Encoder* ctx, GLenum param) {
681 (void)ctx;
682 switch(param) {
683 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
684 case GL_TEXTURE_MIN_FILTER:
685 case GL_TEXTURE_MAG_FILTER:
686 case GL_TEXTURE_WRAP_S:
687 case GL_TEXTURE_WRAP_T:
688 case GL_TEXTURE_WRAP_R:
689 case GL_TEXTURE_MIN_LOD:
690 case GL_TEXTURE_MAX_LOD:
691 case GL_TEXTURE_COMPARE_MODE:
692 case GL_TEXTURE_COMPARE_FUNC:
693 return true;
694 default:
695 return false;
696 }
697 }
698
textureParamValue(GL2Encoder * ctx,GLenum pname,GLint intval,GLfloat floatval,GLenum enumval)699 bool textureParamValue(GL2Encoder* ctx, GLenum pname, GLint intval, GLfloat floatval, GLenum enumval) {
700 (void)ctx;
701 (void)floatval;
702 switch (pname) {
703 case GL_TEXTURE_BASE_LEVEL:
704 return intval >= 0;
705 case GL_TEXTURE_COMPARE_MODE:
706 return
707 (enumval == GL_NONE) ||
708 (enumval == GL_COMPARE_REF_TO_TEXTURE);
709 case GL_TEXTURE_COMPARE_FUNC:
710 return
711 (enumval == GL_LEQUAL) ||
712 (enumval == GL_GEQUAL) ||
713 (enumval == GL_LESS) ||
714 (enumval == GL_GREATER) ||
715 (enumval == GL_EQUAL) ||
716 (enumval == GL_NOTEQUAL) ||
717 (enumval == GL_ALWAYS) ||
718 (enumval == GL_NEVER);
719 case GL_TEXTURE_MAG_FILTER:
720 return
721 (enumval == GL_NEAREST) ||
722 (enumval == GL_LINEAR);
723 case GL_TEXTURE_MAX_LEVEL:
724 return intval >= 0;
725 case GL_TEXTURE_MAX_LOD:
726 return true;
727 case GL_TEXTURE_MIN_FILTER:
728 return
729 (enumval == GL_NEAREST) ||
730 (enumval == GL_LINEAR) ||
731 (enumval == GL_NEAREST_MIPMAP_NEAREST) ||
732 (enumval == GL_NEAREST_MIPMAP_LINEAR) ||
733 (enumval == GL_LINEAR_MIPMAP_NEAREST) ||
734 (enumval == GL_LINEAR_MIPMAP_LINEAR);
735 case GL_TEXTURE_MIN_LOD:
736 return true;
737 case GL_TEXTURE_SWIZZLE_R:
738 case GL_TEXTURE_SWIZZLE_G:
739 case GL_TEXTURE_SWIZZLE_B:
740 case GL_TEXTURE_SWIZZLE_A:
741 return
742 (enumval == GL_RED) ||
743 (enumval == GL_GREEN) ||
744 (enumval == GL_BLUE) ||
745 (enumval == GL_ALPHA) ||
746 (enumval == GL_ZERO) ||
747 (enumval == GL_ONE);
748 case GL_TEXTURE_WRAP_S:
749 case GL_TEXTURE_WRAP_T:
750 case GL_TEXTURE_WRAP_R:
751 return
752 (enumval == GL_CLAMP_TO_EDGE) ||
753 (enumval == GL_REPEAT) ||
754 (enumval == GL_MIRRORED_REPEAT);
755 case GL_TEXTURE_MAX_ANISOTROPY_EXT:
756 return true;
757 case GL_TEXTURE_IMMUTABLE_FORMAT:
758 case GL_TEXTURE_IMMUTABLE_LEVELS:
759 case GL_DEPTH_STENCIL_TEXTURE_MODE:
760 return true;
761 default:
762 return true;
763 }
764 }
765
isIntegerFormat(GLenum format)766 bool isIntegerFormat(GLenum format) {
767
768 #define CHECK_EQUAL(x) case x: return true;
769
770 switch (format) {
771 LIST_INTEGER_TEX_FORMATS(CHECK_EQUAL)
772
773 default:
774 return false;
775 }
776 }
777
isCompressedFormat(GLenum internalformat)778 bool isCompressedFormat(GLenum internalformat) {
779 #define COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(internal) \
780 case internal: \
781 return true; \
782
783 switch (internalformat) {
784 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_R11_EAC)
785 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_R11_EAC)
786 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RG11_EAC)
787 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC)
788 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_ETC2)
789 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ETC2)
790 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2)
791 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2)
792 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC)
793 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC)
794 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
795 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
796 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
797 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
798 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
799 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
800 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
801 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
802 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
803 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
804 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
805 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
806 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
807 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
808 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
809 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
810 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
811 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
812 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
813 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
814 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
815 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
816 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
817 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
818 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
819 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
820 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
821 COMPRESSED_TEX_IMAGE_IS_COMPRESSED_FORMAT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
822 default:
823 break;
824 }
825 return false;
826 }
827
supportedCompressedFormat(GL2Encoder * ctx,GLenum internalformat)828 bool supportedCompressedFormat(GL2Encoder* ctx, GLenum internalformat) {
829 int glesMajorVersion = ctx->majorVersion();
830 int glesMinorVersion = ctx->minorVersion();
831
832 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(internal) \
833 case internal: \
834 return glesMajorVersion > 1 && ctx->hasExtension("GL_KHR_texture_compression_astc_ldr"); \
835
836 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(internal) \
837 case internal: \
838 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_bptc"); \
839
840 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(internal) \
841 case internal: \
842 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_s3tc"); \
843
844 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(internal) \
845 case internal: \
846 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_s3tc") && ctx->hasExtension("GL_EXT_texture_sRGB"); \
847
848 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE_RGTC(internal) \
849 case internal: \
850 return glesMajorVersion > 1 && ctx->hasExtension("GL_EXT_texture_compression_rgtc"); \
851
852 #define COMPRESSED_TEX_IMAGE_SUPPORT_CASE(internal, maj, min) \
853 case internal: \
854 if (maj < 3) return true; \
855 if (glesMajorVersion < maj) return false; \
856 if (glesMinorVersion < min) return false; \
857 break; \
858
859 #define COMPRESSED_TEX_IMAGE_NOTSUPPORTED(internal) \
860 case internal: \
861 return false ; \
862
863 switch (internalformat) {
864 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_ETC1_RGB8_OES, 2, 0)
865 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_R11_EAC, 2, 0)
866 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_R11_EAC, 2, 0)
867 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RG11_EAC, 2, 0)
868 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SIGNED_RG11_EAC, 2, 0)
869 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_ETC2, 2, 0)
870 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ETC2, 2, 0)
871 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
872 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 2, 0)
873 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_RGBA8_ETC2_EAC, 2, 0)
874 COMPRESSED_TEX_IMAGE_SUPPORT_CASE(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 2, 0)
875 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_4x4_KHR)
876 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_5x4_KHR)
877 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_5x5_KHR)
878 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_6x5_KHR)
879 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_6x6_KHR)
880 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x5_KHR)
881 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x6_KHR)
882 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_8x8_KHR)
883 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x5_KHR)
884 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x6_KHR)
885 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x8_KHR)
886 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_10x10_KHR)
887 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_12x10_KHR)
888 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_RGBA_ASTC_12x12_KHR)
889 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR)
890 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR)
891 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR)
892 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR)
893 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR)
894 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR)
895 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR)
896 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR)
897 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR)
898 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR)
899 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR)
900 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR)
901 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR)
902 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_ASTC(GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR)
903 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGBA_BPTC_UNORM_EXT)
904 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT)
905 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT)
906 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_BPTC(GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT)
907 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGB_S3TC_DXT1_EXT)
908 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
909 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT)
910 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)
911 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC(GL_COMPRESSED_SRGB_S3TC_DXT1_EXT)
912 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT)
913 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT)
914 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_S3TC_SRGB(GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT)
915 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_RGTC(GL_COMPRESSED_RED_RGTC1_EXT)
916 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_RGTC(GL_COMPRESSED_SIGNED_RED_RGTC1_EXT)
917 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_RGTC(GL_COMPRESSED_RED_GREEN_RGTC2_EXT)
918 COMPRESSED_TEX_IMAGE_SUPPORT_CASE_RGTC(GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT)
919 default:
920 break;
921 }
922 return false;
923 }
924
unsizedFormat(GLenum format)925 bool unsizedFormat(GLenum format) {
926 switch (format) {
927 case GL_RED:
928 case GL_RED_INTEGER:
929 case GL_DEPTH_COMPONENT:
930 case GL_DEPTH_STENCIL:
931 case GL_RG:
932 case GL_RG_INTEGER:
933 case GL_RGB:
934 case GL_RGB_INTEGER:
935 case GL_RGBA:
936 case GL_RGBA_INTEGER:
937 case GL_ALPHA:
938 case GL_LUMINANCE:
939 case GL_LUMINANCE_ALPHA:
940 return true;
941 }
942 return false;
943 }
944
945 // TODO: fix this
filterableTexFormat(GL2Encoder * ctx,GLenum internalformat)946 bool filterableTexFormat(GL2Encoder* ctx, GLenum internalformat) {
947 switch (internalformat) {
948 case GL_R32F:
949 case GL_RG32F:
950 case GL_RGB32F:
951 case GL_RGBA32F:
952 return ctx->hasExtension("GL_OES_texture_float");
953 case GL_R8UI:
954 case GL_R8I:
955 case GL_R16UI:
956 case GL_R16I:
957 case GL_R32UI:
958 case GL_R32I:
959 case GL_RG8UI:
960 case GL_RG8I:
961 case GL_RG16UI:
962 case GL_RG16I:
963 case GL_RG32UI:
964 case GL_RG32I:
965 case GL_RGBA8UI:
966 case GL_RGBA8I:
967 case GL_RGB10_A2UI:
968 case GL_RGBA16UI:
969 case GL_RGBA16I:
970 case GL_RGBA32I:
971 case GL_RGBA32UI:
972 return false;
973 }
974 return true;
975 }
976
977
colorRenderableFormat(GL2Encoder * ctx,GLenum internalformat)978 bool colorRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
979 int glesMajorVersion = ctx->majorVersion();
980 switch (internalformat) {
981 case GL_R8:
982 case GL_RG8:
983 case GL_RGB8:
984 case GL_RGB565:
985 case GL_RGBA4:
986 case GL_RGB5_A1:
987 case GL_RGBA8:
988 case GL_RGB10_A2:
989 case GL_RGB10_A2UI:
990 case GL_SRGB8_ALPHA8:
991 case GL_R8I:
992 case GL_R8UI:
993 case GL_R16I:
994 case GL_R16UI:
995 case GL_R32I:
996 case GL_R32UI:
997 case GL_RG8I:
998 case GL_RG8UI:
999 case GL_RG16I:
1000 case GL_RG16UI:
1001 case GL_RG32I:
1002 case GL_RG32UI:
1003 case GL_RGBA8I:
1004 case GL_RGBA8UI:
1005 case GL_RGBA16I:
1006 case GL_RGBA16UI:
1007 case GL_RGBA32I:
1008 case GL_RGBA32UI:
1009 return true;
1010 case GL_R16F:
1011 case GL_RG16F:
1012 case GL_RGBA16F:
1013 case GL_R32F:
1014 case GL_RG32F:
1015 case GL_RGBA32F:
1016 case GL_R11F_G11F_B10F:
1017 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_float");
1018 break;
1019 case GL_RGB16F:
1020 return glesMajorVersion >= 3 && ctx->hasExtension("GL_EXT_color_buffer_half_float");
1021 break;
1022 }
1023 return false;
1024 }
1025
depthRenderableFormat(GL2Encoder * ctx,GLenum internalformat)1026 bool depthRenderableFormat(GL2Encoder* ctx, GLenum internalformat) {
1027 switch (internalformat) {
1028 case GL_DEPTH_COMPONENT:
1029 case GL_DEPTH_STENCIL:
1030 case GL_DEPTH_COMPONENT16:
1031 case GL_DEPTH_COMPONENT24:
1032 case GL_DEPTH_COMPONENT32F:
1033 case GL_DEPTH24_STENCIL8:
1034 case GL_DEPTH32F_STENCIL8:
1035 return true;
1036 case GL_DEPTH_COMPONENT32_OES:
1037 return ctx->hasExtension("GL_OES_depth32");
1038 }
1039 return false;
1040 }
1041
stencilRenderableFormat(GL2Encoder *,GLenum internalformat)1042 bool stencilRenderableFormat(GL2Encoder*, GLenum internalformat) {
1043 switch (internalformat) {
1044 case GL_DEPTH_STENCIL:
1045 case GL_STENCIL_INDEX8:
1046 case GL_DEPTH24_STENCIL8:
1047 case GL_DEPTH32F_STENCIL8:
1048 return true;
1049 }
1050 return false;
1051 }
1052
isCubeMapTarget(GLenum target)1053 bool isCubeMapTarget(GLenum target) {
1054 switch (target) {
1055 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
1056 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1057 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1058 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1059 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1060 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1061 return true;
1062 default:
1063 break;
1064 }
1065 return false;
1066 }
1067
1068 #define LIST_VALID_TEXFORMATS(f) \
1069 f(GL_DEPTH_COMPONENT) \
1070 f(GL_DEPTH_STENCIL) \
1071 f(GL_RED) \
1072 f(GL_RED_INTEGER) \
1073 f(GL_RG) \
1074 f(GL_RGB) \
1075 f(GL_RGBA) \
1076 f(GL_RGBA_INTEGER) \
1077 f(GL_RGB_INTEGER) \
1078 f(GL_RG_INTEGER) \
1079 f(GL_BGRA_EXT) \
1080 f(GL_ALPHA) \
1081 f(GL_LUMINANCE) \
1082 f(GL_LUMINANCE_ALPHA) \
1083
1084 #define LIST_VALID_TEXTYPES(f) \
1085 f(GL_BYTE) \
1086 f(GL_FLOAT) \
1087 f(GL_FLOAT_32_UNSIGNED_INT_24_8_REV) \
1088 f(GL_HALF_FLOAT) \
1089 f(GL_HALF_FLOAT_OES) \
1090 f(GL_INT) \
1091 f(GL_SHORT) \
1092 f(GL_UNSIGNED_BYTE) \
1093 f(GL_UNSIGNED_INT) \
1094 f(GL_UNSIGNED_INT_10F_11F_11F_REV) \
1095 f(GL_UNSIGNED_INT_2_10_10_10_REV) \
1096 f(GL_UNSIGNED_INT_24_8) \
1097 f(GL_UNSIGNED_INT_5_9_9_9_REV) \
1098 f(GL_UNSIGNED_SHORT) \
1099 f(GL_UNSIGNED_SHORT_4_4_4_4) \
1100 f(GL_UNSIGNED_SHORT_5_5_5_1) \
1101 f(GL_UNSIGNED_SHORT_5_6_5) \
1102
pixelType(GL2Encoder * ctx,GLenum type)1103 bool pixelType(GL2Encoder* ctx, GLenum type) {
1104 int glesMajorVersion = ctx->majorVersion();
1105 if (glesMajorVersion < 3) {
1106 switch (type) {
1107 case GL_UNSIGNED_BYTE:
1108 case GL_UNSIGNED_SHORT:
1109 case GL_UNSIGNED_SHORT_5_6_5:
1110 case GL_UNSIGNED_SHORT_4_4_4_4:
1111 case GL_UNSIGNED_SHORT_5_5_5_1:
1112 case GL_UNSIGNED_INT:
1113 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1114 case GL_UNSIGNED_INT_24_8:
1115 case GL_HALF_FLOAT:
1116 case GL_HALF_FLOAT_OES:
1117 case GL_FLOAT:
1118 return true;
1119 }
1120 return false;
1121 }
1122
1123 #define GLES3_TYPE_CASE(type) \
1124 case type: \
1125
1126 switch (type) {
1127 LIST_VALID_TEXTYPES(GLES3_TYPE_CASE)
1128 return glesMajorVersion >= 3;
1129 default:
1130 break;
1131 }
1132
1133 return false;
1134 }
1135
pixelFormat(GL2Encoder * ctx,GLenum format)1136 bool pixelFormat(GL2Encoder* ctx, GLenum format) {
1137 int glesMajorVersion = ctx->majorVersion();
1138 if (glesMajorVersion < 3) {
1139 switch (format) {
1140 case GL_DEPTH_COMPONENT:
1141 // GLES3 compatible
1142 // Required in dEQP
1143 case GL_RED:
1144 case GL_RG:
1145 case GL_DEPTH_STENCIL_OES:
1146 case GL_ALPHA:
1147 case GL_RGB:
1148 case GL_RGBA:
1149 case GL_BGRA_EXT:
1150 case GL_LUMINANCE:
1151 case GL_LUMINANCE_ALPHA:
1152 return true;
1153 }
1154 return false;
1155 }
1156
1157 #define GLES3_FORMAT_CASE(format) \
1158 case format:
1159
1160 switch (format) {
1161 LIST_VALID_TEXFORMATS(GLES3_FORMAT_CASE)
1162 return glesMajorVersion >= 3;
1163 default:
1164 break;
1165 }
1166 return false;
1167 }
pixelInternalFormat(GLenum internalformat)1168 bool pixelInternalFormat(GLenum internalformat) {
1169 #define VALID_INTERNAL_FORMAT(format) \
1170 case format: \
1171 return true; \
1172
1173 switch (internalformat) {
1174 LIST_VALID_TEX_INTERNALFORMATS(VALID_INTERNAL_FORMAT)
1175 default:
1176 break;
1177 }
1178
1179 ALOGW("error internal format: 0x%x is invalid\n", internalformat);
1180 return false;
1181 }
1182
pixelSizedFormat(GL2Encoder * ctx,GLenum internalformat,GLenum format,GLenum type)1183 bool pixelSizedFormat(GL2Encoder* ctx, GLenum internalformat, GLenum format, GLenum type) {
1184 int glesMajorVersion = ctx->majorVersion();
1185 if (internalformat == format) {
1186 return true;
1187 }
1188
1189 if (glesMajorVersion < 3) {
1190 switch (format) {
1191 case GL_RED:
1192 switch (type) {
1193 case GL_UNSIGNED_BYTE:
1194 return internalformat == GL_R8;
1195 case GL_HALF_FLOAT:
1196 case GL_FLOAT:
1197 return internalformat == GL_R16F;
1198 case GL_BYTE:
1199 return internalformat == GL_R8_SNORM;
1200 default:
1201 return false;
1202 }
1203 break;
1204 case GL_RG:
1205 switch (type) {
1206 case GL_UNSIGNED_BYTE:
1207 return internalformat == GL_RG8;
1208 case GL_HALF_FLOAT:
1209 case GL_FLOAT:
1210 return internalformat == GL_RG16F;
1211 default:
1212 return false;
1213 }
1214 break;
1215 case GL_RGB:
1216 switch (type) {
1217 case GL_HALF_FLOAT:
1218 case GL_FLOAT:
1219 return internalformat == GL_RGB16F
1220 || internalformat == GL_R11F_G11F_B10F;
1221 case GL_UNSIGNED_INT_10F_11F_11F_REV:
1222 return internalformat == GL_R11F_G11F_B10F;
1223 default:
1224 return internalformat == GL_RGB8 ||
1225 internalformat == GL_RGB;
1226 }
1227 break;
1228 case GL_RGBA:
1229 switch (type) {
1230 case GL_HALF_FLOAT:
1231 case GL_FLOAT:
1232 return internalformat == GL_RGBA16F;
1233 default:
1234 return internalformat == GL_RGBA8 ||
1235 internalformat == GL_RGBA;
1236 }
1237 break;
1238 }
1239 }
1240
1241 #define VALIDATE_FORMAT_COMBINATION(x, y, z) \
1242 if (internalformat == x && format == y && type == z) return true; \
1243
1244 LIST_VALID_TEXFORMAT_COMBINATIONS(VALIDATE_FORMAT_COMBINATION)
1245
1246 return false;
1247 }
1248
getCompatibleFormatTypeForInternalFormat(GLenum internalformat,GLenum * format_out,GLenum * type_out)1249 void getCompatibleFormatTypeForInternalFormat(GLenum internalformat, GLenum* format_out, GLenum* type_out) {
1250 #define RETURN_COMPATIBLE_FORMAT(x, y, z) \
1251 if (internalformat == x) { \
1252 *format_out = y; \
1253 *type_out = z; \
1254 return; \
1255 } \
1256
1257 LIST_VALID_TEXFORMAT_COMBINATIONS(RETURN_COMPATIBLE_FORMAT)
1258 }
1259
shaderType(GL2Encoder * ctx,GLenum type)1260 bool shaderType(GL2Encoder* ctx, GLenum type) {
1261 int glesMajorVersion = ctx->majorVersion();
1262 int glesMinorVersion = ctx->minorVersion();
1263 switch (type) {
1264 case GL_VERTEX_SHADER:
1265 case GL_FRAGMENT_SHADER:
1266 return true;
1267 case GL_COMPUTE_SHADER:
1268 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
1269 }
1270 return false;
1271 }
1272
internalFormatTarget(GL2Encoder * ctx,GLenum target)1273 bool internalFormatTarget(GL2Encoder* ctx, GLenum target) {
1274 int glesMajorVersion = ctx->majorVersion();
1275 int glesMinorVersion = ctx->minorVersion();
1276 switch (target) {
1277 case GL_RENDERBUFFER:
1278 return true;
1279 case GL_TEXTURE_2D_MULTISAMPLE:
1280 return glesMajorVersion >= 3 && glesMinorVersion >= 1;
1281 }
1282 return false;
1283 }
1284
vertexAttribIndexRangeErrorMsg(GL2Encoder * ctx,GLuint index)1285 std::string vertexAttribIndexRangeErrorMsg(GL2Encoder* ctx, GLuint index) {
1286 std::stringstream ss;
1287 GLint maxIndex;
1288 ctx->glGetIntegerv(ctx, GL_MAX_VERTEX_ATTRIBS, &maxIndex);
1289 ss << "Invalid vertex attribute index. Wanted index: " << index << ". Max index: " << maxIndex;
1290 return ss.str();
1291 }
1292
allowedFace(GLenum face)1293 bool allowedFace(GLenum face) {
1294 switch (face) {
1295 case GL_FRONT:
1296 case GL_BACK:
1297 case GL_FRONT_AND_BACK:
1298 return true;
1299 default:
1300 return false;
1301 }
1302 }
1303
allowedFunc(GLenum func)1304 bool allowedFunc(GLenum func) {
1305 switch (func) {
1306 case GL_NEVER:
1307 case GL_ALWAYS:
1308 case GL_LESS:
1309 case GL_LEQUAL:
1310 case GL_EQUAL:
1311 case GL_GREATER:
1312 case GL_GEQUAL:
1313 case GL_NOTEQUAL:
1314 return true;
1315 default:
1316 return false;
1317 }
1318 }
1319
allowedStencilOp(GLenum op)1320 bool allowedStencilOp(GLenum op) {
1321 switch (op) {
1322 case GL_KEEP:
1323 case GL_ZERO:
1324 case GL_REPLACE:
1325 case GL_INCR:
1326 case GL_DECR:
1327 case GL_INVERT:
1328 case GL_INCR_WRAP:
1329 case GL_DECR_WRAP:
1330 return true;
1331 default:
1332 return false;
1333 }
1334 }
1335
allowedBlendEquation(GLenum eq)1336 bool allowedBlendEquation(GLenum eq) {
1337 switch (eq) {
1338 case GL_FUNC_ADD:
1339 case GL_FUNC_SUBTRACT:
1340 case GL_FUNC_REVERSE_SUBTRACT:
1341 case GL_MIN:
1342 case GL_MAX:
1343 return true;
1344 default:
1345 return false;
1346 }
1347 }
1348
allowedBlendFunc(GLenum func)1349 bool allowedBlendFunc(GLenum func) {
1350 switch (func) {
1351 case GL_ZERO:
1352 case GL_ONE:
1353 case GL_SRC_COLOR:
1354 case GL_ONE_MINUS_SRC_COLOR:
1355 case GL_DST_COLOR:
1356 case GL_ONE_MINUS_DST_COLOR:
1357 case GL_SRC_ALPHA:
1358 case GL_ONE_MINUS_SRC_ALPHA:
1359 case GL_DST_ALPHA:
1360 case GL_ONE_MINUS_DST_ALPHA:
1361 case GL_CONSTANT_COLOR:
1362 case GL_ONE_MINUS_CONSTANT_COLOR:
1363 case GL_CONSTANT_ALPHA:
1364 case GL_ONE_MINUS_CONSTANT_ALPHA:
1365 case GL_SRC_ALPHA_SATURATE:
1366 return true;
1367 default:
1368 return false;
1369 }
1370 }
1371
allowedCullFace(GLenum mode)1372 bool allowedCullFace(GLenum mode) {
1373 switch (mode) {
1374 case GL_FRONT:
1375 case GL_BACK:
1376 case GL_FRONT_AND_BACK:
1377 return true;
1378 default:
1379 return false;
1380 }
1381 }
1382
allowedFrontFace(GLenum mode)1383 bool allowedFrontFace(GLenum mode) {
1384 switch (mode) {
1385 case GL_CCW:
1386 case GL_CW:
1387 return true;
1388 default:
1389 return false;
1390 }
1391 }
1392
allowedEnable(int majorVersion,int minorVersion,GLenum cap)1393 bool allowedEnable(int majorVersion, int minorVersion, GLenum cap) {
1394 switch (cap) {
1395 case GL_CULL_FACE:
1396 case GL_POLYGON_OFFSET_FILL:
1397 case GL_SAMPLE_ALPHA_TO_COVERAGE:
1398 case GL_SAMPLE_COVERAGE:
1399 case GL_SCISSOR_TEST:
1400 case GL_STENCIL_TEST:
1401 case GL_DEPTH_TEST:
1402 case GL_BLEND:
1403 case GL_DITHER:
1404 return true;
1405 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
1406 case GL_RASTERIZER_DISCARD:
1407 return majorVersion >= 3;
1408 case GL_SAMPLE_MASK:
1409 return majorVersion >= 3 && minorVersion >= 1;
1410 default:
1411 return false;
1412 }
1413 }
1414
allowedGetShader(GLenum pname)1415 bool allowedGetShader(GLenum pname) {
1416 switch (pname) {
1417 case GL_SHADER_TYPE:
1418 case GL_DELETE_STATUS:
1419 case GL_COMPILE_STATUS:
1420 case GL_INFO_LOG_LENGTH:
1421 case GL_SHADER_SOURCE_LENGTH:
1422 return true;
1423 default:
1424 return false;
1425 }
1426 }
1427
allowedShaderType(GLenum shadertype)1428 bool allowedShaderType(GLenum shadertype) {
1429 switch (shadertype) {
1430 case GL_VERTEX_SHADER:
1431 case GL_FRAGMENT_SHADER:
1432 return true;
1433 default:
1434 return false;
1435 }
1436 }
1437
allowedPrecisionType(GLenum precisiontype)1438 bool allowedPrecisionType(GLenum precisiontype) {
1439 switch (precisiontype) {
1440 case GL_LOW_FLOAT:
1441 case GL_MEDIUM_FLOAT:
1442 case GL_HIGH_FLOAT:
1443 case GL_LOW_INT:
1444 case GL_MEDIUM_INT:
1445 case GL_HIGH_INT:
1446 return true;
1447 default:
1448 return false;
1449 }
1450 }
1451
allowedGetProgram(int majorVersion,int minorVersion,GLenum pname)1452 bool allowedGetProgram(int majorVersion, int minorVersion, GLenum pname) {
1453 switch (pname) {
1454 case GL_DELETE_STATUS:
1455 case GL_LINK_STATUS:
1456 case GL_VALIDATE_STATUS:
1457 case GL_INFO_LOG_LENGTH:
1458 case GL_ATTACHED_SHADERS:
1459 case GL_ACTIVE_ATTRIBUTES:
1460 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
1461 case GL_ACTIVE_UNIFORMS:
1462 case GL_ACTIVE_UNIFORM_MAX_LENGTH:
1463 return true;
1464 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE:
1465 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
1466 case GL_PROGRAM_BINARY_LENGTH:
1467 case GL_TRANSFORM_FEEDBACK_VARYINGS:
1468 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH:
1469 case GL_ACTIVE_UNIFORM_BLOCKS:
1470 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
1471 return majorVersion > 2;
1472 case GL_COMPUTE_WORK_GROUP_SIZE:
1473 case GL_PROGRAM_SEPARABLE:
1474 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS:
1475 return majorVersion > 2 && minorVersion > 0;
1476 default:
1477 return false;
1478 }
1479 }
1480
allowedGetActiveUniforms(GLenum pname)1481 bool allowedGetActiveUniforms(GLenum pname) {
1482 switch (pname) {
1483 case GL_UNIFORM_TYPE:
1484 case GL_UNIFORM_SIZE:
1485 case GL_UNIFORM_NAME_LENGTH:
1486 case GL_UNIFORM_BLOCK_INDEX:
1487 case GL_UNIFORM_OFFSET:
1488 case GL_UNIFORM_ARRAY_STRIDE:
1489 case GL_UNIFORM_MATRIX_STRIDE:
1490 case GL_UNIFORM_IS_ROW_MAJOR:
1491 return true;
1492 default:
1493 return false;
1494 }
1495 }
1496
allowedGetActiveUniformBlock(GLenum pname)1497 bool allowedGetActiveUniformBlock(GLenum pname) {
1498 switch (pname) {
1499 case GL_UNIFORM_BLOCK_BINDING:
1500 case GL_UNIFORM_BLOCK_DATA_SIZE:
1501 case GL_UNIFORM_BLOCK_NAME_LENGTH:
1502 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
1503 case GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES:
1504 case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
1505 case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
1506 return true;
1507 default:
1508 return false;
1509 }
1510 }
1511
allowedGetVertexAttrib(GLenum pname)1512 bool allowedGetVertexAttrib(GLenum pname) {
1513 switch (pname) {
1514 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
1515 case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
1516 case GL_VERTEX_ATTRIB_ARRAY_SIZE:
1517 case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
1518 case GL_VERTEX_ATTRIB_ARRAY_TYPE:
1519 case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
1520 case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
1521 case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
1522 case GL_VERTEX_ATTRIB_BINDING:
1523 case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
1524 case GL_CURRENT_VERTEX_ATTRIB:
1525 return true;
1526 default:
1527 return false;
1528 }
1529 }
1530
allowedGetRenderbufferParameter(GLenum pname)1531 bool allowedGetRenderbufferParameter(GLenum pname) {
1532 switch (pname) {
1533 case GL_RENDERBUFFER_WIDTH:
1534 case GL_RENDERBUFFER_HEIGHT:
1535 case GL_RENDERBUFFER_INTERNAL_FORMAT:
1536 case GL_RENDERBUFFER_RED_SIZE:
1537 case GL_RENDERBUFFER_GREEN_SIZE:
1538 case GL_RENDERBUFFER_BLUE_SIZE:
1539 case GL_RENDERBUFFER_ALPHA_SIZE:
1540 case GL_RENDERBUFFER_DEPTH_SIZE:
1541 case GL_RENDERBUFFER_STENCIL_SIZE:
1542 case GL_RENDERBUFFER_SAMPLES:
1543 return true;
1544 default:
1545 return false;
1546 }
1547 }
1548
allowedQueryTarget(GLenum target)1549 bool allowedQueryTarget(GLenum target) {
1550 switch (target) {
1551 case GL_ANY_SAMPLES_PASSED:
1552 case GL_ANY_SAMPLES_PASSED_CONSERVATIVE:
1553 case GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN:
1554 return true;
1555 default:
1556 return false;
1557 }
1558 }
1559
allowedQueryParam(GLenum pname)1560 bool allowedQueryParam(GLenum pname) {
1561 switch (pname) {
1562 case GL_CURRENT_QUERY:
1563 return true;
1564 default:
1565 return false;
1566 }
1567 }
1568
allowedQueryObjectParam(GLenum pname)1569 bool allowedQueryObjectParam(GLenum pname) {
1570 switch (pname) {
1571 case GL_QUERY_RESULT:
1572 case GL_QUERY_RESULT_AVAILABLE:
1573 return true;
1574 default:
1575 return false;
1576 }
1577 }
1578
allowedGetSyncParam(GLenum pname)1579 bool allowedGetSyncParam(GLenum pname) {
1580 switch (pname) {
1581 case GL_OBJECT_TYPE:
1582 case GL_SYNC_STATUS:
1583 case GL_SYNC_CONDITION:
1584 case GL_SYNC_FLAGS:
1585 return true;
1586 default:
1587 return false;
1588 }
1589 }
1590
allowedHintTarget(GLenum target)1591 bool allowedHintTarget(GLenum target) {
1592 switch (target) {
1593 case GL_GENERATE_MIPMAP_HINT:
1594 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
1595 return true;
1596 default:
1597 return false;
1598 }
1599 }
1600
allowedHintMode(GLenum mode)1601 bool allowedHintMode(GLenum mode) {
1602 switch (mode) {
1603 case GL_DONT_CARE:
1604 case GL_NICEST:
1605 case GL_FASTEST:
1606 return true;
1607 default:
1608 return false;
1609 }
1610 }
1611
1612 } // namespace GLESv2Validation
1613