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