blob: 826ef0d6cfe31c4a156335013c20dc4dd8bfca31 [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
Geoff Lang9aded172017-04-05 11:07:56 -040064ContextState::ContextState(ContextID 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)),
Jamie Madill70b5bb02017-08-28 13:32:37 -040089 mSyncs(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mSyncs)),
Geoff Lang3bf8e3a2016-12-01 17:28:52 -050090 mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)),
Yunchao Hea336b902017-08-02 16:05:21 +080091 mFramebuffers(new FramebufferManager()),
92 mPipelines(new ProgramPipelineManager())
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
Brandon Jonesed5b46f2017-07-21 08:39:17 -0700101bool ContextState::isWebGL() const
102{
103 return mExtensions.webglCompatibility;
104}
105
Jamie Madilla02315b2017-02-23 14:14:47 -0500106bool ContextState::isWebGL1() const
107{
Brandon Jonesed5b46f2017-07-21 08:39:17 -0700108 return (isWebGL() && mClientVersion.major == 2);
Jamie Madilla02315b2017-02-23 14:14:47 -0500109}
110
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700111const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
112{
113 return mTextureCaps.get(internalFormat);
114}
115
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500116ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500117 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500118 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700119 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500120 const Caps &caps,
121 const TextureCapsMap &textureCaps,
122 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500123 const Limitations &limitations,
124 bool skipValidation)
Geoff Lang9aded172017-04-05 11:07:56 -0400125 : mState(reinterpret_cast<ContextID>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500126 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500127 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400128 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700129 state,
130 caps,
131 textureCaps,
132 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500133 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500134 mSkipValidation(skipValidation),
135 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500136{
137}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700138
139bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
140{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700141 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
142 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
143 // to the fact that it is stored internally as a float, and so would require conversion
144 // if returned from Context::getIntegerv. Since this conversion is already implemented
145 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
146 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
147 // application.
148 switch (pname)
149 {
150 case GL_COMPRESSED_TEXTURE_FORMATS:
151 {
152 *type = GL_INT;
153 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
154 return true;
155 }
156 case GL_PROGRAM_BINARY_FORMATS_OES:
157 {
158 *type = GL_INT;
159 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
160 return true;
161 }
162 case GL_SHADER_BINARY_FORMATS:
163 {
164 *type = GL_INT;
165 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
166 return true;
167 }
168
169 case GL_MAX_VERTEX_ATTRIBS:
170 case GL_MAX_VERTEX_UNIFORM_VECTORS:
171 case GL_MAX_VARYING_VECTORS:
172 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
173 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
174 case GL_MAX_TEXTURE_IMAGE_UNITS:
175 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
176 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700177 case GL_NUM_SHADER_BINARY_FORMATS:
178 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
179 case GL_ARRAY_BUFFER_BINDING:
180 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
181 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
182 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
183 case GL_RENDERBUFFER_BINDING:
184 case GL_CURRENT_PROGRAM:
185 case GL_PACK_ALIGNMENT:
186 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
187 case GL_UNPACK_ALIGNMENT:
188 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700189 case GL_RED_BITS:
190 case GL_GREEN_BITS:
191 case GL_BLUE_BITS:
192 case GL_ALPHA_BITS:
193 case GL_DEPTH_BITS:
194 case GL_STENCIL_BITS:
195 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
196 case GL_CULL_FACE_MODE:
197 case GL_FRONT_FACE:
198 case GL_ACTIVE_TEXTURE:
199 case GL_STENCIL_FUNC:
200 case GL_STENCIL_VALUE_MASK:
201 case GL_STENCIL_REF:
202 case GL_STENCIL_FAIL:
203 case GL_STENCIL_PASS_DEPTH_FAIL:
204 case GL_STENCIL_PASS_DEPTH_PASS:
205 case GL_STENCIL_BACK_FUNC:
206 case GL_STENCIL_BACK_VALUE_MASK:
207 case GL_STENCIL_BACK_REF:
208 case GL_STENCIL_BACK_FAIL:
209 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
210 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
211 case GL_DEPTH_FUNC:
212 case GL_BLEND_SRC_RGB:
213 case GL_BLEND_SRC_ALPHA:
214 case GL_BLEND_DST_RGB:
215 case GL_BLEND_DST_ALPHA:
216 case GL_BLEND_EQUATION_RGB:
217 case GL_BLEND_EQUATION_ALPHA:
218 case GL_STENCIL_WRITEMASK:
219 case GL_STENCIL_BACK_WRITEMASK:
220 case GL_STENCIL_CLEAR_VALUE:
221 case GL_SUBPIXEL_BITS:
222 case GL_MAX_TEXTURE_SIZE:
223 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
224 case GL_SAMPLE_BUFFERS:
225 case GL_SAMPLES:
226 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
227 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
228 case GL_TEXTURE_BINDING_2D:
229 case GL_TEXTURE_BINDING_CUBE_MAP:
230 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
231 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
232 {
233 *type = GL_INT;
234 *numParams = 1;
235 return true;
236 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400237 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
238 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
239 {
240 if (!getExtensions().textureRectangle)
241 {
242 return false;
243 }
244 *type = GL_INT;
245 *numParams = 1;
246 return true;
247 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800248 case GL_MAX_DRAW_BUFFERS_EXT:
249 case GL_MAX_COLOR_ATTACHMENTS_EXT:
250 {
251 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
252 {
253 return false;
254 }
255 *type = GL_INT;
256 *numParams = 1;
257 return true;
258 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700259 case GL_MAX_VIEWPORT_DIMS:
260 {
261 *type = GL_INT;
262 *numParams = 2;
263 return true;
264 }
265 case GL_VIEWPORT:
266 case GL_SCISSOR_BOX:
267 {
268 *type = GL_INT;
269 *numParams = 4;
270 return true;
271 }
272 case GL_SHADER_COMPILER:
273 case GL_SAMPLE_COVERAGE_INVERT:
274 case GL_DEPTH_WRITEMASK:
275 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
276 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
277 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
278 // bool-natural
279 case GL_SAMPLE_COVERAGE:
280 case GL_SCISSOR_TEST:
281 case GL_STENCIL_TEST:
282 case GL_DEPTH_TEST:
283 case GL_BLEND:
284 case GL_DITHER:
285 case GL_CONTEXT_ROBUST_ACCESS_EXT:
286 {
287 *type = GL_BOOL;
288 *numParams = 1;
289 return true;
290 }
291 case GL_COLOR_WRITEMASK:
292 {
293 *type = GL_BOOL;
294 *numParams = 4;
295 return true;
296 }
297 case GL_POLYGON_OFFSET_FACTOR:
298 case GL_POLYGON_OFFSET_UNITS:
299 case GL_SAMPLE_COVERAGE_VALUE:
300 case GL_DEPTH_CLEAR_VALUE:
301 case GL_LINE_WIDTH:
302 {
303 *type = GL_FLOAT;
304 *numParams = 1;
305 return true;
306 }
307 case GL_ALIASED_LINE_WIDTH_RANGE:
308 case GL_ALIASED_POINT_SIZE_RANGE:
309 case GL_DEPTH_RANGE:
310 {
311 *type = GL_FLOAT;
312 *numParams = 2;
313 return true;
314 }
315 case GL_COLOR_CLEAR_VALUE:
316 case GL_BLEND_COLOR:
317 {
318 *type = GL_FLOAT;
319 *numParams = 4;
320 return true;
321 }
322 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langd7d526a2017-02-21 16:48:43 -0500323 if (!getExtensions().textureFilterAnisotropic)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700324 {
325 return false;
326 }
327 *type = GL_FLOAT;
328 *numParams = 1;
329 return true;
330 case GL_TIMESTAMP_EXT:
331 if (!getExtensions().disjointTimerQuery)
332 {
333 return false;
334 }
335 *type = GL_INT_64_ANGLEX;
336 *numParams = 1;
337 return true;
338 case GL_GPU_DISJOINT_EXT:
339 if (!getExtensions().disjointTimerQuery)
340 {
341 return false;
342 }
343 *type = GL_INT;
344 *numParams = 1;
345 return true;
346 case GL_COVERAGE_MODULATION_CHROMIUM:
347 if (!getExtensions().framebufferMixedSamples)
348 {
349 return false;
350 }
351 *type = GL_INT;
352 *numParams = 1;
353 return true;
John Bauman18319182016-09-28 14:22:27 -0700354 case GL_TEXTURE_BINDING_EXTERNAL_OES:
355 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
356 {
357 return false;
358 }
359 *type = GL_INT;
360 *numParams = 1;
361 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700362 }
363
364 if (getExtensions().debug)
365 {
366 switch (pname)
367 {
368 case GL_DEBUG_LOGGED_MESSAGES:
369 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
370 case GL_DEBUG_GROUP_STACK_DEPTH:
371 case GL_MAX_DEBUG_MESSAGE_LENGTH:
372 case GL_MAX_DEBUG_LOGGED_MESSAGES:
373 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
374 case GL_MAX_LABEL_LENGTH:
375 *type = GL_INT;
376 *numParams = 1;
377 return true;
378
379 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
380 case GL_DEBUG_OUTPUT:
381 *type = GL_BOOL;
382 *numParams = 1;
383 return true;
384 }
385 }
386
387 if (getExtensions().multisampleCompatibility)
388 {
389 switch (pname)
390 {
391 case GL_MULTISAMPLE_EXT:
392 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
393 *type = GL_BOOL;
394 *numParams = 1;
395 return true;
396 }
397 }
398
Sami Väisänene45e53b2016-05-25 10:36:04 +0300399 if (getExtensions().pathRendering)
400 {
401 switch (pname)
402 {
403 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
404 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
405 *type = GL_FLOAT;
406 *numParams = 16;
407 return true;
408 }
409 }
410
Geoff Langf41a7152016-09-19 15:11:17 -0400411 if (getExtensions().bindGeneratesResource)
412 {
413 switch (pname)
414 {
415 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
416 *type = GL_BOOL;
417 *numParams = 1;
418 return true;
419 }
420 }
421
Geoff Langfeb8c682017-02-13 16:07:35 -0500422 if (getExtensions().clientArrays)
423 {
424 switch (pname)
425 {
426 case GL_CLIENT_ARRAYS_ANGLE:
427 *type = GL_BOOL;
428 *numParams = 1;
429 return true;
430 }
431 }
432
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700433 if (getExtensions().sRGBWriteControl)
434 {
435 switch (pname)
436 {
437 case GL_FRAMEBUFFER_SRGB_EXT:
438 *type = GL_BOOL;
439 *numParams = 1;
440 return true;
441 }
442 }
443
Jamie Madille08a1d32017-03-07 17:24:06 -0500444 if (getExtensions().robustResourceInitialization &&
445 pname == GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
446 {
447 *type = GL_BOOL;
448 *numParams = 1;
449 return true;
450 }
451
Jamie Madillc43be722017-07-13 16:22:14 -0400452 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
453 {
454 *type = GL_BOOL;
455 *numParams = 1;
456 return true;
457 }
458
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700459 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
460 switch (pname)
461 {
462 case GL_PACK_ROW_LENGTH:
463 case GL_PACK_SKIP_ROWS:
464 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300465 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700466 {
467 return false;
468 }
469 *type = GL_INT;
470 *numParams = 1;
471 return true;
472 case GL_UNPACK_ROW_LENGTH:
473 case GL_UNPACK_SKIP_ROWS:
474 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300475 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700476 {
477 return false;
478 }
479 *type = GL_INT;
480 *numParams = 1;
481 return true;
482 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300483 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700484 {
485 return false;
486 }
487 *type = GL_INT;
488 *numParams = 1;
489 return true;
490 case GL_PIXEL_PACK_BUFFER_BINDING:
491 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300492 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700493 {
494 return false;
495 }
496 *type = GL_INT;
497 *numParams = 1;
498 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500499 case GL_MAX_SAMPLES:
500 {
501 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
502 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
503 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
504 {
505 return false;
506 }
507 *type = GL_INT;
508 *numParams = 1;
509 return true;
Geoff Lang6170bef2017-07-18 15:51:14 -0400510
511 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
512 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
513 {
514 return false;
515 }
516 *type = GL_INT;
517 *numParams = 1;
518 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500519 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700520 }
521
Geoff Langd90d3882017-03-21 10:49:54 -0400522 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
523 {
524 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
525 {
526 return false;
527 }
528 *type = GL_INT;
529 *numParams = 1;
530 return true;
531 }
532
Martin Radeve5285d22017-07-14 16:23:53 +0300533 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
534 {
535 *type = GL_INT;
536 *numParams = 1;
537 return true;
538 }
539
Geoff Langeb66a6e2016-10-31 13:06:12 -0400540 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700541 {
542 return false;
543 }
544
545 // Check for ES3.0+ parameter names
546 switch (pname)
547 {
548 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
549 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
550 case GL_UNIFORM_BUFFER_BINDING:
551 case GL_TRANSFORM_FEEDBACK_BINDING:
552 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
553 case GL_COPY_READ_BUFFER_BINDING:
554 case GL_COPY_WRITE_BUFFER_BINDING:
555 case GL_SAMPLER_BINDING:
556 case GL_READ_BUFFER:
557 case GL_TEXTURE_BINDING_3D:
558 case GL_TEXTURE_BINDING_2D_ARRAY:
559 case GL_MAX_3D_TEXTURE_SIZE:
560 case GL_MAX_ARRAY_TEXTURE_LAYERS:
561 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
562 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
563 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
564 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
565 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
566 case GL_MAX_VARYING_COMPONENTS:
567 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
568 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
569 case GL_MIN_PROGRAM_TEXEL_OFFSET:
570 case GL_MAX_PROGRAM_TEXEL_OFFSET:
571 case GL_NUM_EXTENSIONS:
572 case GL_MAJOR_VERSION:
573 case GL_MINOR_VERSION:
574 case GL_MAX_ELEMENTS_INDICES:
575 case GL_MAX_ELEMENTS_VERTICES:
576 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
577 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
578 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
579 case GL_UNPACK_IMAGE_HEIGHT:
580 case GL_UNPACK_SKIP_IMAGES:
581 {
582 *type = GL_INT;
583 *numParams = 1;
584 return true;
585 }
586
587 case GL_MAX_ELEMENT_INDEX:
588 case GL_MAX_UNIFORM_BLOCK_SIZE:
589 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
590 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
591 case GL_MAX_SERVER_WAIT_TIMEOUT:
592 {
593 *type = GL_INT_64_ANGLEX;
594 *numParams = 1;
595 return true;
596 }
597
598 case GL_TRANSFORM_FEEDBACK_ACTIVE:
599 case GL_TRANSFORM_FEEDBACK_PAUSED:
600 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
601 case GL_RASTERIZER_DISCARD:
602 {
603 *type = GL_BOOL;
604 *numParams = 1;
605 return true;
606 }
607
608 case GL_MAX_TEXTURE_LOD_BIAS:
609 {
610 *type = GL_FLOAT;
611 *numParams = 1;
612 return true;
613 }
614 }
615
Geoff Langc339c4e2016-11-29 10:37:36 -0500616 if (getExtensions().requestExtension)
617 {
618 switch (pname)
619 {
620 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
621 *type = GL_INT;
622 *numParams = 1;
623 return true;
624 }
625 }
626
Geoff Langeb66a6e2016-10-31 13:06:12 -0400627 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300628 {
629 return false;
630 }
631
632 switch (pname)
633 {
Jiajia Qin6eafb042016-12-27 17:04:07 +0800634 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800635 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300636 case GL_MAX_FRAMEBUFFER_WIDTH:
637 case GL_MAX_FRAMEBUFFER_HEIGHT:
638 case GL_MAX_FRAMEBUFFER_SAMPLES:
639 case GL_MAX_SAMPLE_MASK_WORDS:
640 case GL_MAX_COLOR_TEXTURE_SAMPLES:
641 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
642 case GL_MAX_INTEGER_SAMPLES:
643 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
644 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
645 case GL_MAX_VERTEX_ATTRIB_STRIDE:
646 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
647 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
648 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
649 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
650 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
651 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
652 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
653 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
654 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
655 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
656 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
657 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
658 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
659 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
660 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
661 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
662 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
663 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
664 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
665 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
666 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
667 case GL_MAX_UNIFORM_LOCATIONS:
668 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
669 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
670 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
671 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
672 case GL_MAX_IMAGE_UNITS:
673 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
674 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
675 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800676 case GL_SHADER_STORAGE_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300677 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
JiangYizhou24fe74c2017-07-06 16:56:50 +0800678 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Martin Radev66fb8202016-07-28 11:45:20 +0300679 *type = GL_INT;
680 *numParams = 1;
681 return true;
682 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
683 *type = GL_INT_64_ANGLEX;
684 *numParams = 1;
685 return true;
686 }
687
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700688 return false;
689}
690
691bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
692 GLenum *type,
693 unsigned int *numParams)
694{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400695 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700696 {
697 return false;
698 }
699
700 switch (target)
701 {
702 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
703 case GL_UNIFORM_BUFFER_BINDING:
704 {
705 *type = GL_INT;
706 *numParams = 1;
707 return true;
708 }
709 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
710 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
711 case GL_UNIFORM_BUFFER_START:
712 case GL_UNIFORM_BUFFER_SIZE:
713 {
714 *type = GL_INT_64_ANGLEX;
715 *numParams = 1;
716 return true;
717 }
718 }
719
Geoff Langeb66a6e2016-10-31 13:06:12 -0400720 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300721 {
722 return false;
723 }
724
725 switch (target)
726 {
727 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
728 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800729 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800730 case GL_SHADER_STORAGE_BUFFER_BINDING:
Shao80957d92017-02-20 21:25:59 +0800731 case GL_VERTEX_BINDING_BUFFER:
732 case GL_VERTEX_BINDING_DIVISOR:
733 case GL_VERTEX_BINDING_OFFSET:
734 case GL_VERTEX_BINDING_STRIDE:
Martin Radev66fb8202016-07-28 11:45:20 +0300735 {
736 *type = GL_INT;
737 *numParams = 1;
738 return true;
739 }
Jiajia Qin6eafb042016-12-27 17:04:07 +0800740 case GL_ATOMIC_COUNTER_BUFFER_START:
741 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800742 case GL_SHADER_STORAGE_BUFFER_START:
743 case GL_SHADER_STORAGE_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800744 {
745 *type = GL_INT_64_ANGLEX;
746 *numParams = 1;
747 return true;
748 }
Martin Radev66fb8202016-07-28 11:45:20 +0300749 }
750
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700751 return false;
752}
753
Jamie Madillef300b12016-10-07 15:12:09 -0400754Program *ValidationContext::getProgram(GLuint handle) const
755{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500756 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400757}
758
759Shader *ValidationContext::getShader(GLuint handle) const
760{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500761 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400762}
763
Jamie Madill01a80ee2016-11-07 12:06:18 -0500764bool ValidationContext::isTextureGenerated(GLuint texture) const
765{
Jamie Madillc74ff572017-06-22 14:45:45 -0400766 return mState.mTextures->isHandleGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500767}
768
769bool ValidationContext::isBufferGenerated(GLuint buffer) const
770{
Jamie Madillc74ff572017-06-22 14:45:45 -0400771 return mState.mBuffers->isHandleGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500772}
773
774bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
775{
Jamie Madillc74ff572017-06-22 14:45:45 -0400776 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500777}
778
779bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
780{
Jamie Madillc74ff572017-06-22 14:45:45 -0400781 return mState.mFramebuffers->isHandleGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500782}
783
Yunchao Hea336b902017-08-02 16:05:21 +0800784bool ValidationContext::isProgramPipelineGenerated(GLuint pipeline) const
785{
786 return mState.mPipelines->isHandleGenerated(pipeline);
787}
788
Geoff Langce02f082017-02-06 16:46:21 -0500789bool ValidationContext::usingDisplayTextureShareGroup() const
790{
791 return mDisplayTextureShareGroup;
792}
793
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500794GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
795{
796 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
797 internalformat == GL_DEPTH_STENCIL
798 ? GL_DEPTH24_STENCIL8
799 : internalformat;
800}
801
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500802} // namespace gl