blob: 2b39b44ddb8758594664e309b86c332c5d179624 [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
315 // Check for ES3.0+ parameter names which are also exposed as ES2 extensions
316 switch (pname)
317 {
318 case GL_PACK_ROW_LENGTH:
319 case GL_PACK_SKIP_ROWS:
320 case GL_PACK_SKIP_PIXELS:
321 if ((getClientVersion() < 3) && !getExtensions().packSubimage)
322 {
323 return false;
324 }
325 *type = GL_INT;
326 *numParams = 1;
327 return true;
328 case GL_UNPACK_ROW_LENGTH:
329 case GL_UNPACK_SKIP_ROWS:
330 case GL_UNPACK_SKIP_PIXELS:
331 if ((getClientVersion() < 3) && !getExtensions().unpackSubimage)
332 {
333 return false;
334 }
335 *type = GL_INT;
336 *numParams = 1;
337 return true;
338 case GL_VERTEX_ARRAY_BINDING:
339 if ((getClientVersion() < 3) && !getExtensions().vertexArrayObject)
340 {
341 return false;
342 }
343 *type = GL_INT;
344 *numParams = 1;
345 return true;
346 case GL_PIXEL_PACK_BUFFER_BINDING:
347 case GL_PIXEL_UNPACK_BUFFER_BINDING:
348 if ((getClientVersion() < 3) && !getExtensions().pixelBufferObject)
349 {
350 return false;
351 }
352 *type = GL_INT;
353 *numParams = 1;
354 return true;
355 }
356
357 if (getClientVersion() < 3)
358 {
359 return false;
360 }
361
362 // Check for ES3.0+ parameter names
363 switch (pname)
364 {
365 case GL_MAX_UNIFORM_BUFFER_BINDINGS:
366 case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT:
367 case GL_UNIFORM_BUFFER_BINDING:
368 case GL_TRANSFORM_FEEDBACK_BINDING:
369 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
370 case GL_COPY_READ_BUFFER_BINDING:
371 case GL_COPY_WRITE_BUFFER_BINDING:
372 case GL_SAMPLER_BINDING:
373 case GL_READ_BUFFER:
374 case GL_TEXTURE_BINDING_3D:
375 case GL_TEXTURE_BINDING_2D_ARRAY:
376 case GL_MAX_3D_TEXTURE_SIZE:
377 case GL_MAX_ARRAY_TEXTURE_LAYERS:
378 case GL_MAX_VERTEX_UNIFORM_BLOCKS:
379 case GL_MAX_FRAGMENT_UNIFORM_BLOCKS:
380 case GL_MAX_COMBINED_UNIFORM_BLOCKS:
381 case GL_MAX_VERTEX_OUTPUT_COMPONENTS:
382 case GL_MAX_FRAGMENT_INPUT_COMPONENTS:
383 case GL_MAX_VARYING_COMPONENTS:
384 case GL_MAX_VERTEX_UNIFORM_COMPONENTS:
385 case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS:
386 case GL_MIN_PROGRAM_TEXEL_OFFSET:
387 case GL_MAX_PROGRAM_TEXEL_OFFSET:
388 case GL_NUM_EXTENSIONS:
389 case GL_MAJOR_VERSION:
390 case GL_MINOR_VERSION:
391 case GL_MAX_ELEMENTS_INDICES:
392 case GL_MAX_ELEMENTS_VERTICES:
393 case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS:
394 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS:
395 case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS:
396 case GL_UNPACK_IMAGE_HEIGHT:
397 case GL_UNPACK_SKIP_IMAGES:
398 {
399 *type = GL_INT;
400 *numParams = 1;
401 return true;
402 }
403
404 case GL_MAX_ELEMENT_INDEX:
405 case GL_MAX_UNIFORM_BLOCK_SIZE:
406 case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
407 case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
408 case GL_MAX_SERVER_WAIT_TIMEOUT:
409 {
410 *type = GL_INT_64_ANGLEX;
411 *numParams = 1;
412 return true;
413 }
414
415 case GL_TRANSFORM_FEEDBACK_ACTIVE:
416 case GL_TRANSFORM_FEEDBACK_PAUSED:
417 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
418 case GL_RASTERIZER_DISCARD:
419 {
420 *type = GL_BOOL;
421 *numParams = 1;
422 return true;
423 }
424
425 case GL_MAX_TEXTURE_LOD_BIAS:
426 {
427 *type = GL_FLOAT;
428 *numParams = 1;
429 return true;
430 }
431 }
432
433 return false;
434}
435
436bool ValidationContext::getIndexedQueryParameterInfo(GLenum target,
437 GLenum *type,
438 unsigned int *numParams)
439{
440 if (getClientVersion() < 3)
441 {
442 return false;
443 }
444
445 switch (target)
446 {
447 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
448 case GL_UNIFORM_BUFFER_BINDING:
449 {
450 *type = GL_INT;
451 *numParams = 1;
452 return true;
453 }
454 case GL_TRANSFORM_FEEDBACK_BUFFER_START:
455 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
456 case GL_UNIFORM_BUFFER_START:
457 case GL_UNIFORM_BUFFER_SIZE:
458 {
459 *type = GL_INT_64_ANGLEX;
460 *numParams = 1;
461 return true;
462 }
463 }
464
465 return false;
466}
467
Jamie Madill46e6c7a2016-01-18 14:42:30 -0500468} // namespace gl