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