blob: ca3d2ef0f5b3fe6622dbca5c21c0fa5594144bd0 [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)),
91 mFramebuffers(new FramebufferManager())
Jamie Madill9082b982016-04-27 15:21:51 -040092{
93}
Jamie Madill1e9ae072014-11-06 15:27:21 -050094
Jamie Madill9082b982016-04-27 15:21:51 -040095ContextState::~ContextState()
Jamie Madill1e9ae072014-11-06 15:27:21 -050096{
Jamie Madill6c1f6712017-02-14 19:08:04 -050097 // Handles are released by the Context.
Jamie Madill1e9ae072014-11-06 15:27:21 -050098}
99
Brandon Jonesed5b46f2017-07-21 08:39:17 -0700100bool ContextState::isWebGL() const
101{
102 return mExtensions.webglCompatibility;
103}
104
Jamie Madilla02315b2017-02-23 14:14:47 -0500105bool ContextState::isWebGL1() const
106{
Brandon Jonesed5b46f2017-07-21 08:39:17 -0700107 return (isWebGL() && mClientVersion.major == 2);
Jamie Madilla02315b2017-02-23 14:14:47 -0500108}
109
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700110const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
111{
112 return mTextureCaps.get(internalFormat);
113}
114
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500115ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500116 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500117 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700118 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500119 const Caps &caps,
120 const TextureCapsMap &textureCaps,
121 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500122 const Limitations &limitations,
123 bool skipValidation)
Geoff Lang9aded172017-04-05 11:07:56 -0400124 : mState(reinterpret_cast<ContextID>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500125 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500126 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400127 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700128 state,
129 caps,
130 textureCaps,
131 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500132 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500133 mSkipValidation(skipValidation),
134 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500135{
136}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700137
138bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
139{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700140 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
141 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
142 // to the fact that it is stored internally as a float, and so would require conversion
143 // if returned from Context::getIntegerv. Since this conversion is already implemented
144 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
145 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
146 // application.
147 switch (pname)
148 {
149 case GL_COMPRESSED_TEXTURE_FORMATS:
150 {
151 *type = GL_INT;
152 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
153 return true;
154 }
155 case GL_PROGRAM_BINARY_FORMATS_OES:
156 {
157 *type = GL_INT;
158 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
159 return true;
160 }
161 case GL_SHADER_BINARY_FORMATS:
162 {
163 *type = GL_INT;
164 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
165 return true;
166 }
167
168 case GL_MAX_VERTEX_ATTRIBS:
169 case GL_MAX_VERTEX_UNIFORM_VECTORS:
170 case GL_MAX_VARYING_VECTORS:
171 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
172 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
173 case GL_MAX_TEXTURE_IMAGE_UNITS:
174 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
175 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700176 case GL_NUM_SHADER_BINARY_FORMATS:
177 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
178 case GL_ARRAY_BUFFER_BINDING:
179 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
180 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
181 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
182 case GL_RENDERBUFFER_BINDING:
183 case GL_CURRENT_PROGRAM:
184 case GL_PACK_ALIGNMENT:
185 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
186 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 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400236 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
237 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
238 {
239 if (!getExtensions().textureRectangle)
240 {
241 return false;
242 }
243 *type = GL_INT;
244 *numParams = 1;
245 return true;
246 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800247 case GL_MAX_DRAW_BUFFERS_EXT:
248 case GL_MAX_COLOR_ATTACHMENTS_EXT:
249 {
250 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
251 {
252 return false;
253 }
254 *type = GL_INT;
255 *numParams = 1;
256 return true;
257 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700258 case GL_MAX_VIEWPORT_DIMS:
259 {
260 *type = GL_INT;
261 *numParams = 2;
262 return true;
263 }
264 case GL_VIEWPORT:
265 case GL_SCISSOR_BOX:
266 {
267 *type = GL_INT;
268 *numParams = 4;
269 return true;
270 }
271 case GL_SHADER_COMPILER:
272 case GL_SAMPLE_COVERAGE_INVERT:
273 case GL_DEPTH_WRITEMASK:
274 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
275 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
276 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
277 // bool-natural
278 case GL_SAMPLE_COVERAGE:
279 case GL_SCISSOR_TEST:
280 case GL_STENCIL_TEST:
281 case GL_DEPTH_TEST:
282 case GL_BLEND:
283 case GL_DITHER:
284 case GL_CONTEXT_ROBUST_ACCESS_EXT:
285 {
286 *type = GL_BOOL;
287 *numParams = 1;
288 return true;
289 }
290 case GL_COLOR_WRITEMASK:
291 {
292 *type = GL_BOOL;
293 *numParams = 4;
294 return true;
295 }
296 case GL_POLYGON_OFFSET_FACTOR:
297 case GL_POLYGON_OFFSET_UNITS:
298 case GL_SAMPLE_COVERAGE_VALUE:
299 case GL_DEPTH_CLEAR_VALUE:
300 case GL_LINE_WIDTH:
301 {
302 *type = GL_FLOAT;
303 *numParams = 1;
304 return true;
305 }
306 case GL_ALIASED_LINE_WIDTH_RANGE:
307 case GL_ALIASED_POINT_SIZE_RANGE:
308 case GL_DEPTH_RANGE:
309 {
310 *type = GL_FLOAT;
311 *numParams = 2;
312 return true;
313 }
314 case GL_COLOR_CLEAR_VALUE:
315 case GL_BLEND_COLOR:
316 {
317 *type = GL_FLOAT;
318 *numParams = 4;
319 return true;
320 }
321 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langd7d526a2017-02-21 16:48:43 -0500322 if (!getExtensions().textureFilterAnisotropic)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700323 {
324 return false;
325 }
326 *type = GL_FLOAT;
327 *numParams = 1;
328 return true;
329 case GL_TIMESTAMP_EXT:
330 if (!getExtensions().disjointTimerQuery)
331 {
332 return false;
333 }
334 *type = GL_INT_64_ANGLEX;
335 *numParams = 1;
336 return true;
337 case GL_GPU_DISJOINT_EXT:
338 if (!getExtensions().disjointTimerQuery)
339 {
340 return false;
341 }
342 *type = GL_INT;
343 *numParams = 1;
344 return true;
345 case GL_COVERAGE_MODULATION_CHROMIUM:
346 if (!getExtensions().framebufferMixedSamples)
347 {
348 return false;
349 }
350 *type = GL_INT;
351 *numParams = 1;
352 return true;
John Bauman18319182016-09-28 14:22:27 -0700353 case GL_TEXTURE_BINDING_EXTERNAL_OES:
354 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
355 {
356 return false;
357 }
358 *type = GL_INT;
359 *numParams = 1;
360 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700361 }
362
363 if (getExtensions().debug)
364 {
365 switch (pname)
366 {
367 case GL_DEBUG_LOGGED_MESSAGES:
368 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
369 case GL_DEBUG_GROUP_STACK_DEPTH:
370 case GL_MAX_DEBUG_MESSAGE_LENGTH:
371 case GL_MAX_DEBUG_LOGGED_MESSAGES:
372 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
373 case GL_MAX_LABEL_LENGTH:
374 *type = GL_INT;
375 *numParams = 1;
376 return true;
377
378 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
379 case GL_DEBUG_OUTPUT:
380 *type = GL_BOOL;
381 *numParams = 1;
382 return true;
383 }
384 }
385
386 if (getExtensions().multisampleCompatibility)
387 {
388 switch (pname)
389 {
390 case GL_MULTISAMPLE_EXT:
391 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
392 *type = GL_BOOL;
393 *numParams = 1;
394 return true;
395 }
396 }
397
Sami Väisänene45e53b2016-05-25 10:36:04 +0300398 if (getExtensions().pathRendering)
399 {
400 switch (pname)
401 {
402 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
403 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
404 *type = GL_FLOAT;
405 *numParams = 16;
406 return true;
407 }
408 }
409
Geoff Langf41a7152016-09-19 15:11:17 -0400410 if (getExtensions().bindGeneratesResource)
411 {
412 switch (pname)
413 {
414 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
415 *type = GL_BOOL;
416 *numParams = 1;
417 return true;
418 }
419 }
420
Geoff Langfeb8c682017-02-13 16:07:35 -0500421 if (getExtensions().clientArrays)
422 {
423 switch (pname)
424 {
425 case GL_CLIENT_ARRAYS_ANGLE:
426 *type = GL_BOOL;
427 *numParams = 1;
428 return true;
429 }
430 }
431
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700432 if (getExtensions().sRGBWriteControl)
433 {
434 switch (pname)
435 {
436 case GL_FRAMEBUFFER_SRGB_EXT:
437 *type = GL_BOOL;
438 *numParams = 1;
439 return true;
440 }
441 }
442
Jamie Madille08a1d32017-03-07 17:24:06 -0500443 if (getExtensions().robustResourceInitialization &&
444 pname == GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
445 {
446 *type = GL_BOOL;
447 *numParams = 1;
448 return true;
449 }
450
Jamie Madillc43be722017-07-13 16:22:14 -0400451 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
452 {
453 *type = GL_BOOL;
454 *numParams = 1;
455 return true;
456 }
457
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700458 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
459 switch (pname)
460 {
461 case GL_PACK_ROW_LENGTH:
462 case GL_PACK_SKIP_ROWS:
463 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300464 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700465 {
466 return false;
467 }
468 *type = GL_INT;
469 *numParams = 1;
470 return true;
471 case GL_UNPACK_ROW_LENGTH:
472 case GL_UNPACK_SKIP_ROWS:
473 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300474 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
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_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300482 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700483 {
484 return false;
485 }
486 *type = GL_INT;
487 *numParams = 1;
488 return true;
489 case GL_PIXEL_PACK_BUFFER_BINDING:
490 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300491 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700492 {
493 return false;
494 }
495 *type = GL_INT;
496 *numParams = 1;
497 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500498 case GL_MAX_SAMPLES:
499 {
500 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
501 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
502 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
503 {
504 return false;
505 }
506 *type = GL_INT;
507 *numParams = 1;
508 return true;
Geoff Lang6170bef2017-07-18 15:51:14 -0400509
510 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
511 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
512 {
513 return false;
514 }
515 *type = GL_INT;
516 *numParams = 1;
517 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500518 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700519 }
520
Geoff Langd90d3882017-03-21 10:49:54 -0400521 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
522 {
523 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
524 {
525 return false;
526 }
527 *type = GL_INT;
528 *numParams = 1;
529 return true;
530 }
531
Martin Radeve5285d22017-07-14 16:23:53 +0300532 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
533 {
534 *type = GL_INT;
535 *numParams = 1;
536 return true;
537 }
538
Geoff Langeb66a6e2016-10-31 13:06:12 -0400539 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700540 {
541 return false;
542 }
543
544 // Check for ES3.0+ parameter names
545 switch (pname)
546 {
547 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
548 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
549 case GL_UNIFORM_BUFFER_BINDING:
550 case GL_TRANSFORM_FEEDBACK_BINDING:
551 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
552 case GL_COPY_READ_BUFFER_BINDING:
553 case GL_COPY_WRITE_BUFFER_BINDING:
554 case GL_SAMPLER_BINDING:
555 case GL_READ_BUFFER:
556 case GL_TEXTURE_BINDING_3D:
557 case GL_TEXTURE_BINDING_2D_ARRAY:
558 case GL_MAX_3D_TEXTURE_SIZE:
559 case GL_MAX_ARRAY_TEXTURE_LAYERS:
560 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
561 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
562 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
563 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
564 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
565 case GL_MAX_VARYING_COMPONENTS:
566 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
567 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
568 case GL_MIN_PROGRAM_TEXEL_OFFSET:
569 case GL_MAX_PROGRAM_TEXEL_OFFSET:
570 case GL_NUM_EXTENSIONS:
571 case GL_MAJOR_VERSION:
572 case GL_MINOR_VERSION:
573 case GL_MAX_ELEMENTS_INDICES:
574 case GL_MAX_ELEMENTS_VERTICES:
575 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
576 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
577 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
578 case GL_UNPACK_IMAGE_HEIGHT:
579 case GL_UNPACK_SKIP_IMAGES:
580 {
581 *type = GL_INT;
582 *numParams = 1;
583 return true;
584 }
585
586 case GL_MAX_ELEMENT_INDEX:
587 case GL_MAX_UNIFORM_BLOCK_SIZE:
588 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
589 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
590 case GL_MAX_SERVER_WAIT_TIMEOUT:
591 {
592 *type = GL_INT_64_ANGLEX;
593 *numParams = 1;
594 return true;
595 }
596
597 case GL_TRANSFORM_FEEDBACK_ACTIVE:
598 case GL_TRANSFORM_FEEDBACK_PAUSED:
599 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
600 case GL_RASTERIZER_DISCARD:
601 {
602 *type = GL_BOOL;
603 *numParams = 1;
604 return true;
605 }
606
607 case GL_MAX_TEXTURE_LOD_BIAS:
608 {
609 *type = GL_FLOAT;
610 *numParams = 1;
611 return true;
612 }
613 }
614
Geoff Langc339c4e2016-11-29 10:37:36 -0500615 if (getExtensions().requestExtension)
616 {
617 switch (pname)
618 {
619 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
620 *type = GL_INT;
621 *numParams = 1;
622 return true;
623 }
624 }
625
Geoff Langeb66a6e2016-10-31 13:06:12 -0400626 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300627 {
628 return false;
629 }
630
631 switch (pname)
632 {
Jiajia Qin6eafb042016-12-27 17:04:07 +0800633 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800634 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300635 case GL_MAX_FRAMEBUFFER_WIDTH:
636 case GL_MAX_FRAMEBUFFER_HEIGHT:
637 case GL_MAX_FRAMEBUFFER_SAMPLES:
638 case GL_MAX_SAMPLE_MASK_WORDS:
639 case GL_MAX_COLOR_TEXTURE_SAMPLES:
640 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
641 case GL_MAX_INTEGER_SAMPLES:
642 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
643 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
644 case GL_MAX_VERTEX_ATTRIB_STRIDE:
645 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
646 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
647 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
648 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
649 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
650 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
651 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
652 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
653 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
654 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
655 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
656 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
657 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
658 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
659 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
660 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
661 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
662 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
663 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
664 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
665 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
666 case GL_MAX_UNIFORM_LOCATIONS:
667 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
668 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
669 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
670 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
671 case GL_MAX_IMAGE_UNITS:
672 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
673 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
674 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800675 case GL_SHADER_STORAGE_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300676 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
JiangYizhou24fe74c2017-07-06 16:56:50 +0800677 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Martin Radev66fb8202016-07-28 11:45:20 +0300678 *type = GL_INT;
679 *numParams = 1;
680 return true;
681 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
682 *type = GL_INT_64_ANGLEX;
683 *numParams = 1;
684 return true;
685 }
686
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700687 return false;
688}
689
690bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
691 GLenum *type,
692 unsigned int *numParams)
693{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400694 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700695 {
696 return false;
697 }
698
699 switch (target)
700 {
701 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
702 case GL_UNIFORM_BUFFER_BINDING:
703 {
704 *type = GL_INT;
705 *numParams = 1;
706 return true;
707 }
708 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
709 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
710 case GL_UNIFORM_BUFFER_START:
711 case GL_UNIFORM_BUFFER_SIZE:
712 {
713 *type = GL_INT_64_ANGLEX;
714 *numParams = 1;
715 return true;
716 }
717 }
718
Geoff Langeb66a6e2016-10-31 13:06:12 -0400719 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300720 {
721 return false;
722 }
723
724 switch (target)
725 {
726 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
727 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800728 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800729 case GL_SHADER_STORAGE_BUFFER_BINDING:
Shao80957d92017-02-20 21:25:59 +0800730 case GL_VERTEX_BINDING_BUFFER:
731 case GL_VERTEX_BINDING_DIVISOR:
732 case GL_VERTEX_BINDING_OFFSET:
733 case GL_VERTEX_BINDING_STRIDE:
Martin Radev66fb8202016-07-28 11:45:20 +0300734 {
735 *type = GL_INT;
736 *numParams = 1;
737 return true;
738 }
Jiajia Qin6eafb042016-12-27 17:04:07 +0800739 case GL_ATOMIC_COUNTER_BUFFER_START:
740 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800741 case GL_SHADER_STORAGE_BUFFER_START:
742 case GL_SHADER_STORAGE_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800743 {
744 *type = GL_INT_64_ANGLEX;
745 *numParams = 1;
746 return true;
747 }
Martin Radev66fb8202016-07-28 11:45:20 +0300748 }
749
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700750 return false;
751}
752
Jamie Madillef300b12016-10-07 15:12:09 -0400753Program *ValidationContext::getProgram(GLuint handle) const
754{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500755 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400756}
757
758Shader *ValidationContext::getShader(GLuint handle) const
759{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500760 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400761}
762
Jamie Madill01a80ee2016-11-07 12:06:18 -0500763bool ValidationContext::isTextureGenerated(GLuint texture) const
764{
Jamie Madillc74ff572017-06-22 14:45:45 -0400765 return mState.mTextures->isHandleGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500766}
767
768bool ValidationContext::isBufferGenerated(GLuint buffer) const
769{
Jamie Madillc74ff572017-06-22 14:45:45 -0400770 return mState.mBuffers->isHandleGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500771}
772
773bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
774{
Jamie Madillc74ff572017-06-22 14:45:45 -0400775 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500776}
777
778bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
779{
Jamie Madillc74ff572017-06-22 14:45:45 -0400780 return mState.mFramebuffers->isHandleGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500781}
782
Geoff Langce02f082017-02-06 16:46:21 -0500783bool ValidationContext::usingDisplayTextureShareGroup() const
784{
785 return mDisplayTextureShareGroup;
786}
787
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500788GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
789{
790 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
791 internalformat == GL_DEPTH_STENCIL
792 ? GL_DEPTH24_STENCIL8
793 : internalformat;
794}
795
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500796} // namespace gl