blob: 0d240fffc8de94ddb959b8f89b4a6022ae1fd0eb [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)),
89 mFenceSyncs(
90 AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mFenceSyncs)),
Geoff Lang3bf8e3a2016-12-01 17:28:52 -050091 mPaths(AllocateOrGetSharedResourceManager(shareContextState, &ContextState::mPaths)),
92 mFramebuffers(new FramebufferManager())
Jamie Madill9082b982016-04-27 15:21:51 -040093{
94}
Jamie Madill1e9ae072014-11-06 15:27:21 -050095
Jamie Madill9082b982016-04-27 15:21:51 -040096ContextState::~ContextState()
Jamie Madill1e9ae072014-11-06 15:27:21 -050097{
Jamie Madill6c1f6712017-02-14 19:08:04 -050098 // Handles are released by the Context.
Jamie Madill1e9ae072014-11-06 15:27:21 -050099}
100
Jamie Madilla02315b2017-02-23 14:14:47 -0500101bool ContextState::isWebGL1() const
102{
103 return (mExtensions.webglCompatibility && mClientVersion.major == 2);
104}
105
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700106const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
107{
108 return mTextureCaps.get(internalFormat);
109}
110
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500111ValidationContext::ValidationContext(const ValidationContext *shareContext,
Geoff Langce02f082017-02-06 16:46:21 -0500112 TextureManager *shareTextures,
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500113 const Version &clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700114 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -0500115 const Caps &caps,
116 const TextureCapsMap &textureCaps,
117 const Extensions &extensions,
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500118 const Limitations &limitations,
119 bool skipValidation)
Geoff Lang9aded172017-04-05 11:07:56 -0400120 : mState(reinterpret_cast<ContextID>(this),
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500121 shareContext ? &shareContext->mState : nullptr,
Geoff Langce02f082017-02-06 16:46:21 -0500122 shareTextures,
Geoff Langeb66a6e2016-10-31 13:06:12 -0400123 clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700124 state,
125 caps,
126 textureCaps,
127 extensions,
Geoff Lang3bf8e3a2016-12-01 17:28:52 -0500128 limitations),
Geoff Langce02f082017-02-06 16:46:21 -0500129 mSkipValidation(skipValidation),
130 mDisplayTextureShareGroup(shareTextures != nullptr)
Jamie Madillf25855c2015-11-03 11:06:18 -0500131{
132}
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700133
134bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
135{
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700136 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
137 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
138 // to the fact that it is stored internally as a float, and so would require conversion
139 // if returned from Context::getIntegerv. Since this conversion is already implemented
140 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
141 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
142 // application.
143 switch (pname)
144 {
145 case GL_COMPRESSED_TEXTURE_FORMATS:
146 {
147 *type = GL_INT;
148 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
149 return true;
150 }
151 case GL_PROGRAM_BINARY_FORMATS_OES:
152 {
153 *type = GL_INT;
154 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
155 return true;
156 }
157 case GL_SHADER_BINARY_FORMATS:
158 {
159 *type = GL_INT;
160 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
161 return true;
162 }
163
164 case GL_MAX_VERTEX_ATTRIBS:
165 case GL_MAX_VERTEX_UNIFORM_VECTORS:
166 case GL_MAX_VARYING_VECTORS:
167 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
168 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
169 case GL_MAX_TEXTURE_IMAGE_UNITS:
170 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
171 case GL_MAX_RENDERBUFFER_SIZE:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700172 case GL_NUM_SHADER_BINARY_FORMATS:
173 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
174 case GL_ARRAY_BUFFER_BINDING:
175 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
176 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
177 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
178 case GL_RENDERBUFFER_BINDING:
179 case GL_CURRENT_PROGRAM:
180 case GL_PACK_ALIGNMENT:
181 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
182 case GL_UNPACK_ALIGNMENT:
183 case GL_GENERATE_MIPMAP_HINT:
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700184 case GL_RED_BITS:
185 case GL_GREEN_BITS:
186 case GL_BLUE_BITS:
187 case GL_ALPHA_BITS:
188 case GL_DEPTH_BITS:
189 case GL_STENCIL_BITS:
190 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
191 case GL_CULL_FACE_MODE:
192 case GL_FRONT_FACE:
193 case GL_ACTIVE_TEXTURE:
194 case GL_STENCIL_FUNC:
195 case GL_STENCIL_VALUE_MASK:
196 case GL_STENCIL_REF:
197 case GL_STENCIL_FAIL:
198 case GL_STENCIL_PASS_DEPTH_FAIL:
199 case GL_STENCIL_PASS_DEPTH_PASS:
200 case GL_STENCIL_BACK_FUNC:
201 case GL_STENCIL_BACK_VALUE_MASK:
202 case GL_STENCIL_BACK_REF:
203 case GL_STENCIL_BACK_FAIL:
204 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
205 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
206 case GL_DEPTH_FUNC:
207 case GL_BLEND_SRC_RGB:
208 case GL_BLEND_SRC_ALPHA:
209 case GL_BLEND_DST_RGB:
210 case GL_BLEND_DST_ALPHA:
211 case GL_BLEND_EQUATION_RGB:
212 case GL_BLEND_EQUATION_ALPHA:
213 case GL_STENCIL_WRITEMASK:
214 case GL_STENCIL_BACK_WRITEMASK:
215 case GL_STENCIL_CLEAR_VALUE:
216 case GL_SUBPIXEL_BITS:
217 case GL_MAX_TEXTURE_SIZE:
218 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
219 case GL_SAMPLE_BUFFERS:
220 case GL_SAMPLES:
221 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
222 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
223 case GL_TEXTURE_BINDING_2D:
224 case GL_TEXTURE_BINDING_CUBE_MAP:
225 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
226 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
227 {
228 *type = GL_INT;
229 *numParams = 1;
230 return true;
231 }
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400232 case GL_MAX_RECTANGLE_TEXTURE_SIZE_ANGLE:
233 case GL_TEXTURE_BINDING_RECTANGLE_ANGLE:
234 {
235 if (!getExtensions().textureRectangle)
236 {
237 return false;
238 }
239 *type = GL_INT;
240 *numParams = 1;
241 return true;
242 }
Bryan Bernhart58806562017-01-05 13:09:31 -0800243 case GL_MAX_DRAW_BUFFERS_EXT:
244 case GL_MAX_COLOR_ATTACHMENTS_EXT:
245 {
246 if ((getClientMajorVersion() < 3) && !getExtensions().drawBuffers)
247 {
248 return false;
249 }
250 *type = GL_INT;
251 *numParams = 1;
252 return true;
253 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700254 case GL_MAX_VIEWPORT_DIMS:
255 {
256 *type = GL_INT;
257 *numParams = 2;
258 return true;
259 }
260 case GL_VIEWPORT:
261 case GL_SCISSOR_BOX:
262 {
263 *type = GL_INT;
264 *numParams = 4;
265 return true;
266 }
267 case GL_SHADER_COMPILER:
268 case GL_SAMPLE_COVERAGE_INVERT:
269 case GL_DEPTH_WRITEMASK:
270 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
271 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
272 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
273 // bool-natural
274 case GL_SAMPLE_COVERAGE:
275 case GL_SCISSOR_TEST:
276 case GL_STENCIL_TEST:
277 case GL_DEPTH_TEST:
278 case GL_BLEND:
279 case GL_DITHER:
280 case GL_CONTEXT_ROBUST_ACCESS_EXT:
281 {
282 *type = GL_BOOL;
283 *numParams = 1;
284 return true;
285 }
286 case GL_COLOR_WRITEMASK:
287 {
288 *type = GL_BOOL;
289 *numParams = 4;
290 return true;
291 }
292 case GL_POLYGON_OFFSET_FACTOR:
293 case GL_POLYGON_OFFSET_UNITS:
294 case GL_SAMPLE_COVERAGE_VALUE:
295 case GL_DEPTH_CLEAR_VALUE:
296 case GL_LINE_WIDTH:
297 {
298 *type = GL_FLOAT;
299 *numParams = 1;
300 return true;
301 }
302 case GL_ALIASED_LINE_WIDTH_RANGE:
303 case GL_ALIASED_POINT_SIZE_RANGE:
304 case GL_DEPTH_RANGE:
305 {
306 *type = GL_FLOAT;
307 *numParams = 2;
308 return true;
309 }
310 case GL_COLOR_CLEAR_VALUE:
311 case GL_BLEND_COLOR:
312 {
313 *type = GL_FLOAT;
314 *numParams = 4;
315 return true;
316 }
317 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
Geoff Langd7d526a2017-02-21 16:48:43 -0500318 if (!getExtensions().textureFilterAnisotropic)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700319 {
320 return false;
321 }
322 *type = GL_FLOAT;
323 *numParams = 1;
324 return true;
325 case GL_TIMESTAMP_EXT:
326 if (!getExtensions().disjointTimerQuery)
327 {
328 return false;
329 }
330 *type = GL_INT_64_ANGLEX;
331 *numParams = 1;
332 return true;
333 case GL_GPU_DISJOINT_EXT:
334 if (!getExtensions().disjointTimerQuery)
335 {
336 return false;
337 }
338 *type = GL_INT;
339 *numParams = 1;
340 return true;
341 case GL_COVERAGE_MODULATION_CHROMIUM:
342 if (!getExtensions().framebufferMixedSamples)
343 {
344 return false;
345 }
346 *type = GL_INT;
347 *numParams = 1;
348 return true;
John Bauman18319182016-09-28 14:22:27 -0700349 case GL_TEXTURE_BINDING_EXTERNAL_OES:
350 if (!getExtensions().eglStreamConsumerExternal && !getExtensions().eglImageExternal)
351 {
352 return false;
353 }
354 *type = GL_INT;
355 *numParams = 1;
356 return true;
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700357 }
358
359 if (getExtensions().debug)
360 {
361 switch (pname)
362 {
363 case GL_DEBUG_LOGGED_MESSAGES:
364 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
365 case GL_DEBUG_GROUP_STACK_DEPTH:
366 case GL_MAX_DEBUG_MESSAGE_LENGTH:
367 case GL_MAX_DEBUG_LOGGED_MESSAGES:
368 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
369 case GL_MAX_LABEL_LENGTH:
370 *type = GL_INT;
371 *numParams = 1;
372 return true;
373
374 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
375 case GL_DEBUG_OUTPUT:
376 *type = GL_BOOL;
377 *numParams = 1;
378 return true;
379 }
380 }
381
382 if (getExtensions().multisampleCompatibility)
383 {
384 switch (pname)
385 {
386 case GL_MULTISAMPLE_EXT:
387 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
388 *type = GL_BOOL;
389 *numParams = 1;
390 return true;
391 }
392 }
393
Sami Väisänene45e53b2016-05-25 10:36:04 +0300394 if (getExtensions().pathRendering)
395 {
396 switch (pname)
397 {
398 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
399 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
400 *type = GL_FLOAT;
401 *numParams = 16;
402 return true;
403 }
404 }
405
Geoff Langf41a7152016-09-19 15:11:17 -0400406 if (getExtensions().bindGeneratesResource)
407 {
408 switch (pname)
409 {
410 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
411 *type = GL_BOOL;
412 *numParams = 1;
413 return true;
414 }
415 }
416
Geoff Langfeb8c682017-02-13 16:07:35 -0500417 if (getExtensions().clientArrays)
418 {
419 switch (pname)
420 {
421 case GL_CLIENT_ARRAYS_ANGLE:
422 *type = GL_BOOL;
423 *numParams = 1;
424 return true;
425 }
426 }
427
Geoff Lang1d2c41d2016-10-19 16:14:46 -0700428 if (getExtensions().sRGBWriteControl)
429 {
430 switch (pname)
431 {
432 case GL_FRAMEBUFFER_SRGB_EXT:
433 *type = GL_BOOL;
434 *numParams = 1;
435 return true;
436 }
437 }
438
Jamie Madille08a1d32017-03-07 17:24:06 -0500439 if (getExtensions().robustResourceInitialization &&
440 pname == GL_CONTEXT_ROBUST_RESOURCE_INITIALIZATION_ANGLE)
441 {
442 *type = GL_BOOL;
443 *numParams = 1;
444 return true;
445 }
446
Jamie Madillc43be722017-07-13 16:22:14 -0400447 if (getExtensions().programCacheControl && pname == GL_PROGRAM_CACHE_ENABLED_ANGLE)
448 {
449 *type = GL_BOOL;
450 *numParams = 1;
451 return true;
452 }
453
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700454 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
455 switch (pname)
456 {
457 case GL_PACK_ROW_LENGTH:
458 case GL_PACK_SKIP_ROWS:
459 case GL_PACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300460 if ((getClientMajorVersion() < 3) && !getExtensions().packSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700461 {
462 return false;
463 }
464 *type = GL_INT;
465 *numParams = 1;
466 return true;
467 case GL_UNPACK_ROW_LENGTH:
468 case GL_UNPACK_SKIP_ROWS:
469 case GL_UNPACK_SKIP_PIXELS:
Martin Radev1be913c2016-07-11 17:59:16 +0300470 if ((getClientMajorVersion() < 3) && !getExtensions().unpackSubimage)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700471 {
472 return false;
473 }
474 *type = GL_INT;
475 *numParams = 1;
476 return true;
477 case GL_VERTEX_ARRAY_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300478 if ((getClientMajorVersion() < 3) && !getExtensions().vertexArrayObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700479 {
480 return false;
481 }
482 *type = GL_INT;
483 *numParams = 1;
484 return true;
485 case GL_PIXEL_PACK_BUFFER_BINDING:
486 case GL_PIXEL_UNPACK_BUFFER_BINDING:
Martin Radev1be913c2016-07-11 17:59:16 +0300487 if ((getClientMajorVersion() < 3) && !getExtensions().pixelBufferObject)
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700488 {
489 return false;
490 }
491 *type = GL_INT;
492 *numParams = 1;
493 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500494 case GL_MAX_SAMPLES:
495 {
496 static_assert(GL_MAX_SAMPLES_ANGLE == GL_MAX_SAMPLES,
497 "GL_MAX_SAMPLES_ANGLE not equal to GL_MAX_SAMPLES");
498 if ((getClientMajorVersion() < 3) && !getExtensions().framebufferMultisample)
499 {
500 return false;
501 }
502 *type = GL_INT;
503 *numParams = 1;
504 return true;
Geoff Lang6170bef2017-07-18 15:51:14 -0400505
506 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
507 if ((getClientMajorVersion() < 3) && !getExtensions().standardDerivatives)
508 {
509 return false;
510 }
511 *type = GL_INT;
512 *numParams = 1;
513 return true;
Geoff Lang44ec2f52017-02-10 10:08:54 -0500514 }
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700515 }
516
Geoff Langd90d3882017-03-21 10:49:54 -0400517 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
518 {
519 if ((getClientVersion() < Version(3, 0)) && !getExtensions().drawBuffers)
520 {
521 return false;
522 }
523 *type = GL_INT;
524 *numParams = 1;
525 return true;
526 }
527
Martin Radeve5285d22017-07-14 16:23:53 +0300528 if (getExtensions().multiview && pname == GL_MAX_VIEWS_ANGLE)
529 {
530 *type = GL_INT;
531 *numParams = 1;
532 return true;
533 }
534
Geoff Langeb66a6e2016-10-31 13:06:12 -0400535 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700536 {
537 return false;
538 }
539
540 // Check for ES3.0+ parameter names
541 switch (pname)
542 {
543 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
544 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
545 case GL_UNIFORM_BUFFER_BINDING:
546 case GL_TRANSFORM_FEEDBACK_BINDING:
547 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
548 case GL_COPY_READ_BUFFER_BINDING:
549 case GL_COPY_WRITE_BUFFER_BINDING:
550 case GL_SAMPLER_BINDING:
551 case GL_READ_BUFFER:
552 case GL_TEXTURE_BINDING_3D:
553 case GL_TEXTURE_BINDING_2D_ARRAY:
554 case GL_MAX_3D_TEXTURE_SIZE:
555 case GL_MAX_ARRAY_TEXTURE_LAYERS:
556 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
557 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
558 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
559 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
560 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
561 case GL_MAX_VARYING_COMPONENTS:
562 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
563 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
564 case GL_MIN_PROGRAM_TEXEL_OFFSET:
565 case GL_MAX_PROGRAM_TEXEL_OFFSET:
566 case GL_NUM_EXTENSIONS:
567 case GL_MAJOR_VERSION:
568 case GL_MINOR_VERSION:
569 case GL_MAX_ELEMENTS_INDICES:
570 case GL_MAX_ELEMENTS_VERTICES:
571 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
572 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
573 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
574 case GL_UNPACK_IMAGE_HEIGHT:
575 case GL_UNPACK_SKIP_IMAGES:
576 {
577 *type = GL_INT;
578 *numParams = 1;
579 return true;
580 }
581
582 case GL_MAX_ELEMENT_INDEX:
583 case GL_MAX_UNIFORM_BLOCK_SIZE:
584 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
585 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
586 case GL_MAX_SERVER_WAIT_TIMEOUT:
587 {
588 *type = GL_INT_64_ANGLEX;
589 *numParams = 1;
590 return true;
591 }
592
593 case GL_TRANSFORM_FEEDBACK_ACTIVE:
594 case GL_TRANSFORM_FEEDBACK_PAUSED:
595 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
596 case GL_RASTERIZER_DISCARD:
597 {
598 *type = GL_BOOL;
599 *numParams = 1;
600 return true;
601 }
602
603 case GL_MAX_TEXTURE_LOD_BIAS:
604 {
605 *type = GL_FLOAT;
606 *numParams = 1;
607 return true;
608 }
609 }
610
Geoff Langc339c4e2016-11-29 10:37:36 -0500611 if (getExtensions().requestExtension)
612 {
613 switch (pname)
614 {
615 case GL_NUM_REQUESTABLE_EXTENSIONS_ANGLE:
616 *type = GL_INT;
617 *numParams = 1;
618 return true;
619 }
620 }
621
Geoff Langeb66a6e2016-10-31 13:06:12 -0400622 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300623 {
624 return false;
625 }
626
627 switch (pname)
628 {
Jiajia Qin6eafb042016-12-27 17:04:07 +0800629 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qin9d7d0b12016-11-29 16:30:31 +0800630 case GL_DRAW_INDIRECT_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300631 case GL_MAX_FRAMEBUFFER_WIDTH:
632 case GL_MAX_FRAMEBUFFER_HEIGHT:
633 case GL_MAX_FRAMEBUFFER_SAMPLES:
634 case GL_MAX_SAMPLE_MASK_WORDS:
635 case GL_MAX_COLOR_TEXTURE_SAMPLES:
636 case GL_MAX_DEPTH_TEXTURE_SAMPLES:
637 case GL_MAX_INTEGER_SAMPLES:
638 case GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET:
639 case GL_MAX_VERTEX_ATTRIB_BINDINGS:
640 case GL_MAX_VERTEX_ATTRIB_STRIDE:
641 case GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS:
642 case GL_MAX_VERTEX_ATOMIC_COUNTERS:
643 case GL_MAX_VERTEX_IMAGE_UNIFORMS:
644 case GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS:
645 case GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS:
646 case GL_MAX_FRAGMENT_ATOMIC_COUNTERS:
647 case GL_MAX_FRAGMENT_IMAGE_UNIFORMS:
648 case GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS:
649 case GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET:
650 case GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET:
651 case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS:
652 case GL_MAX_COMPUTE_UNIFORM_BLOCKS:
653 case GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS:
654 case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE:
655 case GL_MAX_COMPUTE_UNIFORM_COMPONENTS:
656 case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS:
657 case GL_MAX_COMPUTE_ATOMIC_COUNTERS:
658 case GL_MAX_COMPUTE_IMAGE_UNIFORMS:
659 case GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS:
660 case GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS:
661 case GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES:
662 case GL_MAX_UNIFORM_LOCATIONS:
663 case GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS:
664 case GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE:
665 case GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS:
666 case GL_MAX_COMBINED_ATOMIC_COUNTERS:
667 case GL_MAX_IMAGE_UNITS:
668 case GL_MAX_COMBINED_IMAGE_UNIFORMS:
669 case GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS:
670 case GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800671 case GL_SHADER_STORAGE_BUFFER_BINDING:
Martin Radev66fb8202016-07-28 11:45:20 +0300672 case GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT:
JiangYizhou24fe74c2017-07-06 16:56:50 +0800673 case GL_TEXTURE_BINDING_2D_MULTISAMPLE:
Martin Radev66fb8202016-07-28 11:45:20 +0300674 *type = GL_INT;
675 *numParams = 1;
676 return true;
677 case GL_MAX_SHADER_STORAGE_BLOCK_SIZE:
678 *type = GL_INT_64_ANGLEX;
679 *numParams = 1;
680 return true;
681 }
682
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700683 return false;
684}
685
686bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
687 GLenum *type,
688 unsigned int *numParams)
689{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400690 if (getClientVersion() < Version(3, 0))
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700691 {
692 return false;
693 }
694
695 switch (target)
696 {
697 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
698 case GL_UNIFORM_BUFFER_BINDING:
699 {
700 *type = GL_INT;
701 *numParams = 1;
702 return true;
703 }
704 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
705 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
706 case GL_UNIFORM_BUFFER_START:
707 case GL_UNIFORM_BUFFER_SIZE:
708 {
709 *type = GL_INT_64_ANGLEX;
710 *numParams = 1;
711 return true;
712 }
713 }
714
Geoff Langeb66a6e2016-10-31 13:06:12 -0400715 if (getClientVersion() < Version(3, 1))
Martin Radev66fb8202016-07-28 11:45:20 +0300716 {
717 return false;
718 }
719
720 switch (target)
721 {
722 case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
723 case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800724 case GL_ATOMIC_COUNTER_BUFFER_BINDING:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800725 case GL_SHADER_STORAGE_BUFFER_BINDING:
Shao80957d92017-02-20 21:25:59 +0800726 case GL_VERTEX_BINDING_BUFFER:
727 case GL_VERTEX_BINDING_DIVISOR:
728 case GL_VERTEX_BINDING_OFFSET:
729 case GL_VERTEX_BINDING_STRIDE:
Martin Radev66fb8202016-07-28 11:45:20 +0300730 {
731 *type = GL_INT;
732 *numParams = 1;
733 return true;
734 }
Jiajia Qin6eafb042016-12-27 17:04:07 +0800735 case GL_ATOMIC_COUNTER_BUFFER_START:
736 case GL_ATOMIC_COUNTER_BUFFER_SIZE:
Jiajia Qinf546e7d2017-03-27 14:12:59 +0800737 case GL_SHADER_STORAGE_BUFFER_START:
738 case GL_SHADER_STORAGE_BUFFER_SIZE:
Jiajia Qin6eafb042016-12-27 17:04:07 +0800739 {
740 *type = GL_INT_64_ANGLEX;
741 *numParams = 1;
742 return true;
743 }
Martin Radev66fb8202016-07-28 11:45:20 +0300744 }
745
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700746 return false;
747}
748
Jamie Madillef300b12016-10-07 15:12:09 -0400749Program *ValidationContext::getProgram(GLuint handle) const
750{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500751 return mState.mShaderPrograms->getProgram(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400752}
753
754Shader *ValidationContext::getShader(GLuint handle) const
755{
Geoff Lang4ddf5af2016-12-01 14:30:44 -0500756 return mState.mShaderPrograms->getShader(handle);
Jamie Madillef300b12016-10-07 15:12:09 -0400757}
758
Jamie Madill01a80ee2016-11-07 12:06:18 -0500759bool ValidationContext::isTextureGenerated(GLuint texture) const
760{
Jamie Madillc74ff572017-06-22 14:45:45 -0400761 return mState.mTextures->isHandleGenerated(texture);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500762}
763
764bool ValidationContext::isBufferGenerated(GLuint buffer) const
765{
Jamie Madillc74ff572017-06-22 14:45:45 -0400766 return mState.mBuffers->isHandleGenerated(buffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500767}
768
769bool ValidationContext::isRenderbufferGenerated(GLuint renderbuffer) const
770{
Jamie Madillc74ff572017-06-22 14:45:45 -0400771 return mState.mRenderbuffers->isHandleGenerated(renderbuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500772}
773
774bool ValidationContext::isFramebufferGenerated(GLuint framebuffer) const
775{
Jamie Madillc74ff572017-06-22 14:45:45 -0400776 return mState.mFramebuffers->isHandleGenerated(framebuffer);
Jamie Madill01a80ee2016-11-07 12:06:18 -0500777}
778
Geoff Langce02f082017-02-06 16:46:21 -0500779bool ValidationContext::usingDisplayTextureShareGroup() const
780{
781 return mDisplayTextureShareGroup;
782}
783
Jamie Madill4e0e6f82017-02-17 11:06:03 -0500784GLenum ValidationContext::getConvertedRenderbufferFormat(GLenum internalformat) const
785{
786 return mState.mExtensions.webglCompatibility && mState.mClientVersion.major == 2 &&
787 internalformat == GL_DEPTH_STENCIL
788 ? GL_DEPTH24_STENCIL8
789 : internalformat;
790}
791
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500792} // namespace gl