1 //
2 // Copyright (c) 2014 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 // Data.cpp: Container class for all GL relevant state, caps and objects
8 
9 #include "libANGLE/ContextState.h"
10 
11 #include "libANGLE/Framebuffer.h"
12 #include "libANGLE/ResourceManager.h"
13 
14 namespace gl
15 {
16 
17 namespace
18 {
19 
20 template <typename T>
21 using ContextStateMember = T *(ContextState::*);
22 
23 template <typename T>
AllocateOrGetSharedResourceManager(const ContextState * shareContextState,ContextStateMember<T> member)24 T *AllocateOrGetSharedResourceManager(const ContextState *shareContextState,
25                                       ContextStateMember<T> member)
26 {
27     if (shareContextState)
28     {
29         T *resourceManager = (*shareContextState).*member;
30         resourceManager->addRef();
31         return resourceManager;
32     }
33     else
34     {
35         return new T();
36     }
37 }
38 
AllocateOrGetSharedTextureManager(const ContextState * shareContextState,TextureManager * shareTextures,ContextStateMember<TextureManager> member)39 TextureManager *AllocateOrGetSharedTextureManager(const ContextState *shareContextState,
40                                                   TextureManager *shareTextures,
41                                                   ContextStateMember<TextureManager> member)
42 {
43     if (shareContextState)
44     {
45         TextureManager *textureManager = (*shareContextState).*member;
46         ASSERT(shareTextures == nullptr || textureManager == shareTextures);
47         textureManager->addRef();
48         return textureManager;
49     }
50     else if (shareTextures)
51     {
52         TextureManager *textureManager = shareTextures;
53         textureManager->addRef();
54         return textureManager;
55     }
56     else
57     {
58         return new TextureManager();
59     }
60 }
61 
62 }  // anonymous namespace
63 
ContextState(ContextID contextIn,const ContextState * shareContextState,TextureManager * shareTextures,const Version & clientVersion,State * stateIn,const Caps & capsIn,const TextureCapsMap & textureCapsIn,const Extensions & extensionsIn,const Limitations & limitationsIn)64 ContextState::ContextState(ContextID contextIn,
65                            const ContextState *shareContextState,
66                            TextureManager *shareTextures,
67                            const Version &clientVersion,
68                            State *stateIn,
69                            const Caps &capsIn,
70                            const TextureCapsMap &textureCapsIn,
71                            const Extensions &extensionsIn,
72                            const Limitations &limitationsIn)
73     : mClientVersion(clientVersion),
74       mContext(contextIn),
75       mState(stateIn),
76       mCaps(capsIn),
77       mTextureCaps(textureCapsIn),
78       mExtensions(extensionsIn),
79       mLimitations(limitationsIn),
80       mBuffers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mBuffers)),
81       mShaderPrograms(
82           AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mShaderPrograms)),
83       mTextures(AllocateOrGetSharedTextureManager(shareContextState,
84                                                   shareTextures,
85                                                   &ContextState::mTextures)),
86       mRenderbuffers(
87           AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mRenderbuffers)),
88       mSamplers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSamplers)),
89       mSyncs(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSyncs)),
90       mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)),
91       mFramebuffers(new FramebufferManager()),
92       mPipelines(new ProgramPipelineManager())
93 {
94 }
95 
~ContextState()96 ContextState::~ContextState()
97 {
98     // Handles are released by the Context.
99 }
100 
isWebGL() const101 bool ContextState::isWebGL() const
102 {
103     return mExtensions.webglCompatibility;
104 }
105 
isWebGL1() const106 bool ContextState::isWebGL1() const
107 {
108     return (isWebGL() && mClientVersion.major == 2);
109 }
110 
getTextureCap(GLenum internalFormat) const111 const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
112 {
113     return mTextureCaps.get(internalFormat);
114 }
115 
ValidationContext(const ValidationContext * shareContext,TextureManager * shareTextures,const Version & clientVersion,State * state,const Caps & caps,const TextureCapsMap & textureCaps,const Extensions & extensions,const Limitations & limitations,bool skipValidation)116 ValidationContext::ValidationContext(const ValidationContext *shareContext,
117                                      TextureManager *shareTextures,
118                                      const Version &clientVersion,
119                                      State *state,
120                                      const Caps &caps,
121                                      const TextureCapsMap &textureCaps,
122                                      const Extensions &extensions,
123                                      const Limitations &limitations,
124                                      bool skipValidation)
125     : mState(reinterpret_cast<ContextID>(this),
126              shareContext ? &shareContext->mState : nullptr,
127              shareTextures,
128              clientVersion,
129              state,
130              caps,
131              textureCaps,
132              extensions,
133              limitations),
134       mSkipValidation(skipValidation),
135       mDisplayTextureShareGroup(shareTextures != nullptr)
136 {
137 }
138 
~ValidationContext()139 ValidationContext::~ValidationContext()
140 {
141 }
142 
getQueryParameterInfo(GLenum pname,GLenum * type,unsigned int * numParams)143 bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
144 {
145     // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
146     // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
147     // to the fact that it is stored internally as a float, and so would require conversion
148     // if returned from Context::getIntegerv. Since this conversion is already implemented
149     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
150     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
151     // application.
152     switch (pname)
153     {
154         case GL_COMPRESSED_TEXTURE_FORMATS:
155         {
156             *type      = GL_INT;
157             *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
158             return true;
159         }
160         case GL_SHADER_BINARY_FORMATS:
161         {
162             *type      = GL_INT;
163             *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
164             return true;
165         }
166 
167         case GL_MAX_VERTEX_ATTRIBS:
168         case GL_MAX_VERTEX_UNIFORM_VECTORS:
169         case GL_MAX_VARYING_VECTORS:
170         case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
171         case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
172         case GL_MAX_TEXTURE_IMAGE_UNITS:
173         case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
174         case GL_MAX_RENDERBUFFER_SIZE:
175         case GL_NUM_SHADER_BINARY_FORMATS:
176         case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
177         case GL_ARRAY_BUFFER_BINDING:
178         case GL_FRAMEBUFFER_BINDING:
179         case GL_RENDERBUFFER_BINDING:
180         case GL_CURRENT_PROGRAM:
181         case GL_PACK_ALIGNMENT:
182         case GL_UNPACK_ALIGNMENT:
183         case GL_GENERATE_MIPMAP_HINT:
184         case GL_RED_BITS:
185         case GL_GREEN_BITS:
186         case GL_BLUE_BITS:
187         case GL_ALPHA_BITS:
188         case GL_DEPTH_BITS:
189         case GL_STENCIL_BITS:
190         case GL_ELEMENT_ARRAY_BUFFER_BINDING:
191         case GL_CULL_FACE_MODE:
192         case GL_FRONT_FACE:
193         case GL_ACTIVE_TEXTURE:
194         case GL_STENCIL_FUNC:
195         case GL_STENCIL_VALUE_MASK:
196         case GL_STENCIL_REF:
197         case GL_STENCIL_FAIL:
198         case GL_STENCIL_PASS_DEPTH_FAIL:
199         case GL_STENCIL_PASS_DEPTH_PASS:
200         case GL_STENCIL_BACK_FUNC:
201         case GL_STENCIL_BACK_VALUE_MASK:
202         case GL_STENCIL_BACK_REF:
203         case GL_STENCIL_BACK_FAIL:
204         case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
205         case GL_STENCIL_BACK_PASS_DEPTH_PASS:
206         case GL_DEPTH_FUNC:
207         case GL_BLEND_SRC_RGB:
208         case GL_BLEND_SRC_ALPHA:
209         case GL_BLEND_DST_RGB:
210         case GL_BLEND_DST_ALPHA:
211         case GL_BLEND_EQUATION_RGB:
212         case GL_BLEND_EQUATION_ALPHA:
213         case GL_STENCIL_WRITEMASK:
214         case GL_STENCIL_BACK_WRITEMASK:
215         case GL_STENCIL_CLEAR_VALUE:
216         case GL_SUBPIXEL_BITS:
217         case GL_MAX_TEXTURE_SIZE:
218         case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
219         case GL_SAMPLE_BUFFERS:
220         case GL_SAMPLES:
221         case GL_IMPLEMENTATION_COLOR_READ_TYPE:
222         case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
223         case GL_TEXTURE_BINDING_2D:
224         case GL_TEXTURE_BINDING_CUBE_MAP:
225         case GL_RESET_NOTIFICATION_STRATEGY_EXT:
226         {
227             *type      = GL_INT;
228             *numParams = 1;
229             return true;
230         }
231         case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
232         {
233             if (!getExtensions().packReverseRowOrder)
234             {
235                 return false;
236             }
237             *type      = GL_INT;
238             *numParams = 1;
239             return true;
240         }
241         case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
242         case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
243         {
244             if (!getExtensions().textureRectangle)
245             {
246                 return false;
247             }
248             *type      = GL_INT;
249             *numParams = 1;
250             return true;
251         }
252         case GL_MAX_DRAW_BUFFERS_EXT:
253         case GL_MAX_COLOR_ATTACHMENTS_EXT:
254         {
255             if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
256             {
257                 return false;
258             }
259             *type      = GL_INT;
260             *numParams = 1;
261             return true;
262         }
263         case GL_MAX_VIEWPORT_DIMS:
264         {
265             *type      = GL_INT;
266             *numParams = 2;
267             return true;
268         }
269         case GL_VIEWPORT:
270         case GL_SCISSOR_BOX:
271         {
272             *type      = GL_INT;
273             *numParams = 4;
274             return true;
275         }
276         case GL_SHADER_COMPILER:
277         case GL_SAMPLE_COVERAGE_INVERT:
278         case GL_DEPTH_WRITEMASK:
279         case GL_CULL_FACE:                 // CULL_FACE through DITHER are natural to IsEnabled,
280         case GL_POLYGON_OFFSET_FILL:       // but can be retrieved through the Get{Type}v queries.
281         case GL_SAMPLE_ALPHA_TO_COVERAGE:  // For this purpose, they are treated here as
282                                            // bool-natural
283         case GL_SAMPLE_COVERAGE:
284         case GL_SCISSOR_TEST:
285         case GL_STENCIL_TEST:
286         case GL_DEPTH_TEST:
287         case GL_BLEND:
288         case GL_DITHER:
289         case GL_CONTEXT_ROBUST_ACCESS_EXT:
290         {
291             *type      = GL_BOOL;
292             *numParams = 1;
293             return true;
294         }
295         case GL_COLOR_WRITEMASK:
296         {
297             *type      = GL_BOOL;
298             *numParams = 4;
299             return true;
300         }
301         case GL_POLYGON_OFFSET_FACTOR:
302         case GL_POLYGON_OFFSET_UNITS:
303         case GL_SAMPLE_COVERAGE_VALUE:
304         case GL_DEPTH_CLEAR_VALUE:
305         case GL_LINE_WIDTH:
306         {
307             *type      = GL_FLOAT;
308             *numParams = 1;
309             return true;
310         }
311         case GL_ALIASED_LINE_WIDTH_RANGE:
312         case GL_ALIASED_POINT_SIZE_RANGE:
313         case GL_DEPTH_RANGE:
314         {
315             *type      = GL_FLOAT;
316             *numParams = 2;
317             return true;
318         }
319         case GL_COLOR_CLEAR_VALUE:
320         case GL_BLEND_COLOR:
321         {
322             *type      = GL_FLOAT;
323             *numParams = 4;
324             return true;
325         }
326         case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
327             if (!getExtensions().textureFilterAnisotropic)
328             {
329                 return false;
330             }
331             *type      = GL_FLOAT;
332             *numParams = 1;
333             return true;
334         case GL_TIMESTAMP_EXT:
335             if (!getExtensions().disjointTimerQuery)
336             {
337                 return false;
338             }
339             *type      = GL_INT_64_ANGLEX;
340             *numParams = 1;
341             return true;
342         case GL_GPU_DISJOINT_EXT:
343             if (!getExtensions().disjointTimerQuery)
344             {
345                 return false;
346             }
347             *type      = GL_INT;
348             *numParams = 1;
349             return true;
350         case GL_COVERAGE_MODULATION_CHROMIUM:
351             if (!getExtensions().framebufferMixedSamples)
352             {
353                 return false;
354             }
355             *type      = GL_INT;
356             *numParams = 1;
357             return true;
358         case GL_TEXTURE_BINDING_EXTERNAL_OES:
359             if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
360             {
361                 return false;
362             }
363             *type      = GL_INT;
364             *numParams = 1;
365             return true;
366     }
367 
368     if (getExtensions().debug)
369     {
370         switch (pname)
371         {
372             case GL_DEBUG_LOGGED_MESSAGES:
373             case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
374             case GL_DEBUG_GROUP_STACK_DEPTH:
375             case GL_MAX_DEBUG_MESSAGE_LENGTH:
376             case GL_MAX_DEBUG_LOGGED_MESSAGES:
377             case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
378             case GL_MAX_LABEL_LENGTH:
379                 *type      = GL_INT;
380                 *numParams = 1;
381                 return true;
382 
383             case GL_DEBUG_OUTPUT_SYNCHRONOUS:
384             case GL_DEBUG_OUTPUT:
385                 *type      = GL_BOOL;
386                 *numParams = 1;
387                 return true;
388         }
389     }
390 
391     if (getExtensions().multisampleCompatibility)
392     {
393         switch (pname)
394         {
395             case GL_MULTISAMPLE_EXT:
396             case GL_SAMPLE_ALPHA_TO_ONE_EXT:
397                 *type      = GL_BOOL;
398                 *numParams = 1;
399                 return true;
400         }
401     }
402 
403     if (getExtensions().pathRendering)
404     {
405         switch (pname)
406         {
407             case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
408             case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
409                 *type = GL_FLOAT;
410                 *numParams = 16;
411                 return true;
412         }
413     }
414 
415     if (getExtensions().bindGeneratesResource)
416     {
417         switch (pname)
418         {
419             case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
420                 *type      = GL_BOOL;
421                 *numParams = 1;
422                 return true;
423         }
424     }
425 
426     if (getExtensions().clientArrays)
427     {
428         switch (pname)
429         {
430             case GL_CLIENT_ARRAYS_ANGLE:
431                 *type      = GL_BOOL;
432                 *numParams = 1;
433                 return true;
434         }
435     }
436 
437     if (getExtensions().sRGBWriteControl)
438     {
439         switch (pname)
440         {
441             case GL_FRAMEBUFFER_SRGB_EXT:
442                 *type      = GL_BOOL;
443                 *numParams = 1;
444                 return true;
445         }
446     }
447 
448     if (getExtensions().robustResourceInitialization &&
449         pname == GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
450     {
451         *type      = GL_BOOL;
452         *numParams = 1;
453         return true;
454     }
455 
456     if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
457     {
458         *type      = GL_BOOL;
459         *numParams = 1;
460         return true;
461     }
462 
463     // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
464     switch (pname)
465     {
466         // case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE  // equivalent to FRAMEBUFFER_BINDING
467         case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
468             if ((getClientMajorVersion() < 3) && !getExtensions().framebufferBlit)
469             {
470                 return false;
471             }
472             *type      = GL_INT;
473             *numParams = 1;
474             return true;
475 
476         case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
477             if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
478             {
479                 return false;
480             }
481             *type      = GL_INT;
482             *numParams = 1;
483             return true;
484 
485         case GL_PROGRAM_BINARY_FORMATS_OES:
486             if ((getClientMajorVersion() < 3) && !getExtensions().getProgramBinary)
487             {
488                 return false;
489             }
490             *type      = GL_INT;
491             *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
492             return true;
493 
494         case GL_PACK_ROW_LENGTH:
495         case GL_PACK_SKIP_ROWS:
496         case GL_PACK_SKIP_PIXELS:
497             if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
498             {
499                 return false;
500             }
501             *type      = GL_INT;
502             *numParams = 1;
503             return true;
504         case GL_UNPACK_ROW_LENGTH:
505         case GL_UNPACK_SKIP_ROWS:
506         case GL_UNPACK_SKIP_PIXELS:
507             if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
508             {
509                 return false;
510             }
511             *type      = GL_INT;
512             *numParams = 1;
513             return true;
514         case GL_VERTEX_ARRAY_BINDING:
515             if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
516             {
517                 return false;
518             }
519             *type      = GL_INT;
520             *numParams = 1;
521             return true;
522         case GL_PIXEL_PACK_BUFFER_BINDING:
523         case GL_PIXEL_UNPACK_BUFFER_BINDING:
524             if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
525             {
526                 return false;
527             }
528             *type      = GL_INT;
529             *numParams = 1;
530             return true;
531         case GL_MAX_SAMPLES:
532         {
533             static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
534                           "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
535             if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
536             {
537                 return false;
538             }
539             *type      = GL_INT;
540             *numParams = 1;
541             return true;
542 
543             case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
544                 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
545                 {
546                     return false;
547                 }
548                 *type      = GL_INT;
549                 *numParams = 1;
550                 return true;
551         }
552     }
553 
554     if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
555     {
556         if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
557         {
558             return false;
559         }
560         *type      = GL_INT;
561         *numParams = 1;
562         return true;
563     }
564 
565     if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
566     {
567         *type      = GL_INT;
568         *numParams = 1;
569         return true;
570     }
571 
572     if (getClientVersion() < Version(3, 0))
573     {
574         return false;
575     }
576 
577     // Check for ES3.0+ parameter names
578     switch (pname)
579     {
580         case GL_MAX_UNIFORM_BUFFER_BINDINGS:
581         case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
582         case GL_UNIFORM_BUFFER_BINDING:
583         case GL_TRANSFORM_FEEDBACK_BINDING:
584         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
585         case GL_COPY_READ_BUFFER_BINDING:
586         case GL_COPY_WRITE_BUFFER_BINDING:
587         case GL_SAMPLER_BINDING:
588         case GL_READ_BUFFER:
589         case GL_TEXTURE_BINDING_3D:
590         case GL_TEXTURE_BINDING_2D_ARRAY:
591         case GL_MAX_3D_TEXTURE_SIZE:
592         case GL_MAX_ARRAY_TEXTURE_LAYERS:
593         case GL_MAX_VERTEX_UNIFORM_BLOCKS:
594         case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
595         case GL_MAX_COMBINED_UNIFORM_BLOCKS:
596         case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
597         case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
598         case GL_MAX_VARYING_COMPONENTS:
599         case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
600         case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
601         case GL_MIN_PROGRAM_TEXEL_OFFSET:
602         case GL_MAX_PROGRAM_TEXEL_OFFSET:
603         case GL_NUM_EXTENSIONS:
604         case GL_MAJOR_VERSION:
605         case GL_MINOR_VERSION:
606         case GL_MAX_ELEMENTS_INDICES:
607         case GL_MAX_ELEMENTS_VERTICES:
608         case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
609         case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
610         case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
611         case GL_UNPACK_IMAGE_HEIGHT:
612         case GL_UNPACK_SKIP_IMAGES:
613         {
614             *type      = GL_INT;
615             *numParams = 1;
616             return true;
617         }
618 
619         case GL_MAX_ELEMENT_INDEX:
620         case GL_MAX_UNIFORM_BLOCK_SIZE:
621         case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
622         case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
623         case GL_MAX_SERVER_WAIT_TIMEOUT:
624         {
625             *type      = GL_INT_64_ANGLEX;
626             *numParams = 1;
627             return true;
628         }
629 
630         case GL_TRANSFORM_FEEDBACK_ACTIVE:
631         case GL_TRANSFORM_FEEDBACK_PAUSED:
632         case GL_PRIMITIVE_RESTART_FIXED_INDEX:
633         case GL_RASTERIZER_DISCARD:
634         {
635             *type      = GL_BOOL;
636             *numParams = 1;
637             return true;
638         }
639 
640         case GL_MAX_TEXTURE_LOD_BIAS:
641         {
642             *type      = GL_FLOAT;
643             *numParams = 1;
644             return true;
645         }
646     }
647 
648     if (getExtensions().requestExtension)
649     {
650         switch (pname)
651         {
652             case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
653                 *type      = GL_INT;
654                 *numParams = 1;
655                 return true;
656         }
657     }
658 
659     if (getClientVersion() < Version(3, 1))
660     {
661         return false;
662     }
663 
664     switch (pname)
665     {
666         case GL_ATOMIC_COUNTER_BUFFER_BINDING:
667         case GL_DRAW_INDIRECT_BUFFER_BINDING:
668         case GL_MAX_FRAMEBUFFER_WIDTH:
669         case GL_MAX_FRAMEBUFFER_HEIGHT:
670         case GL_MAX_FRAMEBUFFER_SAMPLES:
671         case GL_MAX_SAMPLE_MASK_WORDS:
672         case GL_MAX_COLOR_TEXTURE_SAMPLES:
673         case GL_MAX_DEPTH_TEXTURE_SAMPLES:
674         case GL_MAX_INTEGER_SAMPLES:
675         case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
676         case GL_MAX_VERTEX_ATTRIB_BINDINGS:
677         case GL_MAX_VERTEX_ATTRIB_STRIDE:
678         case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
679         case GL_MAX_VERTEX_ATOMIC_COUNTERS:
680         case GL_MAX_VERTEX_IMAGE_UNIFORMS:
681         case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
682         case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
683         case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
684         case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
685         case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
686         case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
687         case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
688         case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
689         case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
690         case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
691         case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
692         case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
693         case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
694         case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
695         case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
696         case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
697         case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
698         case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
699         case GL_MAX_UNIFORM_LOCATIONS:
700         case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
701         case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
702         case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
703         case GL_MAX_COMBINED_ATOMIC_COUNTERS:
704         case GL_MAX_IMAGE_UNITS:
705         case GL_MAX_COMBINED_IMAGE_UNIFORMS:
706         case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
707         case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
708         case GL_SHADER_STORAGE_BUFFER_BINDING:
709         case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
710         case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
711             *type      = GL_INT;
712             *numParams = 1;
713             return true;
714         case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
715             *type      = GL_INT_64_ANGLEX;
716             *numParams = 1;
717             return true;
718         case GL_SAMPLE_MASK:
719             *type      = GL_BOOL;
720             *numParams = 1;
721             return true;
722     }
723 
724     return false;
725 }
726 
getIndexedQueryParameterInfo(GLenum target,GLenum * type,unsigned int * numParams)727 bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
728                                                      GLenum *type,
729                                                      unsigned int *numParams)
730 {
731     if (getClientVersion() < Version(3, 0))
732     {
733         return false;
734     }
735 
736     switch (target)
737     {
738         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
739         case GL_UNIFORM_BUFFER_BINDING:
740         {
741             *type      = GL_INT;
742             *numParams = 1;
743             return true;
744         }
745         case GL_TRANSFORM_FEEDBACK_BUFFER_START:
746         case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
747         case GL_UNIFORM_BUFFER_START:
748         case GL_UNIFORM_BUFFER_SIZE:
749         {
750             *type      = GL_INT_64_ANGLEX;
751             *numParams = 1;
752             return true;
753         }
754     }
755 
756     if (getClientVersion() < Version(3, 1))
757     {
758         return false;
759     }
760 
761     switch (target)
762     {
763         case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
764         case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
765         case GL_ATOMIC_COUNTER_BUFFER_BINDING:
766         case GL_SHADER_STORAGE_BUFFER_BINDING:
767         case GL_VERTEX_BINDING_BUFFER:
768         case GL_VERTEX_BINDING_DIVISOR:
769         case GL_VERTEX_BINDING_OFFSET:
770         case GL_VERTEX_BINDING_STRIDE:
771         case GL_SAMPLE_MASK_VALUE:
772         {
773             *type      = GL_INT;
774             *numParams = 1;
775             return true;
776         }
777         case GL_ATOMIC_COUNTER_BUFFER_START:
778         case GL_ATOMIC_COUNTER_BUFFER_SIZE:
779         case GL_SHADER_STORAGE_BUFFER_START:
780         case GL_SHADER_STORAGE_BUFFER_SIZE:
781         {
782             *type      = GL_INT_64_ANGLEX;
783             *numParams = 1;
784             return true;
785         }
786     }
787 
788     return false;
789 }
790 
getProgram(GLuint handle) const791 Program *ValidationContext::getProgram(GLuint handle) const
792 {
793     return mState.mShaderPrograms->getProgram(handle);
794 }
795 
getShader(GLuint handle) const796 Shader *ValidationContext::getShader(GLuint handle) const
797 {
798     return mState.mShaderPrograms->getShader(handle);
799 }
800 
isTextureGenerated(GLuint texture) const801 bool ValidationContext::isTextureGenerated(GLuint texture) const
802 {
803     return mState.mTextures->isHandleGenerated(texture);
804 }
805 
isBufferGenerated(GLuint buffer) const806 bool ValidationContext::isBufferGenerated(GLuint buffer) const
807 {
808     return mState.mBuffers->isHandleGenerated(buffer);
809 }
810 
isRenderbufferGenerated(GLuint renderbuffer) const811 bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
812 {
813     return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
814 }
815 
isFramebufferGenerated(GLuint framebuffer) const816 bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
817 {
818     return mState.mFramebuffers->isHandleGenerated(framebuffer);
819 }
820 
isProgramPipelineGenerated(GLuint pipeline) const821 bool ValidationContext::isProgramPipelineGenerated(GLuint pipeline) const
822 {
823     return mState.mPipelines->isHandleGenerated(pipeline);
824 }
825 
usingDisplayTextureShareGroup() const826 bool ValidationContext::usingDisplayTextureShareGroup() const
827 {
828     return mDisplayTextureShareGroup;
829 }
830 
getConvertedRenderbufferFormat(GLenum internalformat) const831 GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
832 {
833     return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
834                    internalformat == GL_DEPTH_STENCIL
835                ? GL_DEPTH24_STENCIL8
836                : internalformat;
837 }
838 
839 }  // namespace gl
840