blob: 4cd11d4943cbefcd00beb34173070dcb3f82b883 [file] [log] [blame]
Jamie Madill1e9ae072014-11-06 15:27:21 -05001//
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
Jamie Madill9082b982016-04-27 15:21:51 -04009#include "libANGLE/ContextState.h"
Jamie Madill51f40ec2016-06-15 14:06:00 -040010
11#include "libANGLE/Framebuffer.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050012#include "libANGLE/ResourceManager.h"
Jamie Madill1e9ae072014-11-06 15:27:21 -050013
14namespace gl
15{
16
Geoff Lang4ddf5af2016-12-01 14:30:44 -050017namespace
18{
19
20template <typename T>
21using ContextStateMember = T *(ContextState::*);
22
23template <typename T>
24T *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
Geoff Langce02f082017-02-06 16:46:21 -050039TextureManager *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
Geoff Lang4ddf5af2016-12-01 14:30:44 -050062} // anonymous namespace
63
Jamie Madill9082b982016-04-27 15:21:51 -040064ContextState::ContextState(uintptr_t contextIn,
Geoff Lang4ddf5af2016-12-01 14:30:44 -050065 const ContextState *shareContextState,
Geoff Langce02f082017-02-06 16:46:21 -050066 TextureManager *shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -040067 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -070068 State *stateIn,
Jamie Madill9082b982016-04-27 15:21:51 -040069 const Caps &capsIn,
70 const TextureCapsMap &textureCapsIn,
71 const Extensions &extensionsIn,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -050072 const Limitations &limitationsIn)
Geoff Langeb66a6e2016-10-31 13:06:12 -040073 : mClientVersion(clientVersion),
Martin Radev1be913c2016-07-11 17:59:16 +030074 mContext(contextIn),
Jamie Madilldfde6ab2016-06-09 07:07:18 -070075 mState(stateIn),
76 mCaps(capsIn),
77 mTextureCaps(textureCapsIn),
78 mExtensions(extensionsIn),
Jamie Madill01a80ee2016-11-07 12:06:18 -050079 mLimitations(limitationsIn),
Geoff Lang4ddf5af2016-12-01 14:30:44 -050080 mBuffers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mBuffers)),
81 mShaderPrograms(
82 AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mShaderPrograms)),
Geoff Langce02f082017-02-06 16:46:21 -050083 mTextures(AllocateOrGetSharedTextureManager(shareContextState,
84 shareTextures,
85 &ContextState::mTextures)),
Geoff Lang4ddf5af2016-12-01 14:30:44 -050086 mRenderbuffers(
87 AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mRenderbuffers)),
88 mSamplers(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSamplers)),
89 mFenceSyncs(
90 AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mFenceSyncs)),
Geoff Lang3bf8e3a2016-12-01 17:28:52 -050091 mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)),
92 mFramebuffers(new FramebufferManager())
Jamie Madill9082b982016-04-27 15:21:51 -040093{
94}
Jamie Madill1e9ae072014-11-06 15:27:21 -050095
Jamie Madill9082b982016-04-27 15:21:51 -040096ContextState::~ContextState()
Jamie Madill1e9ae072014-11-06 15:27:21 -050097{
Jamie Madill6c1f6712017-02-14 19:08:04 -050098 // Handles are released by the Context.
Jamie Madill1e9ae072014-11-06 15:27:21 -050099}
100
Jamie Madilla02315b2017-02-23 14:14:47 -0500101bool ContextState::isWebGL1() const
102{
103 return (mExtensions.webglCompatibility && mClientVersion.major == 2);
104}
105
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700106const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
107{
108 return mTextureCaps.get(internalFormat);
109}
110
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500111ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500112 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500113 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700114 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500115 const Caps &caps,
116 const TextureCapsMap &textureCaps,
117 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500118 const Limitations &limitations,
119 bool skipValidation)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700120 : mState(reinterpret_cast<uintptr_t>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500121 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500122 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400123 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700124 state,
125 caps,
126 textureCaps,
127 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500128 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500129 mSkipValidation(skipValidation),
130 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500131{
132}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700133
134bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
135{
136 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
137 {
138 *type = GL_INT;
139 *numParams = 1;
140 return true;
141 }
142
143 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
144 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
145 // to the fact that it is stored internally as a float, and so would require conversion
146 // if returned from Context::getIntegerv. Since this conversion is already implemented
147 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
148 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
149 // application.
150 switch (pname)
151 {
152 case GL_COMPRESSED_TEXTURE_FORMATS:
153 {
154 *type = GL_INT;
155 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
156 return true;
157 }
158 case GL_PROGRAM_BINARY_FORMATS_OES:
159 {
160 *type = GL_INT;
161 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
162 return true;
163 }
164 case GL_SHADER_BINARY_FORMATS:
165 {
166 *type = GL_INT;
167 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
168 return true;
169 }
170
171 case GL_MAX_VERTEX_ATTRIBS:
172 case GL_MAX_VERTEX_UNIFORM_VECTORS:
173 case GL_MAX_VARYING_VECTORS:
174 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
175 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
176 case GL_MAX_TEXTURE_IMAGE_UNITS:
177 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
178 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700179 case GL_NUM_SHADER_BINARY_FORMATS:
180 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
181 case GL_ARRAY_BUFFER_BINDING:
182 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
183 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
184 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
185 case GL_RENDERBUFFER_BINDING:
186 case GL_CURRENT_PROGRAM:
187 case GL_PACK_ALIGNMENT:
188 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
189 case GL_UNPACK_ALIGNMENT:
190 case GL_GENERATE_MIPMAP_HINT:
191 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
192 case GL_RED_BITS:
193 case GL_GREEN_BITS:
194 case GL_BLUE_BITS:
195 case GL_ALPHA_BITS:
196 case GL_DEPTH_BITS:
197 case GL_STENCIL_BITS:
198 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
199 case GL_CULL_FACE_MODE:
200 case GL_FRONT_FACE:
201 case GL_ACTIVE_TEXTURE:
202 case GL_STENCIL_FUNC:
203 case GL_STENCIL_VALUE_MASK:
204 case GL_STENCIL_REF:
205 case GL_STENCIL_FAIL:
206 case GL_STENCIL_PASS_DEPTH_FAIL:
207 case GL_STENCIL_PASS_DEPTH_PASS:
208 case GL_STENCIL_BACK_FUNC:
209 case GL_STENCIL_BACK_VALUE_MASK:
210 case GL_STENCIL_BACK_REF:
211 case GL_STENCIL_BACK_FAIL:
212 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
213 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
214 case GL_DEPTH_FUNC:
215 case GL_BLEND_SRC_RGB:
216 case GL_BLEND_SRC_ALPHA:
217 case GL_BLEND_DST_RGB:
218 case GL_BLEND_DST_ALPHA:
219 case GL_BLEND_EQUATION_RGB:
220 case GL_BLEND_EQUATION_ALPHA:
221 case GL_STENCIL_WRITEMASK:
222 case GL_STENCIL_BACK_WRITEMASK:
223 case GL_STENCIL_CLEAR_VALUE:
224 case GL_SUBPIXEL_BITS:
225 case GL_MAX_TEXTURE_SIZE:
226 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
227 case GL_SAMPLE_BUFFERS:
228 case GL_SAMPLES:
229 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
230 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
231 case GL_TEXTURE_BINDING_2D:
232 case GL_TEXTURE_BINDING_CUBE_MAP:
233 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
234 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
235 {
236 *type = GL_INT;
237 *numParams = 1;
238 return true;
239 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800240 case GL_MAX_DRAW_BUFFERS_EXT:
241 case GL_MAX_COLOR_ATTACHMENTS_EXT:
242 {
243 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
244 {
245 return false;
246 }
247 *type = GL_INT;
248 *numParams = 1;
249 return true;
250 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700251 case GL_MAX_VIEWPORT_DIMS:
252 {
253 *type = GL_INT;
254 *numParams = 2;
255 return true;
256 }
257 case GL_VIEWPORT:
258 case GL_SCISSOR_BOX:
259 {
260 *type = GL_INT;
261 *numParams = 4;
262 return true;
263 }
264 case GL_SHADER_COMPILER:
265 case GL_SAMPLE_COVERAGE_INVERT:
266 case GL_DEPTH_WRITEMASK:
267 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
268 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
269 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
270 // bool-natural
271 case GL_SAMPLE_COVERAGE:
272 case GL_SCISSOR_TEST:
273 case GL_STENCIL_TEST:
274 case GL_DEPTH_TEST:
275 case GL_BLEND:
276 case GL_DITHER:
277 case GL_CONTEXT_ROBUST_ACCESS_EXT:
278 {
279 *type = GL_BOOL;
280 *numParams = 1;
281 return true;
282 }
283 case GL_COLOR_WRITEMASK:
284 {
285 *type = GL_BOOL;
286 *numParams = 4;
287 return true;
288 }
289 case GL_POLYGON_OFFSET_FACTOR:
290 case GL_POLYGON_OFFSET_UNITS:
291 case GL_SAMPLE_COVERAGE_VALUE:
292 case GL_DEPTH_CLEAR_VALUE:
293 case GL_LINE_WIDTH:
294 {
295 *type = GL_FLOAT;
296 *numParams = 1;
297 return true;
298 }
299 case GL_ALIASED_LINE_WIDTH_RANGE:
300 case GL_ALIASED_POINT_SIZE_RANGE:
301 case GL_DEPTH_RANGE:
302 {
303 *type = GL_FLOAT;
304 *numParams = 2;
305 return true;
306 }
307 case GL_COLOR_CLEAR_VALUE:
308 case GL_BLEND_COLOR:
309 {
310 *type = GL_FLOAT;
311 *numParams = 4;
312 return true;
313 }
314 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
315 if (!getExtensions().maxTextureAnisotropy)
316 {
317 return false;
318 }
319 *type = GL_FLOAT;
320 *numParams = 1;
321 return true;
322 case GL_TIMESTAMP_EXT:
323 if (!getExtensions().disjointTimerQuery)
324 {
325 return false;
326 }
327 *type = GL_INT_64_ANGLEX;
328 *numParams = 1;
329 return true;
330 case GL_GPU_DISJOINT_EXT:
331 if (!getExtensions().disjointTimerQuery)
332 {
333 return false;
334 }
335 *type = GL_INT;
336 *numParams = 1;
337 return true;
338 case GL_COVERAGE_MODULATION_CHROMIUM:
339 if (!getExtensions().framebufferMixedSamples)
340 {
341 return false;
342 }
343 *type = GL_INT;
344 *numParams = 1;
345 return true;
John Bauman18319182016-09-28 14:22:27 -0700346 case GL_TEXTURE_BINDING_EXTERNAL_OES:
347 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
348 {
349 return false;
350 }
351 *type = GL_INT;
352 *numParams = 1;
353 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700354 }
355
356 if (getExtensions().debug)
357 {
358 switch (pname)
359 {
360 case GL_DEBUG_LOGGED_MESSAGES:
361 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
362 case GL_DEBUG_GROUP_STACK_DEPTH:
363 case GL_MAX_DEBUG_MESSAGE_LENGTH:
364 case GL_MAX_DEBUG_LOGGED_MESSAGES:
365 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
366 case GL_MAX_LABEL_LENGTH:
367 *type = GL_INT;
368 *numParams = 1;
369 return true;
370
371 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
372 case GL_DEBUG_OUTPUT:
373 *type = GL_BOOL;
374 *numParams = 1;
375 return true;
376 }
377 }
378
379 if (getExtensions().multisampleCompatibility)
380 {
381 switch (pname)
382 {
383 case GL_MULTISAMPLE_EXT:
384 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
385 *type = GL_BOOL;
386 *numParams = 1;
387 return true;
388 }
389 }
390
Sami Väisänene45e53b2016-05-25 10:36:04 +0300391 if (getExtensions().pathRendering)
392 {
393 switch (pname)
394 {
395 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
396 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
397 *type = GL_FLOAT;
398 *numParams = 16;
399 return true;
400 }
401 }
402
Geoff Langf41a7152016-09-19 15:11:17 -0400403 if (getExtensions().bindGeneratesResource)
404 {
405 switch (pname)
406 {
407 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
408 *type = GL_BOOL;
409 *numParams = 1;
410 return true;
411 }
412 }
413
Geoff Langfeb8c682017-02-13 16:07:35 -0500414 if (getExtensions().clientArrays)
415 {
416 switch (pname)
417 {
418 case GL_CLIENT_ARRAYS_ANGLE:
419 *type = GL_BOOL;
420 *numParams = 1;
421 return true;
422 }
423 }
424
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700425 if (getExtensions().sRGBWriteControl)
426 {
427 switch (pname)
428 {
429 case GL_FRAMEBUFFER_SRGB_EXT:
430 *type = GL_BOOL;
431 *numParams = 1;
432 return true;
433 }
434 }
435
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700436 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
437 switch (pname)
438 {
439 case GL_PACK_ROW_LENGTH:
440 case GL_PACK_SKIP_ROWS:
441 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300442 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700443 {
444 return false;
445 }
446 *type = GL_INT;
447 *numParams = 1;
448 return true;
449 case GL_UNPACK_ROW_LENGTH:
450 case GL_UNPACK_SKIP_ROWS:
451 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300452 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700453 {
454 return false;
455 }
456 *type = GL_INT;
457 *numParams = 1;
458 return true;
459 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300460 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700461 {
462 return false;
463 }
464 *type = GL_INT;
465 *numParams = 1;
466 return true;
467 case GL_PIXEL_PACK_BUFFER_BINDING:
468 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300469 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700470 {
471 return false;
472 }
473 *type = GL_INT;
474 *numParams = 1;
475 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500476 case GL_MAX_SAMPLES:
477 {
478 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
479 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
480 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
481 {
482 return false;
483 }
484 *type = GL_INT;
485 *numParams = 1;
486 return true;
487 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700488 }
489
Geoff Langeb66a6e2016-10-31 13:06:12 -0400490 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700491 {
492 return false;
493 }
494
495 // Check for ES3.0+ parameter names
496 switch (pname)
497 {
498 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
499 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
500 case GL_UNIFORM_BUFFER_BINDING:
501 case GL_TRANSFORM_FEEDBACK_BINDING:
502 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
503 case GL_COPY_READ_BUFFER_BINDING:
504 case GL_COPY_WRITE_BUFFER_BINDING:
505 case GL_SAMPLER_BINDING:
506 case GL_READ_BUFFER:
507 case GL_TEXTURE_BINDING_3D:
508 case GL_TEXTURE_BINDING_2D_ARRAY:
509 case GL_MAX_3D_TEXTURE_SIZE:
510 case GL_MAX_ARRAY_TEXTURE_LAYERS:
511 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
512 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
513 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
514 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
515 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
516 case GL_MAX_VARYING_COMPONENTS:
517 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
518 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
519 case GL_MIN_PROGRAM_TEXEL_OFFSET:
520 case GL_MAX_PROGRAM_TEXEL_OFFSET:
521 case GL_NUM_EXTENSIONS:
522 case GL_MAJOR_VERSION:
523 case GL_MINOR_VERSION:
524 case GL_MAX_ELEMENTS_INDICES:
525 case GL_MAX_ELEMENTS_VERTICES:
526 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
527 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
528 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
529 case GL_UNPACK_IMAGE_HEIGHT:
530 case GL_UNPACK_SKIP_IMAGES:
531 {
532 *type = GL_INT;
533 *numParams = 1;
534 return true;
535 }
536
537 case GL_MAX_ELEMENT_INDEX:
538 case GL_MAX_UNIFORM_BLOCK_SIZE:
539 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
540 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
541 case GL_MAX_SERVER_WAIT_TIMEOUT:
542 {
543 *type = GL_INT_64_ANGLEX;
544 *numParams = 1;
545 return true;
546 }
547
548 case GL_TRANSFORM_FEEDBACK_ACTIVE:
549 case GL_TRANSFORM_FEEDBACK_PAUSED:
550 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
551 case GL_RASTERIZER_DISCARD:
552 {
553 *type = GL_BOOL;
554 *numParams = 1;
555 return true;
556 }
557
558 case GL_MAX_TEXTURE_LOD_BIAS:
559 {
560 *type = GL_FLOAT;
561 *numParams = 1;
562 return true;
563 }
564 }
565
Geoff Langc339c4e2016-11-29 10:37:36 -0500566 if (getExtensions().requestExtension)
567 {
568 switch (pname)
569 {
570 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
571 *type = GL_INT;
572 *numParams = 1;
573 return true;
574 }
575 }
576
Geoff Langeb66a6e2016-10-31 13:06:12 -0400577 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300578 {
579 return false;
580 }
581
582 switch (pname)
583 {
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800584 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300585 case GL_MAX_FRAMEBUFFER_WIDTH:
586 case GL_MAX_FRAMEBUFFER_HEIGHT:
587 case GL_MAX_FRAMEBUFFER_SAMPLES:
588 case GL_MAX_SAMPLE_MASK_WORDS:
589 case GL_MAX_COLOR_TEXTURE_SAMPLES:
590 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
591 case GL_MAX_INTEGER_SAMPLES:
592 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
593 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
594 case GL_MAX_VERTEX_ATTRIB_STRIDE:
595 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
596 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
597 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
598 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
599 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
600 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
601 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
602 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
603 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
604 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
605 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
606 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
607 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
608 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
609 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
610 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
611 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
612 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
613 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
614 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
615 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
616 case GL_MAX_UNIFORM_LOCATIONS:
617 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
618 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
619 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
620 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
621 case GL_MAX_IMAGE_UNITS:
622 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
623 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
624 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
625 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
626 *type = GL_INT;
627 *numParams = 1;
628 return true;
629 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
630 *type = GL_INT_64_ANGLEX;
631 *numParams = 1;
632 return true;
633 }
634
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700635 return false;
636}
637
638bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
639 GLenum *type,
640 unsigned int *numParams)
641{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400642 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700643 {
644 return false;
645 }
646
647 switch (target)
648 {
649 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
650 case GL_UNIFORM_BUFFER_BINDING:
651 {
652 *type = GL_INT;
653 *numParams = 1;
654 return true;
655 }
656 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
657 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
658 case GL_UNIFORM_BUFFER_START:
659 case GL_UNIFORM_BUFFER_SIZE:
660 {
661 *type = GL_INT_64_ANGLEX;
662 *numParams = 1;
663 return true;
664 }
665 }
666
Geoff Langeb66a6e2016-10-31 13:06:12 -0400667 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300668 {
669 return false;
670 }
671
672 switch (target)
673 {
674 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
675 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
676 {
677 *type = GL_INT;
678 *numParams = 1;
679 return true;
680 }
681 }
682
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 return false;
684}
685
Jamie Madillef300b12016-10-07 15:12:09 -0400686Program *ValidationContext::getProgram(GLuint handle) const
687{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500688 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400689}
690
691Shader *ValidationContext::getShader(GLuint handle) const
692{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500693 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400694}
695
Jamie Madill01a80ee2016-11-07 12:06:18 -0500696bool ValidationContext::isTextureGenerated(GLuint texture) const
697{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500698 return mState.mTextures->isTextureGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500699}
700
701bool ValidationContext::isBufferGenerated(GLuint buffer) const
702{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500703 return mState.mBuffers->isBufferGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500704}
705
706bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
707{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500708 return mState.mRenderbuffers->isRenderbufferGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500709}
710
711bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
712{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500713 return mState.mFramebuffers->isFramebufferGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500714}
715
Geoff Langce02f082017-02-06 16:46:21 -0500716bool ValidationContext::usingDisplayTextureShareGroup() const
717{
718 return mDisplayTextureShareGroup;
719}
720
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500721GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
722{
723 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
724 internalformat == GL_DEPTH_STENCIL
725 ? GL_DEPTH24_STENCIL8
726 : internalformat;
727}
728
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500729} // namespace gl