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 
ContextState(uintptr_t contextIn,const Version & clientVersion,State * stateIn,const Caps & capsIn,const TextureCapsMap & textureCapsIn,const Extensions & extensionsIn,const ResourceManager * resourceManagerIn,const Limitations & limitationsIn,const ResourceMap<Framebuffer> & framebufferMap)17 ContextState::ContextState(uintptr_t contextIn,
18                            const Version &clientVersion,
19                            State *stateIn,
20                            const Caps &capsIn,
21                            const TextureCapsMap &textureCapsIn,
22                            const Extensions &extensionsIn,
23                            const ResourceManager *resourceManagerIn,
24                            const Limitations &limitationsIn,
25                            const ResourceMap<Framebuffer> &framebufferMap)
26     : mClientVersion(clientVersion),
27       mContext(contextIn),
28       mState(stateIn),
29       mCaps(capsIn),
30       mTextureCaps(textureCapsIn),
31       mExtensions(extensionsIn),
32       mResourceManager(resourceManagerIn),
33       mLimitations(limitationsIn),
34       mFramebufferMap(framebufferMap)
35 {
36 }
37 
~ContextState()38 ContextState::~ContextState()
39 {
40 }
41 
getTextureCap(GLenum internalFormat) const42 const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
43 {
44     return mTextureCaps.get(internalFormat);
45 }
46 
ValidationContext(const Version & clientVersion,State * state,const Caps & caps,const TextureCapsMap & textureCaps,const Extensions & extensions,const ResourceManager * resourceManager,const Limitations & limitations,const ResourceMap<Framebuffer> & framebufferMap,bool skipValidation)47 ValidationContext::ValidationContext(const Version &clientVersion,
48                                      State *state,
49                                      const Caps &caps,
50                                      const TextureCapsMap &textureCaps,
51                                      const Extensions &extensions,
52                                      const ResourceManager *resourceManager,
53                                      const Limitations &limitations,
54                                      const ResourceMap<Framebuffer> &framebufferMap,
55                                      bool skipValidation)
56     : mState(reinterpret_cast<uintptr_t>(this),
57              clientVersion,
58              state,
59              caps,
60              textureCaps,
61              extensions,
62              resourceManager,
63              limitations,
64              framebufferMap),
65       mSkipValidation(skipValidation)
66 {
67 }
68 
getQueryParameterInfo(GLenum pname,GLenum * type,unsigned int * numParams)69 bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
70 {
71     if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
72     {
73         *type      = GL_INT;
74         *numParams = 1;
75         return true;
76     }
77 
78     // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
79     // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
80     // to the fact that it is stored internally as a float, and so would require conversion
81     // if returned from Context::getIntegerv. Since this conversion is already implemented
82     // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
83     // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
84     // application.
85     switch (pname)
86     {
87         case GL_COMPRESSED_TEXTURE_FORMATS:
88         {
89             *type      = GL_INT;
90             *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
91             return true;
92         }
93         case GL_PROGRAM_BINARY_FORMATS_OES:
94         {
95             *type      = GL_INT;
96             *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
97             return true;
98         }
99         case GL_SHADER_BINARY_FORMATS:
100         {
101             *type      = GL_INT;
102             *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
103             return true;
104         }
105 
106         case GL_MAX_VERTEX_ATTRIBS:
107         case GL_MAX_VERTEX_UNIFORM_VECTORS:
108         case GL_MAX_VARYING_VECTORS:
109         case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
110         case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
111         case GL_MAX_TEXTURE_IMAGE_UNITS:
112         case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
113         case GL_MAX_RENDERBUFFER_SIZE:
114         case GL_MAX_COLOR_ATTACHMENTS_EXT:
115         case GL_MAX_DRAW_BUFFERS_EXT:
116         case GL_NUM_SHADER_BINARY_FORMATS:
117         case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
118         case GL_ARRAY_BUFFER_BINDING:
119         // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
120         case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
121         case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
122         case GL_RENDERBUFFER_BINDING:
123         case GL_CURRENT_PROGRAM:
124         case GL_PACK_ALIGNMENT:
125         case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
126         case GL_UNPACK_ALIGNMENT:
127         case GL_GENERATE_MIPMAP_HINT:
128         case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
129         case GL_RED_BITS:
130         case GL_GREEN_BITS:
131         case GL_BLUE_BITS:
132         case GL_ALPHA_BITS:
133         case GL_DEPTH_BITS:
134         case GL_STENCIL_BITS:
135         case GL_ELEMENT_ARRAY_BUFFER_BINDING:
136         case GL_CULL_FACE_MODE:
137         case GL_FRONT_FACE:
138         case GL_ACTIVE_TEXTURE:
139         case GL_STENCIL_FUNC:
140         case GL_STENCIL_VALUE_MASK:
141         case GL_STENCIL_REF:
142         case GL_STENCIL_FAIL:
143         case GL_STENCIL_PASS_DEPTH_FAIL:
144         case GL_STENCIL_PASS_DEPTH_PASS:
145         case GL_STENCIL_BACK_FUNC:
146         case GL_STENCIL_BACK_VALUE_MASK:
147         case GL_STENCIL_BACK_REF:
148         case GL_STENCIL_BACK_FAIL:
149         case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
150         case GL_STENCIL_BACK_PASS_DEPTH_PASS:
151         case GL_DEPTH_FUNC:
152         case GL_BLEND_SRC_RGB:
153         case GL_BLEND_SRC_ALPHA:
154         case GL_BLEND_DST_RGB:
155         case GL_BLEND_DST_ALPHA:
156         case GL_BLEND_EQUATION_RGB:
157         case GL_BLEND_EQUATION_ALPHA:
158         case GL_STENCIL_WRITEMASK:
159         case GL_STENCIL_BACK_WRITEMASK:
160         case GL_STENCIL_CLEAR_VALUE:
161         case GL_SUBPIXEL_BITS:
162         case GL_MAX_TEXTURE_SIZE:
163         case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
164         case GL_SAMPLE_BUFFERS:
165         case GL_SAMPLES:
166         case GL_IMPLEMENTATION_COLOR_READ_TYPE:
167         case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
168         case GL_TEXTURE_BINDING_2D:
169         case GL_TEXTURE_BINDING_CUBE_MAP:
170         case GL_RESET_NOTIFICATION_STRATEGY_EXT:
171         case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
172         {
173             *type      = GL_INT;
174             *numParams = 1;
175             return true;
176         }
177         case GL_MAX_SAMPLES_ANGLE:
178         {
179             if (!getExtensions().framebufferMultisample)
180             {
181                 return false;
182             }
183             *type      = GL_INT;
184             *numParams = 1;
185             return true;
186         }
187         case GL_MAX_VIEWPORT_DIMS:
188         {
189             *type      = GL_INT;
190             *numParams = 2;
191             return true;
192         }
193         case GL_VIEWPORT:
194         case GL_SCISSOR_BOX:
195         {
196             *type      = GL_INT;
197             *numParams = 4;
198             return true;
199         }
200         case GL_SHADER_COMPILER:
201         case GL_SAMPLE_COVERAGE_INVERT:
202         case GL_DEPTH_WRITEMASK:
203         case GL_CULL_FACE:                 // CULL_FACE through DITHER are natural to IsEnabled,
204         case GL_POLYGON_OFFSET_FILL:       // but can be retrieved through the Get{Type}v queries.
205         case GL_SAMPLE_ALPHA_TO_COVERAGE:  // For this purpose, they are treated here as
206                                            // bool-natural
207         case GL_SAMPLE_COVERAGE:
208         case GL_SCISSOR_TEST:
209         case GL_STENCIL_TEST:
210         case GL_DEPTH_TEST:
211         case GL_BLEND:
212         case GL_DITHER:
213         case GL_CONTEXT_ROBUST_ACCESS_EXT:
214         {
215             *type      = GL_BOOL;
216             *numParams = 1;
217             return true;
218         }
219         case GL_COLOR_WRITEMASK:
220         {
221             *type      = GL_BOOL;
222             *numParams = 4;
223             return true;
224         }
225         case GL_POLYGON_OFFSET_FACTOR:
226         case GL_POLYGON_OFFSET_UNITS:
227         case GL_SAMPLE_COVERAGE_VALUE:
228         case GL_DEPTH_CLEAR_VALUE:
229         case GL_LINE_WIDTH:
230         {
231             *type      = GL_FLOAT;
232             *numParams = 1;
233             return true;
234         }
235         case GL_ALIASED_LINE_WIDTH_RANGE:
236         case GL_ALIASED_POINT_SIZE_RANGE:
237         case GL_DEPTH_RANGE:
238         {
239             *type      = GL_FLOAT;
240             *numParams = 2;
241             return true;
242         }
243         case GL_COLOR_CLEAR_VALUE:
244         case GL_BLEND_COLOR:
245         {
246             *type      = GL_FLOAT;
247             *numParams = 4;
248             return true;
249         }
250         case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
251             if (!getExtensions().maxTextureAnisotropy)
252             {
253                 return false;
254             }
255             *type      = GL_FLOAT;
256             *numParams = 1;
257             return true;
258         case GL_TIMESTAMP_EXT:
259             if (!getExtensions().disjointTimerQuery)
260             {
261                 return false;
262             }
263             *type      = GL_INT_64_ANGLEX;
264             *numParams = 1;
265             return true;
266         case GL_GPU_DISJOINT_EXT:
267             if (!getExtensions().disjointTimerQuery)
268             {
269                 return false;
270             }
271             *type      = GL_INT;
272             *numParams = 1;
273             return true;
274         case GL_COVERAGE_MODULATION_CHROMIUM:
275             if (!getExtensions().framebufferMixedSamples)
276             {
277                 return false;
278             }
279             *type      = GL_INT;
280             *numParams = 1;
281             return true;
282         case GL_TEXTURE_BINDING_EXTERNAL_OES:
283             if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
284             {
285                 return false;
286             }
287             *type      = GL_INT;
288             *numParams = 1;
289             return true;
290     }
291 
292     if (getExtensions().debug)
293     {
294         switch (pname)
295         {
296             case GL_DEBUG_LOGGED_MESSAGES:
297             case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
298             case GL_DEBUG_GROUP_STACK_DEPTH:
299             case GL_MAX_DEBUG_MESSAGE_LENGTH:
300             case GL_MAX_DEBUG_LOGGED_MESSAGES:
301             case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
302             case GL_MAX_LABEL_LENGTH:
303                 *type      = GL_INT;
304                 *numParams = 1;
305                 return true;
306 
307             case GL_DEBUG_OUTPUT_SYNCHRONOUS:
308             case GL_DEBUG_OUTPUT:
309                 *type      = GL_BOOL;
310                 *numParams = 1;
311                 return true;
312         }
313     }
314 
315     if (getExtensions().multisampleCompatibility)
316     {
317         switch (pname)
318         {
319             case GL_MULTISAMPLE_EXT:
320             case GL_SAMPLE_ALPHA_TO_ONE_EXT:
321                 *type      = GL_BOOL;
322                 *numParams = 1;
323                 return true;
324         }
325     }
326 
327     if (getExtensions().pathRendering)
328     {
329         switch (pname)
330         {
331             case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
332             case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
333                 *type = GL_FLOAT;
334                 *numParams = 16;
335                 return true;
336         }
337     }
338 
339     if (getExtensions().bindGeneratesResource)
340     {
341         switch (pname)
342         {
343             case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
344                 *type      = GL_BOOL;
345                 *numParams = 1;
346                 return true;
347         }
348     }
349 
350     if (getExtensions().sRGBWriteControl)
351     {
352         switch (pname)
353         {
354             case GL_FRAMEBUFFER_SRGB_EXT:
355                 *type      = GL_BOOL;
356                 *numParams = 1;
357                 return true;
358         }
359     }
360 
361     // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
362     switch (pname)
363     {
364         case GL_PACK_ROW_LENGTH:
365         case GL_PACK_SKIP_ROWS:
366         case GL_PACK_SKIP_PIXELS:
367             if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
368             {
369                 return false;
370             }
371             *type      = GL_INT;
372             *numParams = 1;
373             return true;
374         case GL_UNPACK_ROW_LENGTH:
375         case GL_UNPACK_SKIP_ROWS:
376         case GL_UNPACK_SKIP_PIXELS:
377             if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
378             {
379                 return false;
380             }
381             *type      = GL_INT;
382             *numParams = 1;
383             return true;
384         case GL_VERTEX_ARRAY_BINDING:
385             if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
386             {
387                 return false;
388             }
389             *type      = GL_INT;
390             *numParams = 1;
391             return true;
392         case GL_PIXEL_PACK_BUFFER_BINDING:
393         case GL_PIXEL_UNPACK_BUFFER_BINDING:
394             if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
395             {
396                 return false;
397             }
398             *type      = GL_INT;
399             *numParams = 1;
400             return true;
401     }
402 
403     if (getClientVersion() < Version(3, 0))
404     {
405         return false;
406     }
407 
408     // Check for ES3.0+ parameter names
409     switch (pname)
410     {
411         case GL_MAX_UNIFORM_BUFFER_BINDINGS:
412         case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
413         case GL_UNIFORM_BUFFER_BINDING:
414         case GL_TRANSFORM_FEEDBACK_BINDING:
415         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
416         case GL_COPY_READ_BUFFER_BINDING:
417         case GL_COPY_WRITE_BUFFER_BINDING:
418         case GL_SAMPLER_BINDING:
419         case GL_READ_BUFFER:
420         case GL_TEXTURE_BINDING_3D:
421         case GL_TEXTURE_BINDING_2D_ARRAY:
422         case GL_MAX_3D_TEXTURE_SIZE:
423         case GL_MAX_ARRAY_TEXTURE_LAYERS:
424         case GL_MAX_VERTEX_UNIFORM_BLOCKS:
425         case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
426         case GL_MAX_COMBINED_UNIFORM_BLOCKS:
427         case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
428         case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
429         case GL_MAX_VARYING_COMPONENTS:
430         case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
431         case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
432         case GL_MIN_PROGRAM_TEXEL_OFFSET:
433         case GL_MAX_PROGRAM_TEXEL_OFFSET:
434         case GL_NUM_EXTENSIONS:
435         case GL_MAJOR_VERSION:
436         case GL_MINOR_VERSION:
437         case GL_MAX_ELEMENTS_INDICES:
438         case GL_MAX_ELEMENTS_VERTICES:
439         case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
440         case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
441         case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
442         case GL_UNPACK_IMAGE_HEIGHT:
443         case GL_UNPACK_SKIP_IMAGES:
444         {
445             *type      = GL_INT;
446             *numParams = 1;
447             return true;
448         }
449 
450         case GL_MAX_ELEMENT_INDEX:
451         case GL_MAX_UNIFORM_BLOCK_SIZE:
452         case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
453         case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
454         case GL_MAX_SERVER_WAIT_TIMEOUT:
455         {
456             *type      = GL_INT_64_ANGLEX;
457             *numParams = 1;
458             return true;
459         }
460 
461         case GL_TRANSFORM_FEEDBACK_ACTIVE:
462         case GL_TRANSFORM_FEEDBACK_PAUSED:
463         case GL_PRIMITIVE_RESTART_FIXED_INDEX:
464         case GL_RASTERIZER_DISCARD:
465         {
466             *type      = GL_BOOL;
467             *numParams = 1;
468             return true;
469         }
470 
471         case GL_MAX_TEXTURE_LOD_BIAS:
472         {
473             *type      = GL_FLOAT;
474             *numParams = 1;
475             return true;
476         }
477     }
478 
479     if (getClientVersion() < Version(3, 1))
480     {
481         return false;
482     }
483 
484     switch (pname)
485     {
486         case GL_MAX_FRAMEBUFFER_WIDTH:
487         case GL_MAX_FRAMEBUFFER_HEIGHT:
488         case GL_MAX_FRAMEBUFFER_SAMPLES:
489         case GL_MAX_SAMPLE_MASK_WORDS:
490         case GL_MAX_COLOR_TEXTURE_SAMPLES:
491         case GL_MAX_DEPTH_TEXTURE_SAMPLES:
492         case GL_MAX_INTEGER_SAMPLES:
493         case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
494         case GL_MAX_VERTEX_ATTRIB_BINDINGS:
495         case GL_MAX_VERTEX_ATTRIB_STRIDE:
496         case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
497         case GL_MAX_VERTEX_ATOMIC_COUNTERS:
498         case GL_MAX_VERTEX_IMAGE_UNIFORMS:
499         case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
500         case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
501         case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
502         case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
503         case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
504         case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
505         case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
506         case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
507         case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
508         case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
509         case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
510         case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
511         case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
512         case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
513         case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
514         case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
515         case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
516         case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
517         case GL_MAX_UNIFORM_LOCATIONS:
518         case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
519         case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
520         case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
521         case GL_MAX_COMBINED_ATOMIC_COUNTERS:
522         case GL_MAX_IMAGE_UNITS:
523         case GL_MAX_COMBINED_IMAGE_UNIFORMS:
524         case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
525         case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
526         case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
527             *type      = GL_INT;
528             *numParams = 1;
529             return true;
530         case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
531             *type      = GL_INT_64_ANGLEX;
532             *numParams = 1;
533             return true;
534     }
535 
536     return false;
537 }
538 
getIndexedQueryParameterInfo(GLenum target,GLenum * type,unsigned int * numParams)539 bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
540                                                      GLenum *type,
541                                                      unsigned int *numParams)
542 {
543     if (getClientVersion() < Version(3, 0))
544     {
545         return false;
546     }
547 
548     switch (target)
549     {
550         case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
551         case GL_UNIFORM_BUFFER_BINDING:
552         {
553             *type      = GL_INT;
554             *numParams = 1;
555             return true;
556         }
557         case GL_TRANSFORM_FEEDBACK_BUFFER_START:
558         case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
559         case GL_UNIFORM_BUFFER_START:
560         case GL_UNIFORM_BUFFER_SIZE:
561         {
562             *type      = GL_INT_64_ANGLEX;
563             *numParams = 1;
564             return true;
565         }
566     }
567 
568     if (getClientVersion() < Version(3, 1))
569     {
570         return false;
571     }
572 
573     switch (target)
574     {
575         case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
576         case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
577         {
578             *type      = GL_INT;
579             *numParams = 1;
580             return true;
581         }
582     }
583 
584     return false;
585 }
586 
getProgram(GLuint handle) const587 Program *ValidationContext::getProgram(GLuint handle) const
588 {
589     return mState.mResourceManager->getProgram(handle);
590 }
591 
getShader(GLuint handle) const592 Shader *ValidationContext::getShader(GLuint handle) const
593 {
594     return mState.mResourceManager->getShader(handle);
595 }
596 
isTextureGenerated(GLuint texture) const597 bool ValidationContext::isTextureGenerated(GLuint texture) const
598 {
599     return mState.mResourceManager->isTextureGenerated(texture);
600 }
601 
isBufferGenerated(GLuint buffer) const602 bool ValidationContext::isBufferGenerated(GLuint buffer) const
603 {
604     return mState.mResourceManager->isBufferGenerated(buffer);
605 }
606 
isRenderbufferGenerated(GLuint renderbuffer) const607 bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
608 {
609     return mState.mResourceManager->isRenderbufferGenerated(renderbuffer);
610 }
611 
isFramebufferGenerated(GLuint framebuffer) const612 bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
613 {
614     ASSERT(mState.mFramebufferMap.find(0) != mState.mFramebufferMap.end());
615     return mState.mFramebufferMap.find(framebuffer) != mState.mFramebufferMap.end();
616 }
617 
618 }  // namespace gl
619