blob: a824be5ceb3cd27b2440cf48bfa1b2b864682bb6 [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
Jamie Madill9082b982016-04-27 15:21:51 -040017ContextState::ContextState(uintptr_t contextIn,
18 GLint clientVersionIn,
Jamie Madilldfde6ab2016-06-09 07:07:18 -070019 State *stateIn,
Jamie Madill9082b982016-04-27 15:21:51 -040020 const Caps &capsIn,
21 const TextureCapsMap &textureCapsIn,
22 const Extensions &extensionsIn,
23 const ResourceManager *resourceManagerIn,
24 const Limitations &limitationsIn)
Jamie Madilldfde6ab2016-06-09 07:07:18 -070025 : mContext(contextIn),
26 mClientVersion(clientVersionIn),
27 mState(stateIn),
28 mCaps(capsIn),
29 mTextureCaps(textureCapsIn),
30 mExtensions(extensionsIn),
31 mResourceManager(resourceManagerIn),
32 mLimitations(limitationsIn)
Jamie Madill9082b982016-04-27 15:21:51 -040033{
34}
Jamie Madill1e9ae072014-11-06 15:27:21 -050035
Jamie Madill9082b982016-04-27 15:21:51 -040036ContextState::~ContextState()
Jamie Madill1e9ae072014-11-06 15:27:21 -050037{
38}
39
Jamie Madilldfde6ab2016-06-09 07:07:18 -070040const TextureCaps &ContextState::getTextureCap(GLenum internalFormat) const
41{
42 return mTextureCaps.get(internalFormat);
43}
44
Jamie Madillf25855c2015-11-03 11:06:18 -050045ValidationContext::ValidationContext(GLint clientVersion,
Jamie Madilldfde6ab2016-06-09 07:07:18 -070046 State *state,
Jamie Madillf25855c2015-11-03 11:06:18 -050047 const Caps &caps,
48 const TextureCapsMap &textureCaps,
49 const Extensions &extensions,
50 const ResourceManager *resourceManager,
Jamie Madill46e6c7a2016-01-18 14:42:30 -050051 const Limitations &limitations,
52 bool skipValidation)
Jamie Madilldfde6ab2016-06-09 07:07:18 -070053 : mState(reinterpret_cast<uintptr_t>(this),
54 clientVersion,
55 state,
56 caps,
57 textureCaps,
58 extensions,
59 resourceManager,
60 limitations),
Jamie Madill46e6c7a2016-01-18 14:42:30 -050061 mSkipValidation(skipValidation)
Jamie Madillf25855c2015-11-03 11:06:18 -050062{
63}
Jamie Madilldfde6ab2016-06-09 07:07:18 -070064
65bool ValidationContext::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *numParams)
66{
67 if (pname >= GL_DRAW_BUFFER0_EXT && pname <= GL_DRAW_BUFFER15_EXT)
68 {
69 *type = GL_INT;
70 *numParams = 1;
71 return true;
72 }
73
74 // Please note: the query type returned for DEPTH_CLEAR_VALUE in this implementation
75 // is FLOAT rather than INT, as would be suggested by the GL ES 2.0 spec. This is due
76 // to the fact that it is stored internally as a float, and so would require conversion
77 // if returned from Context::getIntegerv. Since this conversion is already implemented
78 // in the case that one calls glGetIntegerv to retrieve a float-typed state variable, we
79 // place DEPTH_CLEAR_VALUE with the floats. This should make no difference to the calling
80 // application.
81 switch (pname)
82 {
83 case GL_COMPRESSED_TEXTURE_FORMATS:
84 {
85 *type = GL_INT;
86 *numParams = static_cast<unsigned int>(getCaps().compressedTextureFormats.size());
87 return true;
88 }
89 case GL_PROGRAM_BINARY_FORMATS_OES:
90 {
91 *type = GL_INT;
92 *numParams = static_cast<unsigned int>(getCaps().programBinaryFormats.size());
93 return true;
94 }
95 case GL_SHADER_BINARY_FORMATS:
96 {
97 *type = GL_INT;
98 *numParams = static_cast<unsigned int>(getCaps().shaderBinaryFormats.size());
99 return true;
100 }
101
102 case GL_MAX_VERTEX_ATTRIBS:
103 case GL_MAX_VERTEX_UNIFORM_VECTORS:
104 case GL_MAX_VARYING_VECTORS:
105 case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS:
106 case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS:
107 case GL_MAX_TEXTURE_IMAGE_UNITS:
108 case GL_MAX_FRAGMENT_UNIFORM_VECTORS:
109 case GL_MAX_RENDERBUFFER_SIZE:
110 case GL_MAX_COLOR_ATTACHMENTS_EXT:
111 case GL_MAX_DRAW_BUFFERS_EXT:
112 case GL_NUM_SHADER_BINARY_FORMATS:
113 case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
114 case GL_ARRAY_BUFFER_BINDING:
115 // case GL_FRAMEBUFFER_BINDING: // equivalent to DRAW_FRAMEBUFFER_BINDING_ANGLE
116 case GL_DRAW_FRAMEBUFFER_BINDING_ANGLE:
117 case GL_READ_FRAMEBUFFER_BINDING_ANGLE:
118 case GL_RENDERBUFFER_BINDING:
119 case GL_CURRENT_PROGRAM:
120 case GL_PACK_ALIGNMENT:
121 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
122 case GL_UNPACK_ALIGNMENT:
123 case GL_GENERATE_MIPMAP_HINT:
124 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES:
125 case GL_RED_BITS:
126 case GL_GREEN_BITS:
127 case GL_BLUE_BITS:
128 case GL_ALPHA_BITS:
129 case GL_DEPTH_BITS:
130 case GL_STENCIL_BITS:
131 case GL_ELEMENT_ARRAY_BUFFER_BINDING:
132 case GL_CULL_FACE_MODE:
133 case GL_FRONT_FACE:
134 case GL_ACTIVE_TEXTURE:
135 case GL_STENCIL_FUNC:
136 case GL_STENCIL_VALUE_MASK:
137 case GL_STENCIL_REF:
138 case GL_STENCIL_FAIL:
139 case GL_STENCIL_PASS_DEPTH_FAIL:
140 case GL_STENCIL_PASS_DEPTH_PASS:
141 case GL_STENCIL_BACK_FUNC:
142 case GL_STENCIL_BACK_VALUE_MASK:
143 case GL_STENCIL_BACK_REF:
144 case GL_STENCIL_BACK_FAIL:
145 case GL_STENCIL_BACK_PASS_DEPTH_FAIL:
146 case GL_STENCIL_BACK_PASS_DEPTH_PASS:
147 case GL_DEPTH_FUNC:
148 case GL_BLEND_SRC_RGB:
149 case GL_BLEND_SRC_ALPHA:
150 case GL_BLEND_DST_RGB:
151 case GL_BLEND_DST_ALPHA:
152 case GL_BLEND_EQUATION_RGB:
153 case GL_BLEND_EQUATION_ALPHA:
154 case GL_STENCIL_WRITEMASK:
155 case GL_STENCIL_BACK_WRITEMASK:
156 case GL_STENCIL_CLEAR_VALUE:
157 case GL_SUBPIXEL_BITS:
158 case GL_MAX_TEXTURE_SIZE:
159 case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
160 case GL_SAMPLE_BUFFERS:
161 case GL_SAMPLES:
162 case GL_IMPLEMENTATION_COLOR_READ_TYPE:
163 case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
164 case GL_TEXTURE_BINDING_2D:
165 case GL_TEXTURE_BINDING_CUBE_MAP:
166 case GL_RESET_NOTIFICATION_STRATEGY_EXT:
167 case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
168 {
169 *type = GL_INT;
170 *numParams = 1;
171 return true;
172 }
173 case GL_MAX_SAMPLES_ANGLE:
174 {
175 if (!getExtensions().framebufferMultisample)
176 {
177 return false;
178 }
179 *type = GL_INT;
180 *numParams = 1;
181 return true;
182 }
183 case GL_MAX_VIEWPORT_DIMS:
184 {
185 *type = GL_INT;
186 *numParams = 2;
187 return true;
188 }
189 case GL_VIEWPORT:
190 case GL_SCISSOR_BOX:
191 {
192 *type = GL_INT;
193 *numParams = 4;
194 return true;
195 }
196 case GL_SHADER_COMPILER:
197 case GL_SAMPLE_COVERAGE_INVERT:
198 case GL_DEPTH_WRITEMASK:
199 case GL_CULL_FACE: // CULL_FACE through DITHER are natural to IsEnabled,
200 case GL_POLYGON_OFFSET_FILL: // but can be retrieved through the Get{Type}v queries.
201 case GL_SAMPLE_ALPHA_TO_COVERAGE: // For this purpose, they are treated here as
202 // bool-natural
203 case GL_SAMPLE_COVERAGE:
204 case GL_SCISSOR_TEST:
205 case GL_STENCIL_TEST:
206 case GL_DEPTH_TEST:
207 case GL_BLEND:
208 case GL_DITHER:
209 case GL_CONTEXT_ROBUST_ACCESS_EXT:
210 {
211 *type = GL_BOOL;
212 *numParams = 1;
213 return true;
214 }
215 case GL_COLOR_WRITEMASK:
216 {
217 *type = GL_BOOL;
218 *numParams = 4;
219 return true;
220 }
221 case GL_POLYGON_OFFSET_FACTOR:
222 case GL_POLYGON_OFFSET_UNITS:
223 case GL_SAMPLE_COVERAGE_VALUE:
224 case GL_DEPTH_CLEAR_VALUE:
225 case GL_LINE_WIDTH:
226 {
227 *type = GL_FLOAT;
228 *numParams = 1;
229 return true;
230 }
231 case GL_ALIASED_LINE_WIDTH_RANGE:
232 case GL_ALIASED_POINT_SIZE_RANGE:
233 case GL_DEPTH_RANGE:
234 {
235 *type = GL_FLOAT;
236 *numParams = 2;
237 return true;
238 }
239 case GL_COLOR_CLEAR_VALUE:
240 case GL_BLEND_COLOR:
241 {
242 *type = GL_FLOAT;
243 *numParams = 4;
244 return true;
245 }
246 case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
247 if (!getExtensions().maxTextureAnisotropy)
248 {
249 return false;
250 }
251 *type = GL_FLOAT;
252 *numParams = 1;
253 return true;
254 case GL_TIMESTAMP_EXT:
255 if (!getExtensions().disjointTimerQuery)
256 {
257 return false;
258 }
259 *type = GL_INT_64_ANGLEX;
260 *numParams = 1;
261 return true;
262 case GL_GPU_DISJOINT_EXT:
263 if (!getExtensions().disjointTimerQuery)
264 {
265 return false;
266 }
267 *type = GL_INT;
268 *numParams = 1;
269 return true;
270 case GL_COVERAGE_MODULATION_CHROMIUM:
271 if (!getExtensions().framebufferMixedSamples)
272 {
273 return false;
274 }
275 *type = GL_INT;
276 *numParams = 1;
277 return true;
278 }
279
280 if (getExtensions().debug)
281 {
282 switch (pname)
283 {
284 case GL_DEBUG_LOGGED_MESSAGES:
285 case GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH:
286 case GL_DEBUG_GROUP_STACK_DEPTH:
287 case GL_MAX_DEBUG_MESSAGE_LENGTH:
288 case GL_MAX_DEBUG_LOGGED_MESSAGES:
289 case GL_MAX_DEBUG_GROUP_STACK_DEPTH:
290 case GL_MAX_LABEL_LENGTH:
291 *type = GL_INT;
292 *numParams = 1;
293 return true;
294
295 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
296 case GL_DEBUG_OUTPUT:
297 *type = GL_BOOL;
298 *numParams = 1;
299 return true;
300 }
301 }
302
303 if (getExtensions().multisampleCompatibility)
304 {
305 switch (pname)
306 {
307 case GL_MULTISAMPLE_EXT:
308 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
309 *type = GL_BOOL;
310 *numParams = 1;
311 return true;
312 }
313 }
314
Sami Väisänene45e53b2016-05-25 10:36:04 +0300315 if (getExtensions().pathRendering)
316 {
317 switch (pname)
318 {
319 case GL_PATH_MODELVIEW_MATRIX_CHROMIUM:
320 case GL_PATH_PROJECTION_MATRIX_CHROMIUM:
321 *type = GL_FLOAT;
322 *numParams = 16;
323 return true;
324 }
325 }
326
Jamie Madilldfde6ab2016-06-09 07:07:18 -0700327 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
328 switch (pname)
329 {
330 case GL_PACK_ROW_LENGTH:
331 case GL_PACK_SKIP_ROWS:
332 case GL_PACK_SKIP_PIXELS:
333 if ((getClientVersion() < 3) && !getExtensions().packSubimage)
334 {
335 return false;
336 }
337 *type = GL_INT;
338 *numParams = 1;
339 return true;
340 case GL_UNPACK_ROW_LENGTH:
341 case GL_UNPACK_SKIP_ROWS:
342 case GL_UNPACK_SKIP_PIXELS:
343 if ((getClientVersion() < 3) && !getExtensions().unpackSubimage)
344 {
345 return false;
346 }
347 *type = GL_INT;
348 *numParams = 1;
349 return true;
350 case GL_VERTEX_ARRAY_BINDING:
351 if ((getClientVersion() < 3) && !getExtensions().vertexArrayObject)
352 {
353 return false;
354 }
355 *type = GL_INT;
356 *numParams = 1;
357 return true;
358 case GL_PIXEL_PACK_BUFFER_BINDING:
359 case GL_PIXEL_UNPACK_BUFFER_BINDING:
360 if ((getClientVersion() < 3) && !getExtensions().pixelBufferObject)
361 {
362 return false;
363 }
364 *type = GL_INT;
365 *numParams = 1;
366 return true;
367 }
368
369 if (getClientVersion() < 3)
370 {
371 return false;
372 }
373
374 // Check for ES3.0+ parameter names
375 switch (pname)
376 {
377 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
378 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
379 case GL_UNIFORM_BUFFER_BINDING:
380 case GL_TRANSFORM_FEEDBACK_BINDING:
381 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
382 case GL_COPY_READ_BUFFER_BINDING:
383 case GL_COPY_WRITE_BUFFER_BINDING:
384 case GL_SAMPLER_BINDING:
385 case GL_READ_BUFFER:
386 case GL_TEXTURE_BINDING_3D:
387 case GL_TEXTURE_BINDING_2D_ARRAY:
388 case GL_MAX_3D_TEXTURE_SIZE:
389 case GL_MAX_ARRAY_TEXTURE_LAYERS:
390 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
391 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
392 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
393 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
394 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
395 case GL_MAX_VARYING_COMPONENTS:
396 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
397 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
398 case GL_MIN_PROGRAM_TEXEL_OFFSET:
399 case GL_MAX_PROGRAM_TEXEL_OFFSET:
400 case GL_NUM_EXTENSIONS:
401 case GL_MAJOR_VERSION:
402 case GL_MINOR_VERSION:
403 case GL_MAX_ELEMENTS_INDICES:
404 case GL_MAX_ELEMENTS_VERTICES:
405 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
406 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
407 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
408 case GL_UNPACK_IMAGE_HEIGHT:
409 case GL_UNPACK_SKIP_IMAGES:
410 {
411 *type = GL_INT;
412 *numParams = 1;
413 return true;
414 }
415
416 case GL_MAX_ELEMENT_INDEX:
417 case GL_MAX_UNIFORM_BLOCK_SIZE:
418 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
419 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
420 case GL_MAX_SERVER_WAIT_TIMEOUT:
421 {
422 *type = GL_INT_64_ANGLEX;
423 *numParams = 1;
424 return true;
425 }
426
427 case GL_TRANSFORM_FEEDBACK_ACTIVE:
428 case GL_TRANSFORM_FEEDBACK_PAUSED:
429 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
430 case GL_RASTERIZER_DISCARD:
431 {
432 *type = GL_BOOL;
433 *numParams = 1;
434 return true;
435 }
436
437 case GL_MAX_TEXTURE_LOD_BIAS:
438 {
439 *type = GL_FLOAT;
440 *numParams = 1;
441 return true;
442 }
443 }
444
445 return false;
446}
447
448bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
449 GLenum *type,
450 unsigned int *numParams)
451{
452 if (getClientVersion() < 3)
453 {
454 return false;
455 }
456
457 switch (target)
458 {
459 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
460 case GL_UNIFORM_BUFFER_BINDING:
461 {
462 *type = GL_INT;
463 *numParams = 1;
464 return true;
465 }
466 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
467 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
468 case GL_UNIFORM_BUFFER_START:
469 case GL_UNIFORM_BUFFER_SIZE:
470 {
471 *type = GL_INT_64_ANGLEX;
472 *numParams = 1;
473 return true;
474 }
475 }
476
477 return false;
478}
479
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500480} // namespace gl