1 //
2 // Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // validationES.h: Validation functions for generic OpenGL ES entry point parameters
8 
9 #ifndef LIBANGLE_VALIDATION_ES_H_
10 #define LIBANGLE_VALIDATION_ES_H_
11 
12 #include "common/mathutil.h"
13 #include "libANGLE/PackedGLEnums.h"
14 
15 #include <GLES2/gl2.h>
16 #include <GLES3/gl3.h>
17 #include <GLES3/gl31.h>
18 
19 namespace egl
20 {
21 class Display;
22 class Image;
23 }
24 
25 namespace gl
26 {
27 class Context;
28 struct Format;
29 struct LinkedUniform;
30 class Program;
31 class Shader;
32 class ValidationContext;
33 
34 bool ValidTextureTarget(const ValidationContext *context, GLenum target);
35 bool ValidTexture2DTarget(const ValidationContext *context, GLenum target);
36 bool ValidTexture3DTarget(const ValidationContext *context, GLenum target);
37 bool ValidTextureExternalTarget(const ValidationContext *context, GLenum target);
38 bool ValidTexture2DDestinationTarget(const ValidationContext *context, GLenum target);
39 bool ValidTexture3DDestinationTarget(const ValidationContext *context, GLenum target);
40 bool ValidTexLevelDestinationTarget(const ValidationContext *context, GLenum target);
41 bool ValidFramebufferTarget(const ValidationContext *context, GLenum target);
42 bool ValidBufferType(const ValidationContext *context, BufferBinding target);
43 bool ValidBufferParameter(const ValidationContext *context, GLenum pname, GLsizei *numParams);
44 bool ValidMipLevel(const ValidationContext *context, GLenum target, GLint level);
45 bool ValidImageSizeParameters(ValidationContext *context,
46                               GLenum target,
47                               GLint level,
48                               GLsizei width,
49                               GLsizei height,
50                               GLsizei depth,
51                               bool isSubImage);
52 bool ValidCompressedImageSize(const ValidationContext *context,
53                               GLenum internalFormat,
54                               GLint level,
55                               GLsizei width,
56                               GLsizei height);
57 bool ValidCompressedSubImageSize(const ValidationContext *context,
58                                  GLenum internalFormat,
59                                  GLint xoffset,
60                                  GLint yoffset,
61                                  GLsizei width,
62                                  GLsizei height,
63                                  size_t textureWidth,
64                                  size_t textureHeight);
65 bool ValidImageDataSize(ValidationContext *context,
66                         GLenum textureTarget,
67                         GLsizei width,
68                         GLsizei height,
69                         GLsizei depth,
70                         GLenum format,
71                         GLenum type,
72                         const void *pixels,
73                         GLsizei imageSize);
74 
75 bool ValidQueryType(const Context *context, GLenum queryType);
76 
77 bool ValidateWebGLVertexAttribPointer(ValidationContext *context,
78                                       GLenum type,
79                                       GLboolean normalized,
80                                       GLsizei stride,
81                                       const void *ptr,
82                                       bool pureInteger);
83 
84 // Returns valid program if id is a valid program name
85 // Errors INVALID_OPERATION if valid shader is given and returns NULL
86 // Errors INVALID_VALUE otherwise and returns NULL
87 Program *GetValidProgram(ValidationContext *context, GLuint id);
88 
89 // Returns valid shader if id is a valid shader name
90 // Errors INVALID_OPERATION if valid program is given and returns NULL
91 // Errors INVALID_VALUE otherwise and returns NULL
92 Shader *GetValidShader(ValidationContext *context, GLuint id);
93 
94 bool ValidateAttachmentTarget(Context *context, GLenum attachment);
95 bool ValidateRenderbufferStorageParametersBase(ValidationContext *context,
96                                                GLenum target,
97                                                GLsizei samples,
98                                                GLenum internalformat,
99                                                GLsizei width,
100                                                GLsizei height);
101 bool ValidateFramebufferRenderbufferParameters(Context *context,
102                                                GLenum target,
103                                                GLenum attachment,
104                                                GLenum renderbuffertarget,
105                                                GLuint renderbuffer);
106 
107 bool ValidateBlitFramebufferParameters(ValidationContext *context,
108                                        GLint srcX0,
109                                        GLint srcY0,
110                                        GLint srcX1,
111                                        GLint srcY1,
112                                        GLint dstX0,
113                                        GLint dstY0,
114                                        GLint dstX1,
115                                        GLint dstY1,
116                                        GLbitfield mask,
117                                        GLenum filter);
118 
119 bool ValidateReadPixelsBase(Context *context,
120                             GLint x,
121                             GLint y,
122                             GLsizei width,
123                             GLsizei height,
124                             GLenum format,
125                             GLenum type,
126                             GLsizei bufSize,
127                             GLsizei *length,
128                             GLsizei *columns,
129                             GLsizei *rows,
130                             void *pixels);
131 bool ValidateReadPixelsRobustANGLE(Context *context,
132                                    GLint x,
133                                    GLint y,
134                                    GLsizei width,
135                                    GLsizei height,
136                                    GLenum format,
137                                    GLenum type,
138                                    GLsizei bufSize,
139                                    GLsizei *length,
140                                    GLsizei *columns,
141                                    GLsizei *rows,
142                                    void *pixels);
143 bool ValidateReadnPixelsEXT(Context *context,
144                             GLint x,
145                             GLint y,
146                             GLsizei width,
147                             GLsizei height,
148                             GLenum format,
149                             GLenum type,
150                             GLsizei bufSize,
151                             void *pixels);
152 bool ValidateReadnPixelsRobustANGLE(Context *context,
153                                     GLint x,
154                                     GLint y,
155                                     GLsizei width,
156                                     GLsizei height,
157                                     GLenum format,
158                                     GLenum type,
159                                     GLsizei bufSize,
160                                     GLsizei *length,
161                                     GLsizei *columns,
162                                     GLsizei *rows,
163                                     void *data);
164 
165 bool ValidateGenQueriesEXT(gl::Context *context, GLsizei n, GLuint *ids);
166 bool ValidateDeleteQueriesEXT(gl::Context *context, GLsizei n, const GLuint *ids);
167 bool ValidateIsQueryEXT(gl::Context *context, GLuint id);
168 bool ValidateBeginQueryBase(Context *context, GLenum target, GLuint id);
169 bool ValidateBeginQueryEXT(Context *context, GLenum target, GLuint id);
170 bool ValidateEndQueryBase(Context *context, GLenum target);
171 bool ValidateEndQueryEXT(Context *context, GLenum target);
172 bool ValidateQueryCounterEXT(Context *context, GLuint id, GLenum target);
173 bool ValidateGetQueryivBase(Context *context, GLenum target, GLenum pname, GLsizei *numParams);
174 bool ValidateGetQueryivEXT(Context *context, GLenum target, GLenum pname, GLint *params);
175 bool ValidateGetQueryivRobustANGLE(Context *context,
176                                    GLenum target,
177                                    GLenum pname,
178                                    GLsizei bufSize,
179                                    GLsizei *length,
180                                    GLint *params);
181 bool ValidateGetQueryObjectValueBase(Context *context,
182                                      GLenum target,
183                                      GLenum pname,
184                                      GLsizei *numParams);
185 bool ValidateGetQueryObjectivEXT(Context *context, GLuint id, GLenum pname, GLint *params);
186 bool ValidateGetQueryObjectivRobustANGLE(Context *context,
187                                          GLuint id,
188                                          GLenum pname,
189                                          GLsizei bufSize,
190                                          GLsizei *length,
191                                          GLint *params);
192 bool ValidateGetQueryObjectuivEXT(Context *context, GLuint id, GLenum pname, GLuint *params);
193 bool ValidateGetQueryObjectuivRobustANGLE(Context *context,
194                                           GLuint id,
195                                           GLenum pname,
196                                           GLsizei bufSize,
197                                           GLsizei *length,
198                                           GLuint *params);
199 bool ValidateGetQueryObjecti64vEXT(Context *context, GLuint id, GLenum pname, GLint64 *params);
200 bool ValidateGetQueryObjecti64vRobustANGLE(Context *context,
201                                            GLuint id,
202                                            GLenum pname,
203                                            GLsizei bufSize,
204                                            GLsizei *length,
205                                            GLint64 *params);
206 bool ValidateGetQueryObjectui64vEXT(Context *context, GLuint id, GLenum pname, GLuint64 *params);
207 bool ValidateGetQueryObjectui64vRobustANGLE(Context *context,
208                                             GLuint id,
209                                             GLenum pname,
210                                             GLsizei bufSize,
211                                             GLsizei *length,
212                                             GLuint64 *params);
213 
214 bool ValidateUniformCommonBase(ValidationContext *context,
215                                gl::Program *program,
216                                GLint location,
217                                GLsizei count,
218                                const LinkedUniform **uniformOut);
219 bool ValidateUniform1ivValue(ValidationContext *context,
220                              GLenum uniformType,
221                              GLsizei count,
222                              const GLint *value);
223 bool ValidateUniformValue(ValidationContext *context, GLenum valueType, GLenum uniformType);
224 bool ValidateUniformMatrixValue(ValidationContext *context, GLenum valueType, GLenum uniformType);
225 bool ValidateUniform(ValidationContext *context, GLenum uniformType, GLint location, GLsizei count);
226 bool ValidateUniformMatrix(ValidationContext *context,
227                            GLenum matrixType,
228                            GLint location,
229                            GLsizei count,
230                            GLboolean transpose);
231 
232 bool ValidateStateQuery(ValidationContext *context,
233                         GLenum pname,
234                         GLenum *nativeType,
235                         unsigned int *numParams);
236 
237 bool ValidateRobustStateQuery(ValidationContext *context,
238                               GLenum pname,
239                               GLsizei bufSize,
240                               GLenum *nativeType,
241                               unsigned int *numParams);
242 
243 bool ValidateCopyTexImageParametersBase(ValidationContext *context,
244                                         GLenum target,
245                                         GLint level,
246                                         GLenum internalformat,
247                                         bool isSubImage,
248                                         GLint xoffset,
249                                         GLint yoffset,
250                                         GLint zoffset,
251                                         GLint x,
252                                         GLint y,
253                                         GLsizei width,
254                                         GLsizei height,
255                                         GLint border,
256                                         Format *textureFormatOut);
257 
258 bool ValidateDrawBase(ValidationContext *context, GLenum mode, GLsizei count);
259 bool ValidateDrawArraysCommon(ValidationContext *context,
260                               GLenum mode,
261                               GLint first,
262                               GLsizei count,
263                               GLsizei primcount);
264 bool ValidateDrawArraysInstancedBase(Context *context,
265                                      GLenum mode,
266                                      GLint first,
267                                      GLsizei count,
268                                      GLsizei primcount);
269 bool ValidateDrawArraysInstancedANGLE(Context *context,
270                                       GLenum mode,
271                                       GLint first,
272                                       GLsizei count,
273                                       GLsizei primcount);
274 
275 bool ValidateDrawElementsBase(ValidationContext *context, GLenum type);
276 bool ValidateDrawElementsCommon(ValidationContext *context,
277                                 GLenum mode,
278                                 GLsizei count,
279                                 GLenum type,
280                                 const void *indices,
281                                 GLsizei primcount);
282 
283 bool ValidateDrawElementsInstancedCommon(ValidationContext *context,
284                                          GLenum mode,
285                                          GLsizei count,
286                                          GLenum type,
287                                          const void *indices,
288                                          GLsizei primcount);
289 bool ValidateDrawElementsInstancedANGLE(Context *context,
290                                         GLenum mode,
291                                         GLsizei count,
292                                         GLenum type,
293                                         const void *indices,
294                                         GLsizei primcount);
295 
296 bool ValidateFramebufferTextureBase(Context *context,
297                                     GLenum target,
298                                     GLenum attachment,
299                                     GLuint texture,
300                                     GLint level);
301 
302 bool ValidateGetUniformBase(Context *context, GLuint program, GLint location);
303 bool ValidateGetnUniformfvEXT(Context *context,
304                               GLuint program,
305                               GLint location,
306                               GLsizei bufSize,
307                               GLfloat *params);
308 bool ValidateGetnUniformivEXT(Context *context,
309                               GLuint program,
310                               GLint location,
311                               GLsizei bufSize,
312                               GLint *params);
313 bool ValidateGetUniformfvRobustANGLE(Context *context,
314                                      GLuint program,
315                                      GLint location,
316                                      GLsizei bufSize,
317                                      GLsizei *length,
318                                      GLfloat *params);
319 bool ValidateGetUniformivRobustANGLE(Context *context,
320                                      GLuint program,
321                                      GLint location,
322                                      GLsizei bufSize,
323                                      GLsizei *length,
324                                      GLint *params);
325 bool ValidateGetUniformuivRobustANGLE(Context *context,
326                                       GLuint program,
327                                       GLint location,
328                                       GLsizei bufSize,
329                                       GLsizei *length,
330                                       GLuint *params);
331 
332 bool ValidateDiscardFramebufferBase(Context *context,
333                                     GLenum target,
334                                     GLsizei numAttachments,
335                                     const GLenum *attachments,
336                                     bool defaultFramebuffer);
337 
338 bool ValidateInsertEventMarkerEXT(Context *context, GLsizei length, const char *marker);
339 bool ValidatePushGroupMarkerEXT(Context *context, GLsizei length, const char *marker);
340 
341 bool ValidateEGLImageTargetTexture2DOES(Context *context,
342                                         GLenum target,
343                                         egl::Image *image);
344 bool ValidateEGLImageTargetRenderbufferStorageOES(Context *context,
345                                                   GLenum target,
346                                                   egl::Image *image);
347 
348 bool ValidateBindVertexArrayBase(Context *context, GLuint array);
349 
350 bool ValidateProgramBinaryBase(Context *context,
351                                GLuint program,
352                                GLenum binaryFormat,
353                                const void *binary,
354                                GLint length);
355 bool ValidateGetProgramBinaryBase(Context *context,
356                                   GLuint program,
357                                   GLsizei bufSize,
358                                   GLsizei *length,
359                                   GLenum *binaryFormat,
360                                   void *binary);
361 
362 bool ValidateDrawBuffersBase(ValidationContext *context, GLsizei n, const GLenum *bufs);
363 
364 bool ValidateGetBufferPointervBase(Context *context,
365                                    BufferBinding target,
366                                    GLenum pname,
367                                    GLsizei *length,
368                                    void **params);
369 bool ValidateUnmapBufferBase(Context *context, BufferBinding target);
370 bool ValidateMapBufferRangeBase(Context *context,
371                                 BufferBinding target,
372                                 GLintptr offset,
373                                 GLsizeiptr length,
374                                 GLbitfield access);
375 bool ValidateFlushMappedBufferRangeBase(Context *context,
376                                         BufferBinding target,
377                                         GLintptr offset,
378                                         GLsizeiptr length);
379 
380 bool ValidateGenOrDelete(Context *context, GLint n);
381 
382 bool ValidateRobustEntryPoint(ValidationContext *context, GLsizei bufSize);
383 bool ValidateRobustBufferSize(ValidationContext *context, GLsizei bufSize, GLsizei numParams);
384 
385 bool ValidateGetFramebufferAttachmentParameterivBase(ValidationContext *context,
386                                                      GLenum target,
387                                                      GLenum attachment,
388                                                      GLenum pname,
389                                                      GLsizei *numParams);
390 bool ValidateGetFramebufferAttachmentParameterivRobustANGLE(ValidationContext *context,
391                                                             GLenum target,
392                                                             GLenum attachment,
393                                                             GLenum pname,
394                                                             GLsizei bufSize,
395                                                             GLsizei *numParams);
396 
397 bool ValidateGetBufferParameterBase(ValidationContext *context,
398                                     BufferBinding target,
399                                     GLenum pname,
400                                     bool pointerVersion,
401                                     GLsizei *numParams);
402 bool ValidateGetBufferParameterivRobustANGLE(ValidationContext *context,
403                                              BufferBinding target,
404                                              GLenum pname,
405                                              GLsizei bufSize,
406                                              GLsizei *length,
407                                              GLint *params);
408 
409 bool ValidateGetBufferParameteri64vRobustANGLE(ValidationContext *context,
410                                                BufferBinding target,
411                                                GLenum pname,
412                                                GLsizei bufSize,
413                                                GLsizei *length,
414                                                GLint64 *params);
415 
416 bool ValidateGetProgramivBase(ValidationContext *context,
417                               GLuint program,
418                               GLenum pname,
419                               GLsizei *numParams);
420 bool ValidateGetProgramivRobustANGLE(Context *context,
421                                      GLuint program,
422                                      GLenum pname,
423                                      GLsizei bufSize,
424                                      GLsizei *numParams);
425 
426 bool ValidateGetRenderbufferParameterivBase(Context *context,
427                                             GLenum target,
428                                             GLenum pname,
429                                             GLsizei *length);
430 bool ValidateGetRenderbufferParameterivRobustANGLE(Context *context,
431                                                    GLenum target,
432                                                    GLenum pname,
433                                                    GLsizei bufSize,
434                                                    GLsizei *length,
435                                                    GLint *params);
436 
437 bool ValidateGetShaderivBase(Context *context, GLuint shader, GLenum pname, GLsizei *length);
438 bool ValidateGetShaderivRobustANGLE(Context *context,
439                                     GLuint shader,
440                                     GLenum pname,
441                                     GLsizei bufSize,
442                                     GLsizei *length,
443                                     GLint *params);
444 
445 bool ValidateGetTexParameterBase(Context *context, GLenum target, GLenum pname, GLsizei *length);
446 bool ValidateGetTexParameterfvRobustANGLE(Context *context,
447                                           GLenum target,
448                                           GLenum pname,
449                                           GLsizei bufSize,
450                                           GLsizei *length,
451                                           GLfloat *params);
452 bool ValidateGetTexParameterivRobustANGLE(Context *context,
453                                           GLenum target,
454                                           GLenum pname,
455                                           GLsizei bufSize,
456                                           GLsizei *length,
457                                           GLint *params);
458 
459 template <typename ParamType>
460 bool ValidateTexParameterBase(Context *context,
461                               GLenum target,
462                               GLenum pname,
463                               GLsizei bufSize,
464                               const ParamType *params);
465 bool ValidateTexParameterfvRobustANGLE(Context *context,
466                                        GLenum target,
467                                        GLenum pname,
468                                        GLsizei bufSize,
469                                        const GLfloat *params);
470 bool ValidateTexParameterivRobustANGLE(Context *context,
471                                        GLenum target,
472                                        GLenum pname,
473                                        GLsizei bufSize,
474                                        const GLint *params);
475 
476 bool ValidateGetSamplerParameterfvRobustANGLE(Context *context,
477                                               GLuint sampler,
478                                               GLenum pname,
479                                               GLuint bufSize,
480                                               GLsizei *length,
481                                               GLfloat *params);
482 bool ValidateGetSamplerParameterivRobustANGLE(Context *context,
483                                               GLuint sampler,
484                                               GLenum pname,
485                                               GLuint bufSize,
486                                               GLsizei *length,
487                                               GLint *params);
488 
489 bool ValidateSamplerParameterfvRobustANGLE(Context *context,
490                                            GLuint sampler,
491                                            GLenum pname,
492                                            GLsizei bufSize,
493                                            const GLfloat *params);
494 bool ValidateSamplerParameterivRobustANGLE(Context *context,
495                                            GLuint sampler,
496                                            GLenum pname,
497                                            GLsizei bufSize,
498                                            const GLint *params);
499 
500 bool ValidateGetVertexAttribBase(Context *context,
501                                  GLuint index,
502                                  GLenum pname,
503                                  GLsizei *length,
504                                  bool pointer,
505                                  bool pureIntegerEntryPoint);
506 bool ValidateGetVertexAttribfvRobustANGLE(Context *context,
507                                           GLuint index,
508                                           GLenum pname,
509                                           GLsizei bufSize,
510                                           GLsizei *length,
511                                           GLfloat *params);
512 
513 bool ValidateGetVertexAttribivRobustANGLE(Context *context,
514                                           GLuint index,
515                                           GLenum pname,
516                                           GLsizei bufSize,
517                                           GLsizei *length,
518                                           GLint *params);
519 
520 bool ValidateGetVertexAttribPointervRobustANGLE(Context *context,
521                                                 GLuint index,
522                                                 GLenum pname,
523                                                 GLsizei bufSize,
524                                                 GLsizei *length,
525                                                 void **pointer);
526 
527 bool ValidateGetVertexAttribIivRobustANGLE(Context *context,
528                                            GLuint index,
529                                            GLenum pname,
530                                            GLsizei bufSize,
531                                            GLsizei *length,
532                                            GLint *params);
533 
534 bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
535                                             GLuint index,
536                                             GLenum pname,
537                                             GLsizei bufSize,
538                                             GLsizei *length,
539                                             GLuint *params);
540 
541 bool ValidateGetActiveUniformBlockivRobustANGLE(Context *context,
542                                                 GLuint program,
543                                                 GLuint uniformBlockIndex,
544                                                 GLenum pname,
545                                                 GLsizei bufSize,
546                                                 GLsizei *length,
547                                                 GLint *params);
548 
549 bool ValidateGetInternalFormativRobustANGLE(Context *context,
550                                             GLenum target,
551                                             GLenum internalformat,
552                                             GLenum pname,
553                                             GLsizei bufSize,
554                                             GLsizei *length,
555                                             GLint *params);
556 
557 bool ValidateVertexFormatBase(ValidationContext *context,
558                               GLuint attribIndex,
559                               GLint size,
560                               GLenum type,
561                               GLboolean pureInteger);
562 
563 bool ValidateWebGLFramebufferAttachmentClearType(ValidationContext *context,
564                                                  GLint drawbuffer,
565                                                  const GLenum *validComponentTypes,
566                                                  size_t validComponentTypeCount);
567 
568 bool ValidateRobustCompressedTexImageBase(ValidationContext *context,
569                                           GLsizei imageSize,
570                                           GLsizei dataSize);
571 
572 bool ValidateVertexAttribIndex(ValidationContext *context, GLuint index);
573 
574 bool ValidateGetActiveUniformBlockivBase(Context *context,
575                                          GLuint program,
576                                          GLuint uniformBlockIndex,
577                                          GLenum pname,
578                                          GLsizei *length);
579 
580 bool ValidateGetSamplerParameterBase(Context *context,
581                                      GLuint sampler,
582                                      GLenum pname,
583                                      GLsizei *length);
584 
585 template <typename ParamType>
586 bool ValidateSamplerParameterBase(Context *context,
587                                   GLuint sampler,
588                                   GLenum pname,
589                                   GLsizei bufSize,
590                                   ParamType *params);
591 
592 bool ValidateGetInternalFormativBase(Context *context,
593                                      GLenum target,
594                                      GLenum internalformat,
595                                      GLenum pname,
596                                      GLsizei bufSize,
597                                      GLsizei *numParams);
598 
599 }  // namespace gl
600 
601 #endif  // LIBANGLE_VALIDATION_ES_H_
602