blob: baf35d462a7e7adf71afa8634acbe6909e4f90f9 [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:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700186 case GL_UNPACK_ALIGNMENT:
187 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700188 case GL_RED_BITS:
189 case GL_GREEN_BITS:
190 case GL_BLUE_BITS:
191 case GL_ALPHA_BITS:
192 case GL_DEPTH_BITS:
193 case GL_STENCIL_BITS:
194 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
195 case GL_CULL_FACE_MODE:
196 case GL_FRONT_FACE:
197 case GL_ACTIVE_TEXTURE:
198 case GL_STENCIL_FUNC:
199 case GL_STENCIL_VALUE_MASK:
200 case GL_STENCIL_REF:
201 case GL_STENCIL_FAIL:
202 case GL_STENCIL_PASS_DEPTH_FAIL:
203 case GL_STENCIL_PASS_DEPTH_PASS:
204 case GL_STENCIL_BACK_FUNC:
205 case GL_STENCIL_BACK_VALUE_MASK:
206 case GL_STENCIL_BACK_REF:
207 case GL_STENCIL_BACK_FAIL:
208 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
209 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
210 case GL_DEPTH_FUNC:
211 case GL_BLEND_SRC_RGB:
212 case GL_BLEND_SRC_ALPHA:
213 case GL_BLEND_DST_RGB:
214 case GL_BLEND_DST_ALPHA:
215 case GL_BLEND_EQUATION_RGB:
216 case GL_BLEND_EQUATION_ALPHA:
217 case GL_STENCIL_WRITEMASK:
218 case GL_STENCIL_BACK_WRITEMASK:
219 case GL_STENCIL_CLEAR_VALUE:
220 case GL_SUBPIXEL_BITS:
221 case GL_MAX_TEXTURE_SIZE:
222 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
223 case GL_SAMPLE_BUFFERS:
224 case GL_SAMPLES:
225 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
226 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
227 case GL_TEXTURE_BINDING_2D:
228 case GL_TEXTURE_BINDING_CUBE_MAP:
229 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
230 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
231 {
232 *type = GL_INT;
233 *numParams = 1;
234 return true;
235 }
Geoff Lang000dab82017-09-27 14:27:07 -0400236 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
237 {
238 if (!getExtensions().packReverseRowOrder)
239 {
240 return false;
241 }
242 *type = GL_INT;
243 *numParams = 1;
244 return true;
245 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400246 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
247 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
248 {
249 if (!getExtensions().textureRectangle)
250 {
251 return false;
252 }
253 *type = GL_INT;
254 *numParams = 1;
255 return true;
256 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800257 case GL_MAX_DRAW_BUFFERS_EXT:
258 case GL_MAX_COLOR_ATTACHMENTS_EXT:
259 {
260 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
261 {
262 return false;
263 }
264 *type = GL_INT;
265 *numParams = 1;
266 return true;
267 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700268 case GL_MAX_VIEWPORT_DIMS:
269 {
270 *type = GL_INT;
271 *numParams = 2;
272 return true;
273 }
274 case GL_VIEWPORT:
275 case GL_SCISSOR_BOX:
276 {
277 *type = GL_INT;
278 *numParams = 4;
279 return true;
280 }
281 case GL_SHADER_COMPILER:
282 case GL_SAMPLE_COVERAGE_INVERT:
283 case GL_DEPTH_WRITEMASK:
284 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
285 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
286 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
287 // bool-natural
288 case GL_SAMPLE_COVERAGE:
289 case GL_SCISSOR_TEST:
290 case GL_STENCIL_TEST:
291 case GL_DEPTH_TEST:
292 case GL_BLEND:
293 case GL_DITHER:
294 case GL_CONTEXT_ROBUST_ACCESS_EXT:
295 {
296 *type = GL_BOOL;
297 *numParams = 1;
298 return true;
299 }
300 case GL_COLOR_WRITEMASK:
301 {
302 *type = GL_BOOL;
303 *numParams = 4;
304 return true;
305 }
306 case GL_POLYGON_OFFSET_FACTOR:
307 case GL_POLYGON_OFFSET_UNITS:
308 case GL_SAMPLE_COVERAGE_VALUE:
309 case GL_DEPTH_CLEAR_VALUE:
310 case GL_LINE_WIDTH:
311 {
312 *type = GL_FLOAT;
313 *numParams = 1;
314 return true;
315 }
316 case GL_ALIASED_LINE_WIDTH_RANGE:
317 case GL_ALIASED_POINT_SIZE_RANGE:
318 case GL_DEPTH_RANGE:
319 {
320 *type = GL_FLOAT;
321 *numParams = 2;
322 return true;
323 }
324 case GL_COLOR_CLEAR_VALUE:
325 case GL_BLEND_COLOR:
326 {
327 *type = GL_FLOAT;
328 *numParams = 4;
329 return true;
330 }
331 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langd7d526a2017-02-21 16:48:43 -0500332 if (!getExtensions().textureFilterAnisotropic)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700333 {
334 return false;
335 }
336 *type = GL_FLOAT;
337 *numParams = 1;
338 return true;
339 case GL_TIMESTAMP_EXT:
340 if (!getExtensions().disjointTimerQuery)
341 {
342 return false;
343 }
344 *type = GL_INT_64_ANGLEX;
345 *numParams = 1;
346 return true;
347 case GL_GPU_DISJOINT_EXT:
348 if (!getExtensions().disjointTimerQuery)
349 {
350 return false;
351 }
352 *type = GL_INT;
353 *numParams = 1;
354 return true;
355 case GL_COVERAGE_MODULATION_CHROMIUM:
356 if (!getExtensions().framebufferMixedSamples)
357 {
358 return false;
359 }
360 *type = GL_INT;
361 *numParams = 1;
362 return true;
John Bauman18319182016-09-28 14:22:27 -0700363 case GL_TEXTURE_BINDING_EXTERNAL_OES:
364 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
365 {
366 return false;
367 }
368 *type = GL_INT;
369 *numParams = 1;
370 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700371 }
372
373 if (getExtensions().debug)
374 {
375 switch (pname)
376 {
377 case GL_DEBUG_LOGGED_MESSAGES:
378 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
379 case GL_DEBUG_GROUP_STACK_DEPTH:
380 case GL_MAX_DEBUG_MESSAGE_LENGTH:
381 case GL_MAX_DEBUG_LOGGED_MESSAGES:
382 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
383 case GL_MAX_LABEL_LENGTH:
384 *type = GL_INT;
385 *numParams = 1;
386 return true;
387
388 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
389 case GL_DEBUG_OUTPUT:
390 *type = GL_BOOL;
391 *numParams = 1;
392 return true;
393 }
394 }
395
396 if (getExtensions().multisampleCompatibility)
397 {
398 switch (pname)
399 {
400 case GL_MULTISAMPLE_EXT:
401 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
402 *type = GL_BOOL;
403 *numParams = 1;
404 return true;
405 }
406 }
407
Sami Väisänene45e53b2016-05-25 10:36:04 +0300408 if (getExtensions().pathRendering)
409 {
410 switch (pname)
411 {
412 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
413 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
414 *type = GL_FLOAT;
415 *numParams = 16;
416 return true;
417 }
418 }
419
Geoff Langf41a7152016-09-19 15:11:17 -0400420 if (getExtensions().bindGeneratesResource)
421 {
422 switch (pname)
423 {
424 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
425 *type = GL_BOOL;
426 *numParams = 1;
427 return true;
428 }
429 }
430
Geoff Langfeb8c682017-02-13 16:07:35 -0500431 if (getExtensions().clientArrays)
432 {
433 switch (pname)
434 {
435 case GL_CLIENT_ARRAYS_ANGLE:
436 *type = GL_BOOL;
437 *numParams = 1;
438 return true;
439 }
440 }
441
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700442 if (getExtensions().sRGBWriteControl)
443 {
444 switch (pname)
445 {
446 case GL_FRAMEBUFFER_SRGB_EXT:
447 *type = GL_BOOL;
448 *numParams = 1;
449 return true;
450 }
451 }
452
Jamie Madille08a1d32017-03-07 17:24:06 -0500453 if (getExtensions().robustResourceInitialization &&
454 pname == GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
455 {
456 *type = GL_BOOL;
457 *numParams = 1;
458 return true;
459 }
460
Jamie Madillc43be722017-07-13 16:22:14 -0400461 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
462 {
463 *type = GL_BOOL;
464 *numParams = 1;
465 return true;
466 }
467
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700468 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
469 switch (pname)
470 {
471 case GL_PACK_ROW_LENGTH:
472 case GL_PACK_SKIP_ROWS:
473 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300474 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700475 {
476 return false;
477 }
478 *type = GL_INT;
479 *numParams = 1;
480 return true;
481 case GL_UNPACK_ROW_LENGTH:
482 case GL_UNPACK_SKIP_ROWS:
483 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300484 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700485 {
486 return false;
487 }
488 *type = GL_INT;
489 *numParams = 1;
490 return true;
491 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300492 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700493 {
494 return false;
495 }
496 *type = GL_INT;
497 *numParams = 1;
498 return true;
499 case GL_PIXEL_PACK_BUFFER_BINDING:
500 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300501 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700502 {
503 return false;
504 }
505 *type = GL_INT;
506 *numParams = 1;
507 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500508 case GL_MAX_SAMPLES:
509 {
510 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
511 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
512 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
513 {
514 return false;
515 }
516 *type = GL_INT;
517 *numParams = 1;
518 return true;
Geoff Lang6170bef2017-07-18 15:51:14 -0400519
520 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
521 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
522 {
523 return false;
524 }
525 *type = GL_INT;
526 *numParams = 1;
527 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500528 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700529 }
530
Geoff Langd90d3882017-03-21 10:49:54 -0400531 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
532 {
533 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
534 {
535 return false;
536 }
537 *type = GL_INT;
538 *numParams = 1;
539 return true;
540 }
541
Martin Radeve5285d22017-07-14 16:23:53 +0300542 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
543 {
544 *type = GL_INT;
545 *numParams = 1;
546 return true;
547 }
548
Geoff Langeb66a6e2016-10-31 13:06:12 -0400549 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700550 {
551 return false;
552 }
553
554 // Check for ES3.0+ parameter names
555 switch (pname)
556 {
557 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
558 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
559 case GL_UNIFORM_BUFFER_BINDING:
560 case GL_TRANSFORM_FEEDBACK_BINDING:
561 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
562 case GL_COPY_READ_BUFFER_BINDING:
563 case GL_COPY_WRITE_BUFFER_BINDING:
564 case GL_SAMPLER_BINDING:
565 case GL_READ_BUFFER:
566 case GL_TEXTURE_BINDING_3D:
567 case GL_TEXTURE_BINDING_2D_ARRAY:
568 case GL_MAX_3D_TEXTURE_SIZE:
569 case GL_MAX_ARRAY_TEXTURE_LAYERS:
570 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
571 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
572 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
573 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
574 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
575 case GL_MAX_VARYING_COMPONENTS:
576 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
577 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
578 case GL_MIN_PROGRAM_TEXEL_OFFSET:
579 case GL_MAX_PROGRAM_TEXEL_OFFSET:
580 case GL_NUM_EXTENSIONS:
581 case GL_MAJOR_VERSION:
582 case GL_MINOR_VERSION:
583 case GL_MAX_ELEMENTS_INDICES:
584 case GL_MAX_ELEMENTS_VERTICES:
585 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
586 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
587 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
588 case GL_UNPACK_IMAGE_HEIGHT:
589 case GL_UNPACK_SKIP_IMAGES:
590 {
591 *type = GL_INT;
592 *numParams = 1;
593 return true;
594 }
595
596 case GL_MAX_ELEMENT_INDEX:
597 case GL_MAX_UNIFORM_BLOCK_SIZE:
598 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
599 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
600 case GL_MAX_SERVER_WAIT_TIMEOUT:
601 {
602 *type = GL_INT_64_ANGLEX;
603 *numParams = 1;
604 return true;
605 }
606
607 case GL_TRANSFORM_FEEDBACK_ACTIVE:
608 case GL_TRANSFORM_FEEDBACK_PAUSED:
609 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
610 case GL_RASTERIZER_DISCARD:
611 {
612 *type = GL_BOOL;
613 *numParams = 1;
614 return true;
615 }
616
617 case GL_MAX_TEXTURE_LOD_BIAS:
618 {
619 *type = GL_FLOAT;
620 *numParams = 1;
621 return true;
622 }
623 }
624
Geoff Langc339c4e2016-11-29 10:37:36 -0500625 if (getExtensions().requestExtension)
626 {
627 switch (pname)
628 {
629 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
630 *type = GL_INT;
631 *numParams = 1;
632 return true;
633 }
634 }
635
Geoff Langeb66a6e2016-10-31 13:06:12 -0400636 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300637 {
638 return false;
639 }
640
641 switch (pname)
642 {
Jiajia Qin6eafb042016-12-27 17:04:07 +0800643 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800644 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300645 case GL_MAX_FRAMEBUFFER_WIDTH:
646 case GL_MAX_FRAMEBUFFER_HEIGHT:
647 case GL_MAX_FRAMEBUFFER_SAMPLES:
648 case GL_MAX_SAMPLE_MASK_WORDS:
649 case GL_MAX_COLOR_TEXTURE_SAMPLES:
650 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
651 case GL_MAX_INTEGER_SAMPLES:
652 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
653 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
654 case GL_MAX_VERTEX_ATTRIB_STRIDE:
655 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
656 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
657 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
658 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
659 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
660 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
661 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
662 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
663 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
664 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
665 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
666 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
667 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
668 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
669 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
670 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
671 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
672 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
673 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
674 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
675 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
676 case GL_MAX_UNIFORM_LOCATIONS:
677 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
678 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
679 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
680 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
681 case GL_MAX_IMAGE_UNITS:
682 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
683 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
684 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800685 case GL_SHADER_STORAGE_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300686 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
JiangYizhou24fe74c2017-07-06 16:56:50 +0800687 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Martin Radev66fb8202016-07-28 11:45:20 +0300688 *type = GL_INT;
689 *numParams = 1;
690 return true;
691 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
692 *type = GL_INT_64_ANGLEX;
693 *numParams = 1;
694 return true;
Jiawei Shaodb342272017-09-27 10:21:45 +0800695 case GL_SAMPLE_MASK:
696 *type = GL_BOOL;
697 *numParams = 1;
698 return true;
Martin Radev66fb8202016-07-28 11:45:20 +0300699 }
700
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700701 return false;
702}
703
704bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
705 GLenum *type,
706 unsigned int *numParams)
707{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400708 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700709 {
710 return false;
711 }
712
713 switch (target)
714 {
715 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
716 case GL_UNIFORM_BUFFER_BINDING:
717 {
718 *type = GL_INT;
719 *numParams = 1;
720 return true;
721 }
722 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
723 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
724 case GL_UNIFORM_BUFFER_START:
725 case GL_UNIFORM_BUFFER_SIZE:
726 {
727 *type = GL_INT_64_ANGLEX;
728 *numParams = 1;
729 return true;
730 }
731 }
732
Geoff Langeb66a6e2016-10-31 13:06:12 -0400733 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300734 {
735 return false;
736 }
737
738 switch (target)
739 {
740 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
741 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800742 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800743 case GL_SHADER_STORAGE_BUFFER_BINDING:
Shao80957d92017-02-20 21:25:59 +0800744 case GL_VERTEX_BINDING_BUFFER:
745 case GL_VERTEX_BINDING_DIVISOR:
746 case GL_VERTEX_BINDING_OFFSET:
747 case GL_VERTEX_BINDING_STRIDE:
Jiawei Shaodb342272017-09-27 10:21:45 +0800748 case GL_SAMPLE_MASK_VALUE:
Martin Radev66fb8202016-07-28 11:45:20 +0300749 {
750 *type = GL_INT;
751 *numParams = 1;
752 return true;
753 }
Jiajia Qin6eafb042016-12-27 17:04:07 +0800754 case GL_ATOMIC_COUNTER_BUFFER_START:
755 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800756 case GL_SHADER_STORAGE_BUFFER_START:
757 case GL_SHADER_STORAGE_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800758 {
759 *type = GL_INT_64_ANGLEX;
760 *numParams = 1;
761 return true;
762 }
Martin Radev66fb8202016-07-28 11:45:20 +0300763 }
764
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700765 return false;
766}
767
Jamie Madillef300b12016-10-07 15:12:09 -0400768Program *ValidationContext::getProgram(GLuint handle) const
769{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500770 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400771}
772
773Shader *ValidationContext::getShader(GLuint handle) const
774{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500775 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400776}
777
Jamie Madill01a80ee2016-11-07 12:06:18 -0500778bool ValidationContext::isTextureGenerated(GLuint texture) const
779{
Jamie Madillc74ff572017-06-22 14:45:45 -0400780 return mState.mTextures->isHandleGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500781}
782
783bool ValidationContext::isBufferGenerated(GLuint buffer) const
784{
Jamie Madillc74ff572017-06-22 14:45:45 -0400785 return mState.mBuffers->isHandleGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500786}
787
788bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
789{
Jamie Madillc74ff572017-06-22 14:45:45 -0400790 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500791}
792
793bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
794{
Jamie Madillc74ff572017-06-22 14:45:45 -0400795 return mState.mFramebuffers->isHandleGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500796}
797
Yunchao Hea336b902017-08-02 16:05:21 +0800798bool ValidationContext::isProgramPipelineGenerated(GLuint pipeline) const
799{
800 return mState.mPipelines->isHandleGenerated(pipeline);
801}
802
Geoff Langce02f082017-02-06 16:46:21 -0500803bool ValidationContext::usingDisplayTextureShareGroup() const
804{
805 return mDisplayTextureShareGroup;
806}
807
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500808GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
809{
810 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
811 internalformat == GL_DEPTH_STENCIL
812 ? GL_DEPTH24_STENCIL8
813 : internalformat;
814}
815
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500816} // namespace gl