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