blob: a24d2e3410427fe8cab07426948e83d1b874cfbd [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 Madilldfde6ab2016-06-09 07:07:18 -0700101const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
102{
103 return mTextureCaps.get(internalFormat);
104}
105
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500106ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500107 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500108 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700109 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500110 const Caps &caps,
111 const TextureCapsMap &textureCaps,
112 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500113 const Limitations &limitations,
114 bool skipValidation)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700115 : mState(reinterpret_cast<uintptr_t>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500116 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500117 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400118 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700119 state,
120 caps,
121 textureCaps,
122 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500123 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500124 mSkipValidation(skipValidation),
125 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500126{
127}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700128
129bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
130{
131 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
132 {
133 *type = GL_INT;
134 *numParams = 1;
135 return true;
136 }
137
138 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
139 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
140 // to the fact that it is stored internally as a float, and so would require conversion
141 // if returned from Context::getIntegerv. Since this conversion is already implemented
142 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
143 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
144 // application.
145 switch (pname)
146 {
147 case GL_COMPRESSED_TEXTURE_FORMATS:
148 {
149 *type = GL_INT;
150 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
151 return true;
152 }
153 case GL_PROGRAM_BINARY_FORMATS_OES:
154 {
155 *type = GL_INT;
156 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
157 return true;
158 }
159 case GL_SHADER_BINARY_FORMATS:
160 {
161 *type = GL_INT;
162 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
163 return true;
164 }
165
166 case GL_MAX_VERTEX_ATTRIBS:
167 case GL_MAX_VERTEX_UNIFORM_VECTORS:
168 case GL_MAX_VARYING_VECTORS:
169 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
170 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
171 case GL_MAX_TEXTURE_IMAGE_UNITS:
172 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
173 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700174 case GL_NUM_SHADER_BINARY_FORMATS:
175 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
176 case GL_ARRAY_BUFFER_BINDING:
177 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
178 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
179 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
180 case GL_RENDERBUFFER_BINDING:
181 case GL_CURRENT_PROGRAM:
182 case GL_PACK_ALIGNMENT:
183 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
184 case GL_UNPACK_ALIGNMENT:
185 case GL_GENERATE_MIPMAP_HINT:
186 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
187 case GL_RED_BITS:
188 case GL_GREEN_BITS:
189 case GL_BLUE_BITS:
190 case GL_ALPHA_BITS:
191 case GL_DEPTH_BITS:
192 case GL_STENCIL_BITS:
193 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
194 case GL_CULL_FACE_MODE:
195 case GL_FRONT_FACE:
196 case GL_ACTIVE_TEXTURE:
197 case GL_STENCIL_FUNC:
198 case GL_STENCIL_VALUE_MASK:
199 case GL_STENCIL_REF:
200 case GL_STENCIL_FAIL:
201 case GL_STENCIL_PASS_DEPTH_FAIL:
202 case GL_STENCIL_PASS_DEPTH_PASS:
203 case GL_STENCIL_BACK_FUNC:
204 case GL_STENCIL_BACK_VALUE_MASK:
205 case GL_STENCIL_BACK_REF:
206 case GL_STENCIL_BACK_FAIL:
207 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
208 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
209 case GL_DEPTH_FUNC:
210 case GL_BLEND_SRC_RGB:
211 case GL_BLEND_SRC_ALPHA:
212 case GL_BLEND_DST_RGB:
213 case GL_BLEND_DST_ALPHA:
214 case GL_BLEND_EQUATION_RGB:
215 case GL_BLEND_EQUATION_ALPHA:
216 case GL_STENCIL_WRITEMASK:
217 case GL_STENCIL_BACK_WRITEMASK:
218 case GL_STENCIL_CLEAR_VALUE:
219 case GL_SUBPIXEL_BITS:
220 case GL_MAX_TEXTURE_SIZE:
221 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
222 case GL_SAMPLE_BUFFERS:
223 case GL_SAMPLES:
224 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
225 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
226 case GL_TEXTURE_BINDING_2D:
227 case GL_TEXTURE_BINDING_CUBE_MAP:
228 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
229 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
230 {
231 *type = GL_INT;
232 *numParams = 1;
233 return true;
234 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800235 case GL_MAX_DRAW_BUFFERS_EXT:
236 case GL_MAX_COLOR_ATTACHMENTS_EXT:
237 {
238 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
239 {
240 return false;
241 }
242 *type = GL_INT;
243 *numParams = 1;
244 return true;
245 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700246 case GL_MAX_VIEWPORT_DIMS:
247 {
248 *type = GL_INT;
249 *numParams = 2;
250 return true;
251 }
252 case GL_VIEWPORT:
253 case GL_SCISSOR_BOX:
254 {
255 *type = GL_INT;
256 *numParams = 4;
257 return true;
258 }
259 case GL_SHADER_COMPILER:
260 case GL_SAMPLE_COVERAGE_INVERT:
261 case GL_DEPTH_WRITEMASK:
262 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
263 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
264 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
265 // bool-natural
266 case GL_SAMPLE_COVERAGE:
267 case GL_SCISSOR_TEST:
268 case GL_STENCIL_TEST:
269 case GL_DEPTH_TEST:
270 case GL_BLEND:
271 case GL_DITHER:
272 case GL_CONTEXT_ROBUST_ACCESS_EXT:
273 {
274 *type = GL_BOOL;
275 *numParams = 1;
276 return true;
277 }
278 case GL_COLOR_WRITEMASK:
279 {
280 *type = GL_BOOL;
281 *numParams = 4;
282 return true;
283 }
284 case GL_POLYGON_OFFSET_FACTOR:
285 case GL_POLYGON_OFFSET_UNITS:
286 case GL_SAMPLE_COVERAGE_VALUE:
287 case GL_DEPTH_CLEAR_VALUE:
288 case GL_LINE_WIDTH:
289 {
290 *type = GL_FLOAT;
291 *numParams = 1;
292 return true;
293 }
294 case GL_ALIASED_LINE_WIDTH_RANGE:
295 case GL_ALIASED_POINT_SIZE_RANGE:
296 case GL_DEPTH_RANGE:
297 {
298 *type = GL_FLOAT;
299 *numParams = 2;
300 return true;
301 }
302 case GL_COLOR_CLEAR_VALUE:
303 case GL_BLEND_COLOR:
304 {
305 *type = GL_FLOAT;
306 *numParams = 4;
307 return true;
308 }
309 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
310 if (!getExtensions().maxTextureAnisotropy)
311 {
312 return false;
313 }
314 *type = GL_FLOAT;
315 *numParams = 1;
316 return true;
317 case GL_TIMESTAMP_EXT:
318 if (!getExtensions().disjointTimerQuery)
319 {
320 return false;
321 }
322 *type = GL_INT_64_ANGLEX;
323 *numParams = 1;
324 return true;
325 case GL_GPU_DISJOINT_EXT:
326 if (!getExtensions().disjointTimerQuery)
327 {
328 return false;
329 }
330 *type = GL_INT;
331 *numParams = 1;
332 return true;
333 case GL_COVERAGE_MODULATION_CHROMIUM:
334 if (!getExtensions().framebufferMixedSamples)
335 {
336 return false;
337 }
338 *type = GL_INT;
339 *numParams = 1;
340 return true;
John Bauman18319182016-09-28 14:22:27 -0700341 case GL_TEXTURE_BINDING_EXTERNAL_OES:
342 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
343 {
344 return false;
345 }
346 *type = GL_INT;
347 *numParams = 1;
348 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700349 }
350
351 if (getExtensions().debug)
352 {
353 switch (pname)
354 {
355 case GL_DEBUG_LOGGED_MESSAGES:
356 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
357 case GL_DEBUG_GROUP_STACK_DEPTH:
358 case GL_MAX_DEBUG_MESSAGE_LENGTH:
359 case GL_MAX_DEBUG_LOGGED_MESSAGES:
360 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
361 case GL_MAX_LABEL_LENGTH:
362 *type = GL_INT;
363 *numParams = 1;
364 return true;
365
366 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
367 case GL_DEBUG_OUTPUT:
368 *type = GL_BOOL;
369 *numParams = 1;
370 return true;
371 }
372 }
373
374 if (getExtensions().multisampleCompatibility)
375 {
376 switch (pname)
377 {
378 case GL_MULTISAMPLE_EXT:
379 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
380 *type = GL_BOOL;
381 *numParams = 1;
382 return true;
383 }
384 }
385
Sami Väisänene45e53b2016-05-25 10:36:04 +0300386 if (getExtensions().pathRendering)
387 {
388 switch (pname)
389 {
390 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
391 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
392 *type = GL_FLOAT;
393 *numParams = 16;
394 return true;
395 }
396 }
397
Geoff Langf41a7152016-09-19 15:11:17 -0400398 if (getExtensions().bindGeneratesResource)
399 {
400 switch (pname)
401 {
402 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
403 *type = GL_BOOL;
404 *numParams = 1;
405 return true;
406 }
407 }
408
Geoff Langfeb8c682017-02-13 16:07:35 -0500409 if (getExtensions().clientArrays)
410 {
411 switch (pname)
412 {
413 case GL_CLIENT_ARRAYS_ANGLE:
414 *type = GL_BOOL;
415 *numParams = 1;
416 return true;
417 }
418 }
419
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700420 if (getExtensions().sRGBWriteControl)
421 {
422 switch (pname)
423 {
424 case GL_FRAMEBUFFER_SRGB_EXT:
425 *type = GL_BOOL;
426 *numParams = 1;
427 return true;
428 }
429 }
430
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700431 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
432 switch (pname)
433 {
434 case GL_PACK_ROW_LENGTH:
435 case GL_PACK_SKIP_ROWS:
436 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300437 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700438 {
439 return false;
440 }
441 *type = GL_INT;
442 *numParams = 1;
443 return true;
444 case GL_UNPACK_ROW_LENGTH:
445 case GL_UNPACK_SKIP_ROWS:
446 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300447 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700448 {
449 return false;
450 }
451 *type = GL_INT;
452 *numParams = 1;
453 return true;
454 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300455 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700456 {
457 return false;
458 }
459 *type = GL_INT;
460 *numParams = 1;
461 return true;
462 case GL_PIXEL_PACK_BUFFER_BINDING:
463 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300464 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700465 {
466 return false;
467 }
468 *type = GL_INT;
469 *numParams = 1;
470 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500471 case GL_MAX_SAMPLES:
472 {
473 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
474 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
475 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
476 {
477 return false;
478 }
479 *type = GL_INT;
480 *numParams = 1;
481 return true;
482 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700483 }
484
Geoff Langeb66a6e2016-10-31 13:06:12 -0400485 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700486 {
487 return false;
488 }
489
490 // Check for ES3.0+ parameter names
491 switch (pname)
492 {
493 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
494 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
495 case GL_UNIFORM_BUFFER_BINDING:
496 case GL_TRANSFORM_FEEDBACK_BINDING:
497 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
498 case GL_COPY_READ_BUFFER_BINDING:
499 case GL_COPY_WRITE_BUFFER_BINDING:
500 case GL_SAMPLER_BINDING:
501 case GL_READ_BUFFER:
502 case GL_TEXTURE_BINDING_3D:
503 case GL_TEXTURE_BINDING_2D_ARRAY:
504 case GL_MAX_3D_TEXTURE_SIZE:
505 case GL_MAX_ARRAY_TEXTURE_LAYERS:
506 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
507 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
508 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
509 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
510 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
511 case GL_MAX_VARYING_COMPONENTS:
512 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
513 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
514 case GL_MIN_PROGRAM_TEXEL_OFFSET:
515 case GL_MAX_PROGRAM_TEXEL_OFFSET:
516 case GL_NUM_EXTENSIONS:
517 case GL_MAJOR_VERSION:
518 case GL_MINOR_VERSION:
519 case GL_MAX_ELEMENTS_INDICES:
520 case GL_MAX_ELEMENTS_VERTICES:
521 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
522 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
523 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
524 case GL_UNPACK_IMAGE_HEIGHT:
525 case GL_UNPACK_SKIP_IMAGES:
526 {
527 *type = GL_INT;
528 *numParams = 1;
529 return true;
530 }
531
532 case GL_MAX_ELEMENT_INDEX:
533 case GL_MAX_UNIFORM_BLOCK_SIZE:
534 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
535 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
536 case GL_MAX_SERVER_WAIT_TIMEOUT:
537 {
538 *type = GL_INT_64_ANGLEX;
539 *numParams = 1;
540 return true;
541 }
542
543 case GL_TRANSFORM_FEEDBACK_ACTIVE:
544 case GL_TRANSFORM_FEEDBACK_PAUSED:
545 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
546 case GL_RASTERIZER_DISCARD:
547 {
548 *type = GL_BOOL;
549 *numParams = 1;
550 return true;
551 }
552
553 case GL_MAX_TEXTURE_LOD_BIAS:
554 {
555 *type = GL_FLOAT;
556 *numParams = 1;
557 return true;
558 }
559 }
560
Geoff Langc339c4e2016-11-29 10:37:36 -0500561 if (getExtensions().requestExtension)
562 {
563 switch (pname)
564 {
565 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
566 *type = GL_INT;
567 *numParams = 1;
568 return true;
569 }
570 }
571
Geoff Langeb66a6e2016-10-31 13:06:12 -0400572 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300573 {
574 return false;
575 }
576
577 switch (pname)
578 {
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800579 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300580 case GL_MAX_FRAMEBUFFER_WIDTH:
581 case GL_MAX_FRAMEBUFFER_HEIGHT:
582 case GL_MAX_FRAMEBUFFER_SAMPLES:
583 case GL_MAX_SAMPLE_MASK_WORDS:
584 case GL_MAX_COLOR_TEXTURE_SAMPLES:
585 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
586 case GL_MAX_INTEGER_SAMPLES:
587 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
588 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
589 case GL_MAX_VERTEX_ATTRIB_STRIDE:
590 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
591 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
592 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
593 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
594 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
595 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
596 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
597 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
598 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
599 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
600 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
601 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
602 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
603 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
604 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
605 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
606 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
607 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
608 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
609 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
610 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
611 case GL_MAX_UNIFORM_LOCATIONS:
612 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
613 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
614 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
615 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
616 case GL_MAX_IMAGE_UNITS:
617 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
618 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
619 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
620 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
621 *type = GL_INT;
622 *numParams = 1;
623 return true;
624 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
625 *type = GL_INT_64_ANGLEX;
626 *numParams = 1;
627 return true;
628 }
629
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700630 return false;
631}
632
633bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
634 GLenum *type,
635 unsigned int *numParams)
636{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400637 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700638 {
639 return false;
640 }
641
642 switch (target)
643 {
644 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
645 case GL_UNIFORM_BUFFER_BINDING:
646 {
647 *type = GL_INT;
648 *numParams = 1;
649 return true;
650 }
651 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
652 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
653 case GL_UNIFORM_BUFFER_START:
654 case GL_UNIFORM_BUFFER_SIZE:
655 {
656 *type = GL_INT_64_ANGLEX;
657 *numParams = 1;
658 return true;
659 }
660 }
661
Geoff Langeb66a6e2016-10-31 13:06:12 -0400662 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300663 {
664 return false;
665 }
666
667 switch (target)
668 {
669 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
670 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
671 {
672 *type = GL_INT;
673 *numParams = 1;
674 return true;
675 }
676 }
677
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700678 return false;
679}
680
Jamie Madillef300b12016-10-07 15:12:09 -0400681Program *ValidationContext::getProgram(GLuint handle) const
682{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500683 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400684}
685
686Shader *ValidationContext::getShader(GLuint handle) const
687{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500688 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400689}
690
Jamie Madill01a80ee2016-11-07 12:06:18 -0500691bool ValidationContext::isTextureGenerated(GLuint texture) const
692{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500693 return mState.mTextures->isTextureGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500694}
695
696bool ValidationContext::isBufferGenerated(GLuint buffer) const
697{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500698 return mState.mBuffers->isBufferGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500699}
700
701bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
702{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500703 return mState.mRenderbuffers->isRenderbufferGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500704}
705
706bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
707{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500708 return mState.mFramebuffers->isFramebufferGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500709}
710
Geoff Langce02f082017-02-06 16:46:21 -0500711bool ValidationContext::usingDisplayTextureShareGroup() const
712{
713 return mDisplayTextureShareGroup;
714}
715
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500716} // namespace gl