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