blob: d169e00850ea584c3f2d024b52307e674390062e [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{
Geoff Lang4ddf5af2016-12-01 14:30:44 -050098 mBuffers->release();
99 mShaderPrograms->release();
100 mTextures->release();
101 mRenderbuffers->release();
102 mSamplers->release();
103 mFenceSyncs->release();
104 mPaths->release();
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500105 mFramebuffers->release();
Jamie Madill1e9ae072014-11-06 15:27:21 -0500106}
107
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700108const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
109{
110 return mTextureCaps.get(internalFormat);
111}
112
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500113ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500114 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500115 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700116 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500117 const Caps &caps,
118 const TextureCapsMap &textureCaps,
119 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500120 const Limitations &limitations,
121 bool skipValidation)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700122 : mState(reinterpret_cast<uintptr_t>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500123 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500124 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400125 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700126 state,
127 caps,
128 textureCaps,
129 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500130 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500131 mSkipValidation(skipValidation),
132 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500133{
134}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700135
136bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
137{
138 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
139 {
140 *type = GL_INT;
141 *numParams = 1;
142 return true;
143 }
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_PROGRAM_BINARY_FORMATS_OES:
161 {
162 *type = GL_INT;
163 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
164 return true;
165 }
166 case GL_SHADER_BINARY_FORMATS:
167 {
168 *type = GL_INT;
169 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
170 return true;
171 }
172
173 case GL_MAX_VERTEX_ATTRIBS:
174 case GL_MAX_VERTEX_UNIFORM_VECTORS:
175 case GL_MAX_VARYING_VECTORS:
176 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
177 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
178 case GL_MAX_TEXTURE_IMAGE_UNITS:
179 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
180 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700181 case GL_NUM_SHADER_BINARY_FORMATS:
182 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
183 case GL_ARRAY_BUFFER_BINDING:
184 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
185 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
186 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
187 case GL_RENDERBUFFER_BINDING:
188 case GL_CURRENT_PROGRAM:
189 case GL_PACK_ALIGNMENT:
190 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
191 case GL_UNPACK_ALIGNMENT:
192 case GL_GENERATE_MIPMAP_HINT:
193 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
194 case GL_RED_BITS:
195 case GL_GREEN_BITS:
196 case GL_BLUE_BITS:
197 case GL_ALPHA_BITS:
198 case GL_DEPTH_BITS:
199 case GL_STENCIL_BITS:
200 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
201 case GL_CULL_FACE_MODE:
202 case GL_FRONT_FACE:
203 case GL_ACTIVE_TEXTURE:
204 case GL_STENCIL_FUNC:
205 case GL_STENCIL_VALUE_MASK:
206 case GL_STENCIL_REF:
207 case GL_STENCIL_FAIL:
208 case GL_STENCIL_PASS_DEPTH_FAIL:
209 case GL_STENCIL_PASS_DEPTH_PASS:
210 case GL_STENCIL_BACK_FUNC:
211 case GL_STENCIL_BACK_VALUE_MASK:
212 case GL_STENCIL_BACK_REF:
213 case GL_STENCIL_BACK_FAIL:
214 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
215 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
216 case GL_DEPTH_FUNC:
217 case GL_BLEND_SRC_RGB:
218 case GL_BLEND_SRC_ALPHA:
219 case GL_BLEND_DST_RGB:
220 case GL_BLEND_DST_ALPHA:
221 case GL_BLEND_EQUATION_RGB:
222 case GL_BLEND_EQUATION_ALPHA:
223 case GL_STENCIL_WRITEMASK:
224 case GL_STENCIL_BACK_WRITEMASK:
225 case GL_STENCIL_CLEAR_VALUE:
226 case GL_SUBPIXEL_BITS:
227 case GL_MAX_TEXTURE_SIZE:
228 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
229 case GL_SAMPLE_BUFFERS:
230 case GL_SAMPLES:
231 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
232 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
233 case GL_TEXTURE_BINDING_2D:
234 case GL_TEXTURE_BINDING_CUBE_MAP:
235 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
236 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
237 {
238 *type = GL_INT;
239 *numParams = 1;
240 return true;
241 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800242 case GL_MAX_DRAW_BUFFERS_EXT:
243 case GL_MAX_COLOR_ATTACHMENTS_EXT:
244 {
245 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
246 {
247 return false;
248 }
249 *type = GL_INT;
250 *numParams = 1;
251 return true;
252 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700253 case GL_MAX_VIEWPORT_DIMS:
254 {
255 *type = GL_INT;
256 *numParams = 2;
257 return true;
258 }
259 case GL_VIEWPORT:
260 case GL_SCISSOR_BOX:
261 {
262 *type = GL_INT;
263 *numParams = 4;
264 return true;
265 }
266 case GL_SHADER_COMPILER:
267 case GL_SAMPLE_COVERAGE_INVERT:
268 case GL_DEPTH_WRITEMASK:
269 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
270 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
271 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
272 // bool-natural
273 case GL_SAMPLE_COVERAGE:
274 case GL_SCISSOR_TEST:
275 case GL_STENCIL_TEST:
276 case GL_DEPTH_TEST:
277 case GL_BLEND:
278 case GL_DITHER:
279 case GL_CONTEXT_ROBUST_ACCESS_EXT:
280 {
281 *type = GL_BOOL;
282 *numParams = 1;
283 return true;
284 }
285 case GL_COLOR_WRITEMASK:
286 {
287 *type = GL_BOOL;
288 *numParams = 4;
289 return true;
290 }
291 case GL_POLYGON_OFFSET_FACTOR:
292 case GL_POLYGON_OFFSET_UNITS:
293 case GL_SAMPLE_COVERAGE_VALUE:
294 case GL_DEPTH_CLEAR_VALUE:
295 case GL_LINE_WIDTH:
296 {
297 *type = GL_FLOAT;
298 *numParams = 1;
299 return true;
300 }
301 case GL_ALIASED_LINE_WIDTH_RANGE:
302 case GL_ALIASED_POINT_SIZE_RANGE:
303 case GL_DEPTH_RANGE:
304 {
305 *type = GL_FLOAT;
306 *numParams = 2;
307 return true;
308 }
309 case GL_COLOR_CLEAR_VALUE:
310 case GL_BLEND_COLOR:
311 {
312 *type = GL_FLOAT;
313 *numParams = 4;
314 return true;
315 }
316 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
317 if (!getExtensions().maxTextureAnisotropy)
318 {
319 return false;
320 }
321 *type = GL_FLOAT;
322 *numParams = 1;
323 return true;
324 case GL_TIMESTAMP_EXT:
325 if (!getExtensions().disjointTimerQuery)
326 {
327 return false;
328 }
329 *type = GL_INT_64_ANGLEX;
330 *numParams = 1;
331 return true;
332 case GL_GPU_DISJOINT_EXT:
333 if (!getExtensions().disjointTimerQuery)
334 {
335 return false;
336 }
337 *type = GL_INT;
338 *numParams = 1;
339 return true;
340 case GL_COVERAGE_MODULATION_CHROMIUM:
341 if (!getExtensions().framebufferMixedSamples)
342 {
343 return false;
344 }
345 *type = GL_INT;
346 *numParams = 1;
347 return true;
John Bauman18319182016-09-28 14:22:27 -0700348 case GL_TEXTURE_BINDING_EXTERNAL_OES:
349 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
350 {
351 return false;
352 }
353 *type = GL_INT;
354 *numParams = 1;
355 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700356 }
357
358 if (getExtensions().debug)
359 {
360 switch (pname)
361 {
362 case GL_DEBUG_LOGGED_MESSAGES:
363 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
364 case GL_DEBUG_GROUP_STACK_DEPTH:
365 case GL_MAX_DEBUG_MESSAGE_LENGTH:
366 case GL_MAX_DEBUG_LOGGED_MESSAGES:
367 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
368 case GL_MAX_LABEL_LENGTH:
369 *type = GL_INT;
370 *numParams = 1;
371 return true;
372
373 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
374 case GL_DEBUG_OUTPUT:
375 *type = GL_BOOL;
376 *numParams = 1;
377 return true;
378 }
379 }
380
381 if (getExtensions().multisampleCompatibility)
382 {
383 switch (pname)
384 {
385 case GL_MULTISAMPLE_EXT:
386 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
387 *type = GL_BOOL;
388 *numParams = 1;
389 return true;
390 }
391 }
392
Sami Väisänene45e53b2016-05-25 10:36:04 +0300393 if (getExtensions().pathRendering)
394 {
395 switch (pname)
396 {
397 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
398 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
399 *type = GL_FLOAT;
400 *numParams = 16;
401 return true;
402 }
403 }
404
Geoff Langf41a7152016-09-19 15:11:17 -0400405 if (getExtensions().bindGeneratesResource)
406 {
407 switch (pname)
408 {
409 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
410 *type = GL_BOOL;
411 *numParams = 1;
412 return true;
413 }
414 }
415
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700416 if (getExtensions().sRGBWriteControl)
417 {
418 switch (pname)
419 {
420 case GL_FRAMEBUFFER_SRGB_EXT:
421 *type = GL_BOOL;
422 *numParams = 1;
423 return true;
424 }
425 }
426
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700427 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
428 switch (pname)
429 {
430 case GL_PACK_ROW_LENGTH:
431 case GL_PACK_SKIP_ROWS:
432 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300433 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700434 {
435 return false;
436 }
437 *type = GL_INT;
438 *numParams = 1;
439 return true;
440 case GL_UNPACK_ROW_LENGTH:
441 case GL_UNPACK_SKIP_ROWS:
442 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300443 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700444 {
445 return false;
446 }
447 *type = GL_INT;
448 *numParams = 1;
449 return true;
450 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300451 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700452 {
453 return false;
454 }
455 *type = GL_INT;
456 *numParams = 1;
457 return true;
458 case GL_PIXEL_PACK_BUFFER_BINDING:
459 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300460 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700461 {
462 return false;
463 }
464 *type = GL_INT;
465 *numParams = 1;
466 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500467 case GL_MAX_SAMPLES:
468 {
469 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
470 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
471 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
472 {
473 return false;
474 }
475 *type = GL_INT;
476 *numParams = 1;
477 return true;
478 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700479 }
480
Geoff Langeb66a6e2016-10-31 13:06:12 -0400481 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700482 {
483 return false;
484 }
485
486 // Check for ES3.0+ parameter names
487 switch (pname)
488 {
489 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
490 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
491 case GL_UNIFORM_BUFFER_BINDING:
492 case GL_TRANSFORM_FEEDBACK_BINDING:
493 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
494 case GL_COPY_READ_BUFFER_BINDING:
495 case GL_COPY_WRITE_BUFFER_BINDING:
496 case GL_SAMPLER_BINDING:
497 case GL_READ_BUFFER:
498 case GL_TEXTURE_BINDING_3D:
499 case GL_TEXTURE_BINDING_2D_ARRAY:
500 case GL_MAX_3D_TEXTURE_SIZE:
501 case GL_MAX_ARRAY_TEXTURE_LAYERS:
502 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
503 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
504 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
505 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
506 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
507 case GL_MAX_VARYING_COMPONENTS:
508 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
509 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
510 case GL_MIN_PROGRAM_TEXEL_OFFSET:
511 case GL_MAX_PROGRAM_TEXEL_OFFSET:
512 case GL_NUM_EXTENSIONS:
513 case GL_MAJOR_VERSION:
514 case GL_MINOR_VERSION:
515 case GL_MAX_ELEMENTS_INDICES:
516 case GL_MAX_ELEMENTS_VERTICES:
517 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
518 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
519 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
520 case GL_UNPACK_IMAGE_HEIGHT:
521 case GL_UNPACK_SKIP_IMAGES:
522 {
523 *type = GL_INT;
524 *numParams = 1;
525 return true;
526 }
527
528 case GL_MAX_ELEMENT_INDEX:
529 case GL_MAX_UNIFORM_BLOCK_SIZE:
530 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
531 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
532 case GL_MAX_SERVER_WAIT_TIMEOUT:
533 {
534 *type = GL_INT_64_ANGLEX;
535 *numParams = 1;
536 return true;
537 }
538
539 case GL_TRANSFORM_FEEDBACK_ACTIVE:
540 case GL_TRANSFORM_FEEDBACK_PAUSED:
541 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
542 case GL_RASTERIZER_DISCARD:
543 {
544 *type = GL_BOOL;
545 *numParams = 1;
546 return true;
547 }
548
549 case GL_MAX_TEXTURE_LOD_BIAS:
550 {
551 *type = GL_FLOAT;
552 *numParams = 1;
553 return true;
554 }
555 }
556
Geoff Langc339c4e2016-11-29 10:37:36 -0500557 if (getExtensions().requestExtension)
558 {
559 switch (pname)
560 {
561 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
562 *type = GL_INT;
563 *numParams = 1;
564 return true;
565 }
566 }
567
Geoff Langeb66a6e2016-10-31 13:06:12 -0400568 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300569 {
570 return false;
571 }
572
573 switch (pname)
574 {
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800575 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300576 case GL_MAX_FRAMEBUFFER_WIDTH:
577 case GL_MAX_FRAMEBUFFER_HEIGHT:
578 case GL_MAX_FRAMEBUFFER_SAMPLES:
579 case GL_MAX_SAMPLE_MASK_WORDS:
580 case GL_MAX_COLOR_TEXTURE_SAMPLES:
581 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
582 case GL_MAX_INTEGER_SAMPLES:
583 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
584 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
585 case GL_MAX_VERTEX_ATTRIB_STRIDE:
586 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
587 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
588 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
589 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
590 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
591 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
592 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
593 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
594 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
595 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
596 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
597 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
598 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
599 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
600 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
601 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
602 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
603 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
604 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
605 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
606 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
607 case GL_MAX_UNIFORM_LOCATIONS:
608 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
609 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
610 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
611 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
612 case GL_MAX_IMAGE_UNITS:
613 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
614 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
615 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
616 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
617 *type = GL_INT;
618 *numParams = 1;
619 return true;
620 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
621 *type = GL_INT_64_ANGLEX;
622 *numParams = 1;
623 return true;
624 }
625
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700626 return false;
627}
628
629bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
630 GLenum *type,
631 unsigned int *numParams)
632{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400633 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700634 {
635 return false;
636 }
637
638 switch (target)
639 {
640 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
641 case GL_UNIFORM_BUFFER_BINDING:
642 {
643 *type = GL_INT;
644 *numParams = 1;
645 return true;
646 }
647 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
648 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
649 case GL_UNIFORM_BUFFER_START:
650 case GL_UNIFORM_BUFFER_SIZE:
651 {
652 *type = GL_INT_64_ANGLEX;
653 *numParams = 1;
654 return true;
655 }
656 }
657
Geoff Langeb66a6e2016-10-31 13:06:12 -0400658 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300659 {
660 return false;
661 }
662
663 switch (target)
664 {
665 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
666 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
667 {
668 *type = GL_INT;
669 *numParams = 1;
670 return true;
671 }
672 }
673
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700674 return false;
675}
676
Jamie Madillef300b12016-10-07 15:12:09 -0400677Program *ValidationContext::getProgram(GLuint handle) const
678{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500679 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400680}
681
682Shader *ValidationContext::getShader(GLuint handle) const
683{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500684 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400685}
686
Jamie Madill01a80ee2016-11-07 12:06:18 -0500687bool ValidationContext::isTextureGenerated(GLuint texture) const
688{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500689 return mState.mTextures->isTextureGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500690}
691
692bool ValidationContext::isBufferGenerated(GLuint buffer) const
693{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500694 return mState.mBuffers->isBufferGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500695}
696
697bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
698{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500699 return mState.mRenderbuffers->isRenderbufferGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500700}
701
702bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
703{
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500704 return mState.mFramebuffers->isFramebufferGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500705}
706
Geoff Langce02f082017-02-06 16:46:21 -0500707bool ValidationContext::usingDisplayTextureShareGroup() const
708{
709 return mDisplayTextureShareGroup;
710}
711
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500712} // namespace gl