blob: eaa7f81a21e0971cf9123a884283c32bb49d6f25 [file] [log] [blame]
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001//
Geoff Langcec35902014-04-16 10:52:36 -04002// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
Geoff Lange8ebe7f2013-08-05 15:03:13 -04003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// validationES2.cpp: Validation functions for OpenGL ES 2.0 entry point parameters
8
Jamie Madill778bf092018-11-14 09:54:36 -05009#include "libANGLE/validationES2_autogen.h"
Sami Väisänene45e53b2016-05-25 10:36:04 +030010
11#include <cstdint>
12
Geoff Lange8ebe7f2013-08-05 15:03:13 -040013#include "common/mathutil.h"
Sami Väisänen46eaa942016-06-29 10:26:37 +030014#include "common/string_utils.h"
Geoff Lange8ebe7f2013-08-05 15:03:13 -040015#include "common/utilities.h"
Jamie Madillef300b12016-10-07 15:12:09 -040016#include "libANGLE/Context.h"
Brandon Jones6cad5662017-06-14 13:25:13 -070017#include "libANGLE/ErrorStrings.h"
Jamie Madill2b7bbc22017-12-21 17:30:38 -050018#include "libANGLE/Fence.h"
Jamie Madillef300b12016-10-07 15:12:09 -040019#include "libANGLE/Framebuffer.h"
20#include "libANGLE/FramebufferAttachment.h"
21#include "libANGLE/Renderbuffer.h"
22#include "libANGLE/Shader.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040023#include "libANGLE/Texture.h"
Jamie Madillef300b12016-10-07 15:12:09 -040024#include "libANGLE/Uniform.h"
Jamie Madill231c7f52017-04-26 13:45:37 -040025#include "libANGLE/VertexArray.h"
Jamie Madillef300b12016-10-07 15:12:09 -040026#include "libANGLE/formatutils.h"
27#include "libANGLE/validationES.h"
Jamie Madill778bf092018-11-14 09:54:36 -050028#include "libANGLE/validationES2.h"
29#include "libANGLE/validationES3_autogen.h"
Geoff Lange8ebe7f2013-08-05 15:03:13 -040030
31namespace gl
32{
Jamie Madille0472f32018-11-27 16:32:45 -050033using namespace err;
Geoff Lange8ebe7f2013-08-05 15:03:13 -040034
Jamie Madillc29968b2016-01-20 11:17:23 -050035namespace
36{
37
38bool IsPartialBlit(gl::Context *context,
39 const FramebufferAttachment *readBuffer,
40 const FramebufferAttachment *writeBuffer,
41 GLint srcX0,
42 GLint srcY0,
43 GLint srcX1,
44 GLint srcY1,
45 GLint dstX0,
46 GLint dstY0,
47 GLint dstX1,
48 GLint dstY1)
49{
50 const Extents &writeSize = writeBuffer->getSize();
51 const Extents &readSize = readBuffer->getSize();
52
53 if (srcX0 != 0 || srcY0 != 0 || dstX0 != 0 || dstY0 != 0 || dstX1 != writeSize.width ||
54 dstY1 != writeSize.height || srcX1 != readSize.width || srcY1 != readSize.height)
55 {
56 return true;
57 }
58
Jamie Madillc3dc5d42018-12-30 12:12:04 -050059 if (context->getState().isScissorTestEnabled())
Jamie Madillc29968b2016-01-20 11:17:23 -050060 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -050061 const Rectangle &scissor = context->getState().getScissor();
Jamie Madillc29968b2016-01-20 11:17:23 -050062 return scissor.x > 0 || scissor.y > 0 || scissor.width < writeSize.width ||
63 scissor.height < writeSize.height;
64 }
65
66 return false;
67}
68
Sami Väisänend59ca052016-06-21 16:10:00 +030069template <typename T>
70bool ValidatePathInstances(gl::Context *context,
71 GLsizei numPaths,
72 const void *paths,
73 GLuint pathBase)
74{
75 const auto *array = static_cast<const T *>(paths);
76
77 for (GLsizei i = 0; i < numPaths; ++i)
78 {
79 const GLuint pathName = array[i] + pathBase;
Brandon Jones59770802018-04-02 13:18:42 -070080 if (context->isPathGenerated(pathName) && !context->isPath(pathName))
Sami Väisänend59ca052016-06-21 16:10:00 +030081 {
Jamie Madille0472f32018-11-27 16:32:45 -050082 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänend59ca052016-06-21 16:10:00 +030083 return false;
84 }
85 }
86 return true;
87}
88
89bool ValidateInstancedPathParameters(gl::Context *context,
90 GLsizei numPaths,
91 GLenum pathNameType,
92 const void *paths,
93 GLuint pathBase,
94 GLenum transformType,
95 const GLfloat *transformValues)
96{
97 if (!context->getExtensions().pathRendering)
98 {
Jamie Madillc3e37312018-11-30 15:25:39 -050099 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänend59ca052016-06-21 16:10:00 +0300100 return false;
101 }
102
103 if (paths == nullptr)
104 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500105 context->validationError(GL_INVALID_VALUE, kInvalidPathNameArray);
Sami Väisänend59ca052016-06-21 16:10:00 +0300106 return false;
107 }
108
109 if (numPaths < 0)
110 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500111 context->validationError(GL_INVALID_VALUE, kInvalidPathNumPaths);
Sami Väisänend59ca052016-06-21 16:10:00 +0300112 return false;
113 }
114
115 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(numPaths))
116 {
Jamie Madille0472f32018-11-27 16:32:45 -0500117 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänend59ca052016-06-21 16:10:00 +0300118 return false;
119 }
120
121 std::uint32_t pathNameTypeSize = 0;
122 std::uint32_t componentCount = 0;
123
124 switch (pathNameType)
125 {
126 case GL_UNSIGNED_BYTE:
127 pathNameTypeSize = sizeof(GLubyte);
128 if (!ValidatePathInstances<GLubyte>(context, numPaths, paths, pathBase))
129 return false;
130 break;
131
132 case GL_BYTE:
133 pathNameTypeSize = sizeof(GLbyte);
134 if (!ValidatePathInstances<GLbyte>(context, numPaths, paths, pathBase))
135 return false;
136 break;
137
138 case GL_UNSIGNED_SHORT:
139 pathNameTypeSize = sizeof(GLushort);
140 if (!ValidatePathInstances<GLushort>(context, numPaths, paths, pathBase))
141 return false;
142 break;
143
144 case GL_SHORT:
145 pathNameTypeSize = sizeof(GLshort);
146 if (!ValidatePathInstances<GLshort>(context, numPaths, paths, pathBase))
147 return false;
148 break;
149
150 case GL_UNSIGNED_INT:
151 pathNameTypeSize = sizeof(GLuint);
152 if (!ValidatePathInstances<GLuint>(context, numPaths, paths, pathBase))
153 return false;
154 break;
155
156 case GL_INT:
157 pathNameTypeSize = sizeof(GLint);
158 if (!ValidatePathInstances<GLint>(context, numPaths, paths, pathBase))
159 return false;
160 break;
161
162 default:
Jamie Madillc3e37312018-11-30 15:25:39 -0500163 context->validationError(GL_INVALID_ENUM, kInvalidPathNameType);
Sami Väisänend59ca052016-06-21 16:10:00 +0300164 return false;
165 }
166
167 switch (transformType)
168 {
169 case GL_NONE:
170 componentCount = 0;
171 break;
172 case GL_TRANSLATE_X_CHROMIUM:
173 case GL_TRANSLATE_Y_CHROMIUM:
174 componentCount = 1;
175 break;
176 case GL_TRANSLATE_2D_CHROMIUM:
177 componentCount = 2;
178 break;
179 case GL_TRANSLATE_3D_CHROMIUM:
180 componentCount = 3;
181 break;
182 case GL_AFFINE_2D_CHROMIUM:
183 case GL_TRANSPOSE_AFFINE_2D_CHROMIUM:
184 componentCount = 6;
185 break;
186 case GL_AFFINE_3D_CHROMIUM:
187 case GL_TRANSPOSE_AFFINE_3D_CHROMIUM:
188 componentCount = 12;
189 break;
190 default:
Jamie Madillc3e37312018-11-30 15:25:39 -0500191 context->validationError(GL_INVALID_ENUM, kInvalidTransformation);
Sami Väisänend59ca052016-06-21 16:10:00 +0300192 return false;
193 }
194 if (componentCount != 0 && transformValues == nullptr)
195 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500196 context->validationError(GL_INVALID_VALUE, kNoTransformArray);
Sami Väisänend59ca052016-06-21 16:10:00 +0300197 return false;
198 }
199
200 angle::CheckedNumeric<std::uint32_t> checkedSize(0);
201 checkedSize += (numPaths * pathNameTypeSize);
202 checkedSize += (numPaths * sizeof(GLfloat) * componentCount);
203 if (!checkedSize.IsValid())
204 {
Jamie Madille0472f32018-11-27 16:32:45 -0500205 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänend59ca052016-06-21 16:10:00 +0300206 return false;
207 }
208
209 return true;
210}
211
Geoff Lang4f0e0032017-05-01 16:04:35 -0400212bool IsValidCopyTextureSourceInternalFormatEnum(GLenum internalFormat)
Geoff Lang97073d12016-04-20 10:42:34 -0700213{
Geoff Lang4f0e0032017-05-01 16:04:35 -0400214 // Table 1.1 from the CHROMIUM_copy_texture spec
Geoff Langca271392017-04-05 12:30:00 -0400215 switch (GetUnsizedFormat(internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -0700216 {
Geoff Lang4f0e0032017-05-01 16:04:35 -0400217 case GL_RED:
Geoff Lang97073d12016-04-20 10:42:34 -0700218 case GL_ALPHA:
219 case GL_LUMINANCE:
220 case GL_LUMINANCE_ALPHA:
221 case GL_RGB:
222 case GL_RGBA:
Geoff Lang4f0e0032017-05-01 16:04:35 -0400223 case GL_RGB8:
224 case GL_RGBA8:
225 case GL_BGRA_EXT:
226 case GL_BGRA8_EXT:
Geoff Lang97073d12016-04-20 10:42:34 -0700227 return true;
228
Geoff Lang4f0e0032017-05-01 16:04:35 -0400229 default:
230 return false;
231 }
232}
Geoff Lang97073d12016-04-20 10:42:34 -0700233
Geoff Lang4f0e0032017-05-01 16:04:35 -0400234bool IsValidCopySubTextureSourceInternalFormat(GLenum internalFormat)
235{
236 return IsValidCopyTextureSourceInternalFormatEnum(internalFormat);
237}
238
Geoff Lang4f0e0032017-05-01 16:04:35 -0400239bool IsValidCopyTextureDestinationInternalFormatEnum(GLint internalFormat)
240{
241 // Table 1.0 from the CHROMIUM_copy_texture spec
242 switch (internalFormat)
243 {
244 case GL_RGB:
245 case GL_RGBA:
246 case GL_RGB8:
247 case GL_RGBA8:
Geoff Lang97073d12016-04-20 10:42:34 -0700248 case GL_BGRA_EXT:
Geoff Lang4f0e0032017-05-01 16:04:35 -0400249 case GL_BGRA8_EXT:
250 case GL_SRGB_EXT:
251 case GL_SRGB_ALPHA_EXT:
252 case GL_R8:
253 case GL_R8UI:
254 case GL_RG8:
255 case GL_RG8UI:
256 case GL_SRGB8:
257 case GL_RGB565:
258 case GL_RGB8UI:
Geoff Lang6be3d4c2017-06-16 15:54:15 -0400259 case GL_RGB10_A2:
Geoff Lang4f0e0032017-05-01 16:04:35 -0400260 case GL_SRGB8_ALPHA8:
261 case GL_RGB5_A1:
262 case GL_RGBA4:
263 case GL_RGBA8UI:
264 case GL_RGB9_E5:
265 case GL_R16F:
266 case GL_R32F:
267 case GL_RG16F:
268 case GL_RG32F:
269 case GL_RGB16F:
270 case GL_RGB32F:
271 case GL_RGBA16F:
272 case GL_RGBA32F:
273 case GL_R11F_G11F_B10F:
Brandon Jones340b7b82017-06-26 13:02:31 -0700274 case GL_LUMINANCE:
275 case GL_LUMINANCE_ALPHA:
276 case GL_ALPHA:
Geoff Lang4f0e0032017-05-01 16:04:35 -0400277 return true;
Geoff Lang97073d12016-04-20 10:42:34 -0700278
279 default:
280 return false;
281 }
282}
283
Geoff Lang6be3d4c2017-06-16 15:54:15 -0400284bool IsValidCopySubTextureDestionationInternalFormat(GLenum internalFormat)
285{
286 return IsValidCopyTextureDestinationInternalFormatEnum(internalFormat);
287}
288
Geoff Lang97073d12016-04-20 10:42:34 -0700289bool IsValidCopyTextureDestinationFormatType(Context *context, GLint internalFormat, GLenum type)
290{
Geoff Lang4f0e0032017-05-01 16:04:35 -0400291 if (!IsValidCopyTextureDestinationInternalFormatEnum(internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -0700292 {
Jamie Madille0472f32018-11-27 16:32:45 -0500293 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400294 return false;
Geoff Lang97073d12016-04-20 10:42:34 -0700295 }
296
Geoff Langc0094ec2017-08-16 14:16:24 -0400297 if (!ValidES3FormatCombination(GetUnsizedFormat(internalFormat), type, internalFormat))
298 {
Jamie Madille0472f32018-11-27 16:32:45 -0500299 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Langc0094ec2017-08-16 14:16:24 -0400300 return false;
301 }
302
Geoff Lang4f0e0032017-05-01 16:04:35 -0400303 const InternalFormat &internalFormatInfo = GetInternalFormatInfo(internalFormat, type);
304 if (!internalFormatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
Geoff Lang97073d12016-04-20 10:42:34 -0700305 {
Jamie Madille0472f32018-11-27 16:32:45 -0500306 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400307 return false;
Geoff Lang97073d12016-04-20 10:42:34 -0700308 }
309
310 return true;
311}
312
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800313bool IsValidCopyTextureDestinationTargetEnum(Context *context, TextureTarget target)
Geoff Lang97073d12016-04-20 10:42:34 -0700314{
315 switch (target)
316 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800317 case TextureTarget::_2D:
318 case TextureTarget::CubeMapNegativeX:
319 case TextureTarget::CubeMapNegativeY:
320 case TextureTarget::CubeMapNegativeZ:
321 case TextureTarget::CubeMapPositiveX:
322 case TextureTarget::CubeMapPositiveY:
323 case TextureTarget::CubeMapPositiveZ:
Geoff Lang63458a32017-10-30 15:16:53 -0400324 return true;
Geoff Lang97073d12016-04-20 10:42:34 -0700325
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800326 case TextureTarget::Rectangle:
Geoff Lang63458a32017-10-30 15:16:53 -0400327 return context->getExtensions().textureRectangle;
Geoff Lang97073d12016-04-20 10:42:34 -0700328
329 default:
330 return false;
331 }
332}
333
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800334bool IsValidCopyTextureDestinationTarget(Context *context,
335 TextureType textureType,
336 TextureTarget target)
Geoff Lang63458a32017-10-30 15:16:53 -0400337{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800338 return TextureTargetToType(target) == textureType;
Geoff Lang63458a32017-10-30 15:16:53 -0400339}
340
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800341bool IsValidCopyTextureSourceTarget(Context *context, TextureType type)
Geoff Lang97073d12016-04-20 10:42:34 -0700342{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800343 switch (type)
Geoff Lang97073d12016-04-20 10:42:34 -0700344 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800345 case TextureType::_2D:
Geoff Lang4f0e0032017-05-01 16:04:35 -0400346 return true;
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800347 case TextureType::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -0400348 return context->getExtensions().textureRectangle;
Geoff Langbe607ad2018-11-29 10:14:22 -0500349 case TextureType::External:
350 return context->getExtensions().eglImageExternal;
Geoff Lang4f0e0032017-05-01 16:04:35 -0400351 default:
352 return false;
353 }
354}
355
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800356bool IsValidCopyTextureSourceLevel(Context *context, TextureType type, GLint level)
Geoff Lang4f0e0032017-05-01 16:04:35 -0400357{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800358 if (!ValidMipLevel(context, type, level))
Geoff Lang4f0e0032017-05-01 16:04:35 -0400359 {
360 return false;
Geoff Lang97073d12016-04-20 10:42:34 -0700361 }
362
Geoff Lang4f0e0032017-05-01 16:04:35 -0400363 if (level > 0 && context->getClientVersion() < ES_3_0)
364 {
365 return false;
366 }
Geoff Lang97073d12016-04-20 10:42:34 -0700367
Geoff Lang4f0e0032017-05-01 16:04:35 -0400368 return true;
369}
370
371bool IsValidCopyTextureDestinationLevel(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800372 TextureType type,
Geoff Lang4f0e0032017-05-01 16:04:35 -0400373 GLint level,
374 GLsizei width,
Brandon Jones28783792018-03-05 09:37:32 -0800375 GLsizei height,
376 bool isSubImage)
Geoff Lang4f0e0032017-05-01 16:04:35 -0400377{
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800378 if (!ValidMipLevel(context, type, level))
Geoff Lang4f0e0032017-05-01 16:04:35 -0400379 {
380 return false;
381 }
382
Brandon Jones28783792018-03-05 09:37:32 -0800383 if (!ValidImageSizeParameters(context, type, level, width, height, 1, isSubImage))
384 {
385 return false;
386 }
387
Geoff Lang4f0e0032017-05-01 16:04:35 -0400388 const Caps &caps = context->getCaps();
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800389 switch (type)
Geoff Lang4f0e0032017-05-01 16:04:35 -0400390 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800391 case TextureType::_2D:
392 return static_cast<GLuint>(width) <= (caps.max2DTextureSize >> level) &&
393 static_cast<GLuint>(height) <= (caps.max2DTextureSize >> level);
394 case TextureType::Rectangle:
395 ASSERT(level == 0);
396 return static_cast<GLuint>(width) <= (caps.max2DTextureSize >> level) &&
397 static_cast<GLuint>(height) <= (caps.max2DTextureSize >> level);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400398
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800399 case TextureType::CubeMap:
400 return static_cast<GLuint>(width) <= (caps.maxCubeMapTextureSize >> level) &&
401 static_cast<GLuint>(height) <= (caps.maxCubeMapTextureSize >> level);
402 default:
403 return true;
404 }
Geoff Lang97073d12016-04-20 10:42:34 -0700405}
406
Jamie Madillc1d770e2017-04-13 17:31:24 -0400407bool IsValidStencilFunc(GLenum func)
408{
409 switch (func)
410 {
411 case GL_NEVER:
412 case GL_ALWAYS:
413 case GL_LESS:
414 case GL_LEQUAL:
415 case GL_EQUAL:
416 case GL_GEQUAL:
417 case GL_GREATER:
418 case GL_NOTEQUAL:
419 return true;
420
421 default:
422 return false;
423 }
424}
425
426bool IsValidStencilFace(GLenum face)
427{
428 switch (face)
429 {
430 case GL_FRONT:
431 case GL_BACK:
432 case GL_FRONT_AND_BACK:
433 return true;
434
435 default:
436 return false;
437 }
438}
439
440bool IsValidStencilOp(GLenum op)
441{
442 switch (op)
443 {
444 case GL_ZERO:
445 case GL_KEEP:
446 case GL_REPLACE:
447 case GL_INCR:
448 case GL_DECR:
449 case GL_INVERT:
450 case GL_INCR_WRAP:
451 case GL_DECR_WRAP:
452 return true;
453
454 default:
455 return false;
456 }
457}
458
Jamie Madill5b772312018-03-08 20:28:32 -0500459bool ValidateES2CopyTexImageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800460 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -0400461 GLint level,
462 GLenum internalformat,
463 bool isSubImage,
464 GLint xoffset,
465 GLint yoffset,
466 GLint x,
467 GLint y,
468 GLsizei width,
469 GLsizei height,
470 GLint border)
471{
472 if (!ValidTexture2DDestinationTarget(context, target))
473 {
Jamie Madille0472f32018-11-27 16:32:45 -0500474 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -0400475 return false;
476 }
477
Corentin Wallezf0e89be2017-11-08 14:00:32 -0800478 TextureType texType = TextureTargetToType(target);
479 if (!ValidImageSizeParameters(context, texType, level, width, height, 1, isSubImage))
Jamie Madillbe849e42017-05-02 15:49:00 -0400480 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500481 // Error is already handled.
Jamie Madillbe849e42017-05-02 15:49:00 -0400482 return false;
483 }
484
485 Format textureFormat = Format::Invalid();
486 if (!ValidateCopyTexImageParametersBase(context, target, level, internalformat, isSubImage,
487 xoffset, yoffset, 0, x, y, width, height, border,
488 &textureFormat))
489 {
490 return false;
491 }
492
Jamie Madillc3dc5d42018-12-30 12:12:04 -0500493 const gl::Framebuffer *framebuffer = context->getState().getReadFramebuffer();
Jamie Madillbe849e42017-05-02 15:49:00 -0400494 GLenum colorbufferFormat =
495 framebuffer->getReadColorbuffer()->getFormat().info->sizedInternalFormat;
496 const auto &formatInfo = *textureFormat.info;
497
498 // [OpenGL ES 2.0.24] table 3.9
499 if (isSubImage)
500 {
501 switch (formatInfo.format)
502 {
503 case GL_ALPHA:
504 if (colorbufferFormat != GL_ALPHA8_EXT && colorbufferFormat != GL_RGBA4 &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400505 colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_RGBA8_OES &&
506 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400507 {
Jamie Madille0472f32018-11-27 16:32:45 -0500508 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400509 return false;
510 }
511 break;
512 case GL_LUMINANCE:
513 if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
514 colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
515 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400516 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGRA8_EXT &&
517 colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400518 {
Jamie Madille0472f32018-11-27 16:32:45 -0500519 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400520 return false;
521 }
522 break;
523 case GL_RED_EXT:
524 if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
525 colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
526 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
527 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_R32F &&
528 colorbufferFormat != GL_RG32F && colorbufferFormat != GL_RGB32F &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400529 colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
530 colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400531 {
Jamie Madille0472f32018-11-27 16:32:45 -0500532 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400533 return false;
534 }
535 break;
536 case GL_RG_EXT:
537 if (colorbufferFormat != GL_RG8_EXT && colorbufferFormat != GL_RGB565 &&
538 colorbufferFormat != GL_RGB8_OES && colorbufferFormat != GL_RGBA4 &&
539 colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_RGBA8_OES &&
540 colorbufferFormat != GL_RG32F && colorbufferFormat != GL_RGB32F &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400541 colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
542 colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400543 {
Jamie Madille0472f32018-11-27 16:32:45 -0500544 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400545 return false;
546 }
547 break;
548 case GL_RGB:
549 if (colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
550 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
551 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_RGB32F &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400552 colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT &&
553 colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400554 {
Jamie Madille0472f32018-11-27 16:32:45 -0500555 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400556 return false;
557 }
558 break;
559 case GL_LUMINANCE_ALPHA:
560 case GL_RGBA:
561 if (colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
Geoff Lang0c09e262017-05-03 09:43:13 -0400562 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_RGBA32F &&
563 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_BGR5_A1_ANGLEX)
Jamie Madillbe849e42017-05-02 15:49:00 -0400564 {
Jamie Madille0472f32018-11-27 16:32:45 -0500565 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400566 return false;
567 }
568 break;
569 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
570 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
571 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
572 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
573 case GL_ETC1_RGB8_OES:
574 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
575 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
576 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
577 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
578 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
Olli Etuahof2ed2992018-10-04 13:54:42 +0300579 case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
580 case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
581 case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
582 case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
Jamie Madille0472f32018-11-27 16:32:45 -0500583 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400584 return false;
585 case GL_DEPTH_COMPONENT:
586 case GL_DEPTH_STENCIL_OES:
Jamie Madille0472f32018-11-27 16:32:45 -0500587 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400588 return false;
589 default:
Jamie Madille0472f32018-11-27 16:32:45 -0500590 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400591 return false;
592 }
593
594 if (formatInfo.type == GL_FLOAT && !context->getExtensions().textureFloat)
595 {
Jamie Madille0472f32018-11-27 16:32:45 -0500596 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400597 return false;
598 }
599 }
600 else
601 {
602 switch (internalformat)
603 {
604 case GL_ALPHA:
605 if (colorbufferFormat != GL_ALPHA8_EXT && colorbufferFormat != GL_RGBA4 &&
606 colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_BGRA8_EXT &&
607 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGR5_A1_ANGLEX)
608 {
Jamie Madille0472f32018-11-27 16:32:45 -0500609 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400610 return false;
611 }
612 break;
613 case GL_LUMINANCE:
614 if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
615 colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
616 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
617 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
618 colorbufferFormat != GL_BGR5_A1_ANGLEX)
619 {
Jamie Madille0472f32018-11-27 16:32:45 -0500620 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400621 return false;
622 }
623 break;
624 case GL_RED_EXT:
625 if (colorbufferFormat != GL_R8_EXT && colorbufferFormat != GL_RG8_EXT &&
626 colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
627 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
628 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
629 colorbufferFormat != GL_BGR5_A1_ANGLEX)
630 {
Jamie Madille0472f32018-11-27 16:32:45 -0500631 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400632 return false;
633 }
634 break;
635 case GL_RG_EXT:
636 if (colorbufferFormat != GL_RG8_EXT && colorbufferFormat != GL_RGB565 &&
637 colorbufferFormat != GL_RGB8_OES && colorbufferFormat != GL_RGBA4 &&
638 colorbufferFormat != GL_RGB5_A1 && colorbufferFormat != GL_BGRA8_EXT &&
639 colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_BGR5_A1_ANGLEX)
640 {
Jamie Madille0472f32018-11-27 16:32:45 -0500641 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400642 return false;
643 }
644 break;
645 case GL_RGB:
646 if (colorbufferFormat != GL_RGB565 && colorbufferFormat != GL_RGB8_OES &&
647 colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
648 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
649 colorbufferFormat != GL_BGR5_A1_ANGLEX)
650 {
Jamie Madille0472f32018-11-27 16:32:45 -0500651 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400652 return false;
653 }
654 break;
655 case GL_LUMINANCE_ALPHA:
656 case GL_RGBA:
657 if (colorbufferFormat != GL_RGBA4 && colorbufferFormat != GL_RGB5_A1 &&
658 colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_RGBA8_OES &&
659 colorbufferFormat != GL_BGR5_A1_ANGLEX)
660 {
Jamie Madille0472f32018-11-27 16:32:45 -0500661 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400662 return false;
663 }
664 break;
665 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
666 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
667 if (context->getExtensions().textureCompressionDXT1)
668 {
Jamie Madille0472f32018-11-27 16:32:45 -0500669 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400670 return false;
671 }
672 else
673 {
Jamie Madille0472f32018-11-27 16:32:45 -0500674 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400675 return false;
676 }
677 break;
678 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
679 if (context->getExtensions().textureCompressionDXT3)
680 {
Jamie Madille0472f32018-11-27 16:32:45 -0500681 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400682 return false;
683 }
684 else
685 {
Jamie Madille0472f32018-11-27 16:32:45 -0500686 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400687 return false;
688 }
689 break;
690 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
691 if (context->getExtensions().textureCompressionDXT5)
692 {
Jamie Madille0472f32018-11-27 16:32:45 -0500693 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400694 return false;
695 }
696 else
697 {
Jamie Madille0472f32018-11-27 16:32:45 -0500698 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400699 return false;
700 }
701 break;
702 case GL_ETC1_RGB8_OES:
703 if (context->getExtensions().compressedETC1RGB8Texture)
704 {
Jamie Madille0472f32018-11-27 16:32:45 -0500705 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400706 return false;
707 }
708 else
709 {
Jamie Madille0472f32018-11-27 16:32:45 -0500710 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400711 return false;
712 }
713 break;
714 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
715 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
716 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
717 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
718 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
719 if (context->getExtensions().lossyETCDecode)
720 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500721 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400722 return false;
723 }
724 else
725 {
Jamie Madillc3e37312018-11-30 15:25:39 -0500726 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400727 return false;
728 }
729 break;
730 case GL_DEPTH_COMPONENT:
731 case GL_DEPTH_COMPONENT16:
732 case GL_DEPTH_COMPONENT32_OES:
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -0600733 if (context->getExtensions().depthTextureAny())
Jamie Madillbe849e42017-05-02 15:49:00 -0400734 {
Jamie Madille0472f32018-11-27 16:32:45 -0500735 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400736 return false;
737 }
738 else
739 {
Jamie Madille0472f32018-11-27 16:32:45 -0500740 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400741 return false;
742 }
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -0600743 break;
744 case GL_DEPTH_STENCIL_OES:
745 case GL_DEPTH24_STENCIL8_OES:
746 if (context->getExtensions().depthTextureAny() ||
747 context->getExtensions().packedDepthStencil)
748 {
749 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
750 return false;
751 }
752 else
753 {
754 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
755 return false;
756 }
757 break;
Jamie Madillbe849e42017-05-02 15:49:00 -0400758 default:
Jamie Madille0472f32018-11-27 16:32:45 -0500759 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400760 return false;
761 }
762 }
763
764 // If width or height is zero, it is a no-op. Return false without setting an error.
765 return (width > 0 && height > 0);
766}
767
768bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
769{
770 switch (cap)
771 {
772 // EXT_multisample_compatibility
773 case GL_MULTISAMPLE_EXT:
774 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
775 return context->getExtensions().multisampleCompatibility;
776
777 case GL_CULL_FACE:
778 case GL_POLYGON_OFFSET_FILL:
779 case GL_SAMPLE_ALPHA_TO_COVERAGE:
780 case GL_SAMPLE_COVERAGE:
781 case GL_SCISSOR_TEST:
782 case GL_STENCIL_TEST:
783 case GL_DEPTH_TEST:
784 case GL_BLEND:
785 case GL_DITHER:
786 return true;
787
788 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
789 case GL_RASTERIZER_DISCARD:
790 return (context->getClientMajorVersion() >= 3);
791
792 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
793 case GL_DEBUG_OUTPUT:
794 return context->getExtensions().debug;
795
796 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
797 return queryOnly && context->getExtensions().bindGeneratesResource;
798
799 case GL_CLIENT_ARRAYS_ANGLE:
800 return queryOnly && context->getExtensions().clientArrays;
801
802 case GL_FRAMEBUFFER_SRGB_EXT:
803 return context->getExtensions().sRGBWriteControl;
804
805 case GL_SAMPLE_MASK:
806 return context->getClientVersion() >= Version(3, 1);
807
Geoff Langb433e872017-10-05 14:01:47 -0400808 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madillbe849e42017-05-02 15:49:00 -0400809 return queryOnly && context->getExtensions().robustResourceInitialization;
810
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700811 // GLES1 emulation: GLES1-specific caps
812 case GL_ALPHA_TEST:
Lingfeng Yang01074432018-04-16 10:19:51 -0700813 case GL_VERTEX_ARRAY:
814 case GL_NORMAL_ARRAY:
815 case GL_COLOR_ARRAY:
816 case GL_TEXTURE_COORD_ARRAY:
Lingfeng Yang23dc90b2018-04-23 09:01:49 -0700817 case GL_TEXTURE_2D:
Lingfeng Yangd0febe72018-05-17 22:36:52 -0700818 case GL_LIGHTING:
819 case GL_LIGHT0:
820 case GL_LIGHT1:
821 case GL_LIGHT2:
822 case GL_LIGHT3:
823 case GL_LIGHT4:
824 case GL_LIGHT5:
825 case GL_LIGHT6:
826 case GL_LIGHT7:
827 case GL_NORMALIZE:
828 case GL_RESCALE_NORMAL:
829 case GL_COLOR_MATERIAL:
Lingfeng Yang060088a2018-05-30 20:40:57 -0700830 case GL_CLIP_PLANE0:
831 case GL_CLIP_PLANE1:
832 case GL_CLIP_PLANE2:
833 case GL_CLIP_PLANE3:
834 case GL_CLIP_PLANE4:
835 case GL_CLIP_PLANE5:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -0700836 case GL_FOG:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700837 case GL_POINT_SMOOTH:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700838 case GL_LINE_SMOOTH:
839 case GL_COLOR_LOGIC_OP:
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700840 return context->getClientVersion() < Version(2, 0);
Lingfeng Yang01074432018-04-16 10:19:51 -0700841 case GL_POINT_SIZE_ARRAY_OES:
842 return context->getClientVersion() < Version(2, 0) &&
843 context->getExtensions().pointSizeArray;
Lingfeng Yang23dc90b2018-04-23 09:01:49 -0700844 case GL_TEXTURE_CUBE_MAP:
845 return context->getClientVersion() < Version(2, 0) &&
846 context->getExtensions().textureCubeMap;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700847 case GL_POINT_SPRITE_OES:
848 return context->getClientVersion() < Version(2, 0) &&
849 context->getExtensions().pointSprite;
Jamie Madillbe849e42017-05-02 15:49:00 -0400850 default:
851 return false;
852 }
853}
854
Geoff Langfc32e8b2017-05-31 14:16:59 -0400855// Return true if a character belongs to the ASCII subset as defined in GLSL ES 1.0 spec section
856// 3.1.
Geoff Langcab92ee2017-07-19 17:32:07 -0400857bool IsValidESSLCharacter(unsigned char c)
Geoff Langfc32e8b2017-05-31 14:16:59 -0400858{
859 // Printing characters are valid except " $ ` @ \ ' DEL.
Geoff Langcab92ee2017-07-19 17:32:07 -0400860 if (c >= 32 && c <= 126 && c != '"' && c != '$' && c != '`' && c != '@' && c != '\\' &&
861 c != '\'')
Geoff Langfc32e8b2017-05-31 14:16:59 -0400862 {
863 return true;
864 }
865
866 // Horizontal tab, line feed, vertical tab, form feed, carriage return are also valid.
867 if (c >= 9 && c <= 13)
868 {
869 return true;
870 }
871
872 return false;
873}
874
Geoff Langcab92ee2017-07-19 17:32:07 -0400875bool IsValidESSLString(const char *str, size_t len)
Geoff Langfc32e8b2017-05-31 14:16:59 -0400876{
Geoff Langa71a98e2017-06-19 15:15:00 -0400877 for (size_t i = 0; i < len; i++)
878 {
Geoff Langcab92ee2017-07-19 17:32:07 -0400879 if (!IsValidESSLCharacter(str[i]))
Geoff Langa71a98e2017-06-19 15:15:00 -0400880 {
881 return false;
882 }
883 }
884
885 return true;
Geoff Langfc32e8b2017-05-31 14:16:59 -0400886}
887
Geoff Langcab92ee2017-07-19 17:32:07 -0400888bool IsValidESSLShaderSourceString(const char *str, size_t len, bool lineContinuationAllowed)
889{
890 enum class ParseState
891 {
892 // Have not seen an ASCII non-whitespace character yet on
893 // this line. Possible that we might see a preprocessor
894 // directive.
895 BEGINING_OF_LINE,
896
897 // Have seen at least one ASCII non-whitespace character
898 // on this line.
899 MIDDLE_OF_LINE,
900
901 // Handling a preprocessor directive. Passes through all
902 // characters up to the end of the line. Disables comment
903 // processing.
904 IN_PREPROCESSOR_DIRECTIVE,
905
906 // Handling a single-line comment. The comment text is
907 // replaced with a single space.
908 IN_SINGLE_LINE_COMMENT,
909
910 // Handling a multi-line comment. Newlines are passed
911 // through to preserve line numbers.
912 IN_MULTI_LINE_COMMENT
913 };
914
915 ParseState state = ParseState::BEGINING_OF_LINE;
916 size_t pos = 0;
917
918 while (pos < len)
919 {
920 char c = str[pos];
921 char next = pos + 1 < len ? str[pos + 1] : 0;
922
923 // Check for newlines
924 if (c == '\n' || c == '\r')
925 {
926 if (state != ParseState::IN_MULTI_LINE_COMMENT)
927 {
928 state = ParseState::BEGINING_OF_LINE;
929 }
930
931 pos++;
932 continue;
933 }
934
935 switch (state)
936 {
937 case ParseState::BEGINING_OF_LINE:
938 if (c == ' ')
939 {
940 // Maintain the BEGINING_OF_LINE state until a non-space is seen
941 pos++;
942 }
943 else if (c == '#')
944 {
945 state = ParseState::IN_PREPROCESSOR_DIRECTIVE;
946 pos++;
947 }
948 else
949 {
950 // Don't advance, re-process this character with the MIDDLE_OF_LINE state
951 state = ParseState::MIDDLE_OF_LINE;
952 }
953 break;
954
955 case ParseState::MIDDLE_OF_LINE:
956 if (c == '/' && next == '/')
957 {
958 state = ParseState::IN_SINGLE_LINE_COMMENT;
959 pos++;
960 }
961 else if (c == '/' && next == '*')
962 {
963 state = ParseState::IN_MULTI_LINE_COMMENT;
964 pos++;
965 }
966 else if (lineContinuationAllowed && c == '\\' && (next == '\n' || next == '\r'))
967 {
968 // Skip line continuation characters
969 }
970 else if (!IsValidESSLCharacter(c))
971 {
972 return false;
973 }
974 pos++;
975 break;
976
977 case ParseState::IN_PREPROCESSOR_DIRECTIVE:
Bryan Bernhart (Intel Americas Inc)335d8bf2017-10-23 15:41:43 -0700978 // Line-continuation characters may not be permitted.
979 // Otherwise, just pass it through. Do not parse comments in this state.
980 if (!lineContinuationAllowed && c == '\\')
981 {
982 return false;
983 }
Geoff Langcab92ee2017-07-19 17:32:07 -0400984 pos++;
985 break;
986
987 case ParseState::IN_SINGLE_LINE_COMMENT:
988 // Line-continuation characters are processed before comment processing.
989 // Advance string if a new line character is immediately behind
990 // line-continuation character.
991 if (c == '\\' && (next == '\n' || next == '\r'))
992 {
993 pos++;
994 }
995 pos++;
996 break;
997
998 case ParseState::IN_MULTI_LINE_COMMENT:
999 if (c == '*' && next == '/')
1000 {
1001 state = ParseState::MIDDLE_OF_LINE;
1002 pos++;
1003 }
1004 pos++;
1005 break;
1006 }
1007 }
1008
1009 return true;
1010}
1011
Jamie Madill5b772312018-03-08 20:28:32 -05001012bool ValidateWebGLNamePrefix(Context *context, const GLchar *name)
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001013{
1014 ASSERT(context->isWebGL());
1015
1016 // WebGL 1.0 [Section 6.16] GLSL Constructs
1017 // Identifiers starting with "webgl_" and "_webgl_" are reserved for use by WebGL.
1018 if (strncmp(name, "webgl_", 6) == 0 || strncmp(name, "_webgl_", 7) == 0)
1019 {
Jamie Madille0472f32018-11-27 16:32:45 -05001020 context->validationError(GL_INVALID_OPERATION, kWebglBindAttribLocationReservedPrefix);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001021 return false;
1022 }
1023
1024 return true;
1025}
1026
Jamie Madill5b772312018-03-08 20:28:32 -05001027bool ValidateWebGLNameLength(Context *context, size_t length)
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001028{
1029 ASSERT(context->isWebGL());
1030
1031 if (context->isWebGL1() && length > 256)
1032 {
1033 // WebGL 1.0 [Section 6.21] Maxmimum Uniform and Attribute Location Lengths
1034 // WebGL imposes a limit of 256 characters on the lengths of uniform and attribute
1035 // locations.
Jamie Madille0472f32018-11-27 16:32:45 -05001036 context->validationError(GL_INVALID_VALUE, kWebglNameLengthLimitExceeded);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001037
1038 return false;
1039 }
1040 else if (length > 1024)
1041 {
1042 // WebGL 2.0 [Section 4.3.2] WebGL 2.0 imposes a limit of 1024 characters on the lengths of
1043 // uniform and attribute locations.
Jamie Madille0472f32018-11-27 16:32:45 -05001044 context->validationError(GL_INVALID_VALUE, kWebgl2NameLengthLimitExceeded);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001045 return false;
1046 }
1047
1048 return true;
1049}
1050
Jamie Madill007530e2017-12-28 14:27:04 -05001051bool ValidateMatrixMode(Context *context, GLenum matrixMode)
1052{
1053 if (!context->getExtensions().pathRendering)
1054 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001055 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05001056 return false;
1057 }
1058
1059 if (matrixMode != GL_PATH_MODELVIEW_CHROMIUM && matrixMode != GL_PATH_PROJECTION_CHROMIUM)
1060 {
Jamie Madille0472f32018-11-27 16:32:45 -05001061 context->validationError(GL_INVALID_ENUM, kInvalidMatrixMode);
Jamie Madill007530e2017-12-28 14:27:04 -05001062 return false;
1063 }
1064 return true;
1065}
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001066
1067bool ValidBlendFunc(const Context *context, GLenum val)
1068{
1069 const gl::Extensions &ext = context->getExtensions();
1070
1071 // these are always valid for src and dst.
1072 switch (val)
1073 {
1074 case GL_ZERO:
1075 case GL_ONE:
1076 case GL_SRC_COLOR:
1077 case GL_ONE_MINUS_SRC_COLOR:
1078 case GL_DST_COLOR:
1079 case GL_ONE_MINUS_DST_COLOR:
1080 case GL_SRC_ALPHA:
1081 case GL_ONE_MINUS_SRC_ALPHA:
1082 case GL_DST_ALPHA:
1083 case GL_ONE_MINUS_DST_ALPHA:
1084 case GL_CONSTANT_COLOR:
1085 case GL_ONE_MINUS_CONSTANT_COLOR:
1086 case GL_CONSTANT_ALPHA:
1087 case GL_ONE_MINUS_CONSTANT_ALPHA:
1088 return true;
1089
1090 // EXT_blend_func_extended.
1091 case GL_SRC1_COLOR_EXT:
1092 case GL_SRC1_ALPHA_EXT:
1093 case GL_ONE_MINUS_SRC1_COLOR_EXT:
1094 case GL_ONE_MINUS_SRC1_ALPHA_EXT:
1095 case GL_SRC_ALPHA_SATURATE_EXT:
1096 return ext.blendFuncExtended;
1097
1098 default:
1099 return false;
1100 }
1101}
1102
1103bool ValidSrcBlendFunc(const Context *context, GLenum val)
1104{
1105 if (ValidBlendFunc(context, val))
1106 return true;
1107
1108 if (val == GL_SRC_ALPHA_SATURATE)
1109 return true;
1110
1111 return false;
1112}
1113
1114bool ValidDstBlendFunc(const Context *context, GLenum val)
1115{
1116 if (ValidBlendFunc(context, val))
1117 return true;
1118
1119 if (val == GL_SRC_ALPHA_SATURATE)
1120 {
1121 if (context->getClientMajorVersion() >= 3)
1122 return true;
1123 }
1124
1125 return false;
1126}
Michael Spangab6a59b2019-05-21 21:26:26 -04001127
1128bool IsValidImageLayout(ImageLayout layout)
1129{
1130 switch (layout)
1131 {
Michael Spang6c824a12019-06-18 15:43:33 -04001132 case ImageLayout::Undefined:
Michael Spangab6a59b2019-05-21 21:26:26 -04001133 case ImageLayout::General:
1134 case ImageLayout::ColorAttachment:
1135 case ImageLayout::DepthStencilAttachment:
1136 case ImageLayout::DepthStencilReadOnlyAttachment:
1137 case ImageLayout::ShaderReadOnly:
1138 case ImageLayout::TransferSrc:
1139 case ImageLayout::TransferDst:
1140 case ImageLayout::DepthReadOnlyStencilAttachment:
1141 case ImageLayout::DepthAttachmentStencilReadOnly:
1142 return true;
1143
1144 default:
1145 return false;
1146 }
1147}
1148
Geoff Langff5b2d52016-09-07 11:32:23 -04001149bool ValidateES2TexImageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001150 TextureTarget target,
Geoff Langff5b2d52016-09-07 11:32:23 -04001151 GLint level,
1152 GLenum internalformat,
1153 bool isCompressed,
1154 bool isSubImage,
1155 GLint xoffset,
1156 GLint yoffset,
1157 GLsizei width,
1158 GLsizei height,
1159 GLint border,
1160 GLenum format,
1161 GLenum type,
1162 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04001163 const void *pixels)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001164{
Jamie Madill6f38f822014-06-06 17:12:20 -04001165 if (!ValidTexture2DDestinationTarget(context, target))
1166 {
Jamie Madille0472f32018-11-27 16:32:45 -05001167 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langb1196682014-07-23 13:47:29 -04001168 return false;
Jamie Madill6f38f822014-06-06 17:12:20 -04001169 }
1170
Geoff Lang857880e2019-05-27 13:39:15 -04001171 return ValidateES2TexImageParametersBase(context, target, level, internalformat, isCompressed,
1172 isSubImage, xoffset, yoffset, width, height, border,
1173 format, type, imageSize, pixels);
1174}
1175
1176} // anonymous namespace
1177
1178bool ValidateES2TexImageParametersBase(Context *context,
1179 TextureTarget target,
1180 GLint level,
1181 GLenum internalformat,
1182 bool isCompressed,
1183 bool isSubImage,
1184 GLint xoffset,
1185 GLint yoffset,
1186 GLsizei width,
1187 GLsizei height,
1188 GLint border,
1189 GLenum format,
1190 GLenum type,
1191 GLsizei imageSize,
1192 const void *pixels)
1193{
1194
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001195 TextureType texType = TextureTargetToType(target);
1196 if (!ValidImageSizeParameters(context, texType, level, width, height, 1, isSubImage))
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001197 {
Jamie Madill610640f2018-11-21 17:28:41 -05001198 // Error already handled.
Geoff Langb1196682014-07-23 13:47:29 -04001199 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001200 }
1201
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001202 if (!ValidMipLevel(context, texType, level))
Brandon Jones6cad5662017-06-14 13:25:13 -07001203 {
Jamie Madille0472f32018-11-27 16:32:45 -05001204 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Brandon Jones6cad5662017-06-14 13:25:13 -07001205 return false;
1206 }
1207
1208 if (xoffset < 0 || std::numeric_limits<GLsizei>::max() - xoffset < width ||
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001209 std::numeric_limits<GLsizei>::max() - yoffset < height)
1210 {
Jamie Madille0472f32018-11-27 16:32:45 -05001211 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Geoff Langb1196682014-07-23 13:47:29 -04001212 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001213 }
1214
Geoff Langaae65a42014-05-26 12:43:44 -04001215 const gl::Caps &caps = context->getCaps();
1216
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001217 switch (texType)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001218 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001219 case TextureType::_2D:
Geoff Lang857880e2019-05-27 13:39:15 -04001220 case TextureType::External:
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001221 if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
1222 static_cast<GLuint>(height) > (caps.max2DTextureSize >> level))
1223 {
Jamie Madille0472f32018-11-27 16:32:45 -05001224 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001225 return false;
1226 }
1227 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001228
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001229 case TextureType::Rectangle:
1230 ASSERT(level == 0);
1231 if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
1232 static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
1233 {
Jamie Madille0472f32018-11-27 16:32:45 -05001234 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001235 return false;
1236 }
1237 if (isCompressed)
1238 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001239 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001240 return false;
1241 }
1242 break;
1243
1244 case TextureType::CubeMap:
1245 if (!isSubImage && width != height)
1246 {
Jamie Madille0472f32018-11-27 16:32:45 -05001247 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001248 return false;
1249 }
1250
1251 if (static_cast<GLuint>(width) > (caps.maxCubeMapTextureSize >> level) ||
1252 static_cast<GLuint>(height) > (caps.maxCubeMapTextureSize >> level))
1253 {
Jamie Madille0472f32018-11-27 16:32:45 -05001254 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001255 return false;
1256 }
1257 break;
1258
1259 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001260 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langa9be0dc2014-12-17 12:34:40 -05001261 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001262 }
1263
Jamie Madillcfc73cc2019-04-08 16:26:51 -04001264 gl::Texture *texture = context->getTextureByType(texType);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001265 if (!texture)
1266 {
Jamie Madille0472f32018-11-27 16:32:45 -05001267 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Geoff Langb1196682014-07-23 13:47:29 -04001268 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001269 }
1270
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001271 // Verify zero border
1272 if (border != 0)
1273 {
Jamie Madille0472f32018-11-27 16:32:45 -05001274 context->validationError(GL_INVALID_VALUE, kInvalidBorder);
Geoff Langb1196682014-07-23 13:47:29 -04001275 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001276 }
1277
Tim Van Patten208af3e2019-03-19 09:15:55 -06001278 bool nonEqualFormatsAllowed = false;
1279
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001280 if (isCompressed)
1281 {
tmartino0ccd5ae2015-10-01 14:33:14 -04001282 GLenum actualInternalFormat =
Geoff Langca271392017-04-05 12:30:00 -04001283 isSubImage ? texture->getFormat(target, level).info->sizedInternalFormat
1284 : internalformat;
Geoff Lange88e4542018-05-03 15:05:57 -04001285
1286 const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(actualInternalFormat);
1287
1288 if (!internalFormatInfo.compressed)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001289 {
Jamie Madille0472f32018-11-27 16:32:45 -05001290 context->validationError(GL_INVALID_ENUM, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001291 return false;
1292 }
1293
1294 if (!internalFormatInfo.textureSupport(context->getClientVersion(),
1295 context->getExtensions()))
1296 {
Jamie Madille0472f32018-11-27 16:32:45 -05001297 context->validationError(GL_INVALID_ENUM, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001298 return false;
tmartino0ccd5ae2015-10-01 14:33:14 -04001299 }
Geoff Lang966c9402017-04-18 12:38:27 -04001300
1301 if (isSubImage)
tmartino0ccd5ae2015-10-01 14:33:14 -04001302 {
Geoff Lange88e4542018-05-03 15:05:57 -04001303 // From the OES_compressed_ETC1_RGB8_texture spec:
1304 // INVALID_OPERATION is generated by CompressedTexSubImage2D, TexSubImage2D, or
1305 // CopyTexSubImage2D if the texture image <level> bound to <target> has internal format
1306 // ETC1_RGB8_OES.
1307 if (actualInternalFormat == GL_ETC1_RGB8_OES)
1308 {
Jamie Madille0472f32018-11-27 16:32:45 -05001309 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001310 return false;
1311 }
1312
Geoff Lang966c9402017-04-18 12:38:27 -04001313 if (!ValidCompressedSubImageSize(context, actualInternalFormat, xoffset, yoffset, width,
1314 height, texture->getWidth(target, level),
1315 texture->getHeight(target, level)))
1316 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001317 context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
Geoff Lang966c9402017-04-18 12:38:27 -04001318 return false;
1319 }
1320
1321 if (format != actualInternalFormat)
1322 {
Jamie Madille0472f32018-11-27 16:32:45 -05001323 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Geoff Lang966c9402017-04-18 12:38:27 -04001324 return false;
1325 }
1326 }
1327 else
1328 {
1329 if (!ValidCompressedImageSize(context, actualInternalFormat, level, width, height))
1330 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001331 context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
Geoff Lang966c9402017-04-18 12:38:27 -04001332 return false;
1333 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001334 }
1335 }
1336 else
1337 {
1338 // validate <type> by itself (used as secondary key below)
1339 switch (type)
1340 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001341 case GL_UNSIGNED_BYTE:
1342 case GL_UNSIGNED_SHORT_5_6_5:
1343 case GL_UNSIGNED_SHORT_4_4_4_4:
1344 case GL_UNSIGNED_SHORT_5_5_5_1:
1345 case GL_UNSIGNED_SHORT:
1346 case GL_UNSIGNED_INT:
1347 case GL_UNSIGNED_INT_24_8_OES:
1348 case GL_HALF_FLOAT_OES:
1349 case GL_FLOAT:
1350 break;
1351 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001352 context->validationError(GL_INVALID_ENUM, kInvalidType);
He Yunchaoced53ae2016-11-29 15:00:51 +08001353 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001354 }
1355
1356 // validate <format> + <type> combinations
1357 // - invalid <format> -> sets INVALID_ENUM
1358 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
1359 switch (format)
1360 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001361 case GL_ALPHA:
1362 case GL_LUMINANCE:
1363 case GL_LUMINANCE_ALPHA:
1364 switch (type)
1365 {
1366 case GL_UNSIGNED_BYTE:
1367 case GL_FLOAT:
1368 case GL_HALF_FLOAT_OES:
1369 break;
1370 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001371 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001372 return false;
1373 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001374 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001375 case GL_RED:
1376 case GL_RG:
1377 if (!context->getExtensions().textureRG)
1378 {
Jamie Madille0472f32018-11-27 16:32:45 -05001379 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001380 return false;
1381 }
1382 switch (type)
1383 {
1384 case GL_UNSIGNED_BYTE:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001385 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001386 case GL_FLOAT:
1387 case GL_HALF_FLOAT_OES:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001388 if (!context->getExtensions().textureFloat)
1389 {
Jamie Madille0472f32018-11-27 16:32:45 -05001390 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001391 return false;
1392 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001393 break;
1394 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001395 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001396 return false;
1397 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001398 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001399 case GL_RGB:
1400 switch (type)
1401 {
1402 case GL_UNSIGNED_BYTE:
1403 case GL_UNSIGNED_SHORT_5_6_5:
1404 case GL_FLOAT:
1405 case GL_HALF_FLOAT_OES:
1406 break;
1407 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001408 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001409 return false;
1410 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001411 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001412 case GL_RGBA:
1413 switch (type)
1414 {
1415 case GL_UNSIGNED_BYTE:
1416 case GL_UNSIGNED_SHORT_4_4_4_4:
1417 case GL_UNSIGNED_SHORT_5_5_5_1:
1418 case GL_FLOAT:
1419 case GL_HALF_FLOAT_OES:
1420 break;
1421 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001422 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001423 return false;
1424 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001425 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001426 case GL_BGRA_EXT:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001427 if (!context->getExtensions().textureFormatBGRA8888)
1428 {
Jamie Madille0472f32018-11-27 16:32:45 -05001429 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001430 return false;
1431 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001432 switch (type)
1433 {
1434 case GL_UNSIGNED_BYTE:
1435 break;
1436 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001437 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001438 return false;
1439 }
1440 break;
1441 case GL_SRGB_EXT:
1442 case GL_SRGB_ALPHA_EXT:
1443 if (!context->getExtensions().sRGB)
1444 {
Jamie Madille0472f32018-11-27 16:32:45 -05001445 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001446 return false;
1447 }
1448 switch (type)
1449 {
1450 case GL_UNSIGNED_BYTE:
1451 break;
1452 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001453 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001454 return false;
1455 }
1456 break;
1457 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are
1458 // handled below
1459 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1460 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1461 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1462 break;
1463 case GL_DEPTH_COMPONENT:
1464 switch (type)
1465 {
1466 case GL_UNSIGNED_SHORT:
1467 case GL_UNSIGNED_INT:
1468 break;
1469 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001470 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001471 return false;
1472 }
1473 break;
1474 case GL_DEPTH_STENCIL_OES:
1475 switch (type)
1476 {
1477 case GL_UNSIGNED_INT_24_8_OES:
1478 break;
1479 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001480 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001481 return false;
1482 }
1483 break;
1484 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001485 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001486 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001487 }
1488
1489 switch (format)
1490 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001491 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1492 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1493 if (context->getExtensions().textureCompressionDXT1)
1494 {
Jamie Madille0472f32018-11-27 16:32:45 -05001495 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001496 return false;
1497 }
1498 else
1499 {
Jamie Madille0472f32018-11-27 16:32:45 -05001500 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001501 return false;
1502 }
1503 break;
1504 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1505 if (context->getExtensions().textureCompressionDXT3)
1506 {
Jamie Madille0472f32018-11-27 16:32:45 -05001507 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001508 return false;
1509 }
1510 else
1511 {
Jamie Madille0472f32018-11-27 16:32:45 -05001512 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001513 return false;
1514 }
1515 break;
1516 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1517 if (context->getExtensions().textureCompressionDXT5)
1518 {
Jamie Madille0472f32018-11-27 16:32:45 -05001519 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001520 return false;
1521 }
1522 else
1523 {
Jamie Madille0472f32018-11-27 16:32:45 -05001524 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001525 return false;
1526 }
1527 break;
1528 case GL_ETC1_RGB8_OES:
1529 if (context->getExtensions().compressedETC1RGB8Texture)
1530 {
Jamie Madille0472f32018-11-27 16:32:45 -05001531 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001532 return false;
1533 }
1534 else
1535 {
Jamie Madille0472f32018-11-27 16:32:45 -05001536 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001537 return false;
1538 }
1539 break;
1540 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
Minmin Gong390208b2017-02-28 18:03:06 -08001541 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
1542 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
1543 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
1544 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
He Yunchaoced53ae2016-11-29 15:00:51 +08001545 if (context->getExtensions().lossyETCDecode)
1546 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001547 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001548 return false;
1549 }
1550 else
1551 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001552 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001553 return false;
1554 }
1555 break;
1556 case GL_DEPTH_COMPONENT:
1557 case GL_DEPTH_STENCIL_OES:
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001558 if (!context->getExtensions().depthTextureANGLE &&
1559 !(context->getExtensions().packedDepthStencil &&
1560 context->getExtensions().depthTextureOES))
He Yunchaoced53ae2016-11-29 15:00:51 +08001561 {
Jamie Madille0472f32018-11-27 16:32:45 -05001562 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001563 return false;
1564 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001565 if (target != TextureTarget::_2D)
He Yunchaoced53ae2016-11-29 15:00:51 +08001566 {
Jamie Madille0472f32018-11-27 16:32:45 -05001567 context->validationError(GL_INVALID_OPERATION, kMismatchedTargetAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001568 return false;
1569 }
1570 // OES_depth_texture supports loading depth data and multiple levels,
1571 // but ANGLE_depth_texture does not
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001572 if (!context->getExtensions().depthTextureOES)
He Yunchaoced53ae2016-11-29 15:00:51 +08001573 {
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001574 if (pixels != nullptr)
1575 {
1576 context->validationError(GL_INVALID_OPERATION, kPixelDataNotNull);
1577 return false;
1578 }
1579 if (level != 0)
1580 {
1581 context->validationError(GL_INVALID_OPERATION, kLevelNotZero);
1582 return false;
1583 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001584 }
1585 break;
1586 default:
1587 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001588 }
1589
Geoff Lang6e898aa2017-06-02 11:17:26 -04001590 if (!isSubImage)
1591 {
1592 switch (internalformat)
1593 {
Tim Van Patten208af3e2019-03-19 09:15:55 -06001594 // Core ES 2.0 formats
1595 case GL_ALPHA:
1596 case GL_LUMINANCE:
1597 case GL_LUMINANCE_ALPHA:
1598 case GL_RGB:
1599 case GL_RGBA:
1600 break;
1601
Geoff Lang6e898aa2017-06-02 11:17:26 -04001602 case GL_RGBA32F:
1603 if (!context->getExtensions().colorBufferFloatRGBA)
1604 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001605 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001606 return false;
1607 }
Tim Van Patten208af3e2019-03-19 09:15:55 -06001608
1609 nonEqualFormatsAllowed = true;
1610
Geoff Lang6e898aa2017-06-02 11:17:26 -04001611 if (type != GL_FLOAT)
1612 {
Jamie Madille0472f32018-11-27 16:32:45 -05001613 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001614 return false;
1615 }
1616 if (format != GL_RGBA)
1617 {
Jamie Madille0472f32018-11-27 16:32:45 -05001618 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001619 return false;
1620 }
1621 break;
1622
1623 case GL_RGB32F:
1624 if (!context->getExtensions().colorBufferFloatRGB)
1625 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001626 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001627 return false;
1628 }
Tim Van Patten208af3e2019-03-19 09:15:55 -06001629
1630 nonEqualFormatsAllowed = true;
1631
Geoff Lang6e898aa2017-06-02 11:17:26 -04001632 if (type != GL_FLOAT)
1633 {
Jamie Madille0472f32018-11-27 16:32:45 -05001634 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001635 return false;
1636 }
1637 if (format != GL_RGB)
1638 {
Jamie Madille0472f32018-11-27 16:32:45 -05001639 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001640 return false;
1641 }
1642 break;
1643
Tim Van Patten208af3e2019-03-19 09:15:55 -06001644 case GL_BGRA_EXT:
1645 if (!context->getExtensions().textureFormatBGRA8888)
1646 {
1647 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1648 return false;
1649 }
Geoff Lang6e898aa2017-06-02 11:17:26 -04001650 break;
Tim Van Patten208af3e2019-03-19 09:15:55 -06001651
1652 case GL_DEPTH_COMPONENT:
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001653 if (!(context->getExtensions().depthTextureAny()))
1654 {
1655 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1656 return false;
1657 }
1658 break;
1659
Tim Van Patten208af3e2019-03-19 09:15:55 -06001660 case GL_DEPTH_STENCIL:
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001661 if (!(context->getExtensions().depthTextureANGLE ||
1662 context->getExtensions().packedDepthStencil))
Tim Van Patten208af3e2019-03-19 09:15:55 -06001663 {
1664 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1665 return false;
1666 }
1667 break;
1668
1669 case GL_RED:
1670 case GL_RG:
1671 if (!context->getExtensions().textureRG)
1672 {
1673 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1674 return false;
1675 }
1676 break;
1677
1678 case GL_SRGB_EXT:
1679 case GL_SRGB_ALPHA_EXT:
1680 if (!context->getExtensions().sRGB)
1681 {
1682 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
1683 return false;
1684 }
1685 break;
1686
1687 default:
1688 context->validationError(GL_INVALID_VALUE, kInvalidInternalFormat);
1689 return false;
Geoff Lang6e898aa2017-06-02 11:17:26 -04001690 }
1691 }
1692
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001693 if (type == GL_FLOAT)
1694 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001695 if (!context->getExtensions().textureFloat)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001696 {
Jamie Madille0472f32018-11-27 16:32:45 -05001697 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001698 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001699 }
1700 }
1701 else if (type == GL_HALF_FLOAT_OES)
1702 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001703 if (!context->getExtensions().textureHalfFloat)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001704 {
Jamie Madille0472f32018-11-27 16:32:45 -05001705 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001706 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001707 }
1708 }
1709 }
1710
Tim Van Patten208af3e2019-03-19 09:15:55 -06001711 if (isSubImage)
Geoff Langff5b2d52016-09-07 11:32:23 -04001712 {
Tim Van Patten208af3e2019-03-19 09:15:55 -06001713 const InternalFormat &textureInternalFormat = *texture->getFormat(target, level).info;
1714 if (textureInternalFormat.internalFormat == GL_NONE)
1715 {
1716 context->validationError(GL_INVALID_OPERATION, kInvalidTextureLevel);
1717 return false;
1718 }
1719
Tim Van Patten5f388c22019-03-14 09:54:23 -06001720 if (format != textureInternalFormat.format)
1721 {
1722 context->validationError(GL_INVALID_OPERATION, err::kTextureFormatMismatch);
1723 return false;
1724 }
1725
1726 if (context->getExtensions().webglCompatibility)
Tim Van Patten208af3e2019-03-19 09:15:55 -06001727 {
1728 if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
1729 textureInternalFormat.sizedInternalFormat)
1730 {
Tim Van Patten5f388c22019-03-14 09:54:23 -06001731 context->validationError(GL_INVALID_OPERATION, kTextureTypeMismatch);
Tim Van Patten208af3e2019-03-19 09:15:55 -06001732 return false;
1733 }
1734 }
1735
1736 if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
1737 static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
1738 {
1739 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
1740 return false;
1741 }
1742
1743 if (width > 0 && height > 0 && pixels == nullptr &&
1744 context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
1745 {
1746 context->validationError(GL_INVALID_VALUE, kPixelDataNull);
1747 return false;
1748 }
1749 }
1750 else
1751 {
1752 if (texture->getImmutableFormat())
1753 {
1754 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
1755 return false;
1756 }
1757 }
1758
1759 // From GL_CHROMIUM_color_buffer_float_rgb[a]:
1760 // GL_RGB[A] / GL_RGB[A]32F becomes an allowable format / internalformat parameter pair for
1761 // TexImage2D. The restriction in section 3.7.1 of the OpenGL ES 2.0 spec that the
1762 // internalformat parameter and format parameter of TexImage2D must match is lifted for this
1763 // case.
1764 if (!isSubImage && !isCompressed && internalformat != format && !nonEqualFormatsAllowed)
1765 {
1766 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Langff5b2d52016-09-07 11:32:23 -04001767 return false;
1768 }
1769
Tim Van Patten208af3e2019-03-19 09:15:55 -06001770 GLenum sizeCheckFormat = isSubImage ? format : internalformat;
1771 return ValidImageDataSize(context, texType, width, height, 1, sizeCheckFormat, type, pixels,
1772 imageSize);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001773}
1774
He Yunchaoced53ae2016-11-29 15:00:51 +08001775bool ValidateES2TexStorageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001776 TextureType target,
He Yunchaoced53ae2016-11-29 15:00:51 +08001777 GLsizei levels,
1778 GLenum internalformat,
1779 GLsizei width,
1780 GLsizei height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001781{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001782 if (target != TextureType::_2D && target != TextureType::CubeMap &&
1783 target != TextureType::Rectangle)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001784 {
Jamie Madille0472f32018-11-27 16:32:45 -05001785 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langb1196682014-07-23 13:47:29 -04001786 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001787 }
1788
1789 if (width < 1 || height < 1 || levels < 1)
1790 {
Jamie Madille0472f32018-11-27 16:32:45 -05001791 context->validationError(GL_INVALID_VALUE, kTextureSizeTooSmall);
Geoff Langb1196682014-07-23 13:47:29 -04001792 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001793 }
1794
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001795 if (target == TextureType::CubeMap && width != height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001796 {
Jamie Madille0472f32018-11-27 16:32:45 -05001797 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Langb1196682014-07-23 13:47:29 -04001798 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001799 }
1800
1801 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
1802 {
Jamie Madille0472f32018-11-27 16:32:45 -05001803 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
Geoff Langb1196682014-07-23 13:47:29 -04001804 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001805 }
1806
Geoff Langca271392017-04-05 12:30:00 -04001807 const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
Geoff Lang5d601382014-07-22 15:14:06 -04001808 if (formatInfo.format == GL_NONE || formatInfo.type == GL_NONE)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001809 {
Jamie Madille0472f32018-11-27 16:32:45 -05001810 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Langb1196682014-07-23 13:47:29 -04001811 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001812 }
1813
Geoff Langaae65a42014-05-26 12:43:44 -04001814 const gl::Caps &caps = context->getCaps();
1815
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001816 switch (target)
1817 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001818 case TextureType::_2D:
He Yunchaoced53ae2016-11-29 15:00:51 +08001819 if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
1820 static_cast<GLuint>(height) > caps.max2DTextureSize)
1821 {
Jamie Madille0472f32018-11-27 16:32:45 -05001822 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001823 return false;
1824 }
1825 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001826 case TextureType::Rectangle:
Jamie Madill610640f2018-11-21 17:28:41 -05001827 if (levels != 1)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001828 {
Jamie Madille0472f32018-11-27 16:32:45 -05001829 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madill610640f2018-11-21 17:28:41 -05001830 return false;
1831 }
1832
1833 if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
1834 static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
1835 {
Jamie Madille0472f32018-11-27 16:32:45 -05001836 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001837 return false;
1838 }
1839 if (formatInfo.compressed)
1840 {
Jamie Madille0472f32018-11-27 16:32:45 -05001841 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001842 return false;
1843 }
1844 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001845 case TextureType::CubeMap:
He Yunchaoced53ae2016-11-29 15:00:51 +08001846 if (static_cast<GLuint>(width) > caps.maxCubeMapTextureSize ||
1847 static_cast<GLuint>(height) > caps.maxCubeMapTextureSize)
1848 {
Jamie Madille0472f32018-11-27 16:32:45 -05001849 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001850 return false;
1851 }
1852 break;
1853 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001854 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001855 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001856 }
1857
Geoff Langc0b9ef42014-07-02 10:02:37 -04001858 if (levels != 1 && !context->getExtensions().textureNPOT)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001859 {
1860 if (!gl::isPow2(width) || !gl::isPow2(height))
1861 {
Jamie Madille0472f32018-11-27 16:32:45 -05001862 context->validationError(GL_INVALID_OPERATION, kDimensionsMustBePow2);
Geoff Langb1196682014-07-23 13:47:29 -04001863 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001864 }
1865 }
1866
1867 switch (internalformat)
1868 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001869 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1870 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1871 if (!context->getExtensions().textureCompressionDXT1)
1872 {
Jamie Madille0472f32018-11-27 16:32:45 -05001873 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001874 return false;
1875 }
1876 break;
1877 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1878 if (!context->getExtensions().textureCompressionDXT3)
1879 {
Jamie Madille0472f32018-11-27 16:32:45 -05001880 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001881 return false;
1882 }
1883 break;
1884 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1885 if (!context->getExtensions().textureCompressionDXT5)
1886 {
Jamie Madille0472f32018-11-27 16:32:45 -05001887 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001888 return false;
1889 }
1890 break;
1891 case GL_ETC1_RGB8_OES:
1892 if (!context->getExtensions().compressedETC1RGB8Texture)
1893 {
Jamie Madille0472f32018-11-27 16:32:45 -05001894 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001895 return false;
1896 }
1897 break;
1898 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
Minmin Gong390208b2017-02-28 18:03:06 -08001899 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
1900 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
1901 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
1902 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
He Yunchaoced53ae2016-11-29 15:00:51 +08001903 if (!context->getExtensions().lossyETCDecode)
1904 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001905 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001906 return false;
1907 }
1908 break;
1909 case GL_RGBA32F_EXT:
1910 case GL_RGB32F_EXT:
1911 case GL_ALPHA32F_EXT:
1912 case GL_LUMINANCE32F_EXT:
1913 case GL_LUMINANCE_ALPHA32F_EXT:
1914 if (!context->getExtensions().textureFloat)
1915 {
Jamie Madille0472f32018-11-27 16:32:45 -05001916 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001917 return false;
1918 }
1919 break;
1920 case GL_RGBA16F_EXT:
1921 case GL_RGB16F_EXT:
1922 case GL_ALPHA16F_EXT:
1923 case GL_LUMINANCE16F_EXT:
1924 case GL_LUMINANCE_ALPHA16F_EXT:
1925 if (!context->getExtensions().textureHalfFloat)
1926 {
Jamie Madille0472f32018-11-27 16:32:45 -05001927 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001928 return false;
1929 }
1930 break;
1931 case GL_R8_EXT:
1932 case GL_RG8_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001933 if (!context->getExtensions().textureRG)
1934 {
Jamie Madille0472f32018-11-27 16:32:45 -05001935 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001936 return false;
1937 }
1938 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001939 case GL_R16F_EXT:
1940 case GL_RG16F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001941 if (!context->getExtensions().textureRG || !context->getExtensions().textureHalfFloat)
1942 {
Jamie Madille0472f32018-11-27 16:32:45 -05001943 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001944 return false;
1945 }
1946 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001947 case GL_R32F_EXT:
1948 case GL_RG32F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001949 if (!context->getExtensions().textureRG || !context->getExtensions().textureFloat)
He Yunchaoced53ae2016-11-29 15:00:51 +08001950 {
Jamie Madille0472f32018-11-27 16:32:45 -05001951 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001952 return false;
1953 }
1954 break;
1955 case GL_DEPTH_COMPONENT16:
1956 case GL_DEPTH_COMPONENT32_OES:
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001957 if (!(context->getExtensions().depthTextureAny()))
He Yunchaoced53ae2016-11-29 15:00:51 +08001958 {
Jamie Madille0472f32018-11-27 16:32:45 -05001959 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001960 return false;
1961 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001962 if (target != TextureType::_2D)
He Yunchaoced53ae2016-11-29 15:00:51 +08001963 {
Jamie Madille0472f32018-11-27 16:32:45 -05001964 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08001965 return false;
1966 }
1967 // ANGLE_depth_texture only supports 1-level textures
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001968 if (!context->getExtensions().depthTextureOES)
He Yunchaoced53ae2016-11-29 15:00:51 +08001969 {
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001970 if (levels != 1)
1971 {
1972 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
1973 return false;
1974 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001975 }
1976 break;
Courtney Goeltzenleuchtereaf2d922019-04-18 16:31:25 -06001977 case GL_DEPTH24_STENCIL8_OES:
1978 if (!(context->getExtensions().depthTextureANGLE ||
1979 (context->getExtensions().packedDepthStencil &&
1980 context->getExtensions().textureStorage)))
1981 {
1982 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
1983 return false;
1984 }
1985 if (target != TextureType::_2D)
1986 {
1987 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
1988 return false;
1989 }
1990 if (!context->getExtensions().packedDepthStencil)
1991 {
1992 // ANGLE_depth_texture only supports 1-level textures
1993 if (levels != 1)
1994 {
1995 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
1996 return false;
1997 }
1998 }
1999 break;
2000
He Yunchaoced53ae2016-11-29 15:00:51 +08002001 default:
2002 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002003 }
2004
Jamie Madillcfc73cc2019-04-08 16:26:51 -04002005 gl::Texture *texture = context->getTextureByType(target);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002006 if (!texture || texture->id() == 0)
2007 {
Jamie Madille0472f32018-11-27 16:32:45 -05002008 context->validationError(GL_INVALID_OPERATION, kMissingTexture);
Geoff Langb1196682014-07-23 13:47:29 -04002009 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002010 }
2011
Geoff Lang69cce582015-09-17 13:20:36 -04002012 if (texture->getImmutableFormat())
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002013 {
Jamie Madille0472f32018-11-27 16:32:45 -05002014 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
Geoff Langb1196682014-07-23 13:47:29 -04002015 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002016 }
2017
2018 return true;
2019}
2020
He Yunchaoced53ae2016-11-29 15:00:51 +08002021bool ValidateDiscardFramebufferEXT(Context *context,
2022 GLenum target,
2023 GLsizei numAttachments,
Austin Kinross08332632015-05-05 13:35:47 -07002024 const GLenum *attachments)
2025{
Jamie Madillc29968b2016-01-20 11:17:23 -05002026 if (!context->getExtensions().discardFramebuffer)
2027 {
Jamie Madille0472f32018-11-27 16:32:45 -05002028 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05002029 return false;
2030 }
2031
Austin Kinross08332632015-05-05 13:35:47 -07002032 bool defaultFramebuffer = false;
2033
2034 switch (target)
2035 {
He Yunchaoced53ae2016-11-29 15:00:51 +08002036 case GL_FRAMEBUFFER:
2037 defaultFramebuffer =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002038 (context->getState().getTargetFramebuffer(GL_FRAMEBUFFER)->id() == 0);
He Yunchaoced53ae2016-11-29 15:00:51 +08002039 break;
2040 default:
Jamie Madille0472f32018-11-27 16:32:45 -05002041 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08002042 return false;
Austin Kinross08332632015-05-05 13:35:47 -07002043 }
2044
He Yunchaoced53ae2016-11-29 15:00:51 +08002045 return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments,
2046 defaultFramebuffer);
Austin Kinross08332632015-05-05 13:35:47 -07002047}
2048
Austin Kinrossbc781f32015-10-26 09:27:38 -07002049bool ValidateBindVertexArrayOES(Context *context, GLuint array)
2050{
2051 if (!context->getExtensions().vertexArrayObject)
2052 {
Jamie Madille0472f32018-11-27 16:32:45 -05002053 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002054 return false;
2055 }
2056
2057 return ValidateBindVertexArrayBase(context, array);
2058}
2059
Jamie Madilld7576732017-08-26 18:49:50 -04002060bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n, const GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07002061{
2062 if (!context->getExtensions().vertexArrayObject)
2063 {
Jamie Madille0472f32018-11-27 16:32:45 -05002064 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002065 return false;
2066 }
2067
Olli Etuaho41997e72016-03-10 13:38:39 +02002068 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002069}
2070
Jamie Madilld7576732017-08-26 18:49:50 -04002071bool ValidateGenVertexArraysOES(Context *context, GLsizei n, GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07002072{
2073 if (!context->getExtensions().vertexArrayObject)
2074 {
Jamie Madille0472f32018-11-27 16:32:45 -05002075 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002076 return false;
2077 }
2078
Olli Etuaho41997e72016-03-10 13:38:39 +02002079 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002080}
2081
Jamie Madilld7576732017-08-26 18:49:50 -04002082bool ValidateIsVertexArrayOES(Context *context, GLuint array)
Austin Kinrossbc781f32015-10-26 09:27:38 -07002083{
2084 if (!context->getExtensions().vertexArrayObject)
2085 {
Jamie Madille0472f32018-11-27 16:32:45 -05002086 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07002087 return false;
2088 }
2089
2090 return true;
2091}
Geoff Langc5629752015-12-07 16:29:04 -05002092
2093bool ValidateProgramBinaryOES(Context *context,
2094 GLuint program,
2095 GLenum binaryFormat,
2096 const void *binary,
2097 GLint length)
2098{
2099 if (!context->getExtensions().getProgramBinary)
2100 {
Jamie Madille0472f32018-11-27 16:32:45 -05002101 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05002102 return false;
2103 }
2104
2105 return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
2106}
2107
2108bool ValidateGetProgramBinaryOES(Context *context,
2109 GLuint program,
2110 GLsizei bufSize,
2111 GLsizei *length,
2112 GLenum *binaryFormat,
2113 void *binary)
2114{
2115 if (!context->getExtensions().getProgramBinary)
2116 {
Jamie Madille0472f32018-11-27 16:32:45 -05002117 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05002118 return false;
2119 }
2120
2121 return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
2122}
Geoff Lange102fee2015-12-10 11:23:30 -05002123
Geoff Lang70d0f492015-12-10 17:45:46 -05002124static bool ValidDebugSource(GLenum source, bool mustBeThirdPartyOrApplication)
2125{
2126 switch (source)
2127 {
2128 case GL_DEBUG_SOURCE_API:
2129 case GL_DEBUG_SOURCE_SHADER_COMPILER:
2130 case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
2131 case GL_DEBUG_SOURCE_OTHER:
2132 // Only THIRD_PARTY and APPLICATION sources are allowed to be manually inserted
2133 return !mustBeThirdPartyOrApplication;
2134
2135 case GL_DEBUG_SOURCE_THIRD_PARTY:
2136 case GL_DEBUG_SOURCE_APPLICATION:
2137 return true;
2138
2139 default:
2140 return false;
2141 }
2142}
2143
2144static bool ValidDebugType(GLenum type)
2145{
2146 switch (type)
2147 {
2148 case GL_DEBUG_TYPE_ERROR:
2149 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
2150 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
2151 case GL_DEBUG_TYPE_PERFORMANCE:
2152 case GL_DEBUG_TYPE_PORTABILITY:
2153 case GL_DEBUG_TYPE_OTHER:
2154 case GL_DEBUG_TYPE_MARKER:
2155 case GL_DEBUG_TYPE_PUSH_GROUP:
2156 case GL_DEBUG_TYPE_POP_GROUP:
2157 return true;
2158
2159 default:
2160 return false;
2161 }
2162}
2163
2164static bool ValidDebugSeverity(GLenum severity)
2165{
2166 switch (severity)
2167 {
2168 case GL_DEBUG_SEVERITY_HIGH:
2169 case GL_DEBUG_SEVERITY_MEDIUM:
2170 case GL_DEBUG_SEVERITY_LOW:
2171 case GL_DEBUG_SEVERITY_NOTIFICATION:
2172 return true;
2173
2174 default:
2175 return false;
2176 }
2177}
2178
Geoff Lange102fee2015-12-10 11:23:30 -05002179bool ValidateDebugMessageControlKHR(Context *context,
2180 GLenum source,
2181 GLenum type,
2182 GLenum severity,
2183 GLsizei count,
2184 const GLuint *ids,
2185 GLboolean enabled)
2186{
2187 if (!context->getExtensions().debug)
2188 {
Jamie Madille0472f32018-11-27 16:32:45 -05002189 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002190 return false;
2191 }
2192
Geoff Lang70d0f492015-12-10 17:45:46 -05002193 if (!ValidDebugSource(source, false) && source != GL_DONT_CARE)
2194 {
Jamie Madille0472f32018-11-27 16:32:45 -05002195 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002196 return false;
2197 }
2198
2199 if (!ValidDebugType(type) && type != GL_DONT_CARE)
2200 {
Jamie Madille0472f32018-11-27 16:32:45 -05002201 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002202 return false;
2203 }
2204
2205 if (!ValidDebugSeverity(severity) && severity != GL_DONT_CARE)
2206 {
Jamie Madille0472f32018-11-27 16:32:45 -05002207 context->validationError(GL_INVALID_ENUM, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002208 return false;
2209 }
2210
2211 if (count > 0)
2212 {
2213 if (source == GL_DONT_CARE || type == GL_DONT_CARE)
2214 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002215 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSourceType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002216 return false;
2217 }
2218
2219 if (severity != GL_DONT_CARE)
2220 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002221 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002222 return false;
2223 }
2224 }
2225
Geoff Lange102fee2015-12-10 11:23:30 -05002226 return true;
2227}
2228
2229bool ValidateDebugMessageInsertKHR(Context *context,
2230 GLenum source,
2231 GLenum type,
2232 GLuint id,
2233 GLenum severity,
2234 GLsizei length,
2235 const GLchar *buf)
2236{
2237 if (!context->getExtensions().debug)
2238 {
Jamie Madille0472f32018-11-27 16:32:45 -05002239 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002240 return false;
2241 }
2242
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002243 if (!context->getState().getDebug().isOutputEnabled())
Geoff Lang70d0f492015-12-10 17:45:46 -05002244 {
2245 // If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are discarded and do
2246 // not generate an error.
2247 return false;
2248 }
2249
2250 if (!ValidDebugSeverity(severity))
2251 {
Jamie Madille0472f32018-11-27 16:32:45 -05002252 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002253 return false;
2254 }
2255
2256 if (!ValidDebugType(type))
2257 {
Jamie Madille0472f32018-11-27 16:32:45 -05002258 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002259 return false;
2260 }
2261
2262 if (!ValidDebugSource(source, true))
2263 {
Jamie Madille0472f32018-11-27 16:32:45 -05002264 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002265 return false;
2266 }
2267
2268 size_t messageLength = (length < 0) ? strlen(buf) : length;
2269 if (messageLength > context->getExtensions().maxDebugMessageLength)
2270 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002271 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002272 return false;
2273 }
2274
Geoff Lange102fee2015-12-10 11:23:30 -05002275 return true;
2276}
2277
2278bool ValidateDebugMessageCallbackKHR(Context *context,
2279 GLDEBUGPROCKHR callback,
2280 const void *userParam)
2281{
2282 if (!context->getExtensions().debug)
2283 {
Jamie Madille0472f32018-11-27 16:32:45 -05002284 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002285 return false;
2286 }
2287
Geoff Lange102fee2015-12-10 11:23:30 -05002288 return true;
2289}
2290
2291bool ValidateGetDebugMessageLogKHR(Context *context,
2292 GLuint count,
2293 GLsizei bufSize,
2294 GLenum *sources,
2295 GLenum *types,
2296 GLuint *ids,
2297 GLenum *severities,
2298 GLsizei *lengths,
2299 GLchar *messageLog)
2300{
2301 if (!context->getExtensions().debug)
2302 {
Jamie Madille0472f32018-11-27 16:32:45 -05002303 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002304 return false;
2305 }
2306
Geoff Lang70d0f492015-12-10 17:45:46 -05002307 if (bufSize < 0 && messageLog != nullptr)
2308 {
Jamie Madille0472f32018-11-27 16:32:45 -05002309 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002310 return false;
2311 }
2312
Geoff Lange102fee2015-12-10 11:23:30 -05002313 return true;
2314}
2315
2316bool ValidatePushDebugGroupKHR(Context *context,
2317 GLenum source,
2318 GLuint id,
2319 GLsizei length,
2320 const GLchar *message)
2321{
2322 if (!context->getExtensions().debug)
2323 {
Jamie Madille0472f32018-11-27 16:32:45 -05002324 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002325 return false;
2326 }
2327
Geoff Lang70d0f492015-12-10 17:45:46 -05002328 if (!ValidDebugSource(source, true))
2329 {
Jamie Madille0472f32018-11-27 16:32:45 -05002330 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002331 return false;
2332 }
2333
2334 size_t messageLength = (length < 0) ? strlen(message) : length;
2335 if (messageLength > context->getExtensions().maxDebugMessageLength)
2336 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002337 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002338 return false;
2339 }
2340
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002341 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002342 if (currentStackSize >= context->getExtensions().maxDebugGroupStackDepth)
2343 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002344 context->validationError(GL_STACK_OVERFLOW, kExceedsMaxDebugGroupStackDepth);
Geoff Lang70d0f492015-12-10 17:45:46 -05002345 return false;
2346 }
2347
Geoff Lange102fee2015-12-10 11:23:30 -05002348 return true;
2349}
2350
2351bool ValidatePopDebugGroupKHR(Context *context)
2352{
2353 if (!context->getExtensions().debug)
2354 {
Jamie Madille0472f32018-11-27 16:32:45 -05002355 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002356 return false;
2357 }
2358
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002359 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002360 if (currentStackSize <= 1)
2361 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002362 context->validationError(GL_STACK_UNDERFLOW, kCannotPopDefaultDebugGroup);
Geoff Lang70d0f492015-12-10 17:45:46 -05002363 return false;
2364 }
2365
2366 return true;
2367}
2368
2369static bool ValidateObjectIdentifierAndName(Context *context, GLenum identifier, GLuint name)
2370{
2371 switch (identifier)
2372 {
2373 case GL_BUFFER:
2374 if (context->getBuffer(name) == nullptr)
2375 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002376 context->validationError(GL_INVALID_VALUE, kInvalidBufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002377 return false;
2378 }
2379 return true;
2380
2381 case GL_SHADER:
2382 if (context->getShader(name) == nullptr)
2383 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002384 context->validationError(GL_INVALID_VALUE, kInvalidShaderName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002385 return false;
2386 }
2387 return true;
2388
2389 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002390 if (context->getProgramNoResolveLink(name) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002391 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002392 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002393 return false;
2394 }
2395 return true;
2396
2397 case GL_VERTEX_ARRAY:
2398 if (context->getVertexArray(name) == nullptr)
2399 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002400 context->validationError(GL_INVALID_VALUE, kInvalidVertexArrayName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002401 return false;
2402 }
2403 return true;
2404
2405 case GL_QUERY:
2406 if (context->getQuery(name) == nullptr)
2407 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002408 context->validationError(GL_INVALID_VALUE, kInvalidQueryName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002409 return false;
2410 }
2411 return true;
2412
2413 case GL_TRANSFORM_FEEDBACK:
2414 if (context->getTransformFeedback(name) == nullptr)
2415 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002416 context->validationError(GL_INVALID_VALUE, kInvalidTransformFeedbackName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002417 return false;
2418 }
2419 return true;
2420
2421 case GL_SAMPLER:
2422 if (context->getSampler(name) == nullptr)
2423 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002424 context->validationError(GL_INVALID_VALUE, kInvalidSamplerName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002425 return false;
2426 }
2427 return true;
2428
2429 case GL_TEXTURE:
2430 if (context->getTexture(name) == nullptr)
2431 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002432 context->validationError(GL_INVALID_VALUE, kInvalidTextureName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002433 return false;
2434 }
2435 return true;
2436
2437 case GL_RENDERBUFFER:
2438 if (context->getRenderbuffer(name) == nullptr)
2439 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002440 context->validationError(GL_INVALID_VALUE, kInvalidRenderbufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002441 return false;
2442 }
2443 return true;
2444
2445 case GL_FRAMEBUFFER:
2446 if (context->getFramebuffer(name) == nullptr)
2447 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002448 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002449 return false;
2450 }
2451 return true;
2452
2453 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05002454 context->validationError(GL_INVALID_ENUM, kInvalidIndentifier);
Geoff Lang70d0f492015-12-10 17:45:46 -05002455 return false;
2456 }
Geoff Lange102fee2015-12-10 11:23:30 -05002457}
2458
Martin Radev9d901792016-07-15 15:58:58 +03002459static bool ValidateLabelLength(Context *context, GLsizei length, const GLchar *label)
2460{
2461 size_t labelLength = 0;
2462
2463 if (length < 0)
2464 {
2465 if (label != nullptr)
2466 {
2467 labelLength = strlen(label);
2468 }
2469 }
2470 else
2471 {
2472 labelLength = static_cast<size_t>(length);
2473 }
2474
2475 if (labelLength > context->getExtensions().maxLabelLength)
2476 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002477 context->validationError(GL_INVALID_VALUE, kExceedsMaxLabelLength);
Martin Radev9d901792016-07-15 15:58:58 +03002478 return false;
2479 }
2480
2481 return true;
2482}
2483
Geoff Lange102fee2015-12-10 11:23:30 -05002484bool ValidateObjectLabelKHR(Context *context,
2485 GLenum identifier,
2486 GLuint name,
2487 GLsizei length,
2488 const GLchar *label)
2489{
2490 if (!context->getExtensions().debug)
2491 {
Jamie Madille0472f32018-11-27 16:32:45 -05002492 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002493 return false;
2494 }
2495
Geoff Lang70d0f492015-12-10 17:45:46 -05002496 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2497 {
2498 return false;
2499 }
2500
Martin Radev9d901792016-07-15 15:58:58 +03002501 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002502 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002503 return false;
2504 }
2505
Geoff Lange102fee2015-12-10 11:23:30 -05002506 return true;
2507}
2508
2509bool ValidateGetObjectLabelKHR(Context *context,
2510 GLenum identifier,
2511 GLuint name,
2512 GLsizei bufSize,
2513 GLsizei *length,
2514 GLchar *label)
2515{
2516 if (!context->getExtensions().debug)
2517 {
Jamie Madille0472f32018-11-27 16:32:45 -05002518 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002519 return false;
2520 }
2521
Geoff Lang70d0f492015-12-10 17:45:46 -05002522 if (bufSize < 0)
2523 {
Jamie Madille0472f32018-11-27 16:32:45 -05002524 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002525 return false;
2526 }
2527
2528 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2529 {
2530 return false;
2531 }
2532
Martin Radev9d901792016-07-15 15:58:58 +03002533 return true;
Geoff Lang70d0f492015-12-10 17:45:46 -05002534}
2535
2536static bool ValidateObjectPtrName(Context *context, const void *ptr)
2537{
Jamie Madill70b5bb02017-08-28 13:32:37 -04002538 if (context->getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr))) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002539 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002540 context->validationError(GL_INVALID_VALUE, kInvalidSyncPointer);
Geoff Lang70d0f492015-12-10 17:45:46 -05002541 return false;
2542 }
2543
Geoff Lange102fee2015-12-10 11:23:30 -05002544 return true;
2545}
2546
2547bool ValidateObjectPtrLabelKHR(Context *context,
2548 const void *ptr,
2549 GLsizei length,
2550 const GLchar *label)
2551{
2552 if (!context->getExtensions().debug)
2553 {
Jamie Madille0472f32018-11-27 16:32:45 -05002554 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002555 return false;
2556 }
2557
Geoff Lang70d0f492015-12-10 17:45:46 -05002558 if (!ValidateObjectPtrName(context, ptr))
2559 {
2560 return false;
2561 }
2562
Martin Radev9d901792016-07-15 15:58:58 +03002563 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002564 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002565 return false;
2566 }
2567
Geoff Lange102fee2015-12-10 11:23:30 -05002568 return true;
2569}
2570
2571bool ValidateGetObjectPtrLabelKHR(Context *context,
2572 const void *ptr,
2573 GLsizei bufSize,
2574 GLsizei *length,
2575 GLchar *label)
2576{
2577 if (!context->getExtensions().debug)
2578 {
Jamie Madille0472f32018-11-27 16:32:45 -05002579 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002580 return false;
2581 }
2582
Geoff Lang70d0f492015-12-10 17:45:46 -05002583 if (bufSize < 0)
2584 {
Jamie Madille0472f32018-11-27 16:32:45 -05002585 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002586 return false;
2587 }
2588
2589 if (!ValidateObjectPtrName(context, ptr))
2590 {
2591 return false;
2592 }
2593
Martin Radev9d901792016-07-15 15:58:58 +03002594 return true;
Geoff Lange102fee2015-12-10 11:23:30 -05002595}
2596
2597bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params)
2598{
2599 if (!context->getExtensions().debug)
2600 {
Jamie Madille0472f32018-11-27 16:32:45 -05002601 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002602 return false;
2603 }
2604
Geoff Lang70d0f492015-12-10 17:45:46 -05002605 // TODO: represent this in Context::getQueryParameterInfo.
2606 switch (pname)
2607 {
2608 case GL_DEBUG_CALLBACK_FUNCTION:
2609 case GL_DEBUG_CALLBACK_USER_PARAM:
2610 break;
2611
2612 default:
Jamie Madille0472f32018-11-27 16:32:45 -05002613 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang70d0f492015-12-10 17:45:46 -05002614 return false;
2615 }
2616
Geoff Lange102fee2015-12-10 11:23:30 -05002617 return true;
2618}
Jamie Madillc29968b2016-01-20 11:17:23 -05002619
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002620bool ValidateGetPointervRobustANGLERobustANGLE(Context *context,
2621 GLenum pname,
2622 GLsizei bufSize,
2623 GLsizei *length,
2624 void **params)
2625{
2626 UNIMPLEMENTED();
2627 return false;
2628}
2629
Jamie Madillc29968b2016-01-20 11:17:23 -05002630bool ValidateBlitFramebufferANGLE(Context *context,
2631 GLint srcX0,
2632 GLint srcY0,
2633 GLint srcX1,
2634 GLint srcY1,
2635 GLint dstX0,
2636 GLint dstY0,
2637 GLint dstX1,
2638 GLint dstY1,
2639 GLbitfield mask,
2640 GLenum filter)
2641{
2642 if (!context->getExtensions().framebufferBlit)
2643 {
Jamie Madille0472f32018-11-27 16:32:45 -05002644 context->validationError(GL_INVALID_OPERATION, kBlitExtensionNotAvailable);
Jamie Madillc29968b2016-01-20 11:17:23 -05002645 return false;
2646 }
2647
2648 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
2649 {
2650 // TODO(jmadill): Determine if this should be available on other implementations.
Jamie Madille0472f32018-11-27 16:32:45 -05002651 context->validationError(GL_INVALID_OPERATION, kBlitExtensionScaleOrFlip);
Jamie Madillc29968b2016-01-20 11:17:23 -05002652 return false;
2653 }
2654
2655 if (filter == GL_LINEAR)
2656 {
Jamie Madille0472f32018-11-27 16:32:45 -05002657 context->validationError(GL_INVALID_ENUM, kBlitExtensionLinear);
Jamie Madillc29968b2016-01-20 11:17:23 -05002658 return false;
2659 }
2660
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002661 Framebuffer *readFramebuffer = context->getState().getReadFramebuffer();
2662 Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002663
2664 if (mask & GL_COLOR_BUFFER_BIT)
2665 {
2666 const FramebufferAttachment *readColorAttachment = readFramebuffer->getReadColorbuffer();
2667 const FramebufferAttachment *drawColorAttachment = drawFramebuffer->getFirstColorbuffer();
2668
2669 if (readColorAttachment && drawColorAttachment)
2670 {
2671 if (!(readColorAttachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002672 readColorAttachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002673 readColorAttachment->type() != GL_RENDERBUFFER &&
2674 readColorAttachment->type() != GL_FRAMEBUFFER_DEFAULT)
2675 {
Jamie Madill610640f2018-11-21 17:28:41 -05002676 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002677 kBlitExtensionFromInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002678 return false;
2679 }
2680
Geoff Langa15472a2015-08-11 11:48:03 -04002681 for (size_t drawbufferIdx = 0;
2682 drawbufferIdx < drawFramebuffer->getDrawbufferStateCount(); ++drawbufferIdx)
Jamie Madillc29968b2016-01-20 11:17:23 -05002683 {
Geoff Langa15472a2015-08-11 11:48:03 -04002684 const FramebufferAttachment *attachment =
2685 drawFramebuffer->getDrawBuffer(drawbufferIdx);
2686 if (attachment)
Jamie Madillc29968b2016-01-20 11:17:23 -05002687 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002688 if (!(attachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002689 attachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002690 attachment->type() != GL_RENDERBUFFER &&
2691 attachment->type() != GL_FRAMEBUFFER_DEFAULT)
2692 {
Jamie Madill610640f2018-11-21 17:28:41 -05002693 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002694 kBlitExtensionToInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002695 return false;
2696 }
2697
2698 // Return an error if the destination formats do not match
Kenneth Russell69382852017-07-21 16:38:44 -04002699 if (!Format::EquivalentForBlit(attachment->getFormat(),
2700 readColorAttachment->getFormat()))
Jamie Madillc29968b2016-01-20 11:17:23 -05002701 {
Jamie Madill610640f2018-11-21 17:28:41 -05002702 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002703 kBlitExtensionFormatMismatch);
Jamie Madillc29968b2016-01-20 11:17:23 -05002704 return false;
2705 }
2706 }
2707 }
2708
Jamie Madill427064d2018-04-13 16:20:34 -04002709 GLint samples = readFramebuffer->getSamples(context);
Jamie Madille98b1b52018-03-08 09:47:23 -05002710 if (samples != 0 &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002711 IsPartialBlit(context, readColorAttachment, drawColorAttachment, srcX0, srcY0,
2712 srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
2713 {
Jamie Madill610640f2018-11-21 17:28:41 -05002714 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002715 kBlitExtensionMultisampledWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002716 return false;
2717 }
2718 }
2719 }
2720
2721 GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
2722 GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
2723 for (size_t i = 0; i < 2; i++)
2724 {
2725 if (mask & masks[i])
2726 {
2727 const FramebufferAttachment *readBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002728 readFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002729 const FramebufferAttachment *drawBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002730 drawFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002731
2732 if (readBuffer && drawBuffer)
2733 {
2734 if (IsPartialBlit(context, readBuffer, drawBuffer, srcX0, srcY0, srcX1, srcY1,
2735 dstX0, dstY0, dstX1, dstY1))
2736 {
2737 // only whole-buffer copies are permitted
Jamie Madill610640f2018-11-21 17:28:41 -05002738 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002739 kBlitExtensionDepthStencilWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002740 return false;
2741 }
2742
2743 if (readBuffer->getSamples() != 0 || drawBuffer->getSamples() != 0)
2744 {
Jamie Madill610640f2018-11-21 17:28:41 -05002745 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002746 kBlitExtensionMultisampledDepthOrStencil);
Jamie Madillc29968b2016-01-20 11:17:23 -05002747 return false;
2748 }
2749 }
2750 }
2751 }
2752
2753 return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
2754 dstX1, dstY1, mask, filter);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002755}
Jamie Madillc29968b2016-01-20 11:17:23 -05002756
Jamie Madill5b772312018-03-08 20:28:32 -05002757bool ValidateClear(Context *context, GLbitfield mask)
Jamie Madillc29968b2016-01-20 11:17:23 -05002758{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002759 Framebuffer *fbo = context->getState().getDrawFramebuffer();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002760 const Extensions &extensions = context->getExtensions();
Jamie Madille98b1b52018-03-08 09:47:23 -05002761
Jamie Madill427064d2018-04-13 16:20:34 -04002762 if (!ValidateFramebufferComplete(context, fbo))
Jamie Madillc29968b2016-01-20 11:17:23 -05002763 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002764 return false;
2765 }
2766
2767 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
2768 {
Jamie Madille0472f32018-11-27 16:32:45 -05002769 context->validationError(GL_INVALID_VALUE, kInvalidClearMask);
Jamie Madillc29968b2016-01-20 11:17:23 -05002770 return false;
2771 }
2772
Olli Etuaho94c91a92018-07-19 15:10:24 +03002773 if (extensions.webglCompatibility && (mask & GL_COLOR_BUFFER_BIT) != 0)
Geoff Lang76e65652017-03-27 14:58:02 -04002774 {
2775 constexpr GLenum validComponentTypes[] = {GL_FLOAT, GL_UNSIGNED_NORMALIZED,
2776 GL_SIGNED_NORMALIZED};
2777
Corentin Wallez59c41592017-07-11 13:19:54 -04002778 for (GLuint drawBufferIdx = 0; drawBufferIdx < fbo->getDrawbufferStateCount();
Geoff Lang76e65652017-03-27 14:58:02 -04002779 drawBufferIdx++)
2780 {
2781 if (!ValidateWebGLFramebufferAttachmentClearType(
2782 context, drawBufferIdx, validComponentTypes, ArraySize(validComponentTypes)))
2783 {
2784 return false;
2785 }
2786 }
2787 }
2788
Mingyu Huebab6702019-04-19 14:36:45 -07002789 if ((extensions.multiview || extensions.multiview2) && extensions.disjointTimerQuery)
Olli Etuaho94c91a92018-07-19 15:10:24 +03002790 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002791 const State &state = context->getState();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002792 Framebuffer *framebuffer = state.getDrawFramebuffer();
2793 if (framebuffer->getNumViews() > 1 && state.isQueryActive(QueryType::TimeElapsed))
2794 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002795 context->validationError(GL_INVALID_OPERATION, kMultiviewTimerQuery);
Olli Etuaho94c91a92018-07-19 15:10:24 +03002796 return false;
2797 }
2798 }
2799
Jamie Madillc29968b2016-01-20 11:17:23 -05002800 return true;
2801}
2802
Jamie Madill5b772312018-03-08 20:28:32 -05002803bool ValidateDrawBuffersEXT(Context *context, GLsizei n, const GLenum *bufs)
Jamie Madillc29968b2016-01-20 11:17:23 -05002804{
2805 if (!context->getExtensions().drawBuffers)
2806 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002807 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05002808 return false;
2809 }
2810
2811 return ValidateDrawBuffersBase(context, n, bufs);
2812}
2813
Jamie Madill73a84962016-02-12 09:27:23 -05002814bool ValidateTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002815 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002816 GLint level,
2817 GLint internalformat,
2818 GLsizei width,
2819 GLsizei height,
2820 GLint border,
2821 GLenum format,
2822 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002823 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002824{
Martin Radev1be913c2016-07-11 17:59:16 +03002825 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002826 {
2827 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
Geoff Langff5b2d52016-09-07 11:32:23 -04002828 0, 0, width, height, border, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002829 }
2830
Martin Radev1be913c2016-07-11 17:59:16 +03002831 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002832 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002833 0, 0, width, height, 1, border, format, type, -1,
2834 pixels);
2835}
2836
Brandon Jones416aaf92018-04-10 08:10:16 -07002837bool ValidateTexImage2DRobustANGLE(Context *context,
2838 TextureTarget target,
2839 GLint level,
2840 GLint internalformat,
2841 GLsizei width,
2842 GLsizei height,
2843 GLint border,
2844 GLenum format,
2845 GLenum type,
2846 GLsizei bufSize,
2847 const void *pixels)
Geoff Langff5b2d52016-09-07 11:32:23 -04002848{
2849 if (!ValidateRobustEntryPoint(context, bufSize))
2850 {
2851 return false;
2852 }
2853
2854 if (context->getClientMajorVersion() < 3)
2855 {
2856 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
2857 0, 0, width, height, border, format, type, bufSize,
2858 pixels);
2859 }
2860
2861 ASSERT(context->getClientMajorVersion() >= 3);
2862 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
2863 0, 0, width, height, 1, border, format, type, bufSize,
2864 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002865}
2866
2867bool ValidateTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002868 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002869 GLint level,
2870 GLint xoffset,
2871 GLint yoffset,
2872 GLsizei width,
2873 GLsizei height,
2874 GLenum format,
2875 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002876 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002877{
2878
Martin Radev1be913c2016-07-11 17:59:16 +03002879 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002880 {
2881 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002882 yoffset, width, height, 0, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002883 }
2884
Martin Radev1be913c2016-07-11 17:59:16 +03002885 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002886 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002887 yoffset, 0, width, height, 1, 0, format, type, -1,
2888 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002889}
2890
Geoff Langc52f6f12016-10-14 10:18:00 -04002891bool ValidateTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002892 TextureTarget target,
Geoff Langc52f6f12016-10-14 10:18:00 -04002893 GLint level,
2894 GLint xoffset,
2895 GLint yoffset,
2896 GLsizei width,
2897 GLsizei height,
2898 GLenum format,
2899 GLenum type,
2900 GLsizei bufSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002901 const void *pixels)
Geoff Langc52f6f12016-10-14 10:18:00 -04002902{
2903 if (!ValidateRobustEntryPoint(context, bufSize))
2904 {
2905 return false;
2906 }
2907
2908 if (context->getClientMajorVersion() < 3)
2909 {
2910 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
2911 yoffset, width, height, 0, format, type, bufSize,
2912 pixels);
2913 }
2914
2915 ASSERT(context->getClientMajorVersion() >= 3);
2916 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
2917 yoffset, 0, width, height, 1, 0, format, type, bufSize,
2918 pixels);
2919}
2920
Cody Northrop5faff912019-06-28 14:04:50 -06002921bool ValidateTexSubImage3DOES(Context *context,
2922 TextureTarget target,
2923 GLint level,
2924 GLint xoffset,
2925 GLint yoffset,
2926 GLint zoffset,
2927 GLsizei width,
2928 GLsizei height,
2929 GLsizei depth,
2930 GLenum format,
2931 GLenum type,
2932 const void *pixels)
2933{
2934 return ValidateTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, width, height,
2935 depth, format, type, pixels);
2936}
2937
Jamie Madill73a84962016-02-12 09:27:23 -05002938bool ValidateCompressedTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002939 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002940 GLint level,
2941 GLenum internalformat,
2942 GLsizei width,
2943 GLsizei height,
2944 GLint border,
2945 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002946 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05002947{
Martin Radev1be913c2016-07-11 17:59:16 +03002948 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002949 {
2950 if (!ValidateES2TexImageParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002951 0, width, height, border, GL_NONE, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05002952 {
2953 return false;
2954 }
2955 }
2956 else
2957 {
Martin Radev1be913c2016-07-11 17:59:16 +03002958 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002959 if (!ValidateES3TexImage2DParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002960 0, 0, width, height, 1, border, GL_NONE, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05002961 data))
2962 {
2963 return false;
2964 }
2965 }
2966
Geoff Langca271392017-04-05 12:30:00 -04002967 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
Jamie Madillca2ff382018-07-11 09:01:17 -04002968
2969 GLuint blockSize = 0;
2970 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04002971 {
Jamie Madille0472f32018-11-27 16:32:45 -05002972 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04002973 return false;
2974 }
2975
Jamie Madillca2ff382018-07-11 09:01:17 -04002976 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05002977 {
Jamie Madille0472f32018-11-27 16:32:45 -05002978 context->validationError(GL_INVALID_VALUE, kCompressedTextureDimensionsMustMatchData);
Jamie Madill73a84962016-02-12 09:27:23 -05002979 return false;
2980 }
2981
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002982 if (target == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002983 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002984 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002985 return false;
2986 }
2987
Jamie Madill73a84962016-02-12 09:27:23 -05002988 return true;
2989}
2990
Corentin Wallezb2931602017-04-11 15:58:57 -04002991bool ValidateCompressedTexImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002992 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04002993 GLint level,
2994 GLenum internalformat,
2995 GLsizei width,
2996 GLsizei height,
2997 GLint border,
2998 GLsizei imageSize,
2999 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003000 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04003001{
3002 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
3003 {
3004 return false;
3005 }
3006
3007 return ValidateCompressedTexImage2D(context, target, level, internalformat, width, height,
3008 border, imageSize, data);
3009}
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003010
Cody Northrop5faff912019-06-28 14:04:50 -06003011bool ValidateCompressedTexImage3DOES(Context *context,
3012 TextureTarget target,
3013 GLint level,
3014 GLenum internalformat,
3015 GLsizei width,
3016 GLsizei height,
3017 GLsizei depth,
3018 GLint border,
3019 GLsizei imageSize,
3020 const void *data)
3021{
3022 return ValidateCompressedTexImage3D(context, target, level, internalformat, width, height,
3023 depth, border, imageSize, data);
3024}
3025
Corentin Wallezb2931602017-04-11 15:58:57 -04003026bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003027 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04003028 GLint level,
3029 GLint xoffset,
3030 GLint yoffset,
3031 GLsizei width,
3032 GLsizei height,
3033 GLenum format,
3034 GLsizei imageSize,
3035 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003036 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04003037{
3038 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
3039 {
3040 return false;
3041 }
3042
3043 return ValidateCompressedTexSubImage2D(context, target, level, xoffset, yoffset, width, height,
3044 format, imageSize, data);
3045}
3046
Jamie Madill73a84962016-02-12 09:27:23 -05003047bool ValidateCompressedTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08003048 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05003049 GLint level,
3050 GLint xoffset,
3051 GLint yoffset,
3052 GLsizei width,
3053 GLsizei height,
3054 GLenum format,
3055 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04003056 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05003057{
Martin Radev1be913c2016-07-11 17:59:16 +03003058 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05003059 {
3060 if (!ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04003061 yoffset, width, height, 0, format, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05003062 {
3063 return false;
3064 }
3065 }
3066 else
3067 {
Martin Radev1be913c2016-07-11 17:59:16 +03003068 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05003069 if (!ValidateES3TexImage2DParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04003070 yoffset, 0, width, height, 1, 0, format, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05003071 data))
3072 {
3073 return false;
3074 }
3075 }
3076
Geoff Langca271392017-04-05 12:30:00 -04003077 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
Jamie Madillca2ff382018-07-11 09:01:17 -04003078 GLuint blockSize = 0;
3079 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04003080 {
Jamie Madille0472f32018-11-27 16:32:45 -05003081 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04003082 return false;
3083 }
3084
Jamie Madillca2ff382018-07-11 09:01:17 -04003085 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05003086 {
Jamie Madille0472f32018-11-27 16:32:45 -05003087 context->validationError(GL_INVALID_VALUE, kInvalidCompressedImageSize);
Jamie Madill73a84962016-02-12 09:27:23 -05003088 return false;
3089 }
3090
3091 return true;
3092}
3093
Cody Northrop5faff912019-06-28 14:04:50 -06003094bool ValidateCompressedTexSubImage3DOES(Context *context,
3095 TextureTarget target,
3096 GLint level,
3097 GLint xoffset,
3098 GLint yoffset,
3099 GLint zoffset,
3100 GLsizei width,
3101 GLsizei height,
3102 GLsizei depth,
3103 GLenum format,
3104 GLsizei imageSize,
3105 const void *data)
3106{
3107 return ValidateCompressedTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, width,
3108 height, depth, format, imageSize, data);
3109}
3110
Corentin Wallez336129f2017-10-17 15:55:40 -04003111bool ValidateGetBufferPointervOES(Context *context,
3112 BufferBinding target,
3113 GLenum pname,
3114 void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03003115{
Jamie Madillc3e37312018-11-30 15:25:39 -05003116 if (!context->getExtensions().mapBuffer)
3117 {
3118 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3119 return false;
3120 }
3121
Geoff Lang496c02d2016-10-20 11:38:11 -07003122 return ValidateGetBufferPointervBase(context, target, pname, nullptr, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03003123}
3124
Corentin Wallez336129f2017-10-17 15:55:40 -04003125bool ValidateMapBufferOES(Context *context, BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03003126{
3127 if (!context->getExtensions().mapBuffer)
3128 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003129 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003130 return false;
3131 }
3132
Corentin Walleze4477002017-12-01 14:39:58 -05003133 if (!context->isValidBufferBinding(target))
Olli Etuaho4f667482016-03-30 15:56:35 +03003134 {
Jamie Madille0472f32018-11-27 16:32:45 -05003135 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Olli Etuaho4f667482016-03-30 15:56:35 +03003136 return false;
3137 }
3138
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003139 Buffer *buffer = context->getState().getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003140
3141 if (buffer == nullptr)
3142 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003143 context->validationError(GL_INVALID_OPERATION, kBufferNotMappable);
Olli Etuaho4f667482016-03-30 15:56:35 +03003144 return false;
3145 }
3146
3147 if (access != GL_WRITE_ONLY_OES)
3148 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003149 context->validationError(GL_INVALID_ENUM, kInvalidAccessBits);
Olli Etuaho4f667482016-03-30 15:56:35 +03003150 return false;
3151 }
3152
3153 if (buffer->isMapped())
3154 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003155 context->validationError(GL_INVALID_OPERATION, kBufferAlreadyMapped);
Olli Etuaho4f667482016-03-30 15:56:35 +03003156 return false;
3157 }
3158
Geoff Lang79f71042017-08-14 16:43:43 -04003159 return ValidateMapBufferBase(context, target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003160}
3161
Corentin Wallez336129f2017-10-17 15:55:40 -04003162bool ValidateUnmapBufferOES(Context *context, BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003163{
3164 if (!context->getExtensions().mapBuffer)
3165 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003166 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003167 return false;
3168 }
3169
3170 return ValidateUnmapBufferBase(context, target);
3171}
3172
3173bool ValidateMapBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003174 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003175 GLintptr offset,
3176 GLsizeiptr length,
3177 GLbitfield access)
3178{
3179 if (!context->getExtensions().mapBufferRange)
3180 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003181 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003182 return false;
3183 }
3184
3185 return ValidateMapBufferRangeBase(context, target, offset, length, access);
3186}
3187
Michael Spang7a8c3e52019-04-03 14:49:57 -04003188bool ValidateBufferStorageMemEXT(Context *context,
3189 TextureType target,
3190 GLsizeiptr size,
3191 GLuint memory,
3192 GLuint64 offset)
3193{
3194 if (!context->getExtensions().memoryObject)
3195 {
3196 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3197 return false;
3198 }
3199
3200 UNIMPLEMENTED();
3201 return false;
3202}
3203
3204bool ValidateCreateMemoryObjectsEXT(Context *context, GLsizei n, GLuint *memoryObjects)
3205{
3206 if (!context->getExtensions().memoryObject)
3207 {
3208 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3209 return false;
3210 }
3211
Michael Spangfb201c52019-04-03 14:57:35 -04003212 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003213}
3214
3215bool ValidateDeleteMemoryObjectsEXT(Context *context, GLsizei n, const GLuint *memoryObjects)
3216{
3217 if (!context->getExtensions().memoryObject)
3218 {
3219 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3220 return false;
3221 }
3222
Michael Spangfb201c52019-04-03 14:57:35 -04003223 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003224}
3225
3226bool ValidateGetMemoryObjectParameterivEXT(Context *context,
3227 GLuint memoryObject,
3228 GLenum pname,
3229 GLint *params)
3230{
3231 if (!context->getExtensions().memoryObject)
3232 {
3233 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3234 return false;
3235 }
3236
3237 UNIMPLEMENTED();
3238 return false;
3239}
3240
3241bool ValidateGetUnsignedBytevEXT(Context *context, GLenum pname, GLubyte *data)
3242{
3243 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3244 {
3245 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3246 return false;
3247 }
3248
3249 UNIMPLEMENTED();
3250 return false;
3251}
3252
3253bool ValidateGetUnsignedBytei_vEXT(Context *context, GLenum target, GLuint index, GLubyte *data)
3254{
3255 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3256 {
3257 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3258 return false;
3259 }
3260
3261 UNIMPLEMENTED();
3262 return false;
3263}
3264
3265bool ValidateIsMemoryObjectEXT(Context *context, GLuint memoryObject)
3266{
3267 if (!context->getExtensions().memoryObject)
3268 {
3269 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3270 return false;
3271 }
3272
Michael Spangfb201c52019-04-03 14:57:35 -04003273 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003274}
3275
3276bool ValidateMemoryObjectParameterivEXT(Context *context,
3277 GLuint memoryObject,
3278 GLenum pname,
3279 const GLint *params)
3280{
3281 if (!context->getExtensions().memoryObject)
3282 {
3283 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3284 return false;
3285 }
3286
3287 UNIMPLEMENTED();
3288 return false;
3289}
3290
3291bool ValidateTexStorageMem2DEXT(Context *context,
3292 TextureType target,
3293 GLsizei levels,
3294 GLenum internalFormat,
3295 GLsizei width,
3296 GLsizei height,
3297 GLuint memory,
3298 GLuint64 offset)
3299{
3300 if (!context->getExtensions().memoryObject)
3301 {
3302 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3303 return false;
3304 }
3305
Michael Spangf02a7672019-04-09 18:45:23 -04003306 if (context->getClientMajorVersion() < 3)
3307 {
3308 return ValidateES2TexStorageParameters(context, target, levels, internalFormat, width,
3309 height);
3310 }
3311
3312 ASSERT(context->getClientMajorVersion() >= 3);
3313 return ValidateES3TexStorage2DParameters(context, target, levels, internalFormat, width, height,
3314 1);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003315}
3316
3317bool ValidateTexStorageMem3DEXT(Context *context,
3318 TextureType target,
3319 GLsizei levels,
3320 GLenum internalFormat,
3321 GLsizei width,
3322 GLsizei height,
3323 GLsizei depth,
3324 GLuint memory,
3325 GLuint64 offset)
3326{
3327 if (!context->getExtensions().memoryObject)
3328 {
3329 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3330 return false;
3331 }
3332
3333 UNIMPLEMENTED();
3334 return false;
3335}
3336
Michael Spang9de3ddb2019-04-03 16:23:40 -04003337bool ValidateImportMemoryFdEXT(Context *context,
3338 GLuint memory,
3339 GLuint64 size,
Michael Spange0da9ce2019-04-16 14:34:51 -04003340 HandleType handleType,
Michael Spang9de3ddb2019-04-03 16:23:40 -04003341 GLint fd)
3342{
3343 if (!context->getExtensions().memoryObjectFd)
3344 {
3345 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3346 return false;
3347 }
3348
Michael Spang3b2c6bf2019-04-16 17:19:50 -04003349 switch (handleType)
3350 {
3351 case HandleType::OpaqueFd:
3352 break;
3353 default:
3354 context->validationError(GL_INVALID_ENUM, kInvalidHandleType);
3355 return false;
3356 }
3357
3358 return true;
Michael Spang9de3ddb2019-04-03 16:23:40 -04003359}
3360
Michael Spang7a8c3e52019-04-03 14:49:57 -04003361bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores)
3362{
3363 if (!context->getExtensions().semaphore)
3364 {
3365 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3366 return false;
3367 }
3368
Michael Spang5093ba62019-05-14 17:36:36 -04003369 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003370}
3371
3372bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores)
3373{
3374 if (!context->getExtensions().semaphore)
3375 {
3376 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3377 return false;
3378 }
3379
Michael Spang5093ba62019-05-14 17:36:36 -04003380 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003381}
3382
3383bool ValidateGetSemaphoreParameterui64vEXT(Context *context,
3384 GLuint semaphore,
3385 GLenum pname,
3386 GLuint64 *params)
3387{
3388 if (!context->getExtensions().semaphore)
3389 {
3390 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3391 return false;
3392 }
3393
3394 UNIMPLEMENTED();
3395 return false;
3396}
3397
3398bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore)
3399{
3400 if (!context->getExtensions().semaphore)
3401 {
3402 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3403 return false;
3404 }
3405
Michael Spang5093ba62019-05-14 17:36:36 -04003406 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003407}
3408
3409bool ValidateSemaphoreParameterui64vEXT(Context *context,
3410 GLuint semaphore,
3411 GLenum pname,
3412 const GLuint64 *params)
3413{
3414 if (!context->getExtensions().semaphore)
3415 {
3416 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3417 return false;
3418 }
3419
3420 UNIMPLEMENTED();
3421 return false;
3422}
3423
3424bool ValidateSignalSemaphoreEXT(Context *context,
3425 GLuint semaphore,
3426 GLuint numBufferBarriers,
3427 const GLuint *buffers,
3428 GLuint numTextureBarriers,
3429 const GLuint *textures,
3430 const GLenum *dstLayouts)
3431{
3432 if (!context->getExtensions().semaphore)
3433 {
3434 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3435 return false;
3436 }
3437
Michael Spangab6a59b2019-05-21 21:26:26 -04003438 for (GLuint i = 0; i < numTextureBarriers; ++i)
3439 {
3440 if (!IsValidImageLayout(FromGLenum<ImageLayout>(dstLayouts[i])))
3441 {
3442 context->validationError(GL_INVALID_ENUM, kInvalidImageLayout);
3443 return false;
3444 }
3445 }
3446
3447 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003448}
3449
3450bool ValidateWaitSemaphoreEXT(Context *context,
3451 GLuint semaphore,
3452 GLuint numBufferBarriers,
3453 const GLuint *buffers,
3454 GLuint numTextureBarriers,
3455 const GLuint *textures,
3456 const GLenum *srcLayouts)
3457{
3458 if (!context->getExtensions().semaphore)
3459 {
3460 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3461 return false;
3462 }
3463
Michael Spangab6a59b2019-05-21 21:26:26 -04003464 for (GLuint i = 0; i < numTextureBarriers; ++i)
3465 {
3466 if (!IsValidImageLayout(FromGLenum<ImageLayout>(srcLayouts[i])))
3467 {
3468 context->validationError(GL_INVALID_ENUM, kInvalidImageLayout);
3469 return false;
3470 }
3471 }
3472
3473 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003474}
3475
Michael Spange0da9ce2019-04-16 14:34:51 -04003476bool ValidateImportSemaphoreFdEXT(Context *context,
3477 GLuint semaphore,
3478 HandleType handleType,
3479 GLint fd)
Michael Spang9de3ddb2019-04-03 16:23:40 -04003480{
3481 if (!context->getExtensions().semaphoreFd)
3482 {
3483 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3484 return false;
3485 }
3486
Michael Spang6bb193c2019-05-22 16:32:21 -04003487 switch (handleType)
3488 {
3489 case HandleType::OpaqueFd:
3490 break;
3491 default:
3492 context->validationError(GL_INVALID_ENUM, kInvalidHandleType);
3493 return false;
3494 }
3495
3496 return true;
Michael Spang9de3ddb2019-04-03 16:23:40 -04003497}
3498
Corentin Wallez336129f2017-10-17 15:55:40 -04003499bool ValidateMapBufferBase(Context *context, BufferBinding target)
Geoff Lang79f71042017-08-14 16:43:43 -04003500{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003501 Buffer *buffer = context->getState().getTargetBuffer(target);
Geoff Lang79f71042017-08-14 16:43:43 -04003502 ASSERT(buffer != nullptr);
3503
3504 // Check if this buffer is currently being used as a transform feedback output buffer
Shahbaz Youssefi8af6c6f2019-06-18 15:43:44 -04003505 if (context->getState().isTransformFeedbackActive())
Geoff Lang79f71042017-08-14 16:43:43 -04003506 {
Shahbaz Youssefi8af6c6f2019-06-18 15:43:44 -04003507 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Lang79f71042017-08-14 16:43:43 -04003508 for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3509 {
3510 const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
3511 if (transformFeedbackBuffer.get() == buffer)
3512 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003513 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
Geoff Lang79f71042017-08-14 16:43:43 -04003514 return false;
3515 }
3516 }
3517 }
3518
James Darpiniane8a93c62018-01-04 18:02:24 -08003519 if (context->getExtensions().webglCompatibility &&
3520 buffer->isBoundForTransformFeedbackAndOtherUse())
3521 {
Jamie Madille0472f32018-11-27 16:32:45 -05003522 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08003523 return false;
3524 }
3525
Geoff Lang79f71042017-08-14 16:43:43 -04003526 return true;
3527}
3528
Olli Etuaho4f667482016-03-30 15:56:35 +03003529bool ValidateFlushMappedBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003530 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003531 GLintptr offset,
3532 GLsizeiptr length)
3533{
3534 if (!context->getExtensions().mapBufferRange)
3535 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003536 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003537 return false;
3538 }
3539
3540 return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
3541}
3542
Geoff Langd8605522016-04-13 10:19:12 -04003543bool ValidateBindUniformLocationCHROMIUM(Context *context,
3544 GLuint program,
3545 GLint location,
3546 const GLchar *name)
3547{
3548 if (!context->getExtensions().bindUniformLocation)
3549 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003550 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langd8605522016-04-13 10:19:12 -04003551 return false;
3552 }
3553
3554 Program *programObject = GetValidProgram(context, program);
3555 if (!programObject)
3556 {
3557 return false;
3558 }
3559
3560 if (location < 0)
3561 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003562 context->validationError(GL_INVALID_VALUE, kNegativeLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003563 return false;
3564 }
3565
3566 const Caps &caps = context->getCaps();
3567 if (static_cast<size_t>(location) >=
3568 (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
3569 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003570 context->validationError(GL_INVALID_VALUE, kInvalidBindUniformLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003571 return false;
3572 }
3573
Geoff Langfc32e8b2017-05-31 14:16:59 -04003574 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
3575 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04003576 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04003577 {
Jamie Madille0472f32018-11-27 16:32:45 -05003578 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04003579 return false;
3580 }
3581
Geoff Langd8605522016-04-13 10:19:12 -04003582 if (strncmp(name, "gl_", 3) == 0)
3583 {
Jamie Madille0472f32018-11-27 16:32:45 -05003584 context->validationError(GL_INVALID_VALUE, kNameBeginsWithGL);
Geoff Langd8605522016-04-13 10:19:12 -04003585 return false;
3586 }
3587
3588 return true;
3589}
3590
Jamie Madille2e406c2016-06-02 13:04:10 -04003591bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03003592{
3593 if (!context->getExtensions().framebufferMixedSamples)
3594 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003595 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänena797e062016-05-12 15:23:40 +03003596 return false;
3597 }
3598 switch (components)
3599 {
3600 case GL_RGB:
3601 case GL_RGBA:
3602 case GL_ALPHA:
3603 case GL_NONE:
3604 break;
3605 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003606 context->validationError(GL_INVALID_ENUM, kInvalidCoverageComponents);
Sami Väisänena797e062016-05-12 15:23:40 +03003607 return false;
3608 }
3609
3610 return true;
3611}
3612
Sami Väisänene45e53b2016-05-25 10:36:04 +03003613// CHROMIUM_path_rendering
3614
Jamie Madill007530e2017-12-28 14:27:04 -05003615bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003616{
Jamie Madill007530e2017-12-28 14:27:04 -05003617 if (!ValidateMatrixMode(context, matrixMode))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003618 {
Sami Väisänene45e53b2016-05-25 10:36:04 +03003619 return false;
3620 }
Jamie Madill007530e2017-12-28 14:27:04 -05003621
Sami Väisänene45e53b2016-05-25 10:36:04 +03003622 if (matrix == nullptr)
3623 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003624 context->validationError(GL_INVALID_OPERATION, kInvalidPathMatrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003625 return false;
3626 }
Jamie Madill007530e2017-12-28 14:27:04 -05003627
Sami Väisänene45e53b2016-05-25 10:36:04 +03003628 return true;
3629}
3630
Jamie Madill007530e2017-12-28 14:27:04 -05003631bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003632{
Jamie Madill007530e2017-12-28 14:27:04 -05003633 return ValidateMatrixMode(context, matrixMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003634}
3635
Jamie Madill007530e2017-12-28 14:27:04 -05003636bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003637{
3638 if (!context->getExtensions().pathRendering)
3639 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003640 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003641 return false;
3642 }
3643
3644 // range = 0 is undefined in NV_path_rendering.
3645 // we add stricter semantic check here and require a non zero positive range.
3646 if (range <= 0)
3647 {
Jamie Madille0472f32018-11-27 16:32:45 -05003648 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003649 return false;
3650 }
3651
3652 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
3653 {
Jamie Madille0472f32018-11-27 16:32:45 -05003654 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003655 return false;
3656 }
3657
3658 return true;
3659}
3660
Jamie Madill007530e2017-12-28 14:27:04 -05003661bool ValidateDeletePathsCHROMIUM(Context *context, GLuint path, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003662{
3663 if (!context->getExtensions().pathRendering)
3664 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003665 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003666 return false;
3667 }
3668
3669 // range = 0 is undefined in NV_path_rendering.
3670 // we add stricter semantic check here and require a non zero positive range.
3671 if (range <= 0)
3672 {
Jamie Madille0472f32018-11-27 16:32:45 -05003673 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003674 return false;
3675 }
3676
3677 angle::CheckedNumeric<std::uint32_t> checkedRange(path);
3678 checkedRange += range;
3679
3680 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
3681 {
Jamie Madille0472f32018-11-27 16:32:45 -05003682 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003683 return false;
3684 }
3685 return true;
3686}
3687
Jamie Madill007530e2017-12-28 14:27:04 -05003688bool ValidatePathCommandsCHROMIUM(Context *context,
3689 GLuint path,
3690 GLsizei numCommands,
3691 const GLubyte *commands,
3692 GLsizei numCoords,
3693 GLenum coordType,
3694 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003695{
3696 if (!context->getExtensions().pathRendering)
3697 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003698 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003699 return false;
3700 }
Brandon Jones59770802018-04-02 13:18:42 -07003701 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003702 {
Jamie Madille0472f32018-11-27 16:32:45 -05003703 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003704 return false;
3705 }
3706
3707 if (numCommands < 0)
3708 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003709 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCommands);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003710 return false;
3711 }
3712 else if (numCommands > 0)
3713 {
3714 if (!commands)
3715 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003716 context->validationError(GL_INVALID_VALUE, kInvalidPathCommandsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003717 return false;
3718 }
3719 }
3720
3721 if (numCoords < 0)
3722 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003723 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003724 return false;
3725 }
3726 else if (numCoords > 0)
3727 {
3728 if (!coords)
3729 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003730 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoordsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003731 return false;
3732 }
3733 }
3734
3735 std::uint32_t coordTypeSize = 0;
3736 switch (coordType)
3737 {
3738 case GL_BYTE:
3739 coordTypeSize = sizeof(GLbyte);
3740 break;
3741
3742 case GL_UNSIGNED_BYTE:
3743 coordTypeSize = sizeof(GLubyte);
3744 break;
3745
3746 case GL_SHORT:
3747 coordTypeSize = sizeof(GLshort);
3748 break;
3749
3750 case GL_UNSIGNED_SHORT:
3751 coordTypeSize = sizeof(GLushort);
3752 break;
3753
3754 case GL_FLOAT:
3755 coordTypeSize = sizeof(GLfloat);
3756 break;
3757
3758 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003759 context->validationError(GL_INVALID_ENUM, kInvalidPathCoordinateType);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003760 return false;
3761 }
3762
3763 angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
3764 checkedSize += (coordTypeSize * numCoords);
3765 if (!checkedSize.IsValid())
3766 {
Jamie Madille0472f32018-11-27 16:32:45 -05003767 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003768 return false;
3769 }
3770
3771 // early return skips command data validation when it doesn't exist.
3772 if (!commands)
3773 return true;
3774
3775 GLsizei expectedNumCoords = 0;
3776 for (GLsizei i = 0; i < numCommands; ++i)
3777 {
3778 switch (commands[i])
3779 {
3780 case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
3781 break;
3782 case GL_MOVE_TO_CHROMIUM:
3783 case GL_LINE_TO_CHROMIUM:
3784 expectedNumCoords += 2;
3785 break;
3786 case GL_QUADRATIC_CURVE_TO_CHROMIUM:
3787 expectedNumCoords += 4;
3788 break;
3789 case GL_CUBIC_CURVE_TO_CHROMIUM:
3790 expectedNumCoords += 6;
3791 break;
3792 case GL_CONIC_CURVE_TO_CHROMIUM:
3793 expectedNumCoords += 5;
3794 break;
3795 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003796 context->validationError(GL_INVALID_ENUM, kInvalidPathCommand);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003797 return false;
3798 }
3799 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003800
Sami Väisänene45e53b2016-05-25 10:36:04 +03003801 if (expectedNumCoords != numCoords)
3802 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003803 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003804 return false;
3805 }
3806
3807 return true;
3808}
3809
Jamie Madill007530e2017-12-28 14:27:04 -05003810bool ValidatePathParameterfCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003811{
3812 if (!context->getExtensions().pathRendering)
3813 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003814 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003815 return false;
3816 }
Brandon Jones59770802018-04-02 13:18:42 -07003817 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003818 {
Jamie Madille0472f32018-11-27 16:32:45 -05003819 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003820 return false;
3821 }
3822
3823 switch (pname)
3824 {
3825 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3826 if (value < 0.0f)
3827 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003828 context->validationError(GL_INVALID_VALUE, kInvalidPathStrokeWidth);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003829 return false;
3830 }
3831 break;
3832 case GL_PATH_END_CAPS_CHROMIUM:
3833 switch (static_cast<GLenum>(value))
3834 {
3835 case GL_FLAT_CHROMIUM:
3836 case GL_SQUARE_CHROMIUM:
3837 case GL_ROUND_CHROMIUM:
3838 break;
3839 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003840 context->validationError(GL_INVALID_ENUM, kInvalidPathEndCaps);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003841 return false;
3842 }
3843 break;
3844 case GL_PATH_JOIN_STYLE_CHROMIUM:
3845 switch (static_cast<GLenum>(value))
3846 {
3847 case GL_MITER_REVERT_CHROMIUM:
3848 case GL_BEVEL_CHROMIUM:
3849 case GL_ROUND_CHROMIUM:
3850 break;
3851 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003852 context->validationError(GL_INVALID_ENUM, kInvalidPathJoinStyle);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003853 return false;
3854 }
Nico Weber41b072b2018-02-09 10:01:32 -05003855 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03003856 case GL_PATH_MITER_LIMIT_CHROMIUM:
3857 if (value < 0.0f)
3858 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003859 context->validationError(GL_INVALID_VALUE, kInvalidPathMiterLimit);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003860 return false;
3861 }
3862 break;
3863
3864 case GL_PATH_STROKE_BOUND_CHROMIUM:
3865 // no errors, only clamping.
3866 break;
3867
3868 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003869 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003870 return false;
3871 }
3872 return true;
3873}
3874
Jamie Madill007530e2017-12-28 14:27:04 -05003875bool ValidatePathParameteriCHROMIUM(Context *context, GLuint path, GLenum pname, GLint value)
3876{
3877 // TODO(jmadill): Use proper clamping cast.
3878 return ValidatePathParameterfCHROMIUM(context, path, pname, static_cast<GLfloat>(value));
3879}
3880
3881bool ValidateGetPathParameterfvCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat *value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003882{
3883 if (!context->getExtensions().pathRendering)
3884 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003885 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003886 return false;
3887 }
3888
Brandon Jones59770802018-04-02 13:18:42 -07003889 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003890 {
Jamie Madille0472f32018-11-27 16:32:45 -05003891 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003892 return false;
3893 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003894
Sami Väisänene45e53b2016-05-25 10:36:04 +03003895 if (!value)
3896 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003897 context->validationError(GL_INVALID_VALUE, kInvalidPathValueArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003898 return false;
3899 }
3900
3901 switch (pname)
3902 {
3903 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3904 case GL_PATH_END_CAPS_CHROMIUM:
3905 case GL_PATH_JOIN_STYLE_CHROMIUM:
3906 case GL_PATH_MITER_LIMIT_CHROMIUM:
3907 case GL_PATH_STROKE_BOUND_CHROMIUM:
3908 break;
3909
3910 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003911 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003912 return false;
3913 }
3914
3915 return true;
3916}
3917
Jamie Madill007530e2017-12-28 14:27:04 -05003918bool ValidateGetPathParameterivCHROMIUM(Context *context, GLuint path, GLenum pname, GLint *value)
3919{
3920 return ValidateGetPathParameterfvCHROMIUM(context, path, pname,
3921 reinterpret_cast<GLfloat *>(value));
3922}
3923
3924bool ValidatePathStencilFuncCHROMIUM(Context *context, GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003925{
3926 if (!context->getExtensions().pathRendering)
3927 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003928 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003929 return false;
3930 }
3931
3932 switch (func)
3933 {
3934 case GL_NEVER:
3935 case GL_ALWAYS:
3936 case GL_LESS:
3937 case GL_LEQUAL:
3938 case GL_EQUAL:
3939 case GL_GEQUAL:
3940 case GL_GREATER:
3941 case GL_NOTEQUAL:
3942 break;
3943 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003944 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003945 return false;
3946 }
3947
3948 return true;
3949}
3950
3951// Note that the spec specifies that for the path drawing commands
3952// if the path object is not an existing path object the command
3953// does nothing and no error is generated.
3954// However if the path object exists but has not been specified any
3955// commands then an error is generated.
3956
Jamie Madill007530e2017-12-28 14:27:04 -05003957bool ValidateStencilFillPathCHROMIUM(Context *context, GLuint path, GLenum fillMode, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003958{
3959 if (!context->getExtensions().pathRendering)
3960 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003961 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003962 return false;
3963 }
Brandon Jones59770802018-04-02 13:18:42 -07003964 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003965 {
Jamie Madille0472f32018-11-27 16:32:45 -05003966 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003967 return false;
3968 }
3969
3970 switch (fillMode)
3971 {
Chris Daltona9dfb3b2019-06-26 18:36:10 -06003972 case GL_INVERT:
Sami Väisänene45e53b2016-05-25 10:36:04 +03003973 case GL_COUNT_UP_CHROMIUM:
3974 case GL_COUNT_DOWN_CHROMIUM:
3975 break;
3976 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003977 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003978 return false;
3979 }
3980
3981 if (!isPow2(mask + 1))
3982 {
Jamie Madille0472f32018-11-27 16:32:45 -05003983 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003984 return false;
3985 }
3986
3987 return true;
3988}
3989
Jamie Madill007530e2017-12-28 14:27:04 -05003990bool ValidateStencilStrokePathCHROMIUM(Context *context, GLuint path, GLint reference, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003991{
3992 if (!context->getExtensions().pathRendering)
3993 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003994 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003995 return false;
3996 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003997
Brandon Jones59770802018-04-02 13:18:42 -07003998 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003999 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004000 context->validationError(GL_INVALID_OPERATION, kNoPathOrNoPathData);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004001 return false;
4002 }
4003
4004 return true;
4005}
4006
Jamie Madill007530e2017-12-28 14:27:04 -05004007bool ValidateCoverPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03004008{
4009 if (!context->getExtensions().pathRendering)
4010 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004011 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004012 return false;
4013 }
Brandon Jones59770802018-04-02 13:18:42 -07004014 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03004015 {
Jamie Madille0472f32018-11-27 16:32:45 -05004016 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004017 return false;
4018 }
4019
4020 switch (coverMode)
4021 {
4022 case GL_CONVEX_HULL_CHROMIUM:
4023 case GL_BOUNDING_BOX_CHROMIUM:
4024 break;
4025 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004026 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004027 return false;
4028 }
4029 return true;
4030}
4031
Jamie Madill778bf092018-11-14 09:54:36 -05004032bool ValidateCoverFillPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
4033{
4034 return ValidateCoverPathCHROMIUM(context, path, coverMode);
4035}
4036
4037bool ValidateCoverStrokePathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
4038{
4039 return ValidateCoverPathCHROMIUM(context, path, coverMode);
4040}
4041
Jamie Madill007530e2017-12-28 14:27:04 -05004042bool ValidateStencilThenCoverFillPathCHROMIUM(Context *context,
4043 GLuint path,
4044 GLenum fillMode,
4045 GLuint mask,
4046 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03004047{
Jamie Madill007530e2017-12-28 14:27:04 -05004048 return ValidateStencilFillPathCHROMIUM(context, path, fillMode, mask) &&
4049 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004050}
4051
Jamie Madill007530e2017-12-28 14:27:04 -05004052bool ValidateStencilThenCoverStrokePathCHROMIUM(Context *context,
4053 GLuint path,
4054 GLint reference,
4055 GLuint mask,
4056 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03004057{
Jamie Madill007530e2017-12-28 14:27:04 -05004058 return ValidateStencilStrokePathCHROMIUM(context, path, reference, mask) &&
4059 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004060}
4061
Brandon Jonesd1049182018-03-28 10:02:20 -07004062bool ValidateIsPathCHROMIUM(Context *context, GLuint path)
Sami Väisänene45e53b2016-05-25 10:36:04 +03004063{
4064 if (!context->getExtensions().pathRendering)
4065 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004066 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03004067 return false;
4068 }
4069 return true;
4070}
4071
Jamie Madill007530e2017-12-28 14:27:04 -05004072bool ValidateCoverFillPathInstancedCHROMIUM(Context *context,
4073 GLsizei numPaths,
4074 GLenum pathNameType,
4075 const void *paths,
4076 GLuint pathBase,
4077 GLenum coverMode,
4078 GLenum transformType,
4079 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004080{
4081 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4082 transformType, transformValues))
4083 return false;
4084
4085 switch (coverMode)
4086 {
4087 case GL_CONVEX_HULL_CHROMIUM:
4088 case GL_BOUNDING_BOX_CHROMIUM:
4089 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4090 break;
4091 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004092 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004093 return false;
4094 }
4095
4096 return true;
4097}
4098
Jamie Madill007530e2017-12-28 14:27:04 -05004099bool ValidateCoverStrokePathInstancedCHROMIUM(Context *context,
4100 GLsizei numPaths,
4101 GLenum pathNameType,
4102 const void *paths,
4103 GLuint pathBase,
4104 GLenum coverMode,
4105 GLenum transformType,
4106 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004107{
4108 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4109 transformType, transformValues))
4110 return false;
4111
4112 switch (coverMode)
4113 {
4114 case GL_CONVEX_HULL_CHROMIUM:
4115 case GL_BOUNDING_BOX_CHROMIUM:
4116 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4117 break;
4118 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004119 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004120 return false;
4121 }
4122
4123 return true;
4124}
4125
Jamie Madill007530e2017-12-28 14:27:04 -05004126bool ValidateStencilFillPathInstancedCHROMIUM(Context *context,
4127 GLsizei numPaths,
4128 GLenum pathNameType,
4129 const void *paths,
4130 GLuint pathBase,
4131 GLenum fillMode,
4132 GLuint mask,
4133 GLenum transformType,
4134 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004135{
4136
4137 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4138 transformType, transformValues))
4139 return false;
4140
4141 switch (fillMode)
4142 {
Chris Daltona9dfb3b2019-06-26 18:36:10 -06004143 case GL_INVERT:
Sami Väisänend59ca052016-06-21 16:10:00 +03004144 case GL_COUNT_UP_CHROMIUM:
4145 case GL_COUNT_DOWN_CHROMIUM:
4146 break;
4147 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004148 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004149 return false;
4150 }
4151 if (!isPow2(mask + 1))
4152 {
Jamie Madille0472f32018-11-27 16:32:45 -05004153 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004154 return false;
4155 }
4156 return true;
4157}
4158
Jamie Madill007530e2017-12-28 14:27:04 -05004159bool ValidateStencilStrokePathInstancedCHROMIUM(Context *context,
4160 GLsizei numPaths,
4161 GLenum pathNameType,
4162 const void *paths,
4163 GLuint pathBase,
4164 GLint reference,
4165 GLuint mask,
4166 GLenum transformType,
4167 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004168{
4169 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4170 transformType, transformValues))
4171 return false;
4172
4173 // no more validation here.
4174
4175 return true;
4176}
4177
Jamie Madill007530e2017-12-28 14:27:04 -05004178bool ValidateStencilThenCoverFillPathInstancedCHROMIUM(Context *context,
4179 GLsizei numPaths,
4180 GLenum pathNameType,
4181 const void *paths,
4182 GLuint pathBase,
4183 GLenum fillMode,
4184 GLuint mask,
4185 GLenum coverMode,
4186 GLenum transformType,
4187 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004188{
4189 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4190 transformType, transformValues))
4191 return false;
4192
4193 switch (coverMode)
4194 {
4195 case GL_CONVEX_HULL_CHROMIUM:
4196 case GL_BOUNDING_BOX_CHROMIUM:
4197 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4198 break;
4199 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004200 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004201 return false;
4202 }
4203
4204 switch (fillMode)
4205 {
Chris Daltona9dfb3b2019-06-26 18:36:10 -06004206 case GL_INVERT:
Sami Väisänend59ca052016-06-21 16:10:00 +03004207 case GL_COUNT_UP_CHROMIUM:
4208 case GL_COUNT_DOWN_CHROMIUM:
4209 break;
4210 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004211 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004212 return false;
4213 }
4214 if (!isPow2(mask + 1))
4215 {
Jamie Madille0472f32018-11-27 16:32:45 -05004216 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004217 return false;
4218 }
4219
4220 return true;
4221}
4222
Jamie Madill007530e2017-12-28 14:27:04 -05004223bool ValidateStencilThenCoverStrokePathInstancedCHROMIUM(Context *context,
4224 GLsizei numPaths,
4225 GLenum pathNameType,
4226 const void *paths,
4227 GLuint pathBase,
4228 GLint reference,
4229 GLuint mask,
4230 GLenum coverMode,
4231 GLenum transformType,
4232 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004233{
4234 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4235 transformType, transformValues))
4236 return false;
4237
4238 switch (coverMode)
4239 {
4240 case GL_CONVEX_HULL_CHROMIUM:
4241 case GL_BOUNDING_BOX_CHROMIUM:
4242 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4243 break;
4244 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004245 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004246 return false;
4247 }
4248
4249 return true;
4250}
4251
Jamie Madill007530e2017-12-28 14:27:04 -05004252bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
4253 GLuint program,
4254 GLint location,
4255 const GLchar *name)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004256{
4257 if (!context->getExtensions().pathRendering)
4258 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004259 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004260 return false;
4261 }
4262
4263 const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
4264 if (location >= MaxLocation)
4265 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004266 context->validationError(GL_INVALID_VALUE, kInvalidVaryingLocation);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004267 return false;
4268 }
4269
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004270 const auto *programObject = context->getProgramNoResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004271 if (!programObject)
4272 {
Jamie Madille0472f32018-11-27 16:32:45 -05004273 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004274 return false;
4275 }
4276
4277 if (!name)
4278 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004279 context->validationError(GL_INVALID_VALUE, kMissingName);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004280 return false;
4281 }
4282
4283 if (angle::BeginsWith(name, "gl_"))
4284 {
Jamie Madille0472f32018-11-27 16:32:45 -05004285 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004286 return false;
4287 }
4288
4289 return true;
4290}
4291
Jamie Madill007530e2017-12-28 14:27:04 -05004292bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
4293 GLuint program,
4294 GLint location,
4295 GLenum genMode,
4296 GLint components,
4297 const GLfloat *coeffs)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004298{
4299 if (!context->getExtensions().pathRendering)
4300 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004301 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004302 return false;
4303 }
4304
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004305 const auto *programObject = context->getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004306 if (!programObject || programObject->isFlaggedForDeletion())
4307 {
Jamie Madille0472f32018-11-27 16:32:45 -05004308 context->validationError(GL_INVALID_OPERATION, kProgramDoesNotExist);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004309 return false;
4310 }
4311
4312 if (!programObject->isLinked())
4313 {
Jamie Madille0472f32018-11-27 16:32:45 -05004314 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004315 return false;
4316 }
4317
4318 switch (genMode)
4319 {
4320 case GL_NONE:
4321 if (components != 0)
4322 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004323 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004324 return false;
4325 }
4326 break;
4327
4328 case GL_OBJECT_LINEAR_CHROMIUM:
4329 case GL_EYE_LINEAR_CHROMIUM:
4330 case GL_CONSTANT_CHROMIUM:
4331 if (components < 1 || components > 4)
4332 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004333 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004334 return false;
4335 }
4336 if (!coeffs)
4337 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004338 context->validationError(GL_INVALID_VALUE, kInvalidPathCoefficientsArray);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004339 return false;
4340 }
4341 break;
4342
4343 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004344 context->validationError(GL_INVALID_ENUM, kInvalidPathGenMode);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004345 return false;
4346 }
4347
4348 // If the location is -1 then the command is silently ignored
4349 // and no further validation is needed.
4350 if (location == -1)
4351 return true;
4352
jchen103fd614d2018-08-13 12:21:58 +08004353 const auto &binding = programObject->getFragmentInputBindingInfo(location);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004354
4355 if (!binding.valid)
4356 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004357 context->validationError(GL_INVALID_OPERATION, kInvalidFragmentInputBinding);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004358 return false;
4359 }
4360
4361 if (binding.type != GL_NONE)
4362 {
4363 GLint expectedComponents = 0;
4364 switch (binding.type)
4365 {
4366 case GL_FLOAT:
4367 expectedComponents = 1;
4368 break;
4369 case GL_FLOAT_VEC2:
4370 expectedComponents = 2;
4371 break;
4372 case GL_FLOAT_VEC3:
4373 expectedComponents = 3;
4374 break;
4375 case GL_FLOAT_VEC4:
4376 expectedComponents = 4;
4377 break;
4378 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004379 context->validationError(GL_INVALID_OPERATION, kFragmentInputTypeNotFloatingPoint);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004380 return false;
4381 }
4382 if (expectedComponents != components && genMode != GL_NONE)
4383 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004384 context->validationError(GL_INVALID_OPERATION, kInvalidPathComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004385 return false;
4386 }
4387 }
4388 return true;
4389}
4390
Geoff Lang97073d12016-04-20 10:42:34 -07004391bool ValidateCopyTextureCHROMIUM(Context *context,
4392 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004393 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004394 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004395 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004396 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004397 GLint internalFormat,
4398 GLenum destType,
4399 GLboolean unpackFlipY,
4400 GLboolean unpackPremultiplyAlpha,
4401 GLboolean unpackUnmultiplyAlpha)
4402{
4403 if (!context->getExtensions().copyTexture)
4404 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004405 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004406 return false;
4407 }
4408
Geoff Lang4f0e0032017-05-01 16:04:35 -04004409 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004410 if (source == nullptr)
4411 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004412 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004413 return false;
4414 }
4415
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004416 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004417 {
Jamie Madille0472f32018-11-27 16:32:45 -05004418 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004419 return false;
4420 }
4421
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004422 TextureType sourceType = source->getType();
4423 ASSERT(sourceType != TextureType::CubeMap);
4424 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004425
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004426 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004427 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004428 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004429 return false;
4430 }
4431
Geoff Lang4f0e0032017-05-01 16:04:35 -04004432 GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
4433 GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
4434 if (sourceWidth == 0 || sourceHeight == 0)
4435 {
Jamie Madille0472f32018-11-27 16:32:45 -05004436 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004437 return false;
4438 }
4439
4440 const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
4441 if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004442 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004443 context->validationError(GL_INVALID_OPERATION, kInvalidSourceTextureInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004444 return false;
4445 }
4446
Geoff Lang63458a32017-10-30 15:16:53 -04004447 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4448 {
Jamie Madille0472f32018-11-27 16:32:45 -05004449 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004450 return false;
4451 }
4452
Geoff Lang4f0e0032017-05-01 16:04:35 -04004453 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004454 if (dest == nullptr)
4455 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004456 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004457 return false;
4458 }
4459
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004460 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004461 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004462 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004463 return false;
4464 }
4465
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004466 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, sourceWidth,
Brandon Jones28783792018-03-05 09:37:32 -08004467 sourceHeight, false))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004468 {
Jamie Madille0472f32018-11-27 16:32:45 -05004469 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004470 return false;
4471 }
4472
Geoff Lang97073d12016-04-20 10:42:34 -07004473 if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
4474 {
Geoff Lang97073d12016-04-20 10:42:34 -07004475 return false;
4476 }
4477
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004478 if (dest->getType() == TextureType::CubeMap && sourceWidth != sourceHeight)
Geoff Lang4f0e0032017-05-01 16:04:35 -04004479 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004480 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004481 return false;
4482 }
4483
Geoff Lang97073d12016-04-20 10:42:34 -07004484 if (dest->getImmutableFormat())
4485 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004486 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang97073d12016-04-20 10:42:34 -07004487 return false;
4488 }
4489
4490 return true;
4491}
4492
4493bool ValidateCopySubTextureCHROMIUM(Context *context,
4494 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004495 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004496 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004497 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004498 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004499 GLint xoffset,
4500 GLint yoffset,
4501 GLint x,
4502 GLint y,
4503 GLsizei width,
4504 GLsizei height,
4505 GLboolean unpackFlipY,
4506 GLboolean unpackPremultiplyAlpha,
4507 GLboolean unpackUnmultiplyAlpha)
4508{
4509 if (!context->getExtensions().copyTexture)
4510 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004511 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004512 return false;
4513 }
4514
Geoff Lang4f0e0032017-05-01 16:04:35 -04004515 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004516 if (source == nullptr)
4517 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004518 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004519 return false;
4520 }
4521
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004522 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004523 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004524 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004525 return false;
4526 }
4527
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004528 TextureType sourceType = source->getType();
4529 ASSERT(sourceType != TextureType::CubeMap);
4530 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004531
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004532 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004533 {
Jamie Madille0472f32018-11-27 16:32:45 -05004534 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004535 return false;
4536 }
4537
4538 if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
4539 source->getHeight(sourceTarget, sourceLevel) == 0)
Geoff Lang97073d12016-04-20 10:42:34 -07004540 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004541 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004542 return false;
4543 }
4544
4545 if (x < 0 || y < 0)
4546 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004547 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004548 return false;
4549 }
4550
4551 if (width < 0 || height < 0)
4552 {
Jamie Madille0472f32018-11-27 16:32:45 -05004553 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Geoff Lang97073d12016-04-20 10:42:34 -07004554 return false;
4555 }
4556
Geoff Lang4f0e0032017-05-01 16:04:35 -04004557 if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
4558 static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004559 {
Jamie Madille0472f32018-11-27 16:32:45 -05004560 context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
Geoff Lang97073d12016-04-20 10:42:34 -07004561 return false;
4562 }
4563
Geoff Lang4f0e0032017-05-01 16:04:35 -04004564 const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
4565 if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004566 {
Jamie Madille0472f32018-11-27 16:32:45 -05004567 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004568 return false;
4569 }
4570
Geoff Lang63458a32017-10-30 15:16:53 -04004571 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4572 {
Jamie Madille0472f32018-11-27 16:32:45 -05004573 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004574 return false;
4575 }
4576
Geoff Lang4f0e0032017-05-01 16:04:35 -04004577 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004578 if (dest == nullptr)
4579 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004580 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004581 return false;
4582 }
4583
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004584 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004585 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004586 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004587 return false;
4588 }
4589
Brandon Jones28783792018-03-05 09:37:32 -08004590 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, width, height,
4591 true))
Geoff Lang97073d12016-04-20 10:42:34 -07004592 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004593 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004594 return false;
4595 }
4596
Geoff Lang4f0e0032017-05-01 16:04:35 -04004597 if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
4598 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004599 context->validationError(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004600 return false;
4601 }
4602
4603 const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
4604 if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004605 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004606 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Lang97073d12016-04-20 10:42:34 -07004607 return false;
4608 }
4609
4610 if (xoffset < 0 || yoffset < 0)
4611 {
Jamie Madille0472f32018-11-27 16:32:45 -05004612 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004613 return false;
4614 }
4615
Geoff Lang4f0e0032017-05-01 16:04:35 -04004616 if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
4617 static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004618 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004619 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
Geoff Lang97073d12016-04-20 10:42:34 -07004620 return false;
4621 }
4622
4623 return true;
4624}
4625
Geoff Lang47110bf2016-04-20 11:13:22 -07004626bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
4627{
4628 if (!context->getExtensions().copyCompressedTexture)
4629 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004630 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang47110bf2016-04-20 11:13:22 -07004631 return false;
4632 }
4633
4634 const gl::Texture *source = context->getTexture(sourceId);
4635 if (source == nullptr)
4636 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004637 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004638 return false;
4639 }
4640
Corentin Wallez99d492c2018-02-27 15:17:10 -05004641 if (source->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004642 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004643 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004644 return false;
4645 }
4646
Corentin Wallez99d492c2018-02-27 15:17:10 -05004647 if (source->getWidth(TextureTarget::_2D, 0) == 0 ||
4648 source->getHeight(TextureTarget::_2D, 0) == 0)
Geoff Lang47110bf2016-04-20 11:13:22 -07004649 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004650 context->validationError(GL_INVALID_VALUE, kSourceTextureLevelZeroDefined);
Geoff Lang47110bf2016-04-20 11:13:22 -07004651 return false;
4652 }
4653
Corentin Wallez99d492c2018-02-27 15:17:10 -05004654 const gl::Format &sourceFormat = source->getFormat(TextureTarget::_2D, 0);
Geoff Lang47110bf2016-04-20 11:13:22 -07004655 if (!sourceFormat.info->compressed)
4656 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004657 context->validationError(GL_INVALID_OPERATION, kSourceTextureMustBeCompressed);
Geoff Lang47110bf2016-04-20 11:13:22 -07004658 return false;
4659 }
4660
4661 const gl::Texture *dest = context->getTexture(destId);
4662 if (dest == nullptr)
4663 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004664 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004665 return false;
4666 }
4667
Corentin Wallez99d492c2018-02-27 15:17:10 -05004668 if (dest->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004669 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004670 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004671 return false;
4672 }
4673
4674 if (dest->getImmutableFormat())
4675 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004676 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang47110bf2016-04-20 11:13:22 -07004677 return false;
4678 }
4679
4680 return true;
4681}
4682
Jiawei Shao385b3e02018-03-21 09:43:28 +08004683bool ValidateCreateShader(Context *context, ShaderType type)
Martin Radev4c4c8e72016-08-04 12:25:34 +03004684{
4685 switch (type)
4686 {
Jiawei Shao385b3e02018-03-21 09:43:28 +08004687 case ShaderType::Vertex:
4688 case ShaderType::Fragment:
Martin Radev4c4c8e72016-08-04 12:25:34 +03004689 break;
Geoff Langeb66a6e2016-10-31 13:06:12 -04004690
Jiawei Shao385b3e02018-03-21 09:43:28 +08004691 case ShaderType::Compute:
Geoff Langeb66a6e2016-10-31 13:06:12 -04004692 if (context->getClientVersion() < Version(3, 1))
Martin Radev4c4c8e72016-08-04 12:25:34 +03004693 {
Jamie Madille0472f32018-11-27 16:32:45 -05004694 context->validationError(GL_INVALID_ENUM, kES31Required);
Geoff Langeb66a6e2016-10-31 13:06:12 -04004695 return false;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004696 }
Geoff Langeb66a6e2016-10-31 13:06:12 -04004697 break;
4698
Jiawei Shao385b3e02018-03-21 09:43:28 +08004699 case ShaderType::Geometry:
Jiawei Shao89be29a2017-11-06 14:36:45 +08004700 if (!context->getExtensions().geometryShader)
4701 {
Jamie Madille0472f32018-11-27 16:32:45 -05004702 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jiawei Shao89be29a2017-11-06 14:36:45 +08004703 return false;
4704 }
4705 break;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004706 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004707 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Martin Radev4c4c8e72016-08-04 12:25:34 +03004708 return false;
4709 }
Jamie Madill29639852016-09-02 15:00:09 -04004710
4711 return true;
4712}
4713
Jamie Madill5b772312018-03-08 20:28:32 -05004714bool ValidateBufferData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004715 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004716 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004717 const void *data,
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004718 BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004719{
4720 if (size < 0)
4721 {
Jamie Madille0472f32018-11-27 16:32:45 -05004722 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madill29639852016-09-02 15:00:09 -04004723 return false;
4724 }
4725
4726 switch (usage)
4727 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004728 case BufferUsage::StreamDraw:
4729 case BufferUsage::StaticDraw:
4730 case BufferUsage::DynamicDraw:
Jamie Madill29639852016-09-02 15:00:09 -04004731 break;
4732
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004733 case BufferUsage::StreamRead:
4734 case BufferUsage::StaticRead:
4735 case BufferUsage::DynamicRead:
4736 case BufferUsage::StreamCopy:
4737 case BufferUsage::StaticCopy:
4738 case BufferUsage::DynamicCopy:
Jamie Madill29639852016-09-02 15:00:09 -04004739 if (context->getClientMajorVersion() < 3)
4740 {
Jamie Madille0472f32018-11-27 16:32:45 -05004741 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004742 return false;
4743 }
4744 break;
4745
4746 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004747 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004748 return false;
4749 }
4750
Corentin Walleze4477002017-12-01 14:39:58 -05004751 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004752 {
Jamie Madille0472f32018-11-27 16:32:45 -05004753 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004754 return false;
4755 }
4756
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004757 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004758
4759 if (!buffer)
4760 {
Jamie Madille0472f32018-11-27 16:32:45 -05004761 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004762 return false;
4763 }
4764
James Darpiniane8a93c62018-01-04 18:02:24 -08004765 if (context->getExtensions().webglCompatibility &&
4766 buffer->isBoundForTransformFeedbackAndOtherUse())
4767 {
Jamie Madille0472f32018-11-27 16:32:45 -05004768 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004769 return false;
4770 }
4771
Jamie Madill29639852016-09-02 15:00:09 -04004772 return true;
4773}
4774
Jamie Madill5b772312018-03-08 20:28:32 -05004775bool ValidateBufferSubData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004776 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004777 GLintptr offset,
4778 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004779 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004780{
Brandon Jones6cad5662017-06-14 13:25:13 -07004781 if (size < 0)
Jamie Madill29639852016-09-02 15:00:09 -04004782 {
Jamie Madille0472f32018-11-27 16:32:45 -05004783 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Brandon Jones6cad5662017-06-14 13:25:13 -07004784 return false;
4785 }
4786
4787 if (offset < 0)
4788 {
Jamie Madille0472f32018-11-27 16:32:45 -05004789 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Jamie Madill29639852016-09-02 15:00:09 -04004790 return false;
4791 }
4792
Corentin Walleze4477002017-12-01 14:39:58 -05004793 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004794 {
Jamie Madille0472f32018-11-27 16:32:45 -05004795 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004796 return false;
4797 }
4798
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004799 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004800
4801 if (!buffer)
4802 {
Jamie Madille0472f32018-11-27 16:32:45 -05004803 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004804 return false;
4805 }
4806
4807 if (buffer->isMapped())
4808 {
Jamie Madille0472f32018-11-27 16:32:45 -05004809 context->validationError(GL_INVALID_OPERATION, kBufferMapped);
Jamie Madill29639852016-09-02 15:00:09 -04004810 return false;
4811 }
4812
James Darpiniane8a93c62018-01-04 18:02:24 -08004813 if (context->getExtensions().webglCompatibility &&
4814 buffer->isBoundForTransformFeedbackAndOtherUse())
4815 {
Jamie Madille0472f32018-11-27 16:32:45 -05004816 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004817 return false;
4818 }
4819
Jamie Madill29639852016-09-02 15:00:09 -04004820 // Check for possible overflow of size + offset
4821 angle::CheckedNumeric<size_t> checkedSize(size);
4822 checkedSize += offset;
4823 if (!checkedSize.IsValid())
4824 {
Jamie Madille0472f32018-11-27 16:32:45 -05004825 context->validationError(GL_INVALID_VALUE, kParamOverflow);
Jamie Madill29639852016-09-02 15:00:09 -04004826 return false;
4827 }
4828
4829 if (size + offset > buffer->getSize())
4830 {
Jamie Madille0472f32018-11-27 16:32:45 -05004831 context->validationError(GL_INVALID_VALUE, kInsufficientBufferSize);
Jamie Madill29639852016-09-02 15:00:09 -04004832 return false;
4833 }
4834
Martin Radev4c4c8e72016-08-04 12:25:34 +03004835 return true;
4836}
4837
Geoff Lang111a99e2017-10-17 10:58:41 -04004838bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
Geoff Langc287ea62016-09-16 14:46:51 -04004839{
Geoff Langc339c4e2016-11-29 10:37:36 -05004840 if (!context->getExtensions().requestExtension)
Geoff Langc287ea62016-09-16 14:46:51 -04004841 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004842 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc287ea62016-09-16 14:46:51 -04004843 return false;
4844 }
4845
Geoff Lang111a99e2017-10-17 10:58:41 -04004846 if (!context->isExtensionRequestable(name))
Geoff Langc287ea62016-09-16 14:46:51 -04004847 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004848 context->validationError(GL_INVALID_OPERATION, kExtensionNotRequestable);
Geoff Langc287ea62016-09-16 14:46:51 -04004849 return false;
4850 }
4851
4852 return true;
4853}
4854
Jamie Madill5b772312018-03-08 20:28:32 -05004855bool ValidateActiveTexture(Context *context, GLenum texture)
Jamie Madillef300b12016-10-07 15:12:09 -04004856{
Lingfeng Yang038dd532018-03-29 17:31:52 -07004857 if (context->getClientMajorVersion() < 2)
4858 {
4859 return ValidateMultitextureUnit(context, texture);
4860 }
4861
Jamie Madillef300b12016-10-07 15:12:09 -04004862 if (texture < GL_TEXTURE0 ||
4863 texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
4864 {
Jamie Madille0472f32018-11-27 16:32:45 -05004865 context->validationError(GL_INVALID_ENUM, kInvalidCombinedImageUnit);
Jamie Madillef300b12016-10-07 15:12:09 -04004866 return false;
4867 }
4868
4869 return true;
4870}
4871
Jamie Madill5b772312018-03-08 20:28:32 -05004872bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillef300b12016-10-07 15:12:09 -04004873{
4874 Program *programObject = GetValidProgram(context, program);
4875 if (!programObject)
4876 {
4877 return false;
4878 }
4879
4880 Shader *shaderObject = GetValidShader(context, shader);
4881 if (!shaderObject)
4882 {
4883 return false;
4884 }
4885
Jiawei Shao385b3e02018-03-21 09:43:28 +08004886 if (programObject->getAttachedShader(shaderObject->getType()))
Jamie Madillef300b12016-10-07 15:12:09 -04004887 {
Jamie Madille0472f32018-11-27 16:32:45 -05004888 context->validationError(GL_INVALID_OPERATION, kShaderAttachmentHasShader);
Jiawei Shao385b3e02018-03-21 09:43:28 +08004889 return false;
Jamie Madillef300b12016-10-07 15:12:09 -04004890 }
4891
4892 return true;
4893}
4894
Jamie Madill5b772312018-03-08 20:28:32 -05004895bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004896{
4897 if (index >= MAX_VERTEX_ATTRIBS)
4898 {
Jamie Madille0472f32018-11-27 16:32:45 -05004899 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004900 return false;
4901 }
4902
4903 if (strncmp(name, "gl_", 3) == 0)
4904 {
Jamie Madille0472f32018-11-27 16:32:45 -05004905 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004906 return false;
4907 }
4908
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004909 if (context->isWebGL())
Geoff Langfc32e8b2017-05-31 14:16:59 -04004910 {
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004911 const size_t length = strlen(name);
4912
4913 if (!IsValidESSLString(name, length))
4914 {
4915 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
4916 // for shader-related entry points
Jamie Madille0472f32018-11-27 16:32:45 -05004917 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004918 return false;
4919 }
4920
4921 if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
4922 {
4923 return false;
4924 }
Geoff Langfc32e8b2017-05-31 14:16:59 -04004925 }
4926
Jamie Madill01a80ee2016-11-07 12:06:18 -05004927 return GetValidProgram(context, program) != nullptr;
4928}
4929
Jamie Madill5b772312018-03-08 20:28:32 -05004930bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004931{
Geoff Lange8afa902017-09-27 15:00:43 -04004932 if (!ValidFramebufferTarget(context, target))
Jamie Madill01a80ee2016-11-07 12:06:18 -05004933 {
Jamie Madille0472f32018-11-27 16:32:45 -05004934 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004935 return false;
4936 }
4937
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004938 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004939 !context->isFramebufferGenerated(framebuffer))
4940 {
Jamie Madille0472f32018-11-27 16:32:45 -05004941 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004942 return false;
4943 }
4944
4945 return true;
4946}
4947
Jamie Madill5b772312018-03-08 20:28:32 -05004948bool ValidateBindRenderbuffer(Context *context, GLenum target, GLuint renderbuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004949{
4950 if (target != GL_RENDERBUFFER)
4951 {
Jamie Madille0472f32018-11-27 16:32:45 -05004952 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004953 return false;
4954 }
4955
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004956 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004957 !context->isRenderbufferGenerated(renderbuffer))
4958 {
Jamie Madille0472f32018-11-27 16:32:45 -05004959 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004960 return false;
4961 }
4962
4963 return true;
4964}
4965
Jamie Madill5b772312018-03-08 20:28:32 -05004966static bool ValidBlendEquationMode(const Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004967{
4968 switch (mode)
4969 {
4970 case GL_FUNC_ADD:
4971 case GL_FUNC_SUBTRACT:
4972 case GL_FUNC_REVERSE_SUBTRACT:
Geoff Lang50cac572017-09-26 17:37:43 -04004973 return true;
4974
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004975 case GL_MIN:
4976 case GL_MAX:
Geoff Lang50cac572017-09-26 17:37:43 -04004977 return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004978
4979 default:
4980 return false;
4981 }
4982}
4983
Jamie Madill5b772312018-03-08 20:28:32 -05004984bool ValidateBlendColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004985{
4986 return true;
4987}
4988
Jamie Madill5b772312018-03-08 20:28:32 -05004989bool ValidateBlendEquation(Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004990{
Geoff Lang50cac572017-09-26 17:37:43 -04004991 if (!ValidBlendEquationMode(context, mode))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004992 {
Jamie Madille0472f32018-11-27 16:32:45 -05004993 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004994 return false;
4995 }
4996
4997 return true;
4998}
4999
Jamie Madill5b772312018-03-08 20:28:32 -05005000bool ValidateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005001{
Geoff Lang50cac572017-09-26 17:37:43 -04005002 if (!ValidBlendEquationMode(context, modeRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005003 {
Jamie Madille0472f32018-11-27 16:32:45 -05005004 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005005 return false;
5006 }
5007
Geoff Lang50cac572017-09-26 17:37:43 -04005008 if (!ValidBlendEquationMode(context, modeAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005009 {
Jamie Madille0472f32018-11-27 16:32:45 -05005010 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005011 return false;
5012 }
5013
5014 return true;
5015}
5016
Jamie Madill5b772312018-03-08 20:28:32 -05005017bool ValidateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005018{
5019 return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
5020}
5021
Jamie Madill5b772312018-03-08 20:28:32 -05005022bool ValidateBlendFuncSeparate(Context *context,
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005023 GLenum srcRGB,
5024 GLenum dstRGB,
5025 GLenum srcAlpha,
5026 GLenum dstAlpha)
5027{
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03005028 if (!ValidSrcBlendFunc(context, srcRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005029 {
Jamie Madille0472f32018-11-27 16:32:45 -05005030 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005031 return false;
5032 }
5033
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03005034 if (!ValidDstBlendFunc(context, dstRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005035 {
Jamie Madille0472f32018-11-27 16:32:45 -05005036 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005037 return false;
5038 }
5039
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03005040 if (!ValidSrcBlendFunc(context, srcAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005041 {
Jamie Madille0472f32018-11-27 16:32:45 -05005042 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005043 return false;
5044 }
5045
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03005046 if (!ValidDstBlendFunc(context, dstAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005047 {
Jamie Madille0472f32018-11-27 16:32:45 -05005048 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005049 return false;
5050 }
5051
Frank Henigman146e8a12017-03-02 23:22:37 -05005052 if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
5053 context->getExtensions().webglCompatibility)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005054 {
5055 bool constantColorUsed =
5056 (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
5057 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
5058
5059 bool constantAlphaUsed =
5060 (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
5061 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
5062
5063 if (constantColorUsed && constantAlphaUsed)
5064 {
Frank Henigman146e8a12017-03-02 23:22:37 -05005065 if (context->getExtensions().webglCompatibility)
5066 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005067 context->validationError(GL_INVALID_OPERATION, kInvalidConstantColor);
5068 return false;
Frank Henigman146e8a12017-03-02 23:22:37 -05005069 }
Jamie Madillc3e37312018-11-30 15:25:39 -05005070
5071 WARN() << kConstantColorAlphaLimitation;
5072 context->validationError(GL_INVALID_OPERATION, kConstantColorAlphaLimitation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05005073 return false;
5074 }
5075 }
5076
5077 return true;
5078}
5079
Geoff Langc339c4e2016-11-29 10:37:36 -05005080bool ValidateGetString(Context *context, GLenum name)
5081{
5082 switch (name)
5083 {
5084 case GL_VENDOR:
5085 case GL_RENDERER:
5086 case GL_VERSION:
5087 case GL_SHADING_LANGUAGE_VERSION:
5088 case GL_EXTENSIONS:
5089 break;
5090
5091 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
5092 if (!context->getExtensions().requestExtension)
5093 {
Jamie Madille0472f32018-11-27 16:32:45 -05005094 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05005095 return false;
5096 }
5097 break;
5098
5099 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005100 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05005101 return false;
5102 }
5103
5104 return true;
5105}
5106
Jamie Madill5b772312018-03-08 20:28:32 -05005107bool ValidateLineWidth(Context *context, GLfloat width)
Geoff Lang47c48082016-12-07 15:38:13 -05005108{
5109 if (width <= 0.0f || isNaN(width))
5110 {
Jamie Madille0472f32018-11-27 16:32:45 -05005111 context->validationError(GL_INVALID_VALUE, kInvalidWidth);
Geoff Lang47c48082016-12-07 15:38:13 -05005112 return false;
5113 }
5114
5115 return true;
5116}
5117
Jamie Madill5b772312018-03-08 20:28:32 -05005118bool ValidateDepthRangef(Context *context, GLfloat zNear, GLfloat zFar)
Frank Henigman6137ddc2017-02-10 18:55:07 -05005119{
5120 if (context->getExtensions().webglCompatibility && zNear > zFar)
5121 {
Jamie Madille0472f32018-11-27 16:32:45 -05005122 context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
Frank Henigman6137ddc2017-02-10 18:55:07 -05005123 return false;
5124 }
5125
5126 return true;
5127}
5128
Jamie Madill5b772312018-03-08 20:28:32 -05005129bool ValidateRenderbufferStorage(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05005130 GLenum target,
5131 GLenum internalformat,
5132 GLsizei width,
5133 GLsizei height)
5134{
5135 return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
5136 height);
5137}
5138
Jamie Madill5b772312018-03-08 20:28:32 -05005139bool ValidateRenderbufferStorageMultisampleANGLE(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05005140 GLenum target,
5141 GLsizei samples,
5142 GLenum internalformat,
5143 GLsizei width,
5144 GLsizei height)
5145{
5146 if (!context->getExtensions().framebufferMultisample)
5147 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005148 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madille8fb6402017-02-14 17:56:40 -05005149 return false;
5150 }
5151
5152 // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
Jamie Madill610640f2018-11-21 17:28:41 -05005153 // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_VALUE is
Jamie Madille8fb6402017-02-14 17:56:40 -05005154 // generated.
5155 if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
5156 {
Jamie Madille0472f32018-11-27 16:32:45 -05005157 context->validationError(GL_INVALID_VALUE, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05005158 return false;
5159 }
5160
5161 // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
5162 // the specified storage. This is different than ES 3.0 in which a sample number higher
5163 // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
5164 // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
5165 if (context->getClientMajorVersion() >= 3)
5166 {
5167 const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
5168 if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
5169 {
Jamie Madille0472f32018-11-27 16:32:45 -05005170 context->validationError(GL_OUT_OF_MEMORY, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05005171 return false;
5172 }
5173 }
5174
5175 return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
5176 width, height);
5177}
5178
Jamie Madill5b772312018-03-08 20:28:32 -05005179bool ValidateCheckFramebufferStatus(Context *context, GLenum target)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005180{
Geoff Lange8afa902017-09-27 15:00:43 -04005181 if (!ValidFramebufferTarget(context, target))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005182 {
Jamie Madille0472f32018-11-27 16:32:45 -05005183 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005184 return false;
5185 }
5186
5187 return true;
5188}
5189
Jamie Madill5b772312018-03-08 20:28:32 -05005190bool ValidateClearColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005191{
5192 return true;
5193}
5194
Jamie Madill5b772312018-03-08 20:28:32 -05005195bool ValidateClearDepthf(Context *context, GLfloat depth)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005196{
5197 return true;
5198}
5199
Jamie Madill5b772312018-03-08 20:28:32 -05005200bool ValidateClearStencil(Context *context, GLint s)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005201{
5202 return true;
5203}
5204
Jamie Madill5b772312018-03-08 20:28:32 -05005205bool ValidateColorMask(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005206 GLboolean red,
5207 GLboolean green,
5208 GLboolean blue,
5209 GLboolean alpha)
5210{
5211 return true;
5212}
5213
Jamie Madill5b772312018-03-08 20:28:32 -05005214bool ValidateCompileShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005215{
5216 return true;
5217}
5218
Jamie Madill5b772312018-03-08 20:28:32 -05005219bool ValidateCreateProgram(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005220{
5221 return true;
5222}
5223
Jamie Madill5b772312018-03-08 20:28:32 -05005224bool ValidateCullFace(Context *context, CullFaceMode mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005225{
5226 switch (mode)
5227 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04005228 case CullFaceMode::Front:
5229 case CullFaceMode::Back:
5230 case CullFaceMode::FrontAndBack:
Jamie Madillc1d770e2017-04-13 17:31:24 -04005231 break;
5232
5233 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005234 context->validationError(GL_INVALID_ENUM, kInvalidCullMode);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005235 return false;
5236 }
5237
5238 return true;
5239}
5240
Jamie Madill5b772312018-03-08 20:28:32 -05005241bool ValidateDeleteProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005242{
5243 if (program == 0)
5244 {
5245 return false;
5246 }
5247
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005248 if (!context->getProgramResolveLink(program))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005249 {
5250 if (context->getShader(program))
5251 {
Jamie Madille0472f32018-11-27 16:32:45 -05005252 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005253 return false;
5254 }
5255 else
5256 {
Jamie Madille0472f32018-11-27 16:32:45 -05005257 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005258 return false;
5259 }
5260 }
5261
5262 return true;
5263}
5264
Jamie Madill5b772312018-03-08 20:28:32 -05005265bool ValidateDeleteShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005266{
5267 if (shader == 0)
5268 {
5269 return false;
5270 }
5271
5272 if (!context->getShader(shader))
5273 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005274 if (context->getProgramResolveLink(shader))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005275 {
Jamie Madille0472f32018-11-27 16:32:45 -05005276 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005277 return false;
5278 }
5279 else
5280 {
Jamie Madille0472f32018-11-27 16:32:45 -05005281 context->validationError(GL_INVALID_VALUE, kExpectedShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005282 return false;
5283 }
5284 }
5285
5286 return true;
5287}
5288
Jamie Madill5b772312018-03-08 20:28:32 -05005289bool ValidateDepthFunc(Context *context, GLenum func)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005290{
5291 switch (func)
5292 {
5293 case GL_NEVER:
5294 case GL_ALWAYS:
5295 case GL_LESS:
5296 case GL_LEQUAL:
5297 case GL_EQUAL:
5298 case GL_GREATER:
5299 case GL_GEQUAL:
5300 case GL_NOTEQUAL:
5301 break;
5302
5303 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005304 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005305 return false;
5306 }
5307
5308 return true;
5309}
5310
Jamie Madill5b772312018-03-08 20:28:32 -05005311bool ValidateDepthMask(Context *context, GLboolean flag)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005312{
5313 return true;
5314}
5315
Jamie Madill5b772312018-03-08 20:28:32 -05005316bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005317{
5318 Program *programObject = GetValidProgram(context, program);
5319 if (!programObject)
5320 {
5321 return false;
5322 }
5323
5324 Shader *shaderObject = GetValidShader(context, shader);
5325 if (!shaderObject)
5326 {
5327 return false;
5328 }
5329
Jiawei Shao385b3e02018-03-21 09:43:28 +08005330 const Shader *attachedShader = programObject->getAttachedShader(shaderObject->getType());
Jamie Madillc1d770e2017-04-13 17:31:24 -04005331 if (attachedShader != shaderObject)
5332 {
Jamie Madille0472f32018-11-27 16:32:45 -05005333 context->validationError(GL_INVALID_OPERATION, kShaderToDetachMustBeAttached);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005334 return false;
5335 }
5336
5337 return true;
5338}
5339
Jamie Madill5b772312018-03-08 20:28:32 -05005340bool ValidateDisableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005341{
5342 if (index >= MAX_VERTEX_ATTRIBS)
5343 {
Jamie Madille0472f32018-11-27 16:32:45 -05005344 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005345 return false;
5346 }
5347
5348 return true;
5349}
5350
Jamie Madill5b772312018-03-08 20:28:32 -05005351bool ValidateEnableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005352{
5353 if (index >= MAX_VERTEX_ATTRIBS)
5354 {
Jamie Madille0472f32018-11-27 16:32:45 -05005355 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005356 return false;
5357 }
5358
5359 return true;
5360}
5361
Jamie Madill5b772312018-03-08 20:28:32 -05005362bool ValidateFinish(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005363{
5364 return true;
5365}
5366
Jamie Madill5b772312018-03-08 20:28:32 -05005367bool ValidateFlush(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005368{
5369 return true;
5370}
5371
Jamie Madill5b772312018-03-08 20:28:32 -05005372bool ValidateFrontFace(Context *context, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005373{
5374 switch (mode)
5375 {
5376 case GL_CW:
5377 case GL_CCW:
5378 break;
5379 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005380 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005381 return false;
5382 }
5383
5384 return true;
5385}
5386
Jamie Madill5b772312018-03-08 20:28:32 -05005387bool ValidateGetActiveAttrib(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005388 GLuint program,
5389 GLuint index,
5390 GLsizei bufsize,
5391 GLsizei *length,
5392 GLint *size,
5393 GLenum *type,
5394 GLchar *name)
5395{
5396 if (bufsize < 0)
5397 {
Jamie Madille0472f32018-11-27 16:32:45 -05005398 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005399 return false;
5400 }
5401
5402 Program *programObject = GetValidProgram(context, program);
5403
5404 if (!programObject)
5405 {
5406 return false;
5407 }
5408
5409 if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
5410 {
Jamie Madille0472f32018-11-27 16:32:45 -05005411 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005412 return false;
5413 }
5414
5415 return true;
5416}
5417
Jamie Madill5b772312018-03-08 20:28:32 -05005418bool ValidateGetActiveUniform(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005419 GLuint program,
5420 GLuint index,
5421 GLsizei bufsize,
5422 GLsizei *length,
5423 GLint *size,
5424 GLenum *type,
5425 GLchar *name)
5426{
5427 if (bufsize < 0)
5428 {
Jamie Madille0472f32018-11-27 16:32:45 -05005429 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005430 return false;
5431 }
5432
5433 Program *programObject = GetValidProgram(context, program);
5434
5435 if (!programObject)
5436 {
5437 return false;
5438 }
5439
5440 if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
5441 {
Jamie Madille0472f32018-11-27 16:32:45 -05005442 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005443 return false;
5444 }
5445
5446 return true;
5447}
5448
Jamie Madill5b772312018-03-08 20:28:32 -05005449bool ValidateGetAttachedShaders(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005450 GLuint program,
5451 GLsizei maxcount,
5452 GLsizei *count,
5453 GLuint *shaders)
5454{
5455 if (maxcount < 0)
5456 {
Jamie Madille0472f32018-11-27 16:32:45 -05005457 context->validationError(GL_INVALID_VALUE, kNegativeMaxCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005458 return false;
5459 }
5460
5461 Program *programObject = GetValidProgram(context, program);
5462
5463 if (!programObject)
5464 {
5465 return false;
5466 }
5467
5468 return true;
5469}
5470
Jamie Madill5b772312018-03-08 20:28:32 -05005471bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005472{
Geoff Langfc32e8b2017-05-31 14:16:59 -04005473 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5474 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005475 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005476 {
Jamie Madille0472f32018-11-27 16:32:45 -05005477 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005478 return false;
5479 }
5480
Jamie Madillc1d770e2017-04-13 17:31:24 -04005481 Program *programObject = GetValidProgram(context, program);
5482
5483 if (!programObject)
5484 {
Jamie Madille0472f32018-11-27 16:32:45 -05005485 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005486 return false;
5487 }
5488
5489 if (!programObject->isLinked())
5490 {
Jamie Madille0472f32018-11-27 16:32:45 -05005491 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005492 return false;
5493 }
5494
5495 return true;
5496}
5497
Jamie Madill5b772312018-03-08 20:28:32 -05005498bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005499{
5500 GLenum nativeType;
5501 unsigned int numParams = 0;
5502 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5503}
5504
Jamie Madill5b772312018-03-08 20:28:32 -05005505bool ValidateGetError(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005506{
5507 return true;
5508}
5509
Jamie Madill5b772312018-03-08 20:28:32 -05005510bool ValidateGetFloatv(Context *context, GLenum pname, GLfloat *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005511{
5512 GLenum nativeType;
5513 unsigned int numParams = 0;
5514 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5515}
5516
Jamie Madill5b772312018-03-08 20:28:32 -05005517bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005518{
5519 GLenum nativeType;
5520 unsigned int numParams = 0;
5521 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5522}
5523
Jamie Madill5b772312018-03-08 20:28:32 -05005524bool ValidateGetProgramInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005525 GLuint program,
5526 GLsizei bufsize,
5527 GLsizei *length,
5528 GLchar *infolog)
5529{
5530 if (bufsize < 0)
5531 {
Jamie Madille0472f32018-11-27 16:32:45 -05005532 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005533 return false;
5534 }
5535
5536 Program *programObject = GetValidProgram(context, program);
5537 if (!programObject)
5538 {
5539 return false;
5540 }
5541
5542 return true;
5543}
5544
Jamie Madill5b772312018-03-08 20:28:32 -05005545bool ValidateGetShaderInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005546 GLuint shader,
5547 GLsizei bufsize,
5548 GLsizei *length,
5549 GLchar *infolog)
5550{
5551 if (bufsize < 0)
5552 {
Jamie Madille0472f32018-11-27 16:32:45 -05005553 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005554 return false;
5555 }
5556
5557 Shader *shaderObject = GetValidShader(context, shader);
5558 if (!shaderObject)
5559 {
5560 return false;
5561 }
5562
5563 return true;
5564}
5565
Jamie Madill5b772312018-03-08 20:28:32 -05005566bool ValidateGetShaderPrecisionFormat(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005567 GLenum shadertype,
5568 GLenum precisiontype,
5569 GLint *range,
5570 GLint *precision)
5571{
5572 switch (shadertype)
5573 {
5574 case GL_VERTEX_SHADER:
5575 case GL_FRAGMENT_SHADER:
5576 break;
5577 case GL_COMPUTE_SHADER:
Jamie Madillc3e37312018-11-30 15:25:39 -05005578 context->validationError(GL_INVALID_OPERATION, kUnimplementedComputeShaderPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005579 return false;
5580 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005581 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005582 return false;
5583 }
5584
5585 switch (precisiontype)
5586 {
5587 case GL_LOW_FLOAT:
5588 case GL_MEDIUM_FLOAT:
5589 case GL_HIGH_FLOAT:
5590 case GL_LOW_INT:
5591 case GL_MEDIUM_INT:
5592 case GL_HIGH_INT:
5593 break;
5594
5595 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005596 context->validationError(GL_INVALID_ENUM, kInvalidPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005597 return false;
5598 }
5599
5600 return true;
5601}
5602
Jamie Madill5b772312018-03-08 20:28:32 -05005603bool ValidateGetShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005604 GLuint shader,
5605 GLsizei bufsize,
5606 GLsizei *length,
5607 GLchar *source)
5608{
5609 if (bufsize < 0)
5610 {
Jamie Madille0472f32018-11-27 16:32:45 -05005611 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005612 return false;
5613 }
5614
5615 Shader *shaderObject = GetValidShader(context, shader);
5616 if (!shaderObject)
5617 {
5618 return false;
5619 }
5620
5621 return true;
5622}
5623
Jamie Madill5b772312018-03-08 20:28:32 -05005624bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005625{
5626 if (strstr(name, "gl_") == name)
5627 {
5628 return false;
5629 }
5630
Geoff Langfc32e8b2017-05-31 14:16:59 -04005631 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5632 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005633 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005634 {
Jamie Madille0472f32018-11-27 16:32:45 -05005635 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005636 return false;
5637 }
5638
Jamie Madillc1d770e2017-04-13 17:31:24 -04005639 Program *programObject = GetValidProgram(context, program);
5640
5641 if (!programObject)
5642 {
5643 return false;
5644 }
5645
5646 if (!programObject->isLinked())
5647 {
Jamie Madille0472f32018-11-27 16:32:45 -05005648 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005649 return false;
5650 }
5651
5652 return true;
5653}
5654
Jamie Madill5b772312018-03-08 20:28:32 -05005655bool ValidateHint(Context *context, GLenum target, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005656{
5657 switch (mode)
5658 {
5659 case GL_FASTEST:
5660 case GL_NICEST:
5661 case GL_DONT_CARE:
5662 break;
5663
5664 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005665 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005666 return false;
5667 }
5668
5669 switch (target)
5670 {
5671 case GL_GENERATE_MIPMAP_HINT:
5672 break;
5673
Geoff Lange7bd2182017-06-16 16:13:13 -04005674 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
5675 if (context->getClientVersion() < ES_3_0 &&
5676 !context->getExtensions().standardDerivatives)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005677 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005678 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005679 return false;
5680 }
5681 break;
5682
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005683 case GL_PERSPECTIVE_CORRECTION_HINT:
5684 case GL_POINT_SMOOTH_HINT:
5685 case GL_LINE_SMOOTH_HINT:
5686 case GL_FOG_HINT:
5687 if (context->getClientMajorVersion() >= 2)
5688 {
Jamie Madille0472f32018-11-27 16:32:45 -05005689 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005690 return false;
5691 }
5692 break;
5693
Jamie Madillc1d770e2017-04-13 17:31:24 -04005694 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005695 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005696 return false;
5697 }
5698
5699 return true;
5700}
5701
Jamie Madill5b772312018-03-08 20:28:32 -05005702bool ValidateIsBuffer(Context *context, GLuint buffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005703{
5704 return true;
5705}
5706
Jamie Madill5b772312018-03-08 20:28:32 -05005707bool ValidateIsFramebuffer(Context *context, GLuint framebuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005708{
5709 return true;
5710}
5711
Jamie Madill5b772312018-03-08 20:28:32 -05005712bool ValidateIsProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005713{
5714 return true;
5715}
5716
Jamie Madill5b772312018-03-08 20:28:32 -05005717bool ValidateIsRenderbuffer(Context *context, GLuint renderbuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005718{
5719 return true;
5720}
5721
Jamie Madill5b772312018-03-08 20:28:32 -05005722bool ValidateIsShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005723{
5724 return true;
5725}
5726
Jamie Madill5b772312018-03-08 20:28:32 -05005727bool ValidateIsTexture(Context *context, GLuint texture)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005728{
5729 return true;
5730}
5731
Jamie Madill5b772312018-03-08 20:28:32 -05005732bool ValidatePixelStorei(Context *context, GLenum pname, GLint param)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005733{
5734 if (context->getClientMajorVersion() < 3)
5735 {
5736 switch (pname)
5737 {
5738 case GL_UNPACK_IMAGE_HEIGHT:
5739 case GL_UNPACK_SKIP_IMAGES:
Jamie Madille0472f32018-11-27 16:32:45 -05005740 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005741 return false;
5742
5743 case GL_UNPACK_ROW_LENGTH:
5744 case GL_UNPACK_SKIP_ROWS:
5745 case GL_UNPACK_SKIP_PIXELS:
5746 if (!context->getExtensions().unpackSubimage)
5747 {
Jamie Madille0472f32018-11-27 16:32:45 -05005748 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005749 return false;
5750 }
5751 break;
5752
5753 case GL_PACK_ROW_LENGTH:
5754 case GL_PACK_SKIP_ROWS:
5755 case GL_PACK_SKIP_PIXELS:
5756 if (!context->getExtensions().packSubimage)
5757 {
Jamie Madille0472f32018-11-27 16:32:45 -05005758 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005759 return false;
5760 }
5761 break;
5762 }
5763 }
5764
5765 if (param < 0)
5766 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005767 context->validationError(GL_INVALID_VALUE, kNegativeParam);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005768 return false;
5769 }
5770
5771 switch (pname)
5772 {
5773 case GL_UNPACK_ALIGNMENT:
5774 if (param != 1 && param != 2 && param != 4 && param != 8)
5775 {
Jamie Madille0472f32018-11-27 16:32:45 -05005776 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777 return false;
5778 }
5779 break;
5780
5781 case GL_PACK_ALIGNMENT:
5782 if (param != 1 && param != 2 && param != 4 && param != 8)
5783 {
Jamie Madille0472f32018-11-27 16:32:45 -05005784 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005785 return false;
5786 }
5787 break;
5788
5789 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Geoff Lang000dab82017-09-27 14:27:07 -04005790 if (!context->getExtensions().packReverseRowOrder)
5791 {
Jamie Madille0472f32018-11-27 16:32:45 -05005792 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang000dab82017-09-27 14:27:07 -04005793 }
5794 break;
5795
Jamie Madillc1d770e2017-04-13 17:31:24 -04005796 case GL_UNPACK_ROW_LENGTH:
5797 case GL_UNPACK_IMAGE_HEIGHT:
5798 case GL_UNPACK_SKIP_IMAGES:
5799 case GL_UNPACK_SKIP_ROWS:
5800 case GL_UNPACK_SKIP_PIXELS:
5801 case GL_PACK_ROW_LENGTH:
5802 case GL_PACK_SKIP_ROWS:
5803 case GL_PACK_SKIP_PIXELS:
5804 break;
5805
5806 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005807 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808 return false;
5809 }
5810
5811 return true;
5812}
5813
Jamie Madill5b772312018-03-08 20:28:32 -05005814bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005815{
5816 return true;
5817}
5818
Jamie Madill5b772312018-03-08 20:28:32 -05005819bool ValidateReleaseShaderCompiler(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005820{
5821 return true;
5822}
5823
Jamie Madill5b772312018-03-08 20:28:32 -05005824bool ValidateSampleCoverage(Context *context, GLfloat value, GLboolean invert)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005825{
5826 return true;
5827}
5828
Jamie Madill5b772312018-03-08 20:28:32 -05005829bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005830{
5831 if (width < 0 || height < 0)
5832 {
Jamie Madille0472f32018-11-27 16:32:45 -05005833 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005834 return false;
5835 }
5836
5837 return true;
5838}
5839
Jamie Madill5b772312018-03-08 20:28:32 -05005840bool ValidateShaderBinary(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841 GLsizei n,
5842 const GLuint *shaders,
5843 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005844 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005845 GLsizei length)
5846{
5847 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
5848 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
5849 shaderBinaryFormats.end())
5850 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005851 context->validationError(GL_INVALID_ENUM, kInvalidShaderBinaryFormat);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005852 return false;
5853 }
5854
5855 return true;
5856}
5857
Jamie Madill5b772312018-03-08 20:28:32 -05005858bool ValidateShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005859 GLuint shader,
5860 GLsizei count,
5861 const GLchar *const *string,
5862 const GLint *length)
5863{
5864 if (count < 0)
5865 {
Jamie Madille0472f32018-11-27 16:32:45 -05005866 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005867 return false;
5868 }
5869
Geoff Langfc32e8b2017-05-31 14:16:59 -04005870 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5871 // shader-related entry points
5872 if (context->getExtensions().webglCompatibility)
5873 {
5874 for (GLsizei i = 0; i < count; i++)
5875 {
Geoff Langcab92ee2017-07-19 17:32:07 -04005876 size_t len =
5877 (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
Geoff Langa71a98e2017-06-19 15:15:00 -04005878
5879 // Backslash as line-continuation is allowed in WebGL 2.0.
Geoff Langcab92ee2017-07-19 17:32:07 -04005880 if (!IsValidESSLShaderSourceString(string[i], len,
5881 context->getClientVersion() >= ES_3_0))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005882 {
Jamie Madille0472f32018-11-27 16:32:45 -05005883 context->validationError(GL_INVALID_VALUE, kShaderSourceInvalidCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005884 return false;
5885 }
5886 }
5887 }
5888
Jamie Madillc1d770e2017-04-13 17:31:24 -04005889 Shader *shaderObject = GetValidShader(context, shader);
5890 if (!shaderObject)
5891 {
5892 return false;
5893 }
5894
5895 return true;
5896}
5897
Jamie Madill5b772312018-03-08 20:28:32 -05005898bool ValidateStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005899{
5900 if (!IsValidStencilFunc(func))
5901 {
Jamie Madille0472f32018-11-27 16:32:45 -05005902 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005903 return false;
5904 }
5905
5906 return true;
5907}
5908
Jamie Madill5b772312018-03-08 20:28:32 -05005909bool ValidateStencilFuncSeparate(Context *context, GLenum face, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910{
5911 if (!IsValidStencilFace(face))
5912 {
Jamie Madille0472f32018-11-27 16:32:45 -05005913 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005914 return false;
5915 }
5916
5917 if (!IsValidStencilFunc(func))
5918 {
Jamie Madille0472f32018-11-27 16:32:45 -05005919 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005920 return false;
5921 }
5922
5923 return true;
5924}
5925
Jamie Madill5b772312018-03-08 20:28:32 -05005926bool ValidateStencilMask(Context *context, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927{
5928 return true;
5929}
5930
Jamie Madill5b772312018-03-08 20:28:32 -05005931bool ValidateStencilMaskSeparate(Context *context, GLenum face, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005932{
5933 if (!IsValidStencilFace(face))
5934 {
Jamie Madille0472f32018-11-27 16:32:45 -05005935 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005936 return false;
5937 }
5938
5939 return true;
5940}
5941
Jamie Madill5b772312018-03-08 20:28:32 -05005942bool ValidateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005943{
5944 if (!IsValidStencilOp(fail))
5945 {
Jamie Madille0472f32018-11-27 16:32:45 -05005946 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005947 return false;
5948 }
5949
5950 if (!IsValidStencilOp(zfail))
5951 {
Jamie Madille0472f32018-11-27 16:32:45 -05005952 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005953 return false;
5954 }
5955
5956 if (!IsValidStencilOp(zpass))
5957 {
Jamie Madille0472f32018-11-27 16:32:45 -05005958 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005959 return false;
5960 }
5961
5962 return true;
5963}
5964
Jamie Madill5b772312018-03-08 20:28:32 -05005965bool ValidateStencilOpSeparate(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005966 GLenum face,
5967 GLenum fail,
5968 GLenum zfail,
5969 GLenum zpass)
5970{
5971 if (!IsValidStencilFace(face))
5972 {
Jamie Madille0472f32018-11-27 16:32:45 -05005973 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005974 return false;
5975 }
5976
5977 return ValidateStencilOp(context, fail, zfail, zpass);
5978}
5979
Jamie Madill5b772312018-03-08 20:28:32 -05005980bool ValidateUniform1f(Context *context, GLint location, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005981{
5982 return ValidateUniform(context, GL_FLOAT, location, 1);
5983}
5984
Jamie Madill5b772312018-03-08 20:28:32 -05005985bool ValidateUniform1fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005986{
5987 return ValidateUniform(context, GL_FLOAT, location, count);
5988}
5989
Jamie Madill5b772312018-03-08 20:28:32 -05005990bool ValidateUniform1i(Context *context, GLint location, GLint x)
Jamie Madillbe849e42017-05-02 15:49:00 -04005991{
5992 return ValidateUniform1iv(context, location, 1, &x);
5993}
5994
Jamie Madill5b772312018-03-08 20:28:32 -05005995bool ValidateUniform2fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005996{
5997 return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
5998}
5999
Jamie Madill5b772312018-03-08 20:28:32 -05006000bool ValidateUniform2i(Context *context, GLint location, GLint x, GLint y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006001{
6002 return ValidateUniform(context, GL_INT_VEC2, location, 1);
6003}
6004
Jamie Madill5b772312018-03-08 20:28:32 -05006005bool ValidateUniform2iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006006{
6007 return ValidateUniform(context, GL_INT_VEC2, location, count);
6008}
6009
Jamie Madill5b772312018-03-08 20:28:32 -05006010bool ValidateUniform3f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006011{
6012 return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
6013}
6014
Jamie Madill5b772312018-03-08 20:28:32 -05006015bool ValidateUniform3fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006016{
6017 return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
6018}
6019
Jamie Madill5b772312018-03-08 20:28:32 -05006020bool ValidateUniform3i(Context *context, GLint location, GLint x, GLint y, GLint z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006021{
6022 return ValidateUniform(context, GL_INT_VEC3, location, 1);
6023}
6024
Jamie Madill5b772312018-03-08 20:28:32 -05006025bool ValidateUniform3iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006026{
6027 return ValidateUniform(context, GL_INT_VEC3, location, count);
6028}
6029
Jamie Madill5b772312018-03-08 20:28:32 -05006030bool ValidateUniform4f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006031{
6032 return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
6033}
6034
Jamie Madill5b772312018-03-08 20:28:32 -05006035bool ValidateUniform4fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006036{
6037 return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
6038}
6039
Jamie Madill5b772312018-03-08 20:28:32 -05006040bool ValidateUniform4i(Context *context, GLint location, GLint x, GLint y, GLint z, GLint w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006041{
6042 return ValidateUniform(context, GL_INT_VEC4, location, 1);
6043}
6044
Jamie Madill5b772312018-03-08 20:28:32 -05006045bool ValidateUniform4iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006046{
6047 return ValidateUniform(context, GL_INT_VEC4, location, count);
6048}
6049
Jamie Madill5b772312018-03-08 20:28:32 -05006050bool ValidateUniformMatrix2fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006051 GLint location,
6052 GLsizei count,
6053 GLboolean transpose,
6054 const GLfloat *value)
6055{
6056 return ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose);
6057}
6058
Jamie Madill5b772312018-03-08 20:28:32 -05006059bool ValidateUniformMatrix3fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006060 GLint location,
6061 GLsizei count,
6062 GLboolean transpose,
6063 const GLfloat *value)
6064{
6065 return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
6066}
6067
Jamie Madill5b772312018-03-08 20:28:32 -05006068bool ValidateUniformMatrix4fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006069 GLint location,
6070 GLsizei count,
6071 GLboolean transpose,
6072 const GLfloat *value)
6073{
6074 return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
6075}
6076
Jamie Madill5b772312018-03-08 20:28:32 -05006077bool ValidateValidateProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006078{
6079 Program *programObject = GetValidProgram(context, program);
6080
6081 if (!programObject)
6082 {
6083 return false;
6084 }
6085
6086 return true;
6087}
6088
Jamie Madill5b772312018-03-08 20:28:32 -05006089bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006090{
6091 return ValidateVertexAttribIndex(context, index);
6092}
6093
Jamie Madill5b772312018-03-08 20:28:32 -05006094bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006095{
6096 return ValidateVertexAttribIndex(context, index);
6097}
6098
Jamie Madill5b772312018-03-08 20:28:32 -05006099bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006100{
6101 return ValidateVertexAttribIndex(context, index);
6102}
6103
Jamie Madill5b772312018-03-08 20:28:32 -05006104bool ValidateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006105{
6106 return ValidateVertexAttribIndex(context, index);
6107}
6108
Jamie Madill5b772312018-03-08 20:28:32 -05006109bool ValidateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006110{
6111 return ValidateVertexAttribIndex(context, index);
6112}
6113
Jamie Madill5b772312018-03-08 20:28:32 -05006114bool ValidateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006115{
6116 return ValidateVertexAttribIndex(context, index);
6117}
6118
Jamie Madill5b772312018-03-08 20:28:32 -05006119bool ValidateVertexAttrib4f(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04006120 GLuint index,
6121 GLfloat x,
6122 GLfloat y,
6123 GLfloat z,
6124 GLfloat w)
6125{
6126 return ValidateVertexAttribIndex(context, index);
6127}
6128
Jamie Madill5b772312018-03-08 20:28:32 -05006129bool ValidateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006130{
6131 return ValidateVertexAttribIndex(context, index);
6132}
6133
Jamie Madill5b772312018-03-08 20:28:32 -05006134bool ValidateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04006135{
6136 if (width < 0 || height < 0)
6137 {
Jamie Madille0472f32018-11-27 16:32:45 -05006138 context->validationError(GL_INVALID_VALUE, kViewportNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04006139 return false;
6140 }
6141
6142 return true;
6143}
6144
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08006145bool ValidateGetFramebufferAttachmentParameteriv(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006146 GLenum target,
6147 GLenum attachment,
6148 GLenum pname,
6149 GLint *params)
6150{
6151 return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
6152 nullptr);
6153}
6154
Jamie Madill5b772312018-03-08 20:28:32 -05006155bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006156{
6157 return ValidateGetProgramivBase(context, program, pname, nullptr);
6158}
6159
Jamie Madill5b772312018-03-08 20:28:32 -05006160bool ValidateCopyTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006161 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006162 GLint level,
6163 GLenum internalformat,
6164 GLint x,
6165 GLint y,
6166 GLsizei width,
6167 GLsizei height,
6168 GLint border)
6169{
6170 if (context->getClientMajorVersion() < 3)
6171 {
6172 return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
6173 0, x, y, width, height, border);
6174 }
6175
6176 ASSERT(context->getClientMajorVersion() == 3);
6177 return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
6178 0, x, y, width, height, border);
6179}
6180
6181bool ValidateCopyTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006182 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006183 GLint level,
6184 GLint xoffset,
6185 GLint yoffset,
6186 GLint x,
6187 GLint y,
6188 GLsizei width,
6189 GLsizei height)
6190{
6191 if (context->getClientMajorVersion() < 3)
6192 {
6193 return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
6194 yoffset, x, y, width, height, 0);
6195 }
6196
6197 return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
6198 yoffset, 0, x, y, width, height, 0);
6199}
6200
Cody Northrop5faff912019-06-28 14:04:50 -06006201bool ValidateCopyTexSubImage3DOES(Context *context,
6202 TextureTarget target,
6203 GLint level,
6204 GLint xoffset,
6205 GLint yoffset,
6206 GLint zoffset,
6207 GLint x,
6208 GLint y,
6209 GLsizei width,
6210 GLsizei height)
6211{
6212 return ValidateCopyTexSubImage3D(context, target, level, xoffset, yoffset, zoffset, x, y, width,
6213 height);
6214}
6215
Jamie Madillbe849e42017-05-02 15:49:00 -04006216bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
6217{
6218 return ValidateGenOrDelete(context, n);
6219}
6220
6221bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
6222{
6223 return ValidateGenOrDelete(context, n);
6224}
6225
6226bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
6227{
6228 return ValidateGenOrDelete(context, n);
6229}
6230
6231bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
6232{
6233 return ValidateGenOrDelete(context, n);
6234}
6235
6236bool ValidateDisable(Context *context, GLenum cap)
6237{
6238 if (!ValidCap(context, cap, false))
6239 {
Jamie Madille0472f32018-11-27 16:32:45 -05006240 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006241 return false;
6242 }
6243
6244 return true;
6245}
6246
6247bool ValidateEnable(Context *context, GLenum cap)
6248{
6249 if (!ValidCap(context, cap, false))
6250 {
Jamie Madille0472f32018-11-27 16:32:45 -05006251 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006252 return false;
6253 }
6254
6255 if (context->getLimitations().noSampleAlphaToCoverageSupport &&
6256 cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
6257 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006258 context->validationError(GL_INVALID_OPERATION, kNoSampleAlphaToCoveragesLimitation);
Jamie Madillbe849e42017-05-02 15:49:00 -04006259
6260 // We also output an error message to the debugger window if tracing is active, so that
6261 // developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006262 ERR() << kNoSampleAlphaToCoveragesLimitation;
Jamie Madillbe849e42017-05-02 15:49:00 -04006263 return false;
6264 }
6265
6266 return true;
6267}
6268
6269bool ValidateFramebufferRenderbuffer(Context *context,
6270 GLenum target,
6271 GLenum attachment,
6272 GLenum renderbuffertarget,
6273 GLuint renderbuffer)
6274{
Geoff Lange8afa902017-09-27 15:00:43 -04006275 if (!ValidFramebufferTarget(context, target))
Jamie Madillbe849e42017-05-02 15:49:00 -04006276 {
Jamie Madille0472f32018-11-27 16:32:45 -05006277 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Brandon Jones6cad5662017-06-14 13:25:13 -07006278 return false;
6279 }
6280
6281 if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
6282 {
Jamie Madille0472f32018-11-27 16:32:45 -05006283 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006284 return false;
6285 }
6286
6287 return ValidateFramebufferRenderbufferParameters(context, target, attachment,
6288 renderbuffertarget, renderbuffer);
6289}
6290
6291bool ValidateFramebufferTexture2D(Context *context,
6292 GLenum target,
6293 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006294 TextureTarget textarget,
Jamie Madillbe849e42017-05-02 15:49:00 -04006295 GLuint texture,
6296 GLint level)
6297{
6298 // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
6299 // extension
6300 if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
6301 level != 0)
6302 {
Jamie Madille0472f32018-11-27 16:32:45 -05006303 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006304 return false;
6305 }
6306
6307 if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
6308 {
6309 return false;
6310 }
6311
6312 if (texture != 0)
6313 {
6314 gl::Texture *tex = context->getTexture(texture);
6315 ASSERT(tex);
6316
6317 const gl::Caps &caps = context->getCaps();
6318
6319 switch (textarget)
6320 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006321 case TextureTarget::_2D:
Jamie Madillbe849e42017-05-02 15:49:00 -04006322 {
6323 if (level > gl::log2(caps.max2DTextureSize))
6324 {
Jamie Madille0472f32018-11-27 16:32:45 -05006325 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006326 return false;
6327 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006328 if (tex->getType() != TextureType::_2D)
Jamie Madillbe849e42017-05-02 15:49:00 -04006329 {
Jamie Madille0472f32018-11-27 16:32:45 -05006330 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006331 return false;
6332 }
6333 }
6334 break;
6335
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006336 case TextureTarget::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006337 {
6338 if (level != 0)
6339 {
Jamie Madille0472f32018-11-27 16:32:45 -05006340 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006341 return false;
6342 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006343 if (tex->getType() != TextureType::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006344 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006345 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006346 return false;
6347 }
6348 }
6349 break;
6350
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006351 case TextureTarget::CubeMapNegativeX:
6352 case TextureTarget::CubeMapNegativeY:
6353 case TextureTarget::CubeMapNegativeZ:
6354 case TextureTarget::CubeMapPositiveX:
6355 case TextureTarget::CubeMapPositiveY:
6356 case TextureTarget::CubeMapPositiveZ:
Jamie Madillbe849e42017-05-02 15:49:00 -04006357 {
6358 if (level > gl::log2(caps.maxCubeMapTextureSize))
6359 {
Jamie Madille0472f32018-11-27 16:32:45 -05006360 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006361 return false;
6362 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006363 if (tex->getType() != TextureType::CubeMap)
Jamie Madillbe849e42017-05-02 15:49:00 -04006364 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006365 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006366 return false;
6367 }
6368 }
6369 break;
6370
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006371 case TextureTarget::_2DMultisample:
Jamie Madillbe849e42017-05-02 15:49:00 -04006372 {
Yizhou Jiang7818a852018-09-06 15:02:04 +08006373 if (context->getClientVersion() < ES_3_1 &&
6374 !context->getExtensions().textureMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006375 {
Jamie Madill610640f2018-11-21 17:28:41 -05006376 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05006377 kMultisampleTextureExtensionOrES31Required);
Jamie Madillbe849e42017-05-02 15:49:00 -04006378 return false;
6379 }
6380
6381 if (level != 0)
6382 {
Jamie Madille0472f32018-11-27 16:32:45 -05006383 context->validationError(GL_INVALID_VALUE, kLevelNotZero);
Jamie Madillbe849e42017-05-02 15:49:00 -04006384 return false;
6385 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006386 if (tex->getType() != TextureType::_2DMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006387 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006388 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006389 return false;
6390 }
6391 }
6392 break;
6393
6394 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006395 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006396 return false;
6397 }
Jamie Madillbe849e42017-05-02 15:49:00 -04006398 }
6399
6400 return true;
6401}
6402
Cody Northrop5faff912019-06-28 14:04:50 -06006403bool ValidateFramebufferTexture3DOES(Context *context,
6404 GLenum target,
6405 GLenum attachment,
6406 TextureTarget textargetPacked,
6407 GLuint texture,
6408 GLint level,
6409 GLint zoffset)
6410{
6411 UNIMPLEMENTED();
6412 return false;
6413}
6414
Jamie Madillbe849e42017-05-02 15:49:00 -04006415bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
6416{
6417 return ValidateGenOrDelete(context, n);
6418}
6419
6420bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
6421{
6422 return ValidateGenOrDelete(context, n);
6423}
6424
6425bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
6426{
6427 return ValidateGenOrDelete(context, n);
6428}
6429
6430bool ValidateGenTextures(Context *context, GLint n, GLuint *)
6431{
6432 return ValidateGenOrDelete(context, n);
6433}
6434
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006435bool ValidateGenerateMipmap(Context *context, TextureType target)
Jamie Madillbe849e42017-05-02 15:49:00 -04006436{
6437 if (!ValidTextureTarget(context, target))
6438 {
Jamie Madille0472f32018-11-27 16:32:45 -05006439 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006440 return false;
6441 }
6442
Jamie Madillcfc73cc2019-04-08 16:26:51 -04006443 Texture *texture = context->getTextureByType(target);
Jamie Madillbe849e42017-05-02 15:49:00 -04006444
6445 if (texture == nullptr)
6446 {
Jamie Madille0472f32018-11-27 16:32:45 -05006447 context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
Jamie Madillbe849e42017-05-02 15:49:00 -04006448 return false;
6449 }
6450
6451 const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
6452
6453 // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
6454 // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
6455 if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6456 {
Jamie Madille0472f32018-11-27 16:32:45 -05006457 context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
Jamie Madillbe849e42017-05-02 15:49:00 -04006458 return false;
6459 }
6460
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006461 TextureTarget baseTarget = (target == TextureType::CubeMap)
6462 ? TextureTarget::CubeMapPositiveX
6463 : NonCubeTextureTypeToTarget(target);
Geoff Lang536eca12017-09-13 11:23:35 -04006464 const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
6465 if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
6466 format.stencilBits > 0)
Brandon Jones6cad5662017-06-14 13:25:13 -07006467 {
Jamie Madille0472f32018-11-27 16:32:45 -05006468 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Brandon Jones6cad5662017-06-14 13:25:13 -07006469 return false;
6470 }
6471
Geoff Lang536eca12017-09-13 11:23:35 -04006472 // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
6473 bool formatUnsized = !format.sized;
6474 bool formatColorRenderableAndFilterable =
6475 format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
Yuly Novikovf15f8862018-06-04 18:59:41 -04006476 format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
Geoff Lang536eca12017-09-13 11:23:35 -04006477 if (!formatUnsized && !formatColorRenderableAndFilterable)
Jamie Madillbe849e42017-05-02 15:49:00 -04006478 {
Jamie Madille0472f32018-11-27 16:32:45 -05006479 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006480 return false;
6481 }
6482
Geoff Lang536eca12017-09-13 11:23:35 -04006483 // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
6484 // generation
6485 if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
6486 {
Jamie Madille0472f32018-11-27 16:32:45 -05006487 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Geoff Lang536eca12017-09-13 11:23:35 -04006488 return false;
6489 }
6490
Jiange2c00842018-07-13 16:50:49 +08006491 // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
6492 // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
6493 if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
Jamie Madillbe849e42017-05-02 15:49:00 -04006494 {
Jamie Madille0472f32018-11-27 16:32:45 -05006495 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006496 return false;
6497 }
6498
6499 // Non-power of 2 ES2 check
6500 if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
6501 (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
6502 !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
6503 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006504 ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
6505 target == TextureType::CubeMap);
Jamie Madille0472f32018-11-27 16:32:45 -05006506 context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
Jamie Madillbe849e42017-05-02 15:49:00 -04006507 return false;
6508 }
6509
6510 // Cube completeness check
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006511 if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
Jamie Madillbe849e42017-05-02 15:49:00 -04006512 {
Jamie Madille0472f32018-11-27 16:32:45 -05006513 context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
Jamie Madillbe849e42017-05-02 15:49:00 -04006514 return false;
6515 }
6516
James Darpinian83b2f0e2018-11-27 15:56:01 -08006517 if (context->getExtensions().webglCompatibility &&
6518 (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
6519 texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
6520 {
6521 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
6522 return false;
6523 }
6524
Jamie Madillbe849e42017-05-02 15:49:00 -04006525 return true;
6526}
6527
Jamie Madill5b772312018-03-08 20:28:32 -05006528bool ValidateGetBufferParameteriv(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04006529 BufferBinding target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006530 GLenum pname,
6531 GLint *params)
6532{
6533 return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
6534}
6535
6536bool ValidateGetRenderbufferParameteriv(Context *context,
6537 GLenum target,
6538 GLenum pname,
6539 GLint *params)
6540{
6541 return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
6542}
6543
6544bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
6545{
6546 return ValidateGetShaderivBase(context, shader, pname, nullptr);
6547}
6548
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006549bool ValidateGetTexParameterfv(Context *context, TextureType target, GLenum pname, GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006550{
6551 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6552}
6553
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006554bool ValidateGetTexParameteriv(Context *context, TextureType target, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006555{
6556 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6557}
6558
Till Rathmannb8543632018-10-02 19:46:14 +02006559bool ValidateGetTexParameterIivOES(Context *context,
6560 TextureType target,
6561 GLenum pname,
6562 GLint *params)
6563{
6564 if (context->getClientMajorVersion() < 3)
6565 {
Jamie Madille0472f32018-11-27 16:32:45 -05006566 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006567 return false;
6568 }
6569 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6570}
6571
6572bool ValidateGetTexParameterIuivOES(Context *context,
6573 TextureType target,
6574 GLenum pname,
6575 GLuint *params)
6576{
6577 if (context->getClientMajorVersion() < 3)
6578 {
Jamie Madille0472f32018-11-27 16:32:45 -05006579 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006580 return false;
6581 }
6582 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6583}
6584
Jamie Madillbe849e42017-05-02 15:49:00 -04006585bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
6586{
6587 return ValidateGetUniformBase(context, program, location);
6588}
6589
6590bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
6591{
6592 return ValidateGetUniformBase(context, program, location);
6593}
6594
6595bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
6596{
6597 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6598}
6599
6600bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
6601{
6602 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6603}
6604
6605bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
6606{
6607 return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
6608}
6609
6610bool ValidateIsEnabled(Context *context, GLenum cap)
6611{
6612 if (!ValidCap(context, cap, true))
6613 {
Jamie Madille0472f32018-11-27 16:32:45 -05006614 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006615 return false;
6616 }
6617
6618 return true;
6619}
6620
6621bool ValidateLinkProgram(Context *context, GLuint program)
6622{
6623 if (context->hasActiveTransformFeedback(program))
6624 {
6625 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006626 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackActiveDuringLink);
Jamie Madillbe849e42017-05-02 15:49:00 -04006627 return false;
6628 }
6629
6630 Program *programObject = GetValidProgram(context, program);
6631 if (!programObject)
6632 {
6633 return false;
6634 }
6635
6636 return true;
6637}
6638
Jamie Madill4928b7c2017-06-20 12:57:39 -04006639bool ValidateReadPixels(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006640 GLint x,
6641 GLint y,
6642 GLsizei width,
6643 GLsizei height,
6644 GLenum format,
6645 GLenum type,
6646 void *pixels)
6647{
6648 return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
6649 nullptr, pixels);
6650}
6651
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006652bool ValidateTexParameterf(Context *context, TextureType target, GLenum pname, GLfloat param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006653{
Till Rathmannb8543632018-10-02 19:46:14 +02006654 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006655}
6656
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006657bool ValidateTexParameterfv(Context *context,
6658 TextureType target,
6659 GLenum pname,
6660 const GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006661{
Till Rathmannb8543632018-10-02 19:46:14 +02006662 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006663}
6664
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006665bool ValidateTexParameteri(Context *context, TextureType target, GLenum pname, GLint param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006666{
Till Rathmannb8543632018-10-02 19:46:14 +02006667 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006668}
6669
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006670bool ValidateTexParameteriv(Context *context, TextureType target, GLenum pname, const GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006671{
Till Rathmannb8543632018-10-02 19:46:14 +02006672 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6673}
6674
6675bool ValidateTexParameterIivOES(Context *context,
6676 TextureType target,
6677 GLenum pname,
6678 const GLint *params)
6679{
6680 if (context->getClientMajorVersion() < 3)
6681 {
Jamie Madille0472f32018-11-27 16:32:45 -05006682 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006683 return false;
6684 }
6685 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6686}
6687
6688bool ValidateTexParameterIuivOES(Context *context,
6689 TextureType target,
6690 GLenum pname,
6691 const GLuint *params)
6692{
6693 if (context->getClientMajorVersion() < 3)
6694 {
Jamie Madille0472f32018-11-27 16:32:45 -05006695 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006696 return false;
6697 }
6698 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006699}
6700
6701bool ValidateUseProgram(Context *context, GLuint program)
6702{
6703 if (program != 0)
6704 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006705 Program *programObject = context->getProgramResolveLink(program);
Jamie Madillbe849e42017-05-02 15:49:00 -04006706 if (!programObject)
6707 {
6708 // ES 3.1.0 section 7.3 page 72
6709 if (context->getShader(program))
6710 {
Jamie Madille0472f32018-11-27 16:32:45 -05006711 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006712 return false;
6713 }
6714 else
6715 {
Jamie Madille0472f32018-11-27 16:32:45 -05006716 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006717 return false;
6718 }
6719 }
6720 if (!programObject->isLinked())
6721 {
Jamie Madille0472f32018-11-27 16:32:45 -05006722 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillbe849e42017-05-02 15:49:00 -04006723 return false;
6724 }
6725 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006726 if (context->getState().isTransformFeedbackActiveUnpaused())
Jamie Madillbe849e42017-05-02 15:49:00 -04006727 {
6728 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006729 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackUseProgram);
Jamie Madillbe849e42017-05-02 15:49:00 -04006730 return false;
6731 }
6732
6733 return true;
6734}
6735
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006736bool ValidateDeleteFencesNV(Context *context, GLsizei n, const GLuint *fences)
6737{
6738 if (!context->getExtensions().fence)
6739 {
Jamie Madille0472f32018-11-27 16:32:45 -05006740 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006741 return false;
6742 }
6743
6744 if (n < 0)
6745 {
Jamie Madille0472f32018-11-27 16:32:45 -05006746 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006747 return false;
6748 }
6749
6750 return true;
6751}
6752
6753bool ValidateFinishFenceNV(Context *context, GLuint fence)
6754{
6755 if (!context->getExtensions().fence)
6756 {
Jamie Madille0472f32018-11-27 16:32:45 -05006757 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006758 return false;
6759 }
6760
6761 FenceNV *fenceObject = context->getFenceNV(fence);
6762
6763 if (fenceObject == nullptr)
6764 {
Jamie Madille0472f32018-11-27 16:32:45 -05006765 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006766 return false;
6767 }
6768
6769 if (!fenceObject->isSet())
6770 {
Jamie Madille0472f32018-11-27 16:32:45 -05006771 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006772 return false;
6773 }
6774
6775 return true;
6776}
6777
6778bool ValidateGenFencesNV(Context *context, GLsizei n, GLuint *fences)
6779{
6780 if (!context->getExtensions().fence)
6781 {
Jamie Madille0472f32018-11-27 16:32:45 -05006782 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006783 return false;
6784 }
6785
6786 if (n < 0)
6787 {
Jamie Madille0472f32018-11-27 16:32:45 -05006788 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006789 return false;
6790 }
6791
6792 return true;
6793}
6794
6795bool ValidateGetFenceivNV(Context *context, GLuint fence, GLenum pname, GLint *params)
6796{
6797 if (!context->getExtensions().fence)
6798 {
Jamie Madille0472f32018-11-27 16:32:45 -05006799 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006800 return false;
6801 }
6802
6803 FenceNV *fenceObject = context->getFenceNV(fence);
6804
6805 if (fenceObject == nullptr)
6806 {
Jamie Madille0472f32018-11-27 16:32:45 -05006807 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006808 return false;
6809 }
6810
6811 if (!fenceObject->isSet())
6812 {
Jamie Madille0472f32018-11-27 16:32:45 -05006813 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006814 return false;
6815 }
6816
6817 switch (pname)
6818 {
6819 case GL_FENCE_STATUS_NV:
6820 case GL_FENCE_CONDITION_NV:
6821 break;
6822
6823 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006824 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006825 return false;
6826 }
6827
6828 return true;
6829}
6830
6831bool ValidateGetGraphicsResetStatusEXT(Context *context)
6832{
6833 if (!context->getExtensions().robustness)
6834 {
Jamie Madille0472f32018-11-27 16:32:45 -05006835 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006836 return false;
6837 }
6838
6839 return true;
6840}
6841
6842bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
6843 GLuint shader,
6844 GLsizei bufsize,
6845 GLsizei *length,
6846 GLchar *source)
6847{
6848 if (!context->getExtensions().translatedShaderSource)
6849 {
Jamie Madille0472f32018-11-27 16:32:45 -05006850 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006851 return false;
6852 }
6853
6854 if (bufsize < 0)
6855 {
Jamie Madille0472f32018-11-27 16:32:45 -05006856 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006857 return false;
6858 }
6859
6860 Shader *shaderObject = context->getShader(shader);
6861
6862 if (!shaderObject)
6863 {
Jamie Madille0472f32018-11-27 16:32:45 -05006864 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006865 return false;
6866 }
6867
6868 return true;
6869}
6870
6871bool ValidateIsFenceNV(Context *context, GLuint fence)
6872{
6873 if (!context->getExtensions().fence)
6874 {
Jamie Madille0472f32018-11-27 16:32:45 -05006875 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006876 return false;
6877 }
6878
6879 return true;
6880}
6881
Jamie Madill007530e2017-12-28 14:27:04 -05006882bool ValidateSetFenceNV(Context *context, GLuint fence, GLenum condition)
6883{
6884 if (!context->getExtensions().fence)
6885 {
Jamie Madille0472f32018-11-27 16:32:45 -05006886 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006887 return false;
6888 }
6889
6890 if (condition != GL_ALL_COMPLETED_NV)
6891 {
Jamie Madille0472f32018-11-27 16:32:45 -05006892 context->validationError(GL_INVALID_ENUM, kInvalidFenceCondition);
Jamie Madill007530e2017-12-28 14:27:04 -05006893 return false;
6894 }
6895
6896 FenceNV *fenceObject = context->getFenceNV(fence);
6897
6898 if (fenceObject == nullptr)
6899 {
Jamie Madille0472f32018-11-27 16:32:45 -05006900 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006901 return false;
6902 }
6903
6904 return true;
6905}
6906
6907bool ValidateTestFenceNV(Context *context, GLuint fence)
6908{
6909 if (!context->getExtensions().fence)
6910 {
Jamie Madille0472f32018-11-27 16:32:45 -05006911 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006912 return false;
6913 }
6914
6915 FenceNV *fenceObject = context->getFenceNV(fence);
6916
6917 if (fenceObject == nullptr)
6918 {
Jamie Madille0472f32018-11-27 16:32:45 -05006919 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006920 return false;
6921 }
6922
6923 if (fenceObject->isSet() != GL_TRUE)
6924 {
Jamie Madille0472f32018-11-27 16:32:45 -05006925 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill007530e2017-12-28 14:27:04 -05006926 return false;
6927 }
6928
6929 return true;
6930}
6931
6932bool ValidateTexStorage2DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006933 TextureType type,
Jamie Madill007530e2017-12-28 14:27:04 -05006934 GLsizei levels,
6935 GLenum internalformat,
6936 GLsizei width,
6937 GLsizei height)
6938{
6939 if (!context->getExtensions().textureStorage)
6940 {
Jamie Madille0472f32018-11-27 16:32:45 -05006941 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006942 return false;
6943 }
6944
6945 if (context->getClientMajorVersion() < 3)
6946 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006947 return ValidateES2TexStorageParameters(context, type, levels, internalformat, width,
Jamie Madill007530e2017-12-28 14:27:04 -05006948 height);
6949 }
6950
6951 ASSERT(context->getClientMajorVersion() >= 3);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006952 return ValidateES3TexStorage2DParameters(context, type, levels, internalformat, width, height,
Jamie Madill007530e2017-12-28 14:27:04 -05006953 1);
6954}
6955
6956bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor)
6957{
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006958 if (!context->getExtensions().instancedArraysANGLE)
Jamie Madill007530e2017-12-28 14:27:04 -05006959 {
Jamie Madille0472f32018-11-27 16:32:45 -05006960 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006961 return false;
6962 }
6963
6964 if (index >= MAX_VERTEX_ATTRIBS)
6965 {
Jamie Madille0472f32018-11-27 16:32:45 -05006966 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill007530e2017-12-28 14:27:04 -05006967 return false;
6968 }
6969
6970 if (context->getLimitations().attributeZeroRequiresZeroDivisorInEXT)
6971 {
6972 if (index == 0 && divisor != 0)
6973 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006974 context->validationError(GL_INVALID_OPERATION, kAttributeZeroRequiresDivisorLimitation);
Jamie Madill007530e2017-12-28 14:27:04 -05006975
6976 // We also output an error message to the debugger window if tracing is active, so
6977 // that developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006978 ERR() << kAttributeZeroRequiresDivisorLimitation;
Jamie Madill007530e2017-12-28 14:27:04 -05006979 return false;
6980 }
6981 }
6982
6983 return true;
6984}
6985
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006986bool ValidateVertexAttribDivisorEXT(Context *context, GLuint index, GLuint divisor)
6987{
6988 if (!context->getExtensions().instancedArraysEXT)
6989 {
6990 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6991 return false;
6992 }
6993
6994 if (index >= MAX_VERTEX_ATTRIBS)
6995 {
6996 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
6997 return false;
6998 }
6999
7000 return true;
7001}
7002
Jamie Madill007530e2017-12-28 14:27:04 -05007003bool ValidateTexImage3DOES(Context *context,
Cody Northrop5faff912019-06-28 14:04:50 -06007004 TextureTarget target,
Jamie Madill007530e2017-12-28 14:27:04 -05007005 GLint level,
7006 GLenum internalformat,
7007 GLsizei width,
7008 GLsizei height,
7009 GLsizei depth,
7010 GLint border,
7011 GLenum format,
7012 GLenum type,
7013 const void *pixels)
7014{
Cody Northrop5faff912019-06-28 14:04:50 -06007015 return ValidateTexImage3D(context, target, level, internalformat, width, height, depth, border,
7016 format, type, pixels);
Jamie Madill007530e2017-12-28 14:27:04 -05007017}
7018
7019bool ValidatePopGroupMarkerEXT(Context *context)
7020{
7021 if (!context->getExtensions().debugMarker)
7022 {
7023 // The debug marker calls should not set error state
7024 // However, it seems reasonable to set an error state if the extension is not enabled
Jamie Madille0472f32018-11-27 16:32:45 -05007025 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05007026 return false;
7027 }
7028
7029 return true;
7030}
7031
Jamie Madillfa920eb2018-01-04 11:45:50 -05007032bool ValidateTexStorage1DEXT(Context *context,
7033 GLenum target,
7034 GLsizei levels,
7035 GLenum internalformat,
7036 GLsizei width)
7037{
7038 UNIMPLEMENTED();
Jamie Madille0472f32018-11-27 16:32:45 -05007039 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05007040 return false;
7041}
7042
7043bool ValidateTexStorage3DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08007044 TextureType target,
Jamie Madillfa920eb2018-01-04 11:45:50 -05007045 GLsizei levels,
7046 GLenum internalformat,
7047 GLsizei width,
7048 GLsizei height,
7049 GLsizei depth)
7050{
7051 if (!context->getExtensions().textureStorage)
7052 {
Jamie Madille0472f32018-11-27 16:32:45 -05007053 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05007054 return false;
7055 }
7056
7057 if (context->getClientMajorVersion() < 3)
7058 {
Jamie Madille0472f32018-11-27 16:32:45 -05007059 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05007060 return false;
7061 }
7062
7063 return ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
7064 depth);
7065}
7066
jchen1082af6202018-06-22 10:59:52 +08007067bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count)
7068{
7069 if (!context->getExtensions().parallelShaderCompile)
7070 {
Jamie Madille0472f32018-11-27 16:32:45 -05007071 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
jchen1082af6202018-06-22 10:59:52 +08007072 return false;
7073 }
7074 return true;
7075}
7076
Austin Eng1bf18ce2018-10-19 15:34:02 -07007077bool ValidateMultiDrawArraysANGLE(Context *context,
7078 PrimitiveMode mode,
7079 const GLint *firsts,
7080 const GLsizei *counts,
7081 GLsizei drawcount)
7082{
7083 if (!context->getExtensions().multiDraw)
7084 {
Jamie Madille0472f32018-11-27 16:32:45 -05007085 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07007086 return false;
7087 }
7088 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
7089 {
7090 if (!ValidateDrawArrays(context, mode, firsts[drawID], counts[drawID]))
7091 {
7092 return false;
7093 }
7094 }
7095 return true;
7096}
7097
7098bool ValidateMultiDrawElementsANGLE(Context *context,
7099 PrimitiveMode mode,
7100 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05007101 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08007102 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07007103 GLsizei drawcount)
7104{
7105 if (!context->getExtensions().multiDraw)
7106 {
Jamie Madille0472f32018-11-27 16:32:45 -05007107 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07007108 return false;
7109 }
7110 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
7111 {
Austin Eng3b7c9d02018-11-21 18:09:05 -08007112 if (!ValidateDrawElements(context, mode, counts[drawID], type, indices[drawID]))
Austin Eng1bf18ce2018-10-19 15:34:02 -07007113 {
7114 return false;
7115 }
7116 }
7117 return true;
7118}
7119
Jeff Gilbert465d6092019-01-02 16:21:18 -08007120bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked)
7121{
7122 if (!context->getExtensions().provokingVertex)
7123 {
7124 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
7125 return false;
7126 }
7127
7128 switch (modePacked)
7129 {
7130 case ProvokingVertex::FirstVertexConvention:
7131 case ProvokingVertex::LastVertexConvention:
7132 break;
7133 default:
7134 context->validationError(GL_INVALID_ENUM, kInvalidProvokingVertex);
7135 return false;
7136 }
7137
7138 return true;
7139}
7140
Jamie Madilla5410482019-01-31 19:55:55 -05007141void RecordBindTextureTypeError(Context *context, TextureType target)
7142{
7143 ASSERT(!context->getStateCache().isValidBindTextureType(target));
7144
7145 switch (target)
7146 {
7147 case TextureType::Rectangle:
7148 ASSERT(!context->getExtensions().textureRectangle);
7149 context->validationError(GL_INVALID_ENUM, kTextureRectangleNotSupported);
7150 break;
7151
7152 case TextureType::_3D:
7153 case TextureType::_2DArray:
7154 ASSERT(context->getClientMajorVersion() < 3);
7155 context->validationError(GL_INVALID_ENUM, kES3Required);
7156 break;
7157
7158 case TextureType::_2DMultisample:
7159 ASSERT(context->getClientVersion() < Version(3, 1) &&
7160 !context->getExtensions().textureMultisample);
7161 context->validationError(GL_INVALID_ENUM, kMultisampleTextureExtensionOrES31Required);
7162 break;
7163
7164 case TextureType::_2DMultisampleArray:
7165 ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
7166 context->validationError(GL_INVALID_ENUM, kMultisampleArrayExtensionRequired);
7167 break;
7168
7169 case TextureType::External:
7170 ASSERT(!context->getExtensions().eglImageExternal &&
7171 !context->getExtensions().eglStreamConsumerExternal);
7172 context->validationError(GL_INVALID_ENUM, kExternalTextureNotSupported);
7173 break;
7174
7175 default:
7176 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
7177 }
7178}
7179
Jamie Madillc29968b2016-01-20 11:17:23 -05007180} // namespace gl