blob: b7143eb2b8cd01f68c025eb262430909b10b340a [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:
733 case GL_DEPTH_STENCIL_OES:
734 case GL_DEPTH24_STENCIL8_OES:
735 if (context->getExtensions().depthTextures)
736 {
Jamie Madille0472f32018-11-27 16:32:45 -0500737 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Jamie Madillbe849e42017-05-02 15:49:00 -0400738 return false;
739 }
740 else
741 {
Jamie Madille0472f32018-11-27 16:32:45 -0500742 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400743 return false;
744 }
745 default:
Jamie Madille0472f32018-11-27 16:32:45 -0500746 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -0400747 return false;
748 }
749 }
750
751 // If width or height is zero, it is a no-op. Return false without setting an error.
752 return (width > 0 && height > 0);
753}
754
755bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
756{
757 switch (cap)
758 {
759 // EXT_multisample_compatibility
760 case GL_MULTISAMPLE_EXT:
761 case GL_SAMPLE_ALPHA_TO_ONE_EXT:
762 return context->getExtensions().multisampleCompatibility;
763
764 case GL_CULL_FACE:
765 case GL_POLYGON_OFFSET_FILL:
766 case GL_SAMPLE_ALPHA_TO_COVERAGE:
767 case GL_SAMPLE_COVERAGE:
768 case GL_SCISSOR_TEST:
769 case GL_STENCIL_TEST:
770 case GL_DEPTH_TEST:
771 case GL_BLEND:
772 case GL_DITHER:
773 return true;
774
775 case GL_PRIMITIVE_RESTART_FIXED_INDEX:
776 case GL_RASTERIZER_DISCARD:
777 return (context->getClientMajorVersion() >= 3);
778
779 case GL_DEBUG_OUTPUT_SYNCHRONOUS:
780 case GL_DEBUG_OUTPUT:
781 return context->getExtensions().debug;
782
783 case GL_BIND_GENERATES_RESOURCE_CHROMIUM:
784 return queryOnly && context->getExtensions().bindGeneratesResource;
785
786 case GL_CLIENT_ARRAYS_ANGLE:
787 return queryOnly && context->getExtensions().clientArrays;
788
789 case GL_FRAMEBUFFER_SRGB_EXT:
790 return context->getExtensions().sRGBWriteControl;
791
792 case GL_SAMPLE_MASK:
793 return context->getClientVersion() >= Version(3, 1);
794
Geoff Langb433e872017-10-05 14:01:47 -0400795 case GL_ROBUST_RESOURCE_INITIALIZATION_ANGLE:
Jamie Madillbe849e42017-05-02 15:49:00 -0400796 return queryOnly && context->getExtensions().robustResourceInitialization;
797
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700798 // GLES1 emulation: GLES1-specific caps
799 case GL_ALPHA_TEST:
Lingfeng Yang01074432018-04-16 10:19:51 -0700800 case GL_VERTEX_ARRAY:
801 case GL_NORMAL_ARRAY:
802 case GL_COLOR_ARRAY:
803 case GL_TEXTURE_COORD_ARRAY:
Lingfeng Yang23dc90b2018-04-23 09:01:49 -0700804 case GL_TEXTURE_2D:
Lingfeng Yangd0febe72018-05-17 22:36:52 -0700805 case GL_LIGHTING:
806 case GL_LIGHT0:
807 case GL_LIGHT1:
808 case GL_LIGHT2:
809 case GL_LIGHT3:
810 case GL_LIGHT4:
811 case GL_LIGHT5:
812 case GL_LIGHT6:
813 case GL_LIGHT7:
814 case GL_NORMALIZE:
815 case GL_RESCALE_NORMAL:
816 case GL_COLOR_MATERIAL:
Lingfeng Yang060088a2018-05-30 20:40:57 -0700817 case GL_CLIP_PLANE0:
818 case GL_CLIP_PLANE1:
819 case GL_CLIP_PLANE2:
820 case GL_CLIP_PLANE3:
821 case GL_CLIP_PLANE4:
822 case GL_CLIP_PLANE5:
Lingfeng Yang7ba3f422018-06-01 09:43:04 -0700823 case GL_FOG:
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700824 case GL_POINT_SMOOTH:
Lingfeng Yang6e5bf362018-08-15 09:53:17 -0700825 case GL_LINE_SMOOTH:
826 case GL_COLOR_LOGIC_OP:
Lingfeng Yang13b708f2018-03-21 12:14:10 -0700827 return context->getClientVersion() < Version(2, 0);
Lingfeng Yang01074432018-04-16 10:19:51 -0700828 case GL_POINT_SIZE_ARRAY_OES:
829 return context->getClientVersion() < Version(2, 0) &&
830 context->getExtensions().pointSizeArray;
Lingfeng Yang23dc90b2018-04-23 09:01:49 -0700831 case GL_TEXTURE_CUBE_MAP:
832 return context->getClientVersion() < Version(2, 0) &&
833 context->getExtensions().textureCubeMap;
Lingfeng Yang9c4c0922018-06-13 09:29:00 -0700834 case GL_POINT_SPRITE_OES:
835 return context->getClientVersion() < Version(2, 0) &&
836 context->getExtensions().pointSprite;
Jamie Madillbe849e42017-05-02 15:49:00 -0400837 default:
838 return false;
839 }
840}
841
Geoff Langfc32e8b2017-05-31 14:16:59 -0400842// Return true if a character belongs to the ASCII subset as defined in GLSL ES 1.0 spec section
843// 3.1.
Geoff Langcab92ee2017-07-19 17:32:07 -0400844bool IsValidESSLCharacter(unsigned char c)
Geoff Langfc32e8b2017-05-31 14:16:59 -0400845{
846 // Printing characters are valid except " $ ` @ \ ' DEL.
Geoff Langcab92ee2017-07-19 17:32:07 -0400847 if (c >= 32 && c <= 126 && c != '"' && c != '$' && c != '`' && c != '@' && c != '\\' &&
848 c != '\'')
Geoff Langfc32e8b2017-05-31 14:16:59 -0400849 {
850 return true;
851 }
852
853 // Horizontal tab, line feed, vertical tab, form feed, carriage return are also valid.
854 if (c >= 9 && c <= 13)
855 {
856 return true;
857 }
858
859 return false;
860}
861
Geoff Langcab92ee2017-07-19 17:32:07 -0400862bool IsValidESSLString(const char *str, size_t len)
Geoff Langfc32e8b2017-05-31 14:16:59 -0400863{
Geoff Langa71a98e2017-06-19 15:15:00 -0400864 for (size_t i = 0; i < len; i++)
865 {
Geoff Langcab92ee2017-07-19 17:32:07 -0400866 if (!IsValidESSLCharacter(str[i]))
Geoff Langa71a98e2017-06-19 15:15:00 -0400867 {
868 return false;
869 }
870 }
871
872 return true;
Geoff Langfc32e8b2017-05-31 14:16:59 -0400873}
874
Geoff Langcab92ee2017-07-19 17:32:07 -0400875bool IsValidESSLShaderSourceString(const char *str, size_t len, bool lineContinuationAllowed)
876{
877 enum class ParseState
878 {
879 // Have not seen an ASCII non-whitespace character yet on
880 // this line. Possible that we might see a preprocessor
881 // directive.
882 BEGINING_OF_LINE,
883
884 // Have seen at least one ASCII non-whitespace character
885 // on this line.
886 MIDDLE_OF_LINE,
887
888 // Handling a preprocessor directive. Passes through all
889 // characters up to the end of the line. Disables comment
890 // processing.
891 IN_PREPROCESSOR_DIRECTIVE,
892
893 // Handling a single-line comment. The comment text is
894 // replaced with a single space.
895 IN_SINGLE_LINE_COMMENT,
896
897 // Handling a multi-line comment. Newlines are passed
898 // through to preserve line numbers.
899 IN_MULTI_LINE_COMMENT
900 };
901
902 ParseState state = ParseState::BEGINING_OF_LINE;
903 size_t pos = 0;
904
905 while (pos < len)
906 {
907 char c = str[pos];
908 char next = pos + 1 < len ? str[pos + 1] : 0;
909
910 // Check for newlines
911 if (c == '\n' || c == '\r')
912 {
913 if (state != ParseState::IN_MULTI_LINE_COMMENT)
914 {
915 state = ParseState::BEGINING_OF_LINE;
916 }
917
918 pos++;
919 continue;
920 }
921
922 switch (state)
923 {
924 case ParseState::BEGINING_OF_LINE:
925 if (c == ' ')
926 {
927 // Maintain the BEGINING_OF_LINE state until a non-space is seen
928 pos++;
929 }
930 else if (c == '#')
931 {
932 state = ParseState::IN_PREPROCESSOR_DIRECTIVE;
933 pos++;
934 }
935 else
936 {
937 // Don't advance, re-process this character with the MIDDLE_OF_LINE state
938 state = ParseState::MIDDLE_OF_LINE;
939 }
940 break;
941
942 case ParseState::MIDDLE_OF_LINE:
943 if (c == '/' && next == '/')
944 {
945 state = ParseState::IN_SINGLE_LINE_COMMENT;
946 pos++;
947 }
948 else if (c == '/' && next == '*')
949 {
950 state = ParseState::IN_MULTI_LINE_COMMENT;
951 pos++;
952 }
953 else if (lineContinuationAllowed && c == '\\' && (next == '\n' || next == '\r'))
954 {
955 // Skip line continuation characters
956 }
957 else if (!IsValidESSLCharacter(c))
958 {
959 return false;
960 }
961 pos++;
962 break;
963
964 case ParseState::IN_PREPROCESSOR_DIRECTIVE:
Bryan Bernhart (Intel Americas Inc)335d8bf2017-10-23 15:41:43 -0700965 // Line-continuation characters may not be permitted.
966 // Otherwise, just pass it through. Do not parse comments in this state.
967 if (!lineContinuationAllowed && c == '\\')
968 {
969 return false;
970 }
Geoff Langcab92ee2017-07-19 17:32:07 -0400971 pos++;
972 break;
973
974 case ParseState::IN_SINGLE_LINE_COMMENT:
975 // Line-continuation characters are processed before comment processing.
976 // Advance string if a new line character is immediately behind
977 // line-continuation character.
978 if (c == '\\' && (next == '\n' || next == '\r'))
979 {
980 pos++;
981 }
982 pos++;
983 break;
984
985 case ParseState::IN_MULTI_LINE_COMMENT:
986 if (c == '*' && next == '/')
987 {
988 state = ParseState::MIDDLE_OF_LINE;
989 pos++;
990 }
991 pos++;
992 break;
993 }
994 }
995
996 return true;
997}
998
Jamie Madill5b772312018-03-08 20:28:32 -0500999bool ValidateWebGLNamePrefix(Context *context, const GLchar *name)
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001000{
1001 ASSERT(context->isWebGL());
1002
1003 // WebGL 1.0 [Section 6.16] GLSL Constructs
1004 // Identifiers starting with "webgl_" and "_webgl_" are reserved for use by WebGL.
1005 if (strncmp(name, "webgl_", 6) == 0 || strncmp(name, "_webgl_", 7) == 0)
1006 {
Jamie Madille0472f32018-11-27 16:32:45 -05001007 context->validationError(GL_INVALID_OPERATION, kWebglBindAttribLocationReservedPrefix);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001008 return false;
1009 }
1010
1011 return true;
1012}
1013
Jamie Madill5b772312018-03-08 20:28:32 -05001014bool ValidateWebGLNameLength(Context *context, size_t length)
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001015{
1016 ASSERT(context->isWebGL());
1017
1018 if (context->isWebGL1() && length > 256)
1019 {
1020 // WebGL 1.0 [Section 6.21] Maxmimum Uniform and Attribute Location Lengths
1021 // WebGL imposes a limit of 256 characters on the lengths of uniform and attribute
1022 // locations.
Jamie Madille0472f32018-11-27 16:32:45 -05001023 context->validationError(GL_INVALID_VALUE, kWebglNameLengthLimitExceeded);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001024
1025 return false;
1026 }
1027 else if (length > 1024)
1028 {
1029 // WebGL 2.0 [Section 4.3.2] WebGL 2.0 imposes a limit of 1024 characters on the lengths of
1030 // uniform and attribute locations.
Jamie Madille0472f32018-11-27 16:32:45 -05001031 context->validationError(GL_INVALID_VALUE, kWebgl2NameLengthLimitExceeded);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07001032 return false;
1033 }
1034
1035 return true;
1036}
1037
Jamie Madill007530e2017-12-28 14:27:04 -05001038bool ValidateMatrixMode(Context *context, GLenum matrixMode)
1039{
1040 if (!context->getExtensions().pathRendering)
1041 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001042 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05001043 return false;
1044 }
1045
1046 if (matrixMode != GL_PATH_MODELVIEW_CHROMIUM && matrixMode != GL_PATH_PROJECTION_CHROMIUM)
1047 {
Jamie Madille0472f32018-11-27 16:32:45 -05001048 context->validationError(GL_INVALID_ENUM, kInvalidMatrixMode);
Jamie Madill007530e2017-12-28 14:27:04 -05001049 return false;
1050 }
1051 return true;
1052}
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03001053
1054bool ValidBlendFunc(const Context *context, GLenum val)
1055{
1056 const gl::Extensions &ext = context->getExtensions();
1057
1058 // these are always valid for src and dst.
1059 switch (val)
1060 {
1061 case GL_ZERO:
1062 case GL_ONE:
1063 case GL_SRC_COLOR:
1064 case GL_ONE_MINUS_SRC_COLOR:
1065 case GL_DST_COLOR:
1066 case GL_ONE_MINUS_DST_COLOR:
1067 case GL_SRC_ALPHA:
1068 case GL_ONE_MINUS_SRC_ALPHA:
1069 case GL_DST_ALPHA:
1070 case GL_ONE_MINUS_DST_ALPHA:
1071 case GL_CONSTANT_COLOR:
1072 case GL_ONE_MINUS_CONSTANT_COLOR:
1073 case GL_CONSTANT_ALPHA:
1074 case GL_ONE_MINUS_CONSTANT_ALPHA:
1075 return true;
1076
1077 // EXT_blend_func_extended.
1078 case GL_SRC1_COLOR_EXT:
1079 case GL_SRC1_ALPHA_EXT:
1080 case GL_ONE_MINUS_SRC1_COLOR_EXT:
1081 case GL_ONE_MINUS_SRC1_ALPHA_EXT:
1082 case GL_SRC_ALPHA_SATURATE_EXT:
1083 return ext.blendFuncExtended;
1084
1085 default:
1086 return false;
1087 }
1088}
1089
1090bool ValidSrcBlendFunc(const Context *context, GLenum val)
1091{
1092 if (ValidBlendFunc(context, val))
1093 return true;
1094
1095 if (val == GL_SRC_ALPHA_SATURATE)
1096 return true;
1097
1098 return false;
1099}
1100
1101bool ValidDstBlendFunc(const Context *context, GLenum val)
1102{
1103 if (ValidBlendFunc(context, val))
1104 return true;
1105
1106 if (val == GL_SRC_ALPHA_SATURATE)
1107 {
1108 if (context->getClientMajorVersion() >= 3)
1109 return true;
1110 }
1111
1112 return false;
1113}
Jamie Madillc29968b2016-01-20 11:17:23 -05001114} // anonymous namespace
1115
Geoff Langff5b2d52016-09-07 11:32:23 -04001116bool ValidateES2TexImageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001117 TextureTarget target,
Geoff Langff5b2d52016-09-07 11:32:23 -04001118 GLint level,
1119 GLenum internalformat,
1120 bool isCompressed,
1121 bool isSubImage,
1122 GLint xoffset,
1123 GLint yoffset,
1124 GLsizei width,
1125 GLsizei height,
1126 GLint border,
1127 GLenum format,
1128 GLenum type,
1129 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04001130 const void *pixels)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001131{
Jamie Madill6f38f822014-06-06 17:12:20 -04001132 if (!ValidTexture2DDestinationTarget(context, target))
1133 {
Jamie Madille0472f32018-11-27 16:32:45 -05001134 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langb1196682014-07-23 13:47:29 -04001135 return false;
Jamie Madill6f38f822014-06-06 17:12:20 -04001136 }
1137
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001138 TextureType texType = TextureTargetToType(target);
1139 if (!ValidImageSizeParameters(context, texType, level, width, height, 1, isSubImage))
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001140 {
Jamie Madill610640f2018-11-21 17:28:41 -05001141 // Error already handled.
Geoff Langb1196682014-07-23 13:47:29 -04001142 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001143 }
1144
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001145 if (!ValidMipLevel(context, texType, level))
Brandon Jones6cad5662017-06-14 13:25:13 -07001146 {
Jamie Madille0472f32018-11-27 16:32:45 -05001147 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Brandon Jones6cad5662017-06-14 13:25:13 -07001148 return false;
1149 }
1150
1151 if (xoffset < 0 || std::numeric_limits<GLsizei>::max() - xoffset < width ||
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001152 std::numeric_limits<GLsizei>::max() - yoffset < height)
1153 {
Jamie Madille0472f32018-11-27 16:32:45 -05001154 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Geoff Langb1196682014-07-23 13:47:29 -04001155 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001156 }
1157
Geoff Langaae65a42014-05-26 12:43:44 -04001158 const gl::Caps &caps = context->getCaps();
1159
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001160 switch (texType)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001161 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001162 case TextureType::_2D:
1163 if (static_cast<GLuint>(width) > (caps.max2DTextureSize >> level) ||
1164 static_cast<GLuint>(height) > (caps.max2DTextureSize >> level))
1165 {
Jamie Madille0472f32018-11-27 16:32:45 -05001166 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001167 return false;
1168 }
1169 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001171 case TextureType::Rectangle:
1172 ASSERT(level == 0);
1173 if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
1174 static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
1175 {
Jamie Madille0472f32018-11-27 16:32:45 -05001176 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001177 return false;
1178 }
1179 if (isCompressed)
1180 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001181 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001182 return false;
1183 }
1184 break;
1185
1186 case TextureType::CubeMap:
1187 if (!isSubImage && width != height)
1188 {
Jamie Madille0472f32018-11-27 16:32:45 -05001189 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001190 return false;
1191 }
1192
1193 if (static_cast<GLuint>(width) > (caps.maxCubeMapTextureSize >> level) ||
1194 static_cast<GLuint>(height) > (caps.maxCubeMapTextureSize >> level))
1195 {
Jamie Madille0472f32018-11-27 16:32:45 -05001196 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001197 return false;
1198 }
1199 break;
1200
1201 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001202 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langa9be0dc2014-12-17 12:34:40 -05001203 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001204 }
1205
Jamie Madillcfc73cc2019-04-08 16:26:51 -04001206 gl::Texture *texture = context->getTextureByType(texType);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001207 if (!texture)
1208 {
Jamie Madille0472f32018-11-27 16:32:45 -05001209 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Geoff Langb1196682014-07-23 13:47:29 -04001210 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001211 }
1212
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001213 // Verify zero border
1214 if (border != 0)
1215 {
Jamie Madille0472f32018-11-27 16:32:45 -05001216 context->validationError(GL_INVALID_VALUE, kInvalidBorder);
Geoff Langb1196682014-07-23 13:47:29 -04001217 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001218 }
1219
Tim Van Patten208af3e2019-03-19 09:15:55 -06001220 bool nonEqualFormatsAllowed = false;
1221
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001222 if (isCompressed)
1223 {
tmartino0ccd5ae2015-10-01 14:33:14 -04001224 GLenum actualInternalFormat =
Geoff Langca271392017-04-05 12:30:00 -04001225 isSubImage ? texture->getFormat(target, level).info->sizedInternalFormat
1226 : internalformat;
Geoff Lange88e4542018-05-03 15:05:57 -04001227
1228 const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(actualInternalFormat);
1229
1230 if (!internalFormatInfo.compressed)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001231 {
Jamie Madille0472f32018-11-27 16:32:45 -05001232 context->validationError(GL_INVALID_ENUM, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001233 return false;
1234 }
1235
1236 if (!internalFormatInfo.textureSupport(context->getClientVersion(),
1237 context->getExtensions()))
1238 {
Jamie Madille0472f32018-11-27 16:32:45 -05001239 context->validationError(GL_INVALID_ENUM, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001240 return false;
tmartino0ccd5ae2015-10-01 14:33:14 -04001241 }
Geoff Lang966c9402017-04-18 12:38:27 -04001242
1243 if (isSubImage)
tmartino0ccd5ae2015-10-01 14:33:14 -04001244 {
Geoff Lange88e4542018-05-03 15:05:57 -04001245 // From the OES_compressed_ETC1_RGB8_texture spec:
1246 // INVALID_OPERATION is generated by CompressedTexSubImage2D, TexSubImage2D, or
1247 // CopyTexSubImage2D if the texture image <level> bound to <target> has internal format
1248 // ETC1_RGB8_OES.
1249 if (actualInternalFormat == GL_ETC1_RGB8_OES)
1250 {
Jamie Madille0472f32018-11-27 16:32:45 -05001251 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lange88e4542018-05-03 15:05:57 -04001252 return false;
1253 }
1254
Geoff Lang966c9402017-04-18 12:38:27 -04001255 if (!ValidCompressedSubImageSize(context, actualInternalFormat, xoffset, yoffset, width,
1256 height, texture->getWidth(target, level),
1257 texture->getHeight(target, level)))
1258 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001259 context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
Geoff Lang966c9402017-04-18 12:38:27 -04001260 return false;
1261 }
1262
1263 if (format != actualInternalFormat)
1264 {
Jamie Madille0472f32018-11-27 16:32:45 -05001265 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
Geoff Lang966c9402017-04-18 12:38:27 -04001266 return false;
1267 }
1268 }
1269 else
1270 {
1271 if (!ValidCompressedImageSize(context, actualInternalFormat, level, width, height))
1272 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001273 context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
Geoff Lang966c9402017-04-18 12:38:27 -04001274 return false;
1275 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001276 }
1277 }
1278 else
1279 {
1280 // validate <type> by itself (used as secondary key below)
1281 switch (type)
1282 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001283 case GL_UNSIGNED_BYTE:
1284 case GL_UNSIGNED_SHORT_5_6_5:
1285 case GL_UNSIGNED_SHORT_4_4_4_4:
1286 case GL_UNSIGNED_SHORT_5_5_5_1:
1287 case GL_UNSIGNED_SHORT:
1288 case GL_UNSIGNED_INT:
1289 case GL_UNSIGNED_INT_24_8_OES:
1290 case GL_HALF_FLOAT_OES:
1291 case GL_FLOAT:
1292 break;
1293 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001294 context->validationError(GL_INVALID_ENUM, kInvalidType);
He Yunchaoced53ae2016-11-29 15:00:51 +08001295 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001296 }
1297
1298 // validate <format> + <type> combinations
1299 // - invalid <format> -> sets INVALID_ENUM
1300 // - invalid <format>+<type> combination -> sets INVALID_OPERATION
1301 switch (format)
1302 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001303 case GL_ALPHA:
1304 case GL_LUMINANCE:
1305 case GL_LUMINANCE_ALPHA:
1306 switch (type)
1307 {
1308 case GL_UNSIGNED_BYTE:
1309 case GL_FLOAT:
1310 case GL_HALF_FLOAT_OES:
1311 break;
1312 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001313 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001314 return false;
1315 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001316 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001317 case GL_RED:
1318 case GL_RG:
1319 if (!context->getExtensions().textureRG)
1320 {
Jamie Madille0472f32018-11-27 16:32:45 -05001321 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001322 return false;
1323 }
1324 switch (type)
1325 {
1326 case GL_UNSIGNED_BYTE:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001327 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001328 case GL_FLOAT:
1329 case GL_HALF_FLOAT_OES:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001330 if (!context->getExtensions().textureFloat)
1331 {
Jamie Madille0472f32018-11-27 16:32:45 -05001332 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001333 return false;
1334 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001335 break;
1336 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001337 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001338 return false;
1339 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001340 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001341 case GL_RGB:
1342 switch (type)
1343 {
1344 case GL_UNSIGNED_BYTE:
1345 case GL_UNSIGNED_SHORT_5_6_5:
1346 case GL_FLOAT:
1347 case GL_HALF_FLOAT_OES:
1348 break;
1349 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001350 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001351 return false;
1352 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001353 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001354 case GL_RGBA:
1355 switch (type)
1356 {
1357 case GL_UNSIGNED_BYTE:
1358 case GL_UNSIGNED_SHORT_4_4_4_4:
1359 case GL_UNSIGNED_SHORT_5_5_5_1:
1360 case GL_FLOAT:
1361 case GL_HALF_FLOAT_OES:
1362 break;
1363 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001364 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001365 return false;
1366 }
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001367 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001368 case GL_BGRA_EXT:
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001369 if (!context->getExtensions().textureFormatBGRA8888)
1370 {
Jamie Madille0472f32018-11-27 16:32:45 -05001371 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -07001372 return false;
1373 }
He Yunchaoced53ae2016-11-29 15:00:51 +08001374 switch (type)
1375 {
1376 case GL_UNSIGNED_BYTE:
1377 break;
1378 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001379 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001380 return false;
1381 }
1382 break;
1383 case GL_SRGB_EXT:
1384 case GL_SRGB_ALPHA_EXT:
1385 if (!context->getExtensions().sRGB)
1386 {
Jamie Madille0472f32018-11-27 16:32:45 -05001387 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001388 return false;
1389 }
1390 switch (type)
1391 {
1392 case GL_UNSIGNED_BYTE:
1393 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 }
1398 break;
1399 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: // error cases for compressed textures are
1400 // handled below
1401 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1402 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1403 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1404 break;
1405 case GL_DEPTH_COMPONENT:
1406 switch (type)
1407 {
1408 case GL_UNSIGNED_SHORT:
1409 case GL_UNSIGNED_INT:
1410 break;
1411 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001412 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001413 return false;
1414 }
1415 break;
1416 case GL_DEPTH_STENCIL_OES:
1417 switch (type)
1418 {
1419 case GL_UNSIGNED_INT_24_8_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 }
1425 break;
1426 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001427 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001428 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001429 }
1430
1431 switch (format)
1432 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001433 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1434 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1435 if (context->getExtensions().textureCompressionDXT1)
1436 {
Jamie Madille0472f32018-11-27 16:32:45 -05001437 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001438 return false;
1439 }
1440 else
1441 {
Jamie Madille0472f32018-11-27 16:32:45 -05001442 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001443 return false;
1444 }
1445 break;
1446 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1447 if (context->getExtensions().textureCompressionDXT3)
1448 {
Jamie Madille0472f32018-11-27 16:32:45 -05001449 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001450 return false;
1451 }
1452 else
1453 {
Jamie Madille0472f32018-11-27 16:32:45 -05001454 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001455 return false;
1456 }
1457 break;
1458 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1459 if (context->getExtensions().textureCompressionDXT5)
1460 {
Jamie Madille0472f32018-11-27 16:32:45 -05001461 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001462 return false;
1463 }
1464 else
1465 {
Jamie Madille0472f32018-11-27 16:32:45 -05001466 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001467 return false;
1468 }
1469 break;
1470 case GL_ETC1_RGB8_OES:
1471 if (context->getExtensions().compressedETC1RGB8Texture)
1472 {
Jamie Madille0472f32018-11-27 16:32:45 -05001473 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001474 return false;
1475 }
1476 else
1477 {
Jamie Madille0472f32018-11-27 16:32:45 -05001478 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001479 return false;
1480 }
1481 break;
1482 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
Minmin Gong390208b2017-02-28 18:03:06 -08001483 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
1484 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
1485 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
1486 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
He Yunchaoced53ae2016-11-29 15:00:51 +08001487 if (context->getExtensions().lossyETCDecode)
1488 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001489 context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001490 return false;
1491 }
1492 else
1493 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001494 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001495 return false;
1496 }
1497 break;
1498 case GL_DEPTH_COMPONENT:
1499 case GL_DEPTH_STENCIL_OES:
1500 if (!context->getExtensions().depthTextures)
1501 {
Jamie Madille0472f32018-11-27 16:32:45 -05001502 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001503 return false;
1504 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001505 if (target != TextureTarget::_2D)
He Yunchaoced53ae2016-11-29 15:00:51 +08001506 {
Jamie Madille0472f32018-11-27 16:32:45 -05001507 context->validationError(GL_INVALID_OPERATION, kMismatchedTargetAndFormat);
He Yunchaoced53ae2016-11-29 15:00:51 +08001508 return false;
1509 }
1510 // OES_depth_texture supports loading depth data and multiple levels,
1511 // but ANGLE_depth_texture does not
Brandon Jonesafa75152017-07-21 13:11:29 -07001512 if (pixels != nullptr)
He Yunchaoced53ae2016-11-29 15:00:51 +08001513 {
Jamie Madille0472f32018-11-27 16:32:45 -05001514 context->validationError(GL_INVALID_OPERATION, kPixelDataNotNull);
Brandon Jonesafa75152017-07-21 13:11:29 -07001515 return false;
1516 }
1517 if (level != 0)
1518 {
Jamie Madille0472f32018-11-27 16:32:45 -05001519 context->validationError(GL_INVALID_OPERATION, kLevelNotZero);
He Yunchaoced53ae2016-11-29 15:00:51 +08001520 return false;
1521 }
1522 break;
1523 default:
1524 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001525 }
1526
Geoff Lang6e898aa2017-06-02 11:17:26 -04001527 if (!isSubImage)
1528 {
1529 switch (internalformat)
1530 {
Tim Van Patten208af3e2019-03-19 09:15:55 -06001531 // Core ES 2.0 formats
1532 case GL_ALPHA:
1533 case GL_LUMINANCE:
1534 case GL_LUMINANCE_ALPHA:
1535 case GL_RGB:
1536 case GL_RGBA:
1537 break;
1538
Geoff Lang6e898aa2017-06-02 11:17:26 -04001539 case GL_RGBA32F:
1540 if (!context->getExtensions().colorBufferFloatRGBA)
1541 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001542 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001543 return false;
1544 }
Tim Van Patten208af3e2019-03-19 09:15:55 -06001545
1546 nonEqualFormatsAllowed = true;
1547
Geoff Lang6e898aa2017-06-02 11:17:26 -04001548 if (type != GL_FLOAT)
1549 {
Jamie Madille0472f32018-11-27 16:32:45 -05001550 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001551 return false;
1552 }
1553 if (format != GL_RGBA)
1554 {
Jamie Madille0472f32018-11-27 16:32:45 -05001555 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001556 return false;
1557 }
1558 break;
1559
1560 case GL_RGB32F:
1561 if (!context->getExtensions().colorBufferFloatRGB)
1562 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001563 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001564 return false;
1565 }
Tim Van Patten208af3e2019-03-19 09:15:55 -06001566
1567 nonEqualFormatsAllowed = true;
1568
Geoff Lang6e898aa2017-06-02 11:17:26 -04001569 if (type != GL_FLOAT)
1570 {
Jamie Madille0472f32018-11-27 16:32:45 -05001571 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001572 return false;
1573 }
1574 if (format != GL_RGB)
1575 {
Jamie Madille0472f32018-11-27 16:32:45 -05001576 context->validationError(GL_INVALID_OPERATION, kMismatchedTypeAndFormat);
Geoff Lang6e898aa2017-06-02 11:17:26 -04001577 return false;
1578 }
1579 break;
1580
Tim Van Patten208af3e2019-03-19 09:15:55 -06001581 case GL_BGRA_EXT:
1582 if (!context->getExtensions().textureFormatBGRA8888)
1583 {
1584 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1585 return false;
1586 }
Geoff Lang6e898aa2017-06-02 11:17:26 -04001587 break;
Tim Van Patten208af3e2019-03-19 09:15:55 -06001588
1589 case GL_DEPTH_COMPONENT:
1590 case GL_DEPTH_STENCIL:
1591 if (!context->getExtensions().depthTextures)
1592 {
1593 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1594 return false;
1595 }
1596 break;
1597
1598 case GL_RED:
1599 case GL_RG:
1600 if (!context->getExtensions().textureRG)
1601 {
1602 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
1603 return false;
1604 }
1605 break;
1606
1607 case GL_SRGB_EXT:
1608 case GL_SRGB_ALPHA_EXT:
1609 if (!context->getExtensions().sRGB)
1610 {
1611 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
1612 return false;
1613 }
1614 break;
1615
1616 default:
1617 context->validationError(GL_INVALID_VALUE, kInvalidInternalFormat);
1618 return false;
Geoff Lang6e898aa2017-06-02 11:17:26 -04001619 }
1620 }
1621
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001622 if (type == GL_FLOAT)
1623 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001624 if (!context->getExtensions().textureFloat)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001625 {
Jamie Madille0472f32018-11-27 16:32:45 -05001626 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001627 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001628 }
1629 }
1630 else if (type == GL_HALF_FLOAT_OES)
1631 {
Geoff Langc0b9ef42014-07-02 10:02:37 -04001632 if (!context->getExtensions().textureHalfFloat)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001633 {
Jamie Madille0472f32018-11-27 16:32:45 -05001634 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001635 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001636 }
1637 }
1638 }
1639
Tim Van Patten208af3e2019-03-19 09:15:55 -06001640 if (isSubImage)
Geoff Langff5b2d52016-09-07 11:32:23 -04001641 {
Tim Van Patten208af3e2019-03-19 09:15:55 -06001642 const InternalFormat &textureInternalFormat = *texture->getFormat(target, level).info;
1643 if (textureInternalFormat.internalFormat == GL_NONE)
1644 {
1645 context->validationError(GL_INVALID_OPERATION, kInvalidTextureLevel);
1646 return false;
1647 }
1648
Tim Van Patten5f388c22019-03-14 09:54:23 -06001649 if (format != textureInternalFormat.format)
1650 {
1651 context->validationError(GL_INVALID_OPERATION, err::kTextureFormatMismatch);
1652 return false;
1653 }
1654
1655 if (context->getExtensions().webglCompatibility)
Tim Van Patten208af3e2019-03-19 09:15:55 -06001656 {
1657 if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
1658 textureInternalFormat.sizedInternalFormat)
1659 {
Tim Van Patten5f388c22019-03-14 09:54:23 -06001660 context->validationError(GL_INVALID_OPERATION, kTextureTypeMismatch);
Tim Van Patten208af3e2019-03-19 09:15:55 -06001661 return false;
1662 }
1663 }
1664
1665 if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
1666 static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
1667 {
1668 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
1669 return false;
1670 }
1671
1672 if (width > 0 && height > 0 && pixels == nullptr &&
1673 context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
1674 {
1675 context->validationError(GL_INVALID_VALUE, kPixelDataNull);
1676 return false;
1677 }
1678 }
1679 else
1680 {
1681 if (texture->getImmutableFormat())
1682 {
1683 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
1684 return false;
1685 }
1686 }
1687
1688 // From GL_CHROMIUM_color_buffer_float_rgb[a]:
1689 // GL_RGB[A] / GL_RGB[A]32F becomes an allowable format / internalformat parameter pair for
1690 // TexImage2D. The restriction in section 3.7.1 of the OpenGL ES 2.0 spec that the
1691 // internalformat parameter and format parameter of TexImage2D must match is lifted for this
1692 // case.
1693 if (!isSubImage && !isCompressed && internalformat != format && !nonEqualFormatsAllowed)
1694 {
1695 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Langff5b2d52016-09-07 11:32:23 -04001696 return false;
1697 }
1698
Tim Van Patten208af3e2019-03-19 09:15:55 -06001699 GLenum sizeCheckFormat = isSubImage ? format : internalformat;
1700 return ValidImageDataSize(context, texType, width, height, 1, sizeCheckFormat, type, pixels,
1701 imageSize);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001702}
1703
He Yunchaoced53ae2016-11-29 15:00:51 +08001704bool ValidateES2TexStorageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001705 TextureType target,
He Yunchaoced53ae2016-11-29 15:00:51 +08001706 GLsizei levels,
1707 GLenum internalformat,
1708 GLsizei width,
1709 GLsizei height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001710{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001711 if (target != TextureType::_2D && target != TextureType::CubeMap &&
1712 target != TextureType::Rectangle)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001713 {
Jamie Madille0472f32018-11-27 16:32:45 -05001714 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langb1196682014-07-23 13:47:29 -04001715 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001716 }
1717
1718 if (width < 1 || height < 1 || levels < 1)
1719 {
Jamie Madille0472f32018-11-27 16:32:45 -05001720 context->validationError(GL_INVALID_VALUE, kTextureSizeTooSmall);
Geoff Langb1196682014-07-23 13:47:29 -04001721 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001722 }
1723
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001724 if (target == TextureType::CubeMap && width != height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001725 {
Jamie Madille0472f32018-11-27 16:32:45 -05001726 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Langb1196682014-07-23 13:47:29 -04001727 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001728 }
1729
1730 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
1731 {
Jamie Madille0472f32018-11-27 16:32:45 -05001732 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
Geoff Langb1196682014-07-23 13:47:29 -04001733 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001734 }
1735
Geoff Langca271392017-04-05 12:30:00 -04001736 const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
Geoff Lang5d601382014-07-22 15:14:06 -04001737 if (formatInfo.format == GL_NONE || formatInfo.type == GL_NONE)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001738 {
Jamie Madille0472f32018-11-27 16:32:45 -05001739 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Langb1196682014-07-23 13:47:29 -04001740 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001741 }
1742
Geoff Langaae65a42014-05-26 12:43:44 -04001743 const gl::Caps &caps = context->getCaps();
1744
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001745 switch (target)
1746 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001747 case TextureType::_2D:
He Yunchaoced53ae2016-11-29 15:00:51 +08001748 if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
1749 static_cast<GLuint>(height) > caps.max2DTextureSize)
1750 {
Jamie Madille0472f32018-11-27 16:32:45 -05001751 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001752 return false;
1753 }
1754 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001755 case TextureType::Rectangle:
Jamie Madill610640f2018-11-21 17:28:41 -05001756 if (levels != 1)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001757 {
Jamie Madille0472f32018-11-27 16:32:45 -05001758 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madill610640f2018-11-21 17:28:41 -05001759 return false;
1760 }
1761
1762 if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
1763 static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
1764 {
Jamie Madille0472f32018-11-27 16:32:45 -05001765 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001766 return false;
1767 }
1768 if (formatInfo.compressed)
1769 {
Jamie Madille0472f32018-11-27 16:32:45 -05001770 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001771 return false;
1772 }
1773 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001774 case TextureType::CubeMap:
He Yunchaoced53ae2016-11-29 15:00:51 +08001775 if (static_cast<GLuint>(width) > caps.maxCubeMapTextureSize ||
1776 static_cast<GLuint>(height) > caps.maxCubeMapTextureSize)
1777 {
Jamie Madille0472f32018-11-27 16:32:45 -05001778 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001779 return false;
1780 }
1781 break;
1782 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001783 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001784 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001785 }
1786
Geoff Langc0b9ef42014-07-02 10:02:37 -04001787 if (levels != 1 && !context->getExtensions().textureNPOT)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001788 {
1789 if (!gl::isPow2(width) || !gl::isPow2(height))
1790 {
Jamie Madille0472f32018-11-27 16:32:45 -05001791 context->validationError(GL_INVALID_OPERATION, kDimensionsMustBePow2);
Geoff Langb1196682014-07-23 13:47:29 -04001792 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001793 }
1794 }
1795
1796 switch (internalformat)
1797 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001798 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1799 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1800 if (!context->getExtensions().textureCompressionDXT1)
1801 {
Jamie Madille0472f32018-11-27 16:32:45 -05001802 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001803 return false;
1804 }
1805 break;
1806 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1807 if (!context->getExtensions().textureCompressionDXT3)
1808 {
Jamie Madille0472f32018-11-27 16:32:45 -05001809 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001810 return false;
1811 }
1812 break;
1813 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1814 if (!context->getExtensions().textureCompressionDXT5)
1815 {
Jamie Madille0472f32018-11-27 16:32:45 -05001816 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001817 return false;
1818 }
1819 break;
1820 case GL_ETC1_RGB8_OES:
1821 if (!context->getExtensions().compressedETC1RGB8Texture)
1822 {
Jamie Madille0472f32018-11-27 16:32:45 -05001823 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001824 return false;
1825 }
1826 break;
1827 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
Minmin Gong390208b2017-02-28 18:03:06 -08001828 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
1829 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
1830 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
1831 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
He Yunchaoced53ae2016-11-29 15:00:51 +08001832 if (!context->getExtensions().lossyETCDecode)
1833 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001834 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001835 return false;
1836 }
1837 break;
1838 case GL_RGBA32F_EXT:
1839 case GL_RGB32F_EXT:
1840 case GL_ALPHA32F_EXT:
1841 case GL_LUMINANCE32F_EXT:
1842 case GL_LUMINANCE_ALPHA32F_EXT:
1843 if (!context->getExtensions().textureFloat)
1844 {
Jamie Madille0472f32018-11-27 16:32:45 -05001845 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001846 return false;
1847 }
1848 break;
1849 case GL_RGBA16F_EXT:
1850 case GL_RGB16F_EXT:
1851 case GL_ALPHA16F_EXT:
1852 case GL_LUMINANCE16F_EXT:
1853 case GL_LUMINANCE_ALPHA16F_EXT:
1854 if (!context->getExtensions().textureHalfFloat)
1855 {
Jamie Madille0472f32018-11-27 16:32:45 -05001856 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001857 return false;
1858 }
1859 break;
1860 case GL_R8_EXT:
1861 case GL_RG8_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001862 if (!context->getExtensions().textureRG)
1863 {
Jamie Madille0472f32018-11-27 16:32:45 -05001864 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001865 return false;
1866 }
1867 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001868 case GL_R16F_EXT:
1869 case GL_RG16F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001870 if (!context->getExtensions().textureRG || !context->getExtensions().textureHalfFloat)
1871 {
Jamie Madille0472f32018-11-27 16:32:45 -05001872 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001873 return false;
1874 }
1875 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001876 case GL_R32F_EXT:
1877 case GL_RG32F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001878 if (!context->getExtensions().textureRG || !context->getExtensions().textureFloat)
He Yunchaoced53ae2016-11-29 15:00:51 +08001879 {
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_DEPTH_COMPONENT16:
1885 case GL_DEPTH_COMPONENT32_OES:
1886 case GL_DEPTH24_STENCIL8_OES:
1887 if (!context->getExtensions().depthTextures)
1888 {
Jamie Madille0472f32018-11-27 16:32:45 -05001889 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001890 return false;
1891 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001892 if (target != TextureType::_2D)
He Yunchaoced53ae2016-11-29 15:00:51 +08001893 {
Jamie Madille0472f32018-11-27 16:32:45 -05001894 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08001895 return false;
1896 }
1897 // ANGLE_depth_texture only supports 1-level textures
1898 if (levels != 1)
1899 {
Jamie Madille0472f32018-11-27 16:32:45 -05001900 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
He Yunchaoced53ae2016-11-29 15:00:51 +08001901 return false;
1902 }
1903 break;
1904 default:
1905 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001906 }
1907
Jamie Madillcfc73cc2019-04-08 16:26:51 -04001908 gl::Texture *texture = context->getTextureByType(target);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001909 if (!texture || texture->id() == 0)
1910 {
Jamie Madille0472f32018-11-27 16:32:45 -05001911 context->validationError(GL_INVALID_OPERATION, kMissingTexture);
Geoff Langb1196682014-07-23 13:47:29 -04001912 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001913 }
1914
Geoff Lang69cce582015-09-17 13:20:36 -04001915 if (texture->getImmutableFormat())
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001916 {
Jamie Madille0472f32018-11-27 16:32:45 -05001917 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
Geoff Langb1196682014-07-23 13:47:29 -04001918 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001919 }
1920
1921 return true;
1922}
1923
He Yunchaoced53ae2016-11-29 15:00:51 +08001924bool ValidateDiscardFramebufferEXT(Context *context,
1925 GLenum target,
1926 GLsizei numAttachments,
Austin Kinross08332632015-05-05 13:35:47 -07001927 const GLenum *attachments)
1928{
Jamie Madillc29968b2016-01-20 11:17:23 -05001929 if (!context->getExtensions().discardFramebuffer)
1930 {
Jamie Madille0472f32018-11-27 16:32:45 -05001931 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05001932 return false;
1933 }
1934
Austin Kinross08332632015-05-05 13:35:47 -07001935 bool defaultFramebuffer = false;
1936
1937 switch (target)
1938 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001939 case GL_FRAMEBUFFER:
1940 defaultFramebuffer =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001941 (context->getState().getTargetFramebuffer(GL_FRAMEBUFFER)->id() == 0);
He Yunchaoced53ae2016-11-29 15:00:51 +08001942 break;
1943 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001944 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08001945 return false;
Austin Kinross08332632015-05-05 13:35:47 -07001946 }
1947
He Yunchaoced53ae2016-11-29 15:00:51 +08001948 return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments,
1949 defaultFramebuffer);
Austin Kinross08332632015-05-05 13:35:47 -07001950}
1951
Austin Kinrossbc781f32015-10-26 09:27:38 -07001952bool ValidateBindVertexArrayOES(Context *context, GLuint array)
1953{
1954 if (!context->getExtensions().vertexArrayObject)
1955 {
Jamie Madille0472f32018-11-27 16:32:45 -05001956 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001957 return false;
1958 }
1959
1960 return ValidateBindVertexArrayBase(context, array);
1961}
1962
Jamie Madilld7576732017-08-26 18:49:50 -04001963bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n, const GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001964{
1965 if (!context->getExtensions().vertexArrayObject)
1966 {
Jamie Madille0472f32018-11-27 16:32:45 -05001967 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001968 return false;
1969 }
1970
Olli Etuaho41997e72016-03-10 13:38:39 +02001971 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001972}
1973
Jamie Madilld7576732017-08-26 18:49:50 -04001974bool ValidateGenVertexArraysOES(Context *context, GLsizei n, GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001975{
1976 if (!context->getExtensions().vertexArrayObject)
1977 {
Jamie Madille0472f32018-11-27 16:32:45 -05001978 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001979 return false;
1980 }
1981
Olli Etuaho41997e72016-03-10 13:38:39 +02001982 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001983}
1984
Jamie Madilld7576732017-08-26 18:49:50 -04001985bool ValidateIsVertexArrayOES(Context *context, GLuint array)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001986{
1987 if (!context->getExtensions().vertexArrayObject)
1988 {
Jamie Madille0472f32018-11-27 16:32:45 -05001989 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001990 return false;
1991 }
1992
1993 return true;
1994}
Geoff Langc5629752015-12-07 16:29:04 -05001995
1996bool ValidateProgramBinaryOES(Context *context,
1997 GLuint program,
1998 GLenum binaryFormat,
1999 const void *binary,
2000 GLint length)
2001{
2002 if (!context->getExtensions().getProgramBinary)
2003 {
Jamie Madille0472f32018-11-27 16:32:45 -05002004 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05002005 return false;
2006 }
2007
2008 return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
2009}
2010
2011bool ValidateGetProgramBinaryOES(Context *context,
2012 GLuint program,
2013 GLsizei bufSize,
2014 GLsizei *length,
2015 GLenum *binaryFormat,
2016 void *binary)
2017{
2018 if (!context->getExtensions().getProgramBinary)
2019 {
Jamie Madille0472f32018-11-27 16:32:45 -05002020 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05002021 return false;
2022 }
2023
2024 return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
2025}
Geoff Lange102fee2015-12-10 11:23:30 -05002026
Geoff Lang70d0f492015-12-10 17:45:46 -05002027static bool ValidDebugSource(GLenum source, bool mustBeThirdPartyOrApplication)
2028{
2029 switch (source)
2030 {
2031 case GL_DEBUG_SOURCE_API:
2032 case GL_DEBUG_SOURCE_SHADER_COMPILER:
2033 case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
2034 case GL_DEBUG_SOURCE_OTHER:
2035 // Only THIRD_PARTY and APPLICATION sources are allowed to be manually inserted
2036 return !mustBeThirdPartyOrApplication;
2037
2038 case GL_DEBUG_SOURCE_THIRD_PARTY:
2039 case GL_DEBUG_SOURCE_APPLICATION:
2040 return true;
2041
2042 default:
2043 return false;
2044 }
2045}
2046
2047static bool ValidDebugType(GLenum type)
2048{
2049 switch (type)
2050 {
2051 case GL_DEBUG_TYPE_ERROR:
2052 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
2053 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
2054 case GL_DEBUG_TYPE_PERFORMANCE:
2055 case GL_DEBUG_TYPE_PORTABILITY:
2056 case GL_DEBUG_TYPE_OTHER:
2057 case GL_DEBUG_TYPE_MARKER:
2058 case GL_DEBUG_TYPE_PUSH_GROUP:
2059 case GL_DEBUG_TYPE_POP_GROUP:
2060 return true;
2061
2062 default:
2063 return false;
2064 }
2065}
2066
2067static bool ValidDebugSeverity(GLenum severity)
2068{
2069 switch (severity)
2070 {
2071 case GL_DEBUG_SEVERITY_HIGH:
2072 case GL_DEBUG_SEVERITY_MEDIUM:
2073 case GL_DEBUG_SEVERITY_LOW:
2074 case GL_DEBUG_SEVERITY_NOTIFICATION:
2075 return true;
2076
2077 default:
2078 return false;
2079 }
2080}
2081
Geoff Lange102fee2015-12-10 11:23:30 -05002082bool ValidateDebugMessageControlKHR(Context *context,
2083 GLenum source,
2084 GLenum type,
2085 GLenum severity,
2086 GLsizei count,
2087 const GLuint *ids,
2088 GLboolean enabled)
2089{
2090 if (!context->getExtensions().debug)
2091 {
Jamie Madille0472f32018-11-27 16:32:45 -05002092 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002093 return false;
2094 }
2095
Geoff Lang70d0f492015-12-10 17:45:46 -05002096 if (!ValidDebugSource(source, false) && source != GL_DONT_CARE)
2097 {
Jamie Madille0472f32018-11-27 16:32:45 -05002098 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002099 return false;
2100 }
2101
2102 if (!ValidDebugType(type) && type != GL_DONT_CARE)
2103 {
Jamie Madille0472f32018-11-27 16:32:45 -05002104 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002105 return false;
2106 }
2107
2108 if (!ValidDebugSeverity(severity) && severity != GL_DONT_CARE)
2109 {
Jamie Madille0472f32018-11-27 16:32:45 -05002110 context->validationError(GL_INVALID_ENUM, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002111 return false;
2112 }
2113
2114 if (count > 0)
2115 {
2116 if (source == GL_DONT_CARE || type == GL_DONT_CARE)
2117 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002118 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSourceType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002119 return false;
2120 }
2121
2122 if (severity != GL_DONT_CARE)
2123 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002124 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002125 return false;
2126 }
2127 }
2128
Geoff Lange102fee2015-12-10 11:23:30 -05002129 return true;
2130}
2131
2132bool ValidateDebugMessageInsertKHR(Context *context,
2133 GLenum source,
2134 GLenum type,
2135 GLuint id,
2136 GLenum severity,
2137 GLsizei length,
2138 const GLchar *buf)
2139{
2140 if (!context->getExtensions().debug)
2141 {
Jamie Madille0472f32018-11-27 16:32:45 -05002142 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002143 return false;
2144 }
2145
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002146 if (!context->getState().getDebug().isOutputEnabled())
Geoff Lang70d0f492015-12-10 17:45:46 -05002147 {
2148 // If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are discarded and do
2149 // not generate an error.
2150 return false;
2151 }
2152
2153 if (!ValidDebugSeverity(severity))
2154 {
Jamie Madille0472f32018-11-27 16:32:45 -05002155 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002156 return false;
2157 }
2158
2159 if (!ValidDebugType(type))
2160 {
Jamie Madille0472f32018-11-27 16:32:45 -05002161 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002162 return false;
2163 }
2164
2165 if (!ValidDebugSource(source, true))
2166 {
Jamie Madille0472f32018-11-27 16:32:45 -05002167 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002168 return false;
2169 }
2170
2171 size_t messageLength = (length < 0) ? strlen(buf) : length;
2172 if (messageLength > context->getExtensions().maxDebugMessageLength)
2173 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002174 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002175 return false;
2176 }
2177
Geoff Lange102fee2015-12-10 11:23:30 -05002178 return true;
2179}
2180
2181bool ValidateDebugMessageCallbackKHR(Context *context,
2182 GLDEBUGPROCKHR callback,
2183 const void *userParam)
2184{
2185 if (!context->getExtensions().debug)
2186 {
Jamie Madille0472f32018-11-27 16:32:45 -05002187 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002188 return false;
2189 }
2190
Geoff Lange102fee2015-12-10 11:23:30 -05002191 return true;
2192}
2193
2194bool ValidateGetDebugMessageLogKHR(Context *context,
2195 GLuint count,
2196 GLsizei bufSize,
2197 GLenum *sources,
2198 GLenum *types,
2199 GLuint *ids,
2200 GLenum *severities,
2201 GLsizei *lengths,
2202 GLchar *messageLog)
2203{
2204 if (!context->getExtensions().debug)
2205 {
Jamie Madille0472f32018-11-27 16:32:45 -05002206 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002207 return false;
2208 }
2209
Geoff Lang70d0f492015-12-10 17:45:46 -05002210 if (bufSize < 0 && messageLog != nullptr)
2211 {
Jamie Madille0472f32018-11-27 16:32:45 -05002212 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002213 return false;
2214 }
2215
Geoff Lange102fee2015-12-10 11:23:30 -05002216 return true;
2217}
2218
2219bool ValidatePushDebugGroupKHR(Context *context,
2220 GLenum source,
2221 GLuint id,
2222 GLsizei length,
2223 const GLchar *message)
2224{
2225 if (!context->getExtensions().debug)
2226 {
Jamie Madille0472f32018-11-27 16:32:45 -05002227 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002228 return false;
2229 }
2230
Geoff Lang70d0f492015-12-10 17:45:46 -05002231 if (!ValidDebugSource(source, true))
2232 {
Jamie Madille0472f32018-11-27 16:32:45 -05002233 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002234 return false;
2235 }
2236
2237 size_t messageLength = (length < 0) ? strlen(message) : length;
2238 if (messageLength > context->getExtensions().maxDebugMessageLength)
2239 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002240 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002241 return false;
2242 }
2243
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002244 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002245 if (currentStackSize >= context->getExtensions().maxDebugGroupStackDepth)
2246 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002247 context->validationError(GL_STACK_OVERFLOW, kExceedsMaxDebugGroupStackDepth);
Geoff Lang70d0f492015-12-10 17:45:46 -05002248 return false;
2249 }
2250
Geoff Lange102fee2015-12-10 11:23:30 -05002251 return true;
2252}
2253
2254bool ValidatePopDebugGroupKHR(Context *context)
2255{
2256 if (!context->getExtensions().debug)
2257 {
Jamie Madille0472f32018-11-27 16:32:45 -05002258 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002259 return false;
2260 }
2261
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002262 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002263 if (currentStackSize <= 1)
2264 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002265 context->validationError(GL_STACK_UNDERFLOW, kCannotPopDefaultDebugGroup);
Geoff Lang70d0f492015-12-10 17:45:46 -05002266 return false;
2267 }
2268
2269 return true;
2270}
2271
2272static bool ValidateObjectIdentifierAndName(Context *context, GLenum identifier, GLuint name)
2273{
2274 switch (identifier)
2275 {
2276 case GL_BUFFER:
2277 if (context->getBuffer(name) == nullptr)
2278 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002279 context->validationError(GL_INVALID_VALUE, kInvalidBufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002280 return false;
2281 }
2282 return true;
2283
2284 case GL_SHADER:
2285 if (context->getShader(name) == nullptr)
2286 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002287 context->validationError(GL_INVALID_VALUE, kInvalidShaderName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002288 return false;
2289 }
2290 return true;
2291
2292 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002293 if (context->getProgramNoResolveLink(name) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002294 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002295 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002296 return false;
2297 }
2298 return true;
2299
2300 case GL_VERTEX_ARRAY:
2301 if (context->getVertexArray(name) == nullptr)
2302 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002303 context->validationError(GL_INVALID_VALUE, kInvalidVertexArrayName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002304 return false;
2305 }
2306 return true;
2307
2308 case GL_QUERY:
2309 if (context->getQuery(name) == nullptr)
2310 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002311 context->validationError(GL_INVALID_VALUE, kInvalidQueryName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002312 return false;
2313 }
2314 return true;
2315
2316 case GL_TRANSFORM_FEEDBACK:
2317 if (context->getTransformFeedback(name) == nullptr)
2318 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002319 context->validationError(GL_INVALID_VALUE, kInvalidTransformFeedbackName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002320 return false;
2321 }
2322 return true;
2323
2324 case GL_SAMPLER:
2325 if (context->getSampler(name) == nullptr)
2326 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002327 context->validationError(GL_INVALID_VALUE, kInvalidSamplerName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002328 return false;
2329 }
2330 return true;
2331
2332 case GL_TEXTURE:
2333 if (context->getTexture(name) == nullptr)
2334 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002335 context->validationError(GL_INVALID_VALUE, kInvalidTextureName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002336 return false;
2337 }
2338 return true;
2339
2340 case GL_RENDERBUFFER:
2341 if (context->getRenderbuffer(name) == nullptr)
2342 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002343 context->validationError(GL_INVALID_VALUE, kInvalidRenderbufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002344 return false;
2345 }
2346 return true;
2347
2348 case GL_FRAMEBUFFER:
2349 if (context->getFramebuffer(name) == nullptr)
2350 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002351 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002352 return false;
2353 }
2354 return true;
2355
2356 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05002357 context->validationError(GL_INVALID_ENUM, kInvalidIndentifier);
Geoff Lang70d0f492015-12-10 17:45:46 -05002358 return false;
2359 }
Geoff Lange102fee2015-12-10 11:23:30 -05002360}
2361
Martin Radev9d901792016-07-15 15:58:58 +03002362static bool ValidateLabelLength(Context *context, GLsizei length, const GLchar *label)
2363{
2364 size_t labelLength = 0;
2365
2366 if (length < 0)
2367 {
2368 if (label != nullptr)
2369 {
2370 labelLength = strlen(label);
2371 }
2372 }
2373 else
2374 {
2375 labelLength = static_cast<size_t>(length);
2376 }
2377
2378 if (labelLength > context->getExtensions().maxLabelLength)
2379 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002380 context->validationError(GL_INVALID_VALUE, kExceedsMaxLabelLength);
Martin Radev9d901792016-07-15 15:58:58 +03002381 return false;
2382 }
2383
2384 return true;
2385}
2386
Geoff Lange102fee2015-12-10 11:23:30 -05002387bool ValidateObjectLabelKHR(Context *context,
2388 GLenum identifier,
2389 GLuint name,
2390 GLsizei length,
2391 const GLchar *label)
2392{
2393 if (!context->getExtensions().debug)
2394 {
Jamie Madille0472f32018-11-27 16:32:45 -05002395 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002396 return false;
2397 }
2398
Geoff Lang70d0f492015-12-10 17:45:46 -05002399 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2400 {
2401 return false;
2402 }
2403
Martin Radev9d901792016-07-15 15:58:58 +03002404 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002405 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002406 return false;
2407 }
2408
Geoff Lange102fee2015-12-10 11:23:30 -05002409 return true;
2410}
2411
2412bool ValidateGetObjectLabelKHR(Context *context,
2413 GLenum identifier,
2414 GLuint name,
2415 GLsizei bufSize,
2416 GLsizei *length,
2417 GLchar *label)
2418{
2419 if (!context->getExtensions().debug)
2420 {
Jamie Madille0472f32018-11-27 16:32:45 -05002421 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002422 return false;
2423 }
2424
Geoff Lang70d0f492015-12-10 17:45:46 -05002425 if (bufSize < 0)
2426 {
Jamie Madille0472f32018-11-27 16:32:45 -05002427 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002428 return false;
2429 }
2430
2431 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2432 {
2433 return false;
2434 }
2435
Martin Radev9d901792016-07-15 15:58:58 +03002436 return true;
Geoff Lang70d0f492015-12-10 17:45:46 -05002437}
2438
2439static bool ValidateObjectPtrName(Context *context, const void *ptr)
2440{
Jamie Madill70b5bb02017-08-28 13:32:37 -04002441 if (context->getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr))) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002442 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002443 context->validationError(GL_INVALID_VALUE, kInvalidSyncPointer);
Geoff Lang70d0f492015-12-10 17:45:46 -05002444 return false;
2445 }
2446
Geoff Lange102fee2015-12-10 11:23:30 -05002447 return true;
2448}
2449
2450bool ValidateObjectPtrLabelKHR(Context *context,
2451 const void *ptr,
2452 GLsizei length,
2453 const GLchar *label)
2454{
2455 if (!context->getExtensions().debug)
2456 {
Jamie Madille0472f32018-11-27 16:32:45 -05002457 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002458 return false;
2459 }
2460
Geoff Lang70d0f492015-12-10 17:45:46 -05002461 if (!ValidateObjectPtrName(context, ptr))
2462 {
2463 return false;
2464 }
2465
Martin Radev9d901792016-07-15 15:58:58 +03002466 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002467 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002468 return false;
2469 }
2470
Geoff Lange102fee2015-12-10 11:23:30 -05002471 return true;
2472}
2473
2474bool ValidateGetObjectPtrLabelKHR(Context *context,
2475 const void *ptr,
2476 GLsizei bufSize,
2477 GLsizei *length,
2478 GLchar *label)
2479{
2480 if (!context->getExtensions().debug)
2481 {
Jamie Madille0472f32018-11-27 16:32:45 -05002482 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002483 return false;
2484 }
2485
Geoff Lang70d0f492015-12-10 17:45:46 -05002486 if (bufSize < 0)
2487 {
Jamie Madille0472f32018-11-27 16:32:45 -05002488 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002489 return false;
2490 }
2491
2492 if (!ValidateObjectPtrName(context, ptr))
2493 {
2494 return false;
2495 }
2496
Martin Radev9d901792016-07-15 15:58:58 +03002497 return true;
Geoff Lange102fee2015-12-10 11:23:30 -05002498}
2499
2500bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params)
2501{
2502 if (!context->getExtensions().debug)
2503 {
Jamie Madille0472f32018-11-27 16:32:45 -05002504 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002505 return false;
2506 }
2507
Geoff Lang70d0f492015-12-10 17:45:46 -05002508 // TODO: represent this in Context::getQueryParameterInfo.
2509 switch (pname)
2510 {
2511 case GL_DEBUG_CALLBACK_FUNCTION:
2512 case GL_DEBUG_CALLBACK_USER_PARAM:
2513 break;
2514
2515 default:
Jamie Madille0472f32018-11-27 16:32:45 -05002516 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang70d0f492015-12-10 17:45:46 -05002517 return false;
2518 }
2519
Geoff Lange102fee2015-12-10 11:23:30 -05002520 return true;
2521}
Jamie Madillc29968b2016-01-20 11:17:23 -05002522
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002523bool ValidateGetPointervRobustANGLERobustANGLE(Context *context,
2524 GLenum pname,
2525 GLsizei bufSize,
2526 GLsizei *length,
2527 void **params)
2528{
2529 UNIMPLEMENTED();
2530 return false;
2531}
2532
Jamie Madillc29968b2016-01-20 11:17:23 -05002533bool ValidateBlitFramebufferANGLE(Context *context,
2534 GLint srcX0,
2535 GLint srcY0,
2536 GLint srcX1,
2537 GLint srcY1,
2538 GLint dstX0,
2539 GLint dstY0,
2540 GLint dstX1,
2541 GLint dstY1,
2542 GLbitfield mask,
2543 GLenum filter)
2544{
2545 if (!context->getExtensions().framebufferBlit)
2546 {
Jamie Madille0472f32018-11-27 16:32:45 -05002547 context->validationError(GL_INVALID_OPERATION, kBlitExtensionNotAvailable);
Jamie Madillc29968b2016-01-20 11:17:23 -05002548 return false;
2549 }
2550
2551 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
2552 {
2553 // TODO(jmadill): Determine if this should be available on other implementations.
Jamie Madille0472f32018-11-27 16:32:45 -05002554 context->validationError(GL_INVALID_OPERATION, kBlitExtensionScaleOrFlip);
Jamie Madillc29968b2016-01-20 11:17:23 -05002555 return false;
2556 }
2557
2558 if (filter == GL_LINEAR)
2559 {
Jamie Madille0472f32018-11-27 16:32:45 -05002560 context->validationError(GL_INVALID_ENUM, kBlitExtensionLinear);
Jamie Madillc29968b2016-01-20 11:17:23 -05002561 return false;
2562 }
2563
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002564 Framebuffer *readFramebuffer = context->getState().getReadFramebuffer();
2565 Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002566
2567 if (mask & GL_COLOR_BUFFER_BIT)
2568 {
2569 const FramebufferAttachment *readColorAttachment = readFramebuffer->getReadColorbuffer();
2570 const FramebufferAttachment *drawColorAttachment = drawFramebuffer->getFirstColorbuffer();
2571
2572 if (readColorAttachment && drawColorAttachment)
2573 {
2574 if (!(readColorAttachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002575 readColorAttachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002576 readColorAttachment->type() != GL_RENDERBUFFER &&
2577 readColorAttachment->type() != GL_FRAMEBUFFER_DEFAULT)
2578 {
Jamie Madill610640f2018-11-21 17:28:41 -05002579 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002580 kBlitExtensionFromInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002581 return false;
2582 }
2583
Geoff Langa15472a2015-08-11 11:48:03 -04002584 for (size_t drawbufferIdx = 0;
2585 drawbufferIdx < drawFramebuffer->getDrawbufferStateCount(); ++drawbufferIdx)
Jamie Madillc29968b2016-01-20 11:17:23 -05002586 {
Geoff Langa15472a2015-08-11 11:48:03 -04002587 const FramebufferAttachment *attachment =
2588 drawFramebuffer->getDrawBuffer(drawbufferIdx);
2589 if (attachment)
Jamie Madillc29968b2016-01-20 11:17:23 -05002590 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002591 if (!(attachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002592 attachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002593 attachment->type() != GL_RENDERBUFFER &&
2594 attachment->type() != GL_FRAMEBUFFER_DEFAULT)
2595 {
Jamie Madill610640f2018-11-21 17:28:41 -05002596 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002597 kBlitExtensionToInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002598 return false;
2599 }
2600
2601 // Return an error if the destination formats do not match
Kenneth Russell69382852017-07-21 16:38:44 -04002602 if (!Format::EquivalentForBlit(attachment->getFormat(),
2603 readColorAttachment->getFormat()))
Jamie Madillc29968b2016-01-20 11:17:23 -05002604 {
Jamie Madill610640f2018-11-21 17:28:41 -05002605 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002606 kBlitExtensionFormatMismatch);
Jamie Madillc29968b2016-01-20 11:17:23 -05002607 return false;
2608 }
2609 }
2610 }
2611
Jamie Madill427064d2018-04-13 16:20:34 -04002612 GLint samples = readFramebuffer->getSamples(context);
Jamie Madille98b1b52018-03-08 09:47:23 -05002613 if (samples != 0 &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002614 IsPartialBlit(context, readColorAttachment, drawColorAttachment, srcX0, srcY0,
2615 srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
2616 {
Jamie Madill610640f2018-11-21 17:28:41 -05002617 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002618 kBlitExtensionMultisampledWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002619 return false;
2620 }
2621 }
2622 }
2623
2624 GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
2625 GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
2626 for (size_t i = 0; i < 2; i++)
2627 {
2628 if (mask & masks[i])
2629 {
2630 const FramebufferAttachment *readBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002631 readFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002632 const FramebufferAttachment *drawBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002633 drawFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002634
2635 if (readBuffer && drawBuffer)
2636 {
2637 if (IsPartialBlit(context, readBuffer, drawBuffer, srcX0, srcY0, srcX1, srcY1,
2638 dstX0, dstY0, dstX1, dstY1))
2639 {
2640 // only whole-buffer copies are permitted
Jamie Madill610640f2018-11-21 17:28:41 -05002641 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002642 kBlitExtensionDepthStencilWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002643 return false;
2644 }
2645
2646 if (readBuffer->getSamples() != 0 || drawBuffer->getSamples() != 0)
2647 {
Jamie Madill610640f2018-11-21 17:28:41 -05002648 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002649 kBlitExtensionMultisampledDepthOrStencil);
Jamie Madillc29968b2016-01-20 11:17:23 -05002650 return false;
2651 }
2652 }
2653 }
2654 }
2655
2656 return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
2657 dstX1, dstY1, mask, filter);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002658}
Jamie Madillc29968b2016-01-20 11:17:23 -05002659
Jamie Madill5b772312018-03-08 20:28:32 -05002660bool ValidateClear(Context *context, GLbitfield mask)
Jamie Madillc29968b2016-01-20 11:17:23 -05002661{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002662 Framebuffer *fbo = context->getState().getDrawFramebuffer();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002663 const Extensions &extensions = context->getExtensions();
Jamie Madille98b1b52018-03-08 09:47:23 -05002664
Jamie Madill427064d2018-04-13 16:20:34 -04002665 if (!ValidateFramebufferComplete(context, fbo))
Jamie Madillc29968b2016-01-20 11:17:23 -05002666 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002667 return false;
2668 }
2669
2670 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
2671 {
Jamie Madille0472f32018-11-27 16:32:45 -05002672 context->validationError(GL_INVALID_VALUE, kInvalidClearMask);
Jamie Madillc29968b2016-01-20 11:17:23 -05002673 return false;
2674 }
2675
Olli Etuaho94c91a92018-07-19 15:10:24 +03002676 if (extensions.webglCompatibility && (mask & GL_COLOR_BUFFER_BIT) != 0)
Geoff Lang76e65652017-03-27 14:58:02 -04002677 {
2678 constexpr GLenum validComponentTypes[] = {GL_FLOAT, GL_UNSIGNED_NORMALIZED,
2679 GL_SIGNED_NORMALIZED};
2680
Corentin Wallez59c41592017-07-11 13:19:54 -04002681 for (GLuint drawBufferIdx = 0; drawBufferIdx < fbo->getDrawbufferStateCount();
Geoff Lang76e65652017-03-27 14:58:02 -04002682 drawBufferIdx++)
2683 {
2684 if (!ValidateWebGLFramebufferAttachmentClearType(
2685 context, drawBufferIdx, validComponentTypes, ArraySize(validComponentTypes)))
2686 {
2687 return false;
2688 }
2689 }
2690 }
2691
Mingyu Hu7d64c482019-03-12 14:27:40 -07002692 if (extensions.multiview2 && extensions.disjointTimerQuery)
Olli Etuaho94c91a92018-07-19 15:10:24 +03002693 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002694 const State &state = context->getState();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002695 Framebuffer *framebuffer = state.getDrawFramebuffer();
2696 if (framebuffer->getNumViews() > 1 && state.isQueryActive(QueryType::TimeElapsed))
2697 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002698 context->validationError(GL_INVALID_OPERATION, kMultiviewTimerQuery);
Olli Etuaho94c91a92018-07-19 15:10:24 +03002699 return false;
2700 }
2701 }
2702
Jamie Madillc29968b2016-01-20 11:17:23 -05002703 return true;
2704}
2705
Jamie Madill5b772312018-03-08 20:28:32 -05002706bool ValidateDrawBuffersEXT(Context *context, GLsizei n, const GLenum *bufs)
Jamie Madillc29968b2016-01-20 11:17:23 -05002707{
2708 if (!context->getExtensions().drawBuffers)
2709 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002710 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05002711 return false;
2712 }
2713
2714 return ValidateDrawBuffersBase(context, n, bufs);
2715}
2716
Jamie Madill73a84962016-02-12 09:27:23 -05002717bool ValidateTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002718 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002719 GLint level,
2720 GLint internalformat,
2721 GLsizei width,
2722 GLsizei height,
2723 GLint border,
2724 GLenum format,
2725 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002726 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002727{
Martin Radev1be913c2016-07-11 17:59:16 +03002728 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002729 {
2730 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
Geoff Langff5b2d52016-09-07 11:32:23 -04002731 0, 0, width, height, border, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002732 }
2733
Martin Radev1be913c2016-07-11 17:59:16 +03002734 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002735 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002736 0, 0, width, height, 1, border, format, type, -1,
2737 pixels);
2738}
2739
Brandon Jones416aaf92018-04-10 08:10:16 -07002740bool ValidateTexImage2DRobustANGLE(Context *context,
2741 TextureTarget target,
2742 GLint level,
2743 GLint internalformat,
2744 GLsizei width,
2745 GLsizei height,
2746 GLint border,
2747 GLenum format,
2748 GLenum type,
2749 GLsizei bufSize,
2750 const void *pixels)
Geoff Langff5b2d52016-09-07 11:32:23 -04002751{
2752 if (!ValidateRobustEntryPoint(context, bufSize))
2753 {
2754 return false;
2755 }
2756
2757 if (context->getClientMajorVersion() < 3)
2758 {
2759 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
2760 0, 0, width, height, border, format, type, bufSize,
2761 pixels);
2762 }
2763
2764 ASSERT(context->getClientMajorVersion() >= 3);
2765 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
2766 0, 0, width, height, 1, border, format, type, bufSize,
2767 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002768}
2769
2770bool ValidateTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002771 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002772 GLint level,
2773 GLint xoffset,
2774 GLint yoffset,
2775 GLsizei width,
2776 GLsizei height,
2777 GLenum format,
2778 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002779 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002780{
2781
Martin Radev1be913c2016-07-11 17:59:16 +03002782 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002783 {
2784 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002785 yoffset, width, height, 0, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002786 }
2787
Martin Radev1be913c2016-07-11 17:59:16 +03002788 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002789 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002790 yoffset, 0, width, height, 1, 0, format, type, -1,
2791 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002792}
2793
Geoff Langc52f6f12016-10-14 10:18:00 -04002794bool ValidateTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002795 TextureTarget target,
Geoff Langc52f6f12016-10-14 10:18:00 -04002796 GLint level,
2797 GLint xoffset,
2798 GLint yoffset,
2799 GLsizei width,
2800 GLsizei height,
2801 GLenum format,
2802 GLenum type,
2803 GLsizei bufSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002804 const void *pixels)
Geoff Langc52f6f12016-10-14 10:18:00 -04002805{
2806 if (!ValidateRobustEntryPoint(context, bufSize))
2807 {
2808 return false;
2809 }
2810
2811 if (context->getClientMajorVersion() < 3)
2812 {
2813 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
2814 yoffset, width, height, 0, format, type, bufSize,
2815 pixels);
2816 }
2817
2818 ASSERT(context->getClientMajorVersion() >= 3);
2819 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
2820 yoffset, 0, width, height, 1, 0, format, type, bufSize,
2821 pixels);
2822}
2823
Jamie Madill73a84962016-02-12 09:27:23 -05002824bool ValidateCompressedTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002825 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002826 GLint level,
2827 GLenum internalformat,
2828 GLsizei width,
2829 GLsizei height,
2830 GLint border,
2831 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002832 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05002833{
Martin Radev1be913c2016-07-11 17:59:16 +03002834 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002835 {
2836 if (!ValidateES2TexImageParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002837 0, width, height, border, GL_NONE, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05002838 {
2839 return false;
2840 }
2841 }
2842 else
2843 {
Martin Radev1be913c2016-07-11 17:59:16 +03002844 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002845 if (!ValidateES3TexImage2DParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002846 0, 0, width, height, 1, border, GL_NONE, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05002847 data))
2848 {
2849 return false;
2850 }
2851 }
2852
Geoff Langca271392017-04-05 12:30:00 -04002853 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
Jamie Madillca2ff382018-07-11 09:01:17 -04002854
2855 GLuint blockSize = 0;
2856 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04002857 {
Jamie Madille0472f32018-11-27 16:32:45 -05002858 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04002859 return false;
2860 }
2861
Jamie Madillca2ff382018-07-11 09:01:17 -04002862 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05002863 {
Jamie Madille0472f32018-11-27 16:32:45 -05002864 context->validationError(GL_INVALID_VALUE, kCompressedTextureDimensionsMustMatchData);
Jamie Madill73a84962016-02-12 09:27:23 -05002865 return false;
2866 }
2867
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002868 if (target == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002869 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002870 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002871 return false;
2872 }
2873
Jamie Madill73a84962016-02-12 09:27:23 -05002874 return true;
2875}
2876
Corentin Wallezb2931602017-04-11 15:58:57 -04002877bool ValidateCompressedTexImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002878 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04002879 GLint level,
2880 GLenum internalformat,
2881 GLsizei width,
2882 GLsizei height,
2883 GLint border,
2884 GLsizei imageSize,
2885 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002886 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04002887{
2888 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
2889 {
2890 return false;
2891 }
2892
2893 return ValidateCompressedTexImage2D(context, target, level, internalformat, width, height,
2894 border, imageSize, data);
2895}
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002896
Corentin Wallezb2931602017-04-11 15:58:57 -04002897bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002898 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04002899 GLint level,
2900 GLint xoffset,
2901 GLint yoffset,
2902 GLsizei width,
2903 GLsizei height,
2904 GLenum format,
2905 GLsizei imageSize,
2906 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002907 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04002908{
2909 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
2910 {
2911 return false;
2912 }
2913
2914 return ValidateCompressedTexSubImage2D(context, target, level, xoffset, yoffset, width, height,
2915 format, imageSize, data);
2916}
2917
Jamie Madill73a84962016-02-12 09:27:23 -05002918bool ValidateCompressedTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002919 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002920 GLint level,
2921 GLint xoffset,
2922 GLint yoffset,
2923 GLsizei width,
2924 GLsizei height,
2925 GLenum format,
2926 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002927 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05002928{
Martin Radev1be913c2016-07-11 17:59:16 +03002929 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002930 {
2931 if (!ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04002932 yoffset, width, height, 0, format, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05002933 {
2934 return false;
2935 }
2936 }
2937 else
2938 {
Martin Radev1be913c2016-07-11 17:59:16 +03002939 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002940 if (!ValidateES3TexImage2DParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04002941 yoffset, 0, width, height, 1, 0, format, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05002942 data))
2943 {
2944 return false;
2945 }
2946 }
2947
Geoff Langca271392017-04-05 12:30:00 -04002948 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
Jamie Madillca2ff382018-07-11 09:01:17 -04002949 GLuint blockSize = 0;
2950 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04002951 {
Jamie Madille0472f32018-11-27 16:32:45 -05002952 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04002953 return false;
2954 }
2955
Jamie Madillca2ff382018-07-11 09:01:17 -04002956 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05002957 {
Jamie Madille0472f32018-11-27 16:32:45 -05002958 context->validationError(GL_INVALID_VALUE, kInvalidCompressedImageSize);
Jamie Madill73a84962016-02-12 09:27:23 -05002959 return false;
2960 }
2961
2962 return true;
2963}
2964
Corentin Wallez336129f2017-10-17 15:55:40 -04002965bool ValidateGetBufferPointervOES(Context *context,
2966 BufferBinding target,
2967 GLenum pname,
2968 void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03002969{
Jamie Madillc3e37312018-11-30 15:25:39 -05002970 if (!context->getExtensions().mapBuffer)
2971 {
2972 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
2973 return false;
2974 }
2975
Geoff Lang496c02d2016-10-20 11:38:11 -07002976 return ValidateGetBufferPointervBase(context, target, pname, nullptr, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03002977}
2978
Corentin Wallez336129f2017-10-17 15:55:40 -04002979bool ValidateMapBufferOES(Context *context, BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03002980{
2981 if (!context->getExtensions().mapBuffer)
2982 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002983 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03002984 return false;
2985 }
2986
Corentin Walleze4477002017-12-01 14:39:58 -05002987 if (!context->isValidBufferBinding(target))
Olli Etuaho4f667482016-03-30 15:56:35 +03002988 {
Jamie Madille0472f32018-11-27 16:32:45 -05002989 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Olli Etuaho4f667482016-03-30 15:56:35 +03002990 return false;
2991 }
2992
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002993 Buffer *buffer = context->getState().getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002994
2995 if (buffer == nullptr)
2996 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002997 context->validationError(GL_INVALID_OPERATION, kBufferNotMappable);
Olli Etuaho4f667482016-03-30 15:56:35 +03002998 return false;
2999 }
3000
3001 if (access != GL_WRITE_ONLY_OES)
3002 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003003 context->validationError(GL_INVALID_ENUM, kInvalidAccessBits);
Olli Etuaho4f667482016-03-30 15:56:35 +03003004 return false;
3005 }
3006
3007 if (buffer->isMapped())
3008 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003009 context->validationError(GL_INVALID_OPERATION, kBufferAlreadyMapped);
Olli Etuaho4f667482016-03-30 15:56:35 +03003010 return false;
3011 }
3012
Geoff Lang79f71042017-08-14 16:43:43 -04003013 return ValidateMapBufferBase(context, target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003014}
3015
Corentin Wallez336129f2017-10-17 15:55:40 -04003016bool ValidateUnmapBufferOES(Context *context, BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003017{
3018 if (!context->getExtensions().mapBuffer)
3019 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003020 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003021 return false;
3022 }
3023
3024 return ValidateUnmapBufferBase(context, target);
3025}
3026
3027bool ValidateMapBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003028 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003029 GLintptr offset,
3030 GLsizeiptr length,
3031 GLbitfield access)
3032{
3033 if (!context->getExtensions().mapBufferRange)
3034 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003035 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003036 return false;
3037 }
3038
3039 return ValidateMapBufferRangeBase(context, target, offset, length, access);
3040}
3041
Michael Spang7a8c3e52019-04-03 14:49:57 -04003042bool ValidateBufferStorageMemEXT(Context *context,
3043 TextureType target,
3044 GLsizeiptr size,
3045 GLuint memory,
3046 GLuint64 offset)
3047{
3048 if (!context->getExtensions().memoryObject)
3049 {
3050 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3051 return false;
3052 }
3053
3054 UNIMPLEMENTED();
3055 return false;
3056}
3057
3058bool ValidateCreateMemoryObjectsEXT(Context *context, GLsizei n, GLuint *memoryObjects)
3059{
3060 if (!context->getExtensions().memoryObject)
3061 {
3062 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3063 return false;
3064 }
3065
Michael Spangfb201c52019-04-03 14:57:35 -04003066 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003067}
3068
3069bool ValidateDeleteMemoryObjectsEXT(Context *context, GLsizei n, const GLuint *memoryObjects)
3070{
3071 if (!context->getExtensions().memoryObject)
3072 {
3073 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3074 return false;
3075 }
3076
Michael Spangfb201c52019-04-03 14:57:35 -04003077 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003078}
3079
3080bool ValidateGetMemoryObjectParameterivEXT(Context *context,
3081 GLuint memoryObject,
3082 GLenum pname,
3083 GLint *params)
3084{
3085 if (!context->getExtensions().memoryObject)
3086 {
3087 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3088 return false;
3089 }
3090
3091 UNIMPLEMENTED();
3092 return false;
3093}
3094
3095bool ValidateGetUnsignedBytevEXT(Context *context, GLenum pname, GLubyte *data)
3096{
3097 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3098 {
3099 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3100 return false;
3101 }
3102
3103 UNIMPLEMENTED();
3104 return false;
3105}
3106
3107bool ValidateGetUnsignedBytei_vEXT(Context *context, GLenum target, GLuint index, GLubyte *data)
3108{
3109 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3110 {
3111 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3112 return false;
3113 }
3114
3115 UNIMPLEMENTED();
3116 return false;
3117}
3118
3119bool ValidateIsMemoryObjectEXT(Context *context, GLuint memoryObject)
3120{
3121 if (!context->getExtensions().memoryObject)
3122 {
3123 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3124 return false;
3125 }
3126
Michael Spangfb201c52019-04-03 14:57:35 -04003127 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003128}
3129
3130bool ValidateMemoryObjectParameterivEXT(Context *context,
3131 GLuint memoryObject,
3132 GLenum pname,
3133 const GLint *params)
3134{
3135 if (!context->getExtensions().memoryObject)
3136 {
3137 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3138 return false;
3139 }
3140
3141 UNIMPLEMENTED();
3142 return false;
3143}
3144
3145bool ValidateTexStorageMem2DEXT(Context *context,
3146 TextureType target,
3147 GLsizei levels,
3148 GLenum internalFormat,
3149 GLsizei width,
3150 GLsizei height,
3151 GLuint memory,
3152 GLuint64 offset)
3153{
3154 if (!context->getExtensions().memoryObject)
3155 {
3156 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3157 return false;
3158 }
3159
3160 UNIMPLEMENTED();
3161 return false;
3162}
3163
3164bool ValidateTexStorageMem3DEXT(Context *context,
3165 TextureType target,
3166 GLsizei levels,
3167 GLenum internalFormat,
3168 GLsizei width,
3169 GLsizei height,
3170 GLsizei depth,
3171 GLuint memory,
3172 GLuint64 offset)
3173{
3174 if (!context->getExtensions().memoryObject)
3175 {
3176 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3177 return false;
3178 }
3179
3180 UNIMPLEMENTED();
3181 return false;
3182}
3183
Michael Spang9de3ddb2019-04-03 16:23:40 -04003184bool ValidateImportMemoryFdEXT(Context *context,
3185 GLuint memory,
3186 GLuint64 size,
Michael Spange0da9ce2019-04-16 14:34:51 -04003187 HandleType handleType,
Michael Spang9de3ddb2019-04-03 16:23:40 -04003188 GLint fd)
3189{
3190 if (!context->getExtensions().memoryObjectFd)
3191 {
3192 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3193 return false;
3194 }
3195
3196 UNIMPLEMENTED();
3197 return false;
3198}
3199
Michael Spang7a8c3e52019-04-03 14:49:57 -04003200bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores)
3201{
3202 if (!context->getExtensions().semaphore)
3203 {
3204 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3205 return false;
3206 }
3207
3208 UNIMPLEMENTED();
3209 return false;
3210}
3211
3212bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores)
3213{
3214 if (!context->getExtensions().semaphore)
3215 {
3216 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3217 return false;
3218 }
3219
3220 UNIMPLEMENTED();
3221 return false;
3222}
3223
3224bool ValidateGetSemaphoreParameterui64vEXT(Context *context,
3225 GLuint semaphore,
3226 GLenum pname,
3227 GLuint64 *params)
3228{
3229 if (!context->getExtensions().semaphore)
3230 {
3231 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3232 return false;
3233 }
3234
3235 UNIMPLEMENTED();
3236 return false;
3237}
3238
3239bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore)
3240{
3241 if (!context->getExtensions().semaphore)
3242 {
3243 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3244 return false;
3245 }
3246
3247 UNIMPLEMENTED();
3248 return false;
3249}
3250
3251bool ValidateSemaphoreParameterui64vEXT(Context *context,
3252 GLuint semaphore,
3253 GLenum pname,
3254 const GLuint64 *params)
3255{
3256 if (!context->getExtensions().semaphore)
3257 {
3258 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3259 return false;
3260 }
3261
3262 UNIMPLEMENTED();
3263 return false;
3264}
3265
3266bool ValidateSignalSemaphoreEXT(Context *context,
3267 GLuint semaphore,
3268 GLuint numBufferBarriers,
3269 const GLuint *buffers,
3270 GLuint numTextureBarriers,
3271 const GLuint *textures,
3272 const GLenum *dstLayouts)
3273{
3274 if (!context->getExtensions().semaphore)
3275 {
3276 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3277 return false;
3278 }
3279
3280 UNIMPLEMENTED();
3281 return false;
3282}
3283
3284bool ValidateWaitSemaphoreEXT(Context *context,
3285 GLuint semaphore,
3286 GLuint numBufferBarriers,
3287 const GLuint *buffers,
3288 GLuint numTextureBarriers,
3289 const GLuint *textures,
3290 const GLenum *srcLayouts)
3291{
3292 if (!context->getExtensions().semaphore)
3293 {
3294 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3295 return false;
3296 }
3297
3298 UNIMPLEMENTED();
3299 return false;
3300}
3301
Michael Spange0da9ce2019-04-16 14:34:51 -04003302bool ValidateImportSemaphoreFdEXT(Context *context,
3303 GLuint semaphore,
3304 HandleType handleType,
3305 GLint fd)
Michael Spang9de3ddb2019-04-03 16:23:40 -04003306{
3307 if (!context->getExtensions().semaphoreFd)
3308 {
3309 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3310 return false;
3311 }
3312
3313 UNIMPLEMENTED();
3314 return false;
3315}
3316
Corentin Wallez336129f2017-10-17 15:55:40 -04003317bool ValidateMapBufferBase(Context *context, BufferBinding target)
Geoff Lang79f71042017-08-14 16:43:43 -04003318{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003319 Buffer *buffer = context->getState().getTargetBuffer(target);
Geoff Lang79f71042017-08-14 16:43:43 -04003320 ASSERT(buffer != nullptr);
3321
3322 // Check if this buffer is currently being used as a transform feedback output buffer
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003323 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Lang79f71042017-08-14 16:43:43 -04003324 if (transformFeedback != nullptr && transformFeedback->isActive())
3325 {
3326 for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3327 {
3328 const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
3329 if (transformFeedbackBuffer.get() == buffer)
3330 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003331 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
Geoff Lang79f71042017-08-14 16:43:43 -04003332 return false;
3333 }
3334 }
3335 }
3336
James Darpiniane8a93c62018-01-04 18:02:24 -08003337 if (context->getExtensions().webglCompatibility &&
3338 buffer->isBoundForTransformFeedbackAndOtherUse())
3339 {
Jamie Madille0472f32018-11-27 16:32:45 -05003340 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08003341 return false;
3342 }
3343
Geoff Lang79f71042017-08-14 16:43:43 -04003344 return true;
3345}
3346
Olli Etuaho4f667482016-03-30 15:56:35 +03003347bool ValidateFlushMappedBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003348 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003349 GLintptr offset,
3350 GLsizeiptr length)
3351{
3352 if (!context->getExtensions().mapBufferRange)
3353 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003354 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003355 return false;
3356 }
3357
3358 return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
3359}
3360
Geoff Langd8605522016-04-13 10:19:12 -04003361bool ValidateBindUniformLocationCHROMIUM(Context *context,
3362 GLuint program,
3363 GLint location,
3364 const GLchar *name)
3365{
3366 if (!context->getExtensions().bindUniformLocation)
3367 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003368 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langd8605522016-04-13 10:19:12 -04003369 return false;
3370 }
3371
3372 Program *programObject = GetValidProgram(context, program);
3373 if (!programObject)
3374 {
3375 return false;
3376 }
3377
3378 if (location < 0)
3379 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003380 context->validationError(GL_INVALID_VALUE, kNegativeLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003381 return false;
3382 }
3383
3384 const Caps &caps = context->getCaps();
3385 if (static_cast<size_t>(location) >=
3386 (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
3387 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003388 context->validationError(GL_INVALID_VALUE, kInvalidBindUniformLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003389 return false;
3390 }
3391
Geoff Langfc32e8b2017-05-31 14:16:59 -04003392 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
3393 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04003394 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04003395 {
Jamie Madille0472f32018-11-27 16:32:45 -05003396 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04003397 return false;
3398 }
3399
Geoff Langd8605522016-04-13 10:19:12 -04003400 if (strncmp(name, "gl_", 3) == 0)
3401 {
Jamie Madille0472f32018-11-27 16:32:45 -05003402 context->validationError(GL_INVALID_VALUE, kNameBeginsWithGL);
Geoff Langd8605522016-04-13 10:19:12 -04003403 return false;
3404 }
3405
3406 return true;
3407}
3408
Jamie Madille2e406c2016-06-02 13:04:10 -04003409bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03003410{
3411 if (!context->getExtensions().framebufferMixedSamples)
3412 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003413 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänena797e062016-05-12 15:23:40 +03003414 return false;
3415 }
3416 switch (components)
3417 {
3418 case GL_RGB:
3419 case GL_RGBA:
3420 case GL_ALPHA:
3421 case GL_NONE:
3422 break;
3423 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003424 context->validationError(GL_INVALID_ENUM, kInvalidCoverageComponents);
Sami Väisänena797e062016-05-12 15:23:40 +03003425 return false;
3426 }
3427
3428 return true;
3429}
3430
Sami Väisänene45e53b2016-05-25 10:36:04 +03003431// CHROMIUM_path_rendering
3432
Jamie Madill007530e2017-12-28 14:27:04 -05003433bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003434{
Jamie Madill007530e2017-12-28 14:27:04 -05003435 if (!ValidateMatrixMode(context, matrixMode))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003436 {
Sami Väisänene45e53b2016-05-25 10:36:04 +03003437 return false;
3438 }
Jamie Madill007530e2017-12-28 14:27:04 -05003439
Sami Väisänene45e53b2016-05-25 10:36:04 +03003440 if (matrix == nullptr)
3441 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003442 context->validationError(GL_INVALID_OPERATION, kInvalidPathMatrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003443 return false;
3444 }
Jamie Madill007530e2017-12-28 14:27:04 -05003445
Sami Väisänene45e53b2016-05-25 10:36:04 +03003446 return true;
3447}
3448
Jamie Madill007530e2017-12-28 14:27:04 -05003449bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003450{
Jamie Madill007530e2017-12-28 14:27:04 -05003451 return ValidateMatrixMode(context, matrixMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003452}
3453
Jamie Madill007530e2017-12-28 14:27:04 -05003454bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003455{
3456 if (!context->getExtensions().pathRendering)
3457 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003458 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003459 return false;
3460 }
3461
3462 // range = 0 is undefined in NV_path_rendering.
3463 // we add stricter semantic check here and require a non zero positive range.
3464 if (range <= 0)
3465 {
Jamie Madille0472f32018-11-27 16:32:45 -05003466 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003467 return false;
3468 }
3469
3470 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
3471 {
Jamie Madille0472f32018-11-27 16:32:45 -05003472 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003473 return false;
3474 }
3475
3476 return true;
3477}
3478
Jamie Madill007530e2017-12-28 14:27:04 -05003479bool ValidateDeletePathsCHROMIUM(Context *context, GLuint path, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003480{
3481 if (!context->getExtensions().pathRendering)
3482 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003483 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003484 return false;
3485 }
3486
3487 // range = 0 is undefined in NV_path_rendering.
3488 // we add stricter semantic check here and require a non zero positive range.
3489 if (range <= 0)
3490 {
Jamie Madille0472f32018-11-27 16:32:45 -05003491 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003492 return false;
3493 }
3494
3495 angle::CheckedNumeric<std::uint32_t> checkedRange(path);
3496 checkedRange += range;
3497
3498 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
3499 {
Jamie Madille0472f32018-11-27 16:32:45 -05003500 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003501 return false;
3502 }
3503 return true;
3504}
3505
Jamie Madill007530e2017-12-28 14:27:04 -05003506bool ValidatePathCommandsCHROMIUM(Context *context,
3507 GLuint path,
3508 GLsizei numCommands,
3509 const GLubyte *commands,
3510 GLsizei numCoords,
3511 GLenum coordType,
3512 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003513{
3514 if (!context->getExtensions().pathRendering)
3515 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003516 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003517 return false;
3518 }
Brandon Jones59770802018-04-02 13:18:42 -07003519 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003520 {
Jamie Madille0472f32018-11-27 16:32:45 -05003521 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003522 return false;
3523 }
3524
3525 if (numCommands < 0)
3526 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003527 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCommands);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003528 return false;
3529 }
3530 else if (numCommands > 0)
3531 {
3532 if (!commands)
3533 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003534 context->validationError(GL_INVALID_VALUE, kInvalidPathCommandsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003535 return false;
3536 }
3537 }
3538
3539 if (numCoords < 0)
3540 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003541 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003542 return false;
3543 }
3544 else if (numCoords > 0)
3545 {
3546 if (!coords)
3547 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003548 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoordsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003549 return false;
3550 }
3551 }
3552
3553 std::uint32_t coordTypeSize = 0;
3554 switch (coordType)
3555 {
3556 case GL_BYTE:
3557 coordTypeSize = sizeof(GLbyte);
3558 break;
3559
3560 case GL_UNSIGNED_BYTE:
3561 coordTypeSize = sizeof(GLubyte);
3562 break;
3563
3564 case GL_SHORT:
3565 coordTypeSize = sizeof(GLshort);
3566 break;
3567
3568 case GL_UNSIGNED_SHORT:
3569 coordTypeSize = sizeof(GLushort);
3570 break;
3571
3572 case GL_FLOAT:
3573 coordTypeSize = sizeof(GLfloat);
3574 break;
3575
3576 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003577 context->validationError(GL_INVALID_ENUM, kInvalidPathCoordinateType);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003578 return false;
3579 }
3580
3581 angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
3582 checkedSize += (coordTypeSize * numCoords);
3583 if (!checkedSize.IsValid())
3584 {
Jamie Madille0472f32018-11-27 16:32:45 -05003585 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003586 return false;
3587 }
3588
3589 // early return skips command data validation when it doesn't exist.
3590 if (!commands)
3591 return true;
3592
3593 GLsizei expectedNumCoords = 0;
3594 for (GLsizei i = 0; i < numCommands; ++i)
3595 {
3596 switch (commands[i])
3597 {
3598 case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
3599 break;
3600 case GL_MOVE_TO_CHROMIUM:
3601 case GL_LINE_TO_CHROMIUM:
3602 expectedNumCoords += 2;
3603 break;
3604 case GL_QUADRATIC_CURVE_TO_CHROMIUM:
3605 expectedNumCoords += 4;
3606 break;
3607 case GL_CUBIC_CURVE_TO_CHROMIUM:
3608 expectedNumCoords += 6;
3609 break;
3610 case GL_CONIC_CURVE_TO_CHROMIUM:
3611 expectedNumCoords += 5;
3612 break;
3613 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003614 context->validationError(GL_INVALID_ENUM, kInvalidPathCommand);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003615 return false;
3616 }
3617 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003618
Sami Väisänene45e53b2016-05-25 10:36:04 +03003619 if (expectedNumCoords != numCoords)
3620 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003621 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003622 return false;
3623 }
3624
3625 return true;
3626}
3627
Jamie Madill007530e2017-12-28 14:27:04 -05003628bool ValidatePathParameterfCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003629{
3630 if (!context->getExtensions().pathRendering)
3631 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003632 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003633 return false;
3634 }
Brandon Jones59770802018-04-02 13:18:42 -07003635 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003636 {
Jamie Madille0472f32018-11-27 16:32:45 -05003637 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003638 return false;
3639 }
3640
3641 switch (pname)
3642 {
3643 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3644 if (value < 0.0f)
3645 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003646 context->validationError(GL_INVALID_VALUE, kInvalidPathStrokeWidth);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003647 return false;
3648 }
3649 break;
3650 case GL_PATH_END_CAPS_CHROMIUM:
3651 switch (static_cast<GLenum>(value))
3652 {
3653 case GL_FLAT_CHROMIUM:
3654 case GL_SQUARE_CHROMIUM:
3655 case GL_ROUND_CHROMIUM:
3656 break;
3657 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003658 context->validationError(GL_INVALID_ENUM, kInvalidPathEndCaps);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003659 return false;
3660 }
3661 break;
3662 case GL_PATH_JOIN_STYLE_CHROMIUM:
3663 switch (static_cast<GLenum>(value))
3664 {
3665 case GL_MITER_REVERT_CHROMIUM:
3666 case GL_BEVEL_CHROMIUM:
3667 case GL_ROUND_CHROMIUM:
3668 break;
3669 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003670 context->validationError(GL_INVALID_ENUM, kInvalidPathJoinStyle);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003671 return false;
3672 }
Nico Weber41b072b2018-02-09 10:01:32 -05003673 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03003674 case GL_PATH_MITER_LIMIT_CHROMIUM:
3675 if (value < 0.0f)
3676 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003677 context->validationError(GL_INVALID_VALUE, kInvalidPathMiterLimit);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003678 return false;
3679 }
3680 break;
3681
3682 case GL_PATH_STROKE_BOUND_CHROMIUM:
3683 // no errors, only clamping.
3684 break;
3685
3686 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003687 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003688 return false;
3689 }
3690 return true;
3691}
3692
Jamie Madill007530e2017-12-28 14:27:04 -05003693bool ValidatePathParameteriCHROMIUM(Context *context, GLuint path, GLenum pname, GLint value)
3694{
3695 // TODO(jmadill): Use proper clamping cast.
3696 return ValidatePathParameterfCHROMIUM(context, path, pname, static_cast<GLfloat>(value));
3697}
3698
3699bool ValidateGetPathParameterfvCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat *value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003700{
3701 if (!context->getExtensions().pathRendering)
3702 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003703 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003704 return false;
3705 }
3706
Brandon Jones59770802018-04-02 13:18:42 -07003707 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003708 {
Jamie Madille0472f32018-11-27 16:32:45 -05003709 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003710 return false;
3711 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003712
Sami Väisänene45e53b2016-05-25 10:36:04 +03003713 if (!value)
3714 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003715 context->validationError(GL_INVALID_VALUE, kInvalidPathValueArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003716 return false;
3717 }
3718
3719 switch (pname)
3720 {
3721 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3722 case GL_PATH_END_CAPS_CHROMIUM:
3723 case GL_PATH_JOIN_STYLE_CHROMIUM:
3724 case GL_PATH_MITER_LIMIT_CHROMIUM:
3725 case GL_PATH_STROKE_BOUND_CHROMIUM:
3726 break;
3727
3728 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003729 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003730 return false;
3731 }
3732
3733 return true;
3734}
3735
Jamie Madill007530e2017-12-28 14:27:04 -05003736bool ValidateGetPathParameterivCHROMIUM(Context *context, GLuint path, GLenum pname, GLint *value)
3737{
3738 return ValidateGetPathParameterfvCHROMIUM(context, path, pname,
3739 reinterpret_cast<GLfloat *>(value));
3740}
3741
3742bool ValidatePathStencilFuncCHROMIUM(Context *context, GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003743{
3744 if (!context->getExtensions().pathRendering)
3745 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003746 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003747 return false;
3748 }
3749
3750 switch (func)
3751 {
3752 case GL_NEVER:
3753 case GL_ALWAYS:
3754 case GL_LESS:
3755 case GL_LEQUAL:
3756 case GL_EQUAL:
3757 case GL_GEQUAL:
3758 case GL_GREATER:
3759 case GL_NOTEQUAL:
3760 break;
3761 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003762 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003763 return false;
3764 }
3765
3766 return true;
3767}
3768
3769// Note that the spec specifies that for the path drawing commands
3770// if the path object is not an existing path object the command
3771// does nothing and no error is generated.
3772// However if the path object exists but has not been specified any
3773// commands then an error is generated.
3774
Jamie Madill007530e2017-12-28 14:27:04 -05003775bool ValidateStencilFillPathCHROMIUM(Context *context, GLuint path, GLenum fillMode, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003776{
3777 if (!context->getExtensions().pathRendering)
3778 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003779 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003780 return false;
3781 }
Brandon Jones59770802018-04-02 13:18:42 -07003782 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003783 {
Jamie Madille0472f32018-11-27 16:32:45 -05003784 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003785 return false;
3786 }
3787
3788 switch (fillMode)
3789 {
3790 case GL_COUNT_UP_CHROMIUM:
3791 case GL_COUNT_DOWN_CHROMIUM:
3792 break;
3793 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003794 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003795 return false;
3796 }
3797
3798 if (!isPow2(mask + 1))
3799 {
Jamie Madille0472f32018-11-27 16:32:45 -05003800 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003801 return false;
3802 }
3803
3804 return true;
3805}
3806
Jamie Madill007530e2017-12-28 14:27:04 -05003807bool ValidateStencilStrokePathCHROMIUM(Context *context, GLuint path, GLint reference, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003808{
3809 if (!context->getExtensions().pathRendering)
3810 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003811 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003812 return false;
3813 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003814
Brandon Jones59770802018-04-02 13:18:42 -07003815 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003816 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003817 context->validationError(GL_INVALID_OPERATION, kNoPathOrNoPathData);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003818 return false;
3819 }
3820
3821 return true;
3822}
3823
Jamie Madill007530e2017-12-28 14:27:04 -05003824bool ValidateCoverPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003825{
3826 if (!context->getExtensions().pathRendering)
3827 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003828 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003829 return false;
3830 }
Brandon Jones59770802018-04-02 13:18:42 -07003831 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003832 {
Jamie Madille0472f32018-11-27 16:32:45 -05003833 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003834 return false;
3835 }
3836
3837 switch (coverMode)
3838 {
3839 case GL_CONVEX_HULL_CHROMIUM:
3840 case GL_BOUNDING_BOX_CHROMIUM:
3841 break;
3842 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003843 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003844 return false;
3845 }
3846 return true;
3847}
3848
Jamie Madill778bf092018-11-14 09:54:36 -05003849bool ValidateCoverFillPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3850{
3851 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3852}
3853
3854bool ValidateCoverStrokePathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3855{
3856 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3857}
3858
Jamie Madill007530e2017-12-28 14:27:04 -05003859bool ValidateStencilThenCoverFillPathCHROMIUM(Context *context,
3860 GLuint path,
3861 GLenum fillMode,
3862 GLuint mask,
3863 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003864{
Jamie Madill007530e2017-12-28 14:27:04 -05003865 return ValidateStencilFillPathCHROMIUM(context, path, fillMode, mask) &&
3866 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003867}
3868
Jamie Madill007530e2017-12-28 14:27:04 -05003869bool ValidateStencilThenCoverStrokePathCHROMIUM(Context *context,
3870 GLuint path,
3871 GLint reference,
3872 GLuint mask,
3873 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003874{
Jamie Madill007530e2017-12-28 14:27:04 -05003875 return ValidateStencilStrokePathCHROMIUM(context, path, reference, mask) &&
3876 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003877}
3878
Brandon Jonesd1049182018-03-28 10:02:20 -07003879bool ValidateIsPathCHROMIUM(Context *context, GLuint path)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003880{
3881 if (!context->getExtensions().pathRendering)
3882 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003883 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003884 return false;
3885 }
3886 return true;
3887}
3888
Jamie Madill007530e2017-12-28 14:27:04 -05003889bool ValidateCoverFillPathInstancedCHROMIUM(Context *context,
3890 GLsizei numPaths,
3891 GLenum pathNameType,
3892 const void *paths,
3893 GLuint pathBase,
3894 GLenum coverMode,
3895 GLenum transformType,
3896 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003897{
3898 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3899 transformType, transformValues))
3900 return false;
3901
3902 switch (coverMode)
3903 {
3904 case GL_CONVEX_HULL_CHROMIUM:
3905 case GL_BOUNDING_BOX_CHROMIUM:
3906 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3907 break;
3908 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003909 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003910 return false;
3911 }
3912
3913 return true;
3914}
3915
Jamie Madill007530e2017-12-28 14:27:04 -05003916bool ValidateCoverStrokePathInstancedCHROMIUM(Context *context,
3917 GLsizei numPaths,
3918 GLenum pathNameType,
3919 const void *paths,
3920 GLuint pathBase,
3921 GLenum coverMode,
3922 GLenum transformType,
3923 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003924{
3925 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3926 transformType, transformValues))
3927 return false;
3928
3929 switch (coverMode)
3930 {
3931 case GL_CONVEX_HULL_CHROMIUM:
3932 case GL_BOUNDING_BOX_CHROMIUM:
3933 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3934 break;
3935 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003936 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003937 return false;
3938 }
3939
3940 return true;
3941}
3942
Jamie Madill007530e2017-12-28 14:27:04 -05003943bool ValidateStencilFillPathInstancedCHROMIUM(Context *context,
3944 GLsizei numPaths,
3945 GLenum pathNameType,
3946 const void *paths,
3947 GLuint pathBase,
3948 GLenum fillMode,
3949 GLuint mask,
3950 GLenum transformType,
3951 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003952{
3953
3954 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3955 transformType, transformValues))
3956 return false;
3957
3958 switch (fillMode)
3959 {
3960 case GL_COUNT_UP_CHROMIUM:
3961 case GL_COUNT_DOWN_CHROMIUM:
3962 break;
3963 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003964 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003965 return false;
3966 }
3967 if (!isPow2(mask + 1))
3968 {
Jamie Madille0472f32018-11-27 16:32:45 -05003969 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03003970 return false;
3971 }
3972 return true;
3973}
3974
Jamie Madill007530e2017-12-28 14:27:04 -05003975bool ValidateStencilStrokePathInstancedCHROMIUM(Context *context,
3976 GLsizei numPaths,
3977 GLenum pathNameType,
3978 const void *paths,
3979 GLuint pathBase,
3980 GLint reference,
3981 GLuint mask,
3982 GLenum transformType,
3983 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003984{
3985 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3986 transformType, transformValues))
3987 return false;
3988
3989 // no more validation here.
3990
3991 return true;
3992}
3993
Jamie Madill007530e2017-12-28 14:27:04 -05003994bool ValidateStencilThenCoverFillPathInstancedCHROMIUM(Context *context,
3995 GLsizei numPaths,
3996 GLenum pathNameType,
3997 const void *paths,
3998 GLuint pathBase,
3999 GLenum fillMode,
4000 GLuint mask,
4001 GLenum coverMode,
4002 GLenum transformType,
4003 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004004{
4005 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4006 transformType, transformValues))
4007 return false;
4008
4009 switch (coverMode)
4010 {
4011 case GL_CONVEX_HULL_CHROMIUM:
4012 case GL_BOUNDING_BOX_CHROMIUM:
4013 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4014 break;
4015 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004016 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004017 return false;
4018 }
4019
4020 switch (fillMode)
4021 {
4022 case GL_COUNT_UP_CHROMIUM:
4023 case GL_COUNT_DOWN_CHROMIUM:
4024 break;
4025 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004026 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004027 return false;
4028 }
4029 if (!isPow2(mask + 1))
4030 {
Jamie Madille0472f32018-11-27 16:32:45 -05004031 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004032 return false;
4033 }
4034
4035 return true;
4036}
4037
Jamie Madill007530e2017-12-28 14:27:04 -05004038bool ValidateStencilThenCoverStrokePathInstancedCHROMIUM(Context *context,
4039 GLsizei numPaths,
4040 GLenum pathNameType,
4041 const void *paths,
4042 GLuint pathBase,
4043 GLint reference,
4044 GLuint mask,
4045 GLenum coverMode,
4046 GLenum transformType,
4047 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004048{
4049 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4050 transformType, transformValues))
4051 return false;
4052
4053 switch (coverMode)
4054 {
4055 case GL_CONVEX_HULL_CHROMIUM:
4056 case GL_BOUNDING_BOX_CHROMIUM:
4057 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4058 break;
4059 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004060 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004061 return false;
4062 }
4063
4064 return true;
4065}
4066
Jamie Madill007530e2017-12-28 14:27:04 -05004067bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
4068 GLuint program,
4069 GLint location,
4070 const GLchar *name)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004071{
4072 if (!context->getExtensions().pathRendering)
4073 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004074 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004075 return false;
4076 }
4077
4078 const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
4079 if (location >= MaxLocation)
4080 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004081 context->validationError(GL_INVALID_VALUE, kInvalidVaryingLocation);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004082 return false;
4083 }
4084
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004085 const auto *programObject = context->getProgramNoResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004086 if (!programObject)
4087 {
Jamie Madille0472f32018-11-27 16:32:45 -05004088 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004089 return false;
4090 }
4091
4092 if (!name)
4093 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004094 context->validationError(GL_INVALID_VALUE, kMissingName);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004095 return false;
4096 }
4097
4098 if (angle::BeginsWith(name, "gl_"))
4099 {
Jamie Madille0472f32018-11-27 16:32:45 -05004100 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004101 return false;
4102 }
4103
4104 return true;
4105}
4106
Jamie Madill007530e2017-12-28 14:27:04 -05004107bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
4108 GLuint program,
4109 GLint location,
4110 GLenum genMode,
4111 GLint components,
4112 const GLfloat *coeffs)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004113{
4114 if (!context->getExtensions().pathRendering)
4115 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004116 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004117 return false;
4118 }
4119
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004120 const auto *programObject = context->getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004121 if (!programObject || programObject->isFlaggedForDeletion())
4122 {
Jamie Madille0472f32018-11-27 16:32:45 -05004123 context->validationError(GL_INVALID_OPERATION, kProgramDoesNotExist);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004124 return false;
4125 }
4126
4127 if (!programObject->isLinked())
4128 {
Jamie Madille0472f32018-11-27 16:32:45 -05004129 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004130 return false;
4131 }
4132
4133 switch (genMode)
4134 {
4135 case GL_NONE:
4136 if (components != 0)
4137 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004138 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004139 return false;
4140 }
4141 break;
4142
4143 case GL_OBJECT_LINEAR_CHROMIUM:
4144 case GL_EYE_LINEAR_CHROMIUM:
4145 case GL_CONSTANT_CHROMIUM:
4146 if (components < 1 || components > 4)
4147 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004148 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004149 return false;
4150 }
4151 if (!coeffs)
4152 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004153 context->validationError(GL_INVALID_VALUE, kInvalidPathCoefficientsArray);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004154 return false;
4155 }
4156 break;
4157
4158 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004159 context->validationError(GL_INVALID_ENUM, kInvalidPathGenMode);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004160 return false;
4161 }
4162
4163 // If the location is -1 then the command is silently ignored
4164 // and no further validation is needed.
4165 if (location == -1)
4166 return true;
4167
jchen103fd614d2018-08-13 12:21:58 +08004168 const auto &binding = programObject->getFragmentInputBindingInfo(location);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004169
4170 if (!binding.valid)
4171 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004172 context->validationError(GL_INVALID_OPERATION, kInvalidFragmentInputBinding);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004173 return false;
4174 }
4175
4176 if (binding.type != GL_NONE)
4177 {
4178 GLint expectedComponents = 0;
4179 switch (binding.type)
4180 {
4181 case GL_FLOAT:
4182 expectedComponents = 1;
4183 break;
4184 case GL_FLOAT_VEC2:
4185 expectedComponents = 2;
4186 break;
4187 case GL_FLOAT_VEC3:
4188 expectedComponents = 3;
4189 break;
4190 case GL_FLOAT_VEC4:
4191 expectedComponents = 4;
4192 break;
4193 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004194 context->validationError(GL_INVALID_OPERATION, kFragmentInputTypeNotFloatingPoint);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004195 return false;
4196 }
4197 if (expectedComponents != components && genMode != GL_NONE)
4198 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004199 context->validationError(GL_INVALID_OPERATION, kInvalidPathComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004200 return false;
4201 }
4202 }
4203 return true;
4204}
4205
Geoff Lang97073d12016-04-20 10:42:34 -07004206bool ValidateCopyTextureCHROMIUM(Context *context,
4207 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004208 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004209 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004210 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004211 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004212 GLint internalFormat,
4213 GLenum destType,
4214 GLboolean unpackFlipY,
4215 GLboolean unpackPremultiplyAlpha,
4216 GLboolean unpackUnmultiplyAlpha)
4217{
4218 if (!context->getExtensions().copyTexture)
4219 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004220 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004221 return false;
4222 }
4223
Geoff Lang4f0e0032017-05-01 16:04:35 -04004224 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004225 if (source == nullptr)
4226 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004227 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004228 return false;
4229 }
4230
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004231 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004232 {
Jamie Madille0472f32018-11-27 16:32:45 -05004233 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004234 return false;
4235 }
4236
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004237 TextureType sourceType = source->getType();
4238 ASSERT(sourceType != TextureType::CubeMap);
4239 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004240
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004241 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004242 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004243 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004244 return false;
4245 }
4246
Geoff Lang4f0e0032017-05-01 16:04:35 -04004247 GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
4248 GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
4249 if (sourceWidth == 0 || sourceHeight == 0)
4250 {
Jamie Madille0472f32018-11-27 16:32:45 -05004251 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004252 return false;
4253 }
4254
4255 const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
4256 if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004257 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004258 context->validationError(GL_INVALID_OPERATION, kInvalidSourceTextureInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004259 return false;
4260 }
4261
Geoff Lang63458a32017-10-30 15:16:53 -04004262 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4263 {
Jamie Madille0472f32018-11-27 16:32:45 -05004264 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004265 return false;
4266 }
4267
Geoff Lang4f0e0032017-05-01 16:04:35 -04004268 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004269 if (dest == nullptr)
4270 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004271 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004272 return false;
4273 }
4274
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004275 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004276 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004277 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004278 return false;
4279 }
4280
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004281 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, sourceWidth,
Brandon Jones28783792018-03-05 09:37:32 -08004282 sourceHeight, false))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004283 {
Jamie Madille0472f32018-11-27 16:32:45 -05004284 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004285 return false;
4286 }
4287
Geoff Lang97073d12016-04-20 10:42:34 -07004288 if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
4289 {
Geoff Lang97073d12016-04-20 10:42:34 -07004290 return false;
4291 }
4292
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004293 if (dest->getType() == TextureType::CubeMap && sourceWidth != sourceHeight)
Geoff Lang4f0e0032017-05-01 16:04:35 -04004294 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004295 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004296 return false;
4297 }
4298
Geoff Lang97073d12016-04-20 10:42:34 -07004299 if (dest->getImmutableFormat())
4300 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004301 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang97073d12016-04-20 10:42:34 -07004302 return false;
4303 }
4304
4305 return true;
4306}
4307
4308bool ValidateCopySubTextureCHROMIUM(Context *context,
4309 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004310 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004311 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004312 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004313 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004314 GLint xoffset,
4315 GLint yoffset,
4316 GLint x,
4317 GLint y,
4318 GLsizei width,
4319 GLsizei height,
4320 GLboolean unpackFlipY,
4321 GLboolean unpackPremultiplyAlpha,
4322 GLboolean unpackUnmultiplyAlpha)
4323{
4324 if (!context->getExtensions().copyTexture)
4325 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004326 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004327 return false;
4328 }
4329
Geoff Lang4f0e0032017-05-01 16:04:35 -04004330 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004331 if (source == nullptr)
4332 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004333 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004334 return false;
4335 }
4336
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004337 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004338 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004339 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004340 return false;
4341 }
4342
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004343 TextureType sourceType = source->getType();
4344 ASSERT(sourceType != TextureType::CubeMap);
4345 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004346
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004347 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004348 {
Jamie Madille0472f32018-11-27 16:32:45 -05004349 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004350 return false;
4351 }
4352
4353 if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
4354 source->getHeight(sourceTarget, sourceLevel) == 0)
Geoff Lang97073d12016-04-20 10:42:34 -07004355 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004356 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004357 return false;
4358 }
4359
4360 if (x < 0 || y < 0)
4361 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004362 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004363 return false;
4364 }
4365
4366 if (width < 0 || height < 0)
4367 {
Jamie Madille0472f32018-11-27 16:32:45 -05004368 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Geoff Lang97073d12016-04-20 10:42:34 -07004369 return false;
4370 }
4371
Geoff Lang4f0e0032017-05-01 16:04:35 -04004372 if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
4373 static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004374 {
Jamie Madille0472f32018-11-27 16:32:45 -05004375 context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
Geoff Lang97073d12016-04-20 10:42:34 -07004376 return false;
4377 }
4378
Geoff Lang4f0e0032017-05-01 16:04:35 -04004379 const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
4380 if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004381 {
Jamie Madille0472f32018-11-27 16:32:45 -05004382 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004383 return false;
4384 }
4385
Geoff Lang63458a32017-10-30 15:16:53 -04004386 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4387 {
Jamie Madille0472f32018-11-27 16:32:45 -05004388 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004389 return false;
4390 }
4391
Geoff Lang4f0e0032017-05-01 16:04:35 -04004392 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004393 if (dest == nullptr)
4394 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004395 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004396 return false;
4397 }
4398
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004399 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004400 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004401 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004402 return false;
4403 }
4404
Brandon Jones28783792018-03-05 09:37:32 -08004405 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, width, height,
4406 true))
Geoff Lang97073d12016-04-20 10:42:34 -07004407 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004408 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004409 return false;
4410 }
4411
Geoff Lang4f0e0032017-05-01 16:04:35 -04004412 if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
4413 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004414 context->validationError(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004415 return false;
4416 }
4417
4418 const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
4419 if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004420 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004421 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Lang97073d12016-04-20 10:42:34 -07004422 return false;
4423 }
4424
4425 if (xoffset < 0 || yoffset < 0)
4426 {
Jamie Madille0472f32018-11-27 16:32:45 -05004427 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004428 return false;
4429 }
4430
Geoff Lang4f0e0032017-05-01 16:04:35 -04004431 if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
4432 static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004433 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004434 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
Geoff Lang97073d12016-04-20 10:42:34 -07004435 return false;
4436 }
4437
4438 return true;
4439}
4440
Geoff Lang47110bf2016-04-20 11:13:22 -07004441bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
4442{
4443 if (!context->getExtensions().copyCompressedTexture)
4444 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004445 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang47110bf2016-04-20 11:13:22 -07004446 return false;
4447 }
4448
4449 const gl::Texture *source = context->getTexture(sourceId);
4450 if (source == nullptr)
4451 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004452 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004453 return false;
4454 }
4455
Corentin Wallez99d492c2018-02-27 15:17:10 -05004456 if (source->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004457 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004458 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004459 return false;
4460 }
4461
Corentin Wallez99d492c2018-02-27 15:17:10 -05004462 if (source->getWidth(TextureTarget::_2D, 0) == 0 ||
4463 source->getHeight(TextureTarget::_2D, 0) == 0)
Geoff Lang47110bf2016-04-20 11:13:22 -07004464 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004465 context->validationError(GL_INVALID_VALUE, kSourceTextureLevelZeroDefined);
Geoff Lang47110bf2016-04-20 11:13:22 -07004466 return false;
4467 }
4468
Corentin Wallez99d492c2018-02-27 15:17:10 -05004469 const gl::Format &sourceFormat = source->getFormat(TextureTarget::_2D, 0);
Geoff Lang47110bf2016-04-20 11:13:22 -07004470 if (!sourceFormat.info->compressed)
4471 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004472 context->validationError(GL_INVALID_OPERATION, kSourceTextureMustBeCompressed);
Geoff Lang47110bf2016-04-20 11:13:22 -07004473 return false;
4474 }
4475
4476 const gl::Texture *dest = context->getTexture(destId);
4477 if (dest == nullptr)
4478 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004479 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004480 return false;
4481 }
4482
Corentin Wallez99d492c2018-02-27 15:17:10 -05004483 if (dest->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004484 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004485 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004486 return false;
4487 }
4488
4489 if (dest->getImmutableFormat())
4490 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004491 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang47110bf2016-04-20 11:13:22 -07004492 return false;
4493 }
4494
4495 return true;
4496}
4497
Jiawei Shao385b3e02018-03-21 09:43:28 +08004498bool ValidateCreateShader(Context *context, ShaderType type)
Martin Radev4c4c8e72016-08-04 12:25:34 +03004499{
4500 switch (type)
4501 {
Jiawei Shao385b3e02018-03-21 09:43:28 +08004502 case ShaderType::Vertex:
4503 case ShaderType::Fragment:
Martin Radev4c4c8e72016-08-04 12:25:34 +03004504 break;
Geoff Langeb66a6e2016-10-31 13:06:12 -04004505
Jiawei Shao385b3e02018-03-21 09:43:28 +08004506 case ShaderType::Compute:
Geoff Langeb66a6e2016-10-31 13:06:12 -04004507 if (context->getClientVersion() < Version(3, 1))
Martin Radev4c4c8e72016-08-04 12:25:34 +03004508 {
Jamie Madille0472f32018-11-27 16:32:45 -05004509 context->validationError(GL_INVALID_ENUM, kES31Required);
Geoff Langeb66a6e2016-10-31 13:06:12 -04004510 return false;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004511 }
Geoff Langeb66a6e2016-10-31 13:06:12 -04004512 break;
4513
Jiawei Shao385b3e02018-03-21 09:43:28 +08004514 case ShaderType::Geometry:
Jiawei Shao89be29a2017-11-06 14:36:45 +08004515 if (!context->getExtensions().geometryShader)
4516 {
Jamie Madille0472f32018-11-27 16:32:45 -05004517 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jiawei Shao89be29a2017-11-06 14:36:45 +08004518 return false;
4519 }
4520 break;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004521 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004522 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Martin Radev4c4c8e72016-08-04 12:25:34 +03004523 return false;
4524 }
Jamie Madill29639852016-09-02 15:00:09 -04004525
4526 return true;
4527}
4528
Jamie Madill5b772312018-03-08 20:28:32 -05004529bool ValidateBufferData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004530 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004531 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004532 const void *data,
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004533 BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004534{
4535 if (size < 0)
4536 {
Jamie Madille0472f32018-11-27 16:32:45 -05004537 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madill29639852016-09-02 15:00:09 -04004538 return false;
4539 }
4540
4541 switch (usage)
4542 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004543 case BufferUsage::StreamDraw:
4544 case BufferUsage::StaticDraw:
4545 case BufferUsage::DynamicDraw:
Jamie Madill29639852016-09-02 15:00:09 -04004546 break;
4547
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004548 case BufferUsage::StreamRead:
4549 case BufferUsage::StaticRead:
4550 case BufferUsage::DynamicRead:
4551 case BufferUsage::StreamCopy:
4552 case BufferUsage::StaticCopy:
4553 case BufferUsage::DynamicCopy:
Jamie Madill29639852016-09-02 15:00:09 -04004554 if (context->getClientMajorVersion() < 3)
4555 {
Jamie Madille0472f32018-11-27 16:32:45 -05004556 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004557 return false;
4558 }
4559 break;
4560
4561 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004562 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004563 return false;
4564 }
4565
Corentin Walleze4477002017-12-01 14:39:58 -05004566 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004567 {
Jamie Madille0472f32018-11-27 16:32:45 -05004568 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004569 return false;
4570 }
4571
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004572 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004573
4574 if (!buffer)
4575 {
Jamie Madille0472f32018-11-27 16:32:45 -05004576 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004577 return false;
4578 }
4579
James Darpiniane8a93c62018-01-04 18:02:24 -08004580 if (context->getExtensions().webglCompatibility &&
4581 buffer->isBoundForTransformFeedbackAndOtherUse())
4582 {
Jamie Madille0472f32018-11-27 16:32:45 -05004583 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004584 return false;
4585 }
4586
Jamie Madill29639852016-09-02 15:00:09 -04004587 return true;
4588}
4589
Jamie Madill5b772312018-03-08 20:28:32 -05004590bool ValidateBufferSubData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004591 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004592 GLintptr offset,
4593 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004594 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004595{
Brandon Jones6cad5662017-06-14 13:25:13 -07004596 if (size < 0)
Jamie Madill29639852016-09-02 15:00:09 -04004597 {
Jamie Madille0472f32018-11-27 16:32:45 -05004598 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Brandon Jones6cad5662017-06-14 13:25:13 -07004599 return false;
4600 }
4601
4602 if (offset < 0)
4603 {
Jamie Madille0472f32018-11-27 16:32:45 -05004604 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Jamie Madill29639852016-09-02 15:00:09 -04004605 return false;
4606 }
4607
Corentin Walleze4477002017-12-01 14:39:58 -05004608 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004609 {
Jamie Madille0472f32018-11-27 16:32:45 -05004610 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004611 return false;
4612 }
4613
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004614 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004615
4616 if (!buffer)
4617 {
Jamie Madille0472f32018-11-27 16:32:45 -05004618 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004619 return false;
4620 }
4621
4622 if (buffer->isMapped())
4623 {
Jamie Madille0472f32018-11-27 16:32:45 -05004624 context->validationError(GL_INVALID_OPERATION, kBufferMapped);
Jamie Madill29639852016-09-02 15:00:09 -04004625 return false;
4626 }
4627
James Darpiniane8a93c62018-01-04 18:02:24 -08004628 if (context->getExtensions().webglCompatibility &&
4629 buffer->isBoundForTransformFeedbackAndOtherUse())
4630 {
Jamie Madille0472f32018-11-27 16:32:45 -05004631 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004632 return false;
4633 }
4634
Jamie Madill29639852016-09-02 15:00:09 -04004635 // Check for possible overflow of size + offset
4636 angle::CheckedNumeric<size_t> checkedSize(size);
4637 checkedSize += offset;
4638 if (!checkedSize.IsValid())
4639 {
Jamie Madille0472f32018-11-27 16:32:45 -05004640 context->validationError(GL_INVALID_VALUE, kParamOverflow);
Jamie Madill29639852016-09-02 15:00:09 -04004641 return false;
4642 }
4643
4644 if (size + offset > buffer->getSize())
4645 {
Jamie Madille0472f32018-11-27 16:32:45 -05004646 context->validationError(GL_INVALID_VALUE, kInsufficientBufferSize);
Jamie Madill29639852016-09-02 15:00:09 -04004647 return false;
4648 }
4649
Martin Radev4c4c8e72016-08-04 12:25:34 +03004650 return true;
4651}
4652
Geoff Lang111a99e2017-10-17 10:58:41 -04004653bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
Geoff Langc287ea62016-09-16 14:46:51 -04004654{
Geoff Langc339c4e2016-11-29 10:37:36 -05004655 if (!context->getExtensions().requestExtension)
Geoff Langc287ea62016-09-16 14:46:51 -04004656 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004657 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc287ea62016-09-16 14:46:51 -04004658 return false;
4659 }
4660
Geoff Lang111a99e2017-10-17 10:58:41 -04004661 if (!context->isExtensionRequestable(name))
Geoff Langc287ea62016-09-16 14:46:51 -04004662 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004663 context->validationError(GL_INVALID_OPERATION, kExtensionNotRequestable);
Geoff Langc287ea62016-09-16 14:46:51 -04004664 return false;
4665 }
4666
4667 return true;
4668}
4669
Jamie Madill5b772312018-03-08 20:28:32 -05004670bool ValidateActiveTexture(Context *context, GLenum texture)
Jamie Madillef300b12016-10-07 15:12:09 -04004671{
Lingfeng Yang038dd532018-03-29 17:31:52 -07004672 if (context->getClientMajorVersion() < 2)
4673 {
4674 return ValidateMultitextureUnit(context, texture);
4675 }
4676
Jamie Madillef300b12016-10-07 15:12:09 -04004677 if (texture < GL_TEXTURE0 ||
4678 texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
4679 {
Jamie Madille0472f32018-11-27 16:32:45 -05004680 context->validationError(GL_INVALID_ENUM, kInvalidCombinedImageUnit);
Jamie Madillef300b12016-10-07 15:12:09 -04004681 return false;
4682 }
4683
4684 return true;
4685}
4686
Jamie Madill5b772312018-03-08 20:28:32 -05004687bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillef300b12016-10-07 15:12:09 -04004688{
4689 Program *programObject = GetValidProgram(context, program);
4690 if (!programObject)
4691 {
4692 return false;
4693 }
4694
4695 Shader *shaderObject = GetValidShader(context, shader);
4696 if (!shaderObject)
4697 {
4698 return false;
4699 }
4700
Jiawei Shao385b3e02018-03-21 09:43:28 +08004701 if (programObject->getAttachedShader(shaderObject->getType()))
Jamie Madillef300b12016-10-07 15:12:09 -04004702 {
Jamie Madille0472f32018-11-27 16:32:45 -05004703 context->validationError(GL_INVALID_OPERATION, kShaderAttachmentHasShader);
Jiawei Shao385b3e02018-03-21 09:43:28 +08004704 return false;
Jamie Madillef300b12016-10-07 15:12:09 -04004705 }
4706
4707 return true;
4708}
4709
Jamie Madill5b772312018-03-08 20:28:32 -05004710bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004711{
4712 if (index >= MAX_VERTEX_ATTRIBS)
4713 {
Jamie Madille0472f32018-11-27 16:32:45 -05004714 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004715 return false;
4716 }
4717
4718 if (strncmp(name, "gl_", 3) == 0)
4719 {
Jamie Madille0472f32018-11-27 16:32:45 -05004720 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004721 return false;
4722 }
4723
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004724 if (context->isWebGL())
Geoff Langfc32e8b2017-05-31 14:16:59 -04004725 {
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004726 const size_t length = strlen(name);
4727
4728 if (!IsValidESSLString(name, length))
4729 {
4730 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
4731 // for shader-related entry points
Jamie Madille0472f32018-11-27 16:32:45 -05004732 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004733 return false;
4734 }
4735
4736 if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
4737 {
4738 return false;
4739 }
Geoff Langfc32e8b2017-05-31 14:16:59 -04004740 }
4741
Jamie Madill01a80ee2016-11-07 12:06:18 -05004742 return GetValidProgram(context, program) != nullptr;
4743}
4744
Jamie Madill5b772312018-03-08 20:28:32 -05004745bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004746{
Geoff Lange8afa902017-09-27 15:00:43 -04004747 if (!ValidFramebufferTarget(context, target))
Jamie Madill01a80ee2016-11-07 12:06:18 -05004748 {
Jamie Madille0472f32018-11-27 16:32:45 -05004749 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004750 return false;
4751 }
4752
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004753 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004754 !context->isFramebufferGenerated(framebuffer))
4755 {
Jamie Madille0472f32018-11-27 16:32:45 -05004756 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004757 return false;
4758 }
4759
4760 return true;
4761}
4762
Jamie Madill5b772312018-03-08 20:28:32 -05004763bool ValidateBindRenderbuffer(Context *context, GLenum target, GLuint renderbuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004764{
4765 if (target != GL_RENDERBUFFER)
4766 {
Jamie Madille0472f32018-11-27 16:32:45 -05004767 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004768 return false;
4769 }
4770
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004771 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004772 !context->isRenderbufferGenerated(renderbuffer))
4773 {
Jamie Madille0472f32018-11-27 16:32:45 -05004774 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004775 return false;
4776 }
4777
4778 return true;
4779}
4780
Jamie Madill5b772312018-03-08 20:28:32 -05004781static bool ValidBlendEquationMode(const Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004782{
4783 switch (mode)
4784 {
4785 case GL_FUNC_ADD:
4786 case GL_FUNC_SUBTRACT:
4787 case GL_FUNC_REVERSE_SUBTRACT:
Geoff Lang50cac572017-09-26 17:37:43 -04004788 return true;
4789
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004790 case GL_MIN:
4791 case GL_MAX:
Geoff Lang50cac572017-09-26 17:37:43 -04004792 return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004793
4794 default:
4795 return false;
4796 }
4797}
4798
Jamie Madill5b772312018-03-08 20:28:32 -05004799bool ValidateBlendColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004800{
4801 return true;
4802}
4803
Jamie Madill5b772312018-03-08 20:28:32 -05004804bool ValidateBlendEquation(Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004805{
Geoff Lang50cac572017-09-26 17:37:43 -04004806 if (!ValidBlendEquationMode(context, mode))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004807 {
Jamie Madille0472f32018-11-27 16:32:45 -05004808 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004809 return false;
4810 }
4811
4812 return true;
4813}
4814
Jamie Madill5b772312018-03-08 20:28:32 -05004815bool ValidateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004816{
Geoff Lang50cac572017-09-26 17:37:43 -04004817 if (!ValidBlendEquationMode(context, modeRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004818 {
Jamie Madille0472f32018-11-27 16:32:45 -05004819 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004820 return false;
4821 }
4822
Geoff Lang50cac572017-09-26 17:37:43 -04004823 if (!ValidBlendEquationMode(context, modeAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004824 {
Jamie Madille0472f32018-11-27 16:32:45 -05004825 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004826 return false;
4827 }
4828
4829 return true;
4830}
4831
Jamie Madill5b772312018-03-08 20:28:32 -05004832bool ValidateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004833{
4834 return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
4835}
4836
Jamie Madill5b772312018-03-08 20:28:32 -05004837bool ValidateBlendFuncSeparate(Context *context,
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004838 GLenum srcRGB,
4839 GLenum dstRGB,
4840 GLenum srcAlpha,
4841 GLenum dstAlpha)
4842{
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004843 if (!ValidSrcBlendFunc(context, srcRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004844 {
Jamie Madille0472f32018-11-27 16:32:45 -05004845 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004846 return false;
4847 }
4848
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004849 if (!ValidDstBlendFunc(context, dstRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004850 {
Jamie Madille0472f32018-11-27 16:32:45 -05004851 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004852 return false;
4853 }
4854
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004855 if (!ValidSrcBlendFunc(context, srcAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004856 {
Jamie Madille0472f32018-11-27 16:32:45 -05004857 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004858 return false;
4859 }
4860
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004861 if (!ValidDstBlendFunc(context, dstAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004862 {
Jamie Madille0472f32018-11-27 16:32:45 -05004863 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004864 return false;
4865 }
4866
Frank Henigman146e8a12017-03-02 23:22:37 -05004867 if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
4868 context->getExtensions().webglCompatibility)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004869 {
4870 bool constantColorUsed =
4871 (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
4872 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
4873
4874 bool constantAlphaUsed =
4875 (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
4876 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
4877
4878 if (constantColorUsed && constantAlphaUsed)
4879 {
Frank Henigman146e8a12017-03-02 23:22:37 -05004880 if (context->getExtensions().webglCompatibility)
4881 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004882 context->validationError(GL_INVALID_OPERATION, kInvalidConstantColor);
4883 return false;
Frank Henigman146e8a12017-03-02 23:22:37 -05004884 }
Jamie Madillc3e37312018-11-30 15:25:39 -05004885
4886 WARN() << kConstantColorAlphaLimitation;
4887 context->validationError(GL_INVALID_OPERATION, kConstantColorAlphaLimitation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004888 return false;
4889 }
4890 }
4891
4892 return true;
4893}
4894
Geoff Langc339c4e2016-11-29 10:37:36 -05004895bool ValidateGetString(Context *context, GLenum name)
4896{
4897 switch (name)
4898 {
4899 case GL_VENDOR:
4900 case GL_RENDERER:
4901 case GL_VERSION:
4902 case GL_SHADING_LANGUAGE_VERSION:
4903 case GL_EXTENSIONS:
4904 break;
4905
4906 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
4907 if (!context->getExtensions().requestExtension)
4908 {
Jamie Madille0472f32018-11-27 16:32:45 -05004909 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004910 return false;
4911 }
4912 break;
4913
4914 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004915 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004916 return false;
4917 }
4918
4919 return true;
4920}
4921
Jamie Madill5b772312018-03-08 20:28:32 -05004922bool ValidateLineWidth(Context *context, GLfloat width)
Geoff Lang47c48082016-12-07 15:38:13 -05004923{
4924 if (width <= 0.0f || isNaN(width))
4925 {
Jamie Madille0472f32018-11-27 16:32:45 -05004926 context->validationError(GL_INVALID_VALUE, kInvalidWidth);
Geoff Lang47c48082016-12-07 15:38:13 -05004927 return false;
4928 }
4929
4930 return true;
4931}
4932
Jamie Madill5b772312018-03-08 20:28:32 -05004933bool ValidateDepthRangef(Context *context, GLfloat zNear, GLfloat zFar)
Frank Henigman6137ddc2017-02-10 18:55:07 -05004934{
4935 if (context->getExtensions().webglCompatibility && zNear > zFar)
4936 {
Jamie Madille0472f32018-11-27 16:32:45 -05004937 context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
Frank Henigman6137ddc2017-02-10 18:55:07 -05004938 return false;
4939 }
4940
4941 return true;
4942}
4943
Jamie Madill5b772312018-03-08 20:28:32 -05004944bool ValidateRenderbufferStorage(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004945 GLenum target,
4946 GLenum internalformat,
4947 GLsizei width,
4948 GLsizei height)
4949{
4950 return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
4951 height);
4952}
4953
Jamie Madill5b772312018-03-08 20:28:32 -05004954bool ValidateRenderbufferStorageMultisampleANGLE(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004955 GLenum target,
4956 GLsizei samples,
4957 GLenum internalformat,
4958 GLsizei width,
4959 GLsizei height)
4960{
4961 if (!context->getExtensions().framebufferMultisample)
4962 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004963 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madille8fb6402017-02-14 17:56:40 -05004964 return false;
4965 }
4966
4967 // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
Jamie Madill610640f2018-11-21 17:28:41 -05004968 // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_VALUE is
Jamie Madille8fb6402017-02-14 17:56:40 -05004969 // generated.
4970 if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
4971 {
Jamie Madille0472f32018-11-27 16:32:45 -05004972 context->validationError(GL_INVALID_VALUE, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004973 return false;
4974 }
4975
4976 // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
4977 // the specified storage. This is different than ES 3.0 in which a sample number higher
4978 // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
4979 // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
4980 if (context->getClientMajorVersion() >= 3)
4981 {
4982 const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
4983 if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
4984 {
Jamie Madille0472f32018-11-27 16:32:45 -05004985 context->validationError(GL_OUT_OF_MEMORY, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004986 return false;
4987 }
4988 }
4989
4990 return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
4991 width, height);
4992}
4993
Jamie Madill5b772312018-03-08 20:28:32 -05004994bool ValidateCheckFramebufferStatus(Context *context, GLenum target)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004995{
Geoff Lange8afa902017-09-27 15:00:43 -04004996 if (!ValidFramebufferTarget(context, target))
Jamie Madillc1d770e2017-04-13 17:31:24 -04004997 {
Jamie Madille0472f32018-11-27 16:32:45 -05004998 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004999 return false;
5000 }
5001
5002 return true;
5003}
5004
Jamie Madill5b772312018-03-08 20:28:32 -05005005bool ValidateClearColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005006{
5007 return true;
5008}
5009
Jamie Madill5b772312018-03-08 20:28:32 -05005010bool ValidateClearDepthf(Context *context, GLfloat depth)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005011{
5012 return true;
5013}
5014
Jamie Madill5b772312018-03-08 20:28:32 -05005015bool ValidateClearStencil(Context *context, GLint s)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005016{
5017 return true;
5018}
5019
Jamie Madill5b772312018-03-08 20:28:32 -05005020bool ValidateColorMask(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005021 GLboolean red,
5022 GLboolean green,
5023 GLboolean blue,
5024 GLboolean alpha)
5025{
5026 return true;
5027}
5028
Jamie Madill5b772312018-03-08 20:28:32 -05005029bool ValidateCompileShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005030{
5031 return true;
5032}
5033
Jamie Madill5b772312018-03-08 20:28:32 -05005034bool ValidateCreateProgram(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005035{
5036 return true;
5037}
5038
Jamie Madill5b772312018-03-08 20:28:32 -05005039bool ValidateCullFace(Context *context, CullFaceMode mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005040{
5041 switch (mode)
5042 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04005043 case CullFaceMode::Front:
5044 case CullFaceMode::Back:
5045 case CullFaceMode::FrontAndBack:
Jamie Madillc1d770e2017-04-13 17:31:24 -04005046 break;
5047
5048 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005049 context->validationError(GL_INVALID_ENUM, kInvalidCullMode);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005050 return false;
5051 }
5052
5053 return true;
5054}
5055
Jamie Madill5b772312018-03-08 20:28:32 -05005056bool ValidateDeleteProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005057{
5058 if (program == 0)
5059 {
5060 return false;
5061 }
5062
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005063 if (!context->getProgramResolveLink(program))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005064 {
5065 if (context->getShader(program))
5066 {
Jamie Madille0472f32018-11-27 16:32:45 -05005067 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005068 return false;
5069 }
5070 else
5071 {
Jamie Madille0472f32018-11-27 16:32:45 -05005072 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005073 return false;
5074 }
5075 }
5076
5077 return true;
5078}
5079
Jamie Madill5b772312018-03-08 20:28:32 -05005080bool ValidateDeleteShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005081{
5082 if (shader == 0)
5083 {
5084 return false;
5085 }
5086
5087 if (!context->getShader(shader))
5088 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005089 if (context->getProgramResolveLink(shader))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005090 {
Jamie Madille0472f32018-11-27 16:32:45 -05005091 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005092 return false;
5093 }
5094 else
5095 {
Jamie Madille0472f32018-11-27 16:32:45 -05005096 context->validationError(GL_INVALID_VALUE, kExpectedShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005097 return false;
5098 }
5099 }
5100
5101 return true;
5102}
5103
Jamie Madill5b772312018-03-08 20:28:32 -05005104bool ValidateDepthFunc(Context *context, GLenum func)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005105{
5106 switch (func)
5107 {
5108 case GL_NEVER:
5109 case GL_ALWAYS:
5110 case GL_LESS:
5111 case GL_LEQUAL:
5112 case GL_EQUAL:
5113 case GL_GREATER:
5114 case GL_GEQUAL:
5115 case GL_NOTEQUAL:
5116 break;
5117
5118 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005119 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005120 return false;
5121 }
5122
5123 return true;
5124}
5125
Jamie Madill5b772312018-03-08 20:28:32 -05005126bool ValidateDepthMask(Context *context, GLboolean flag)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005127{
5128 return true;
5129}
5130
Jamie Madill5b772312018-03-08 20:28:32 -05005131bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005132{
5133 Program *programObject = GetValidProgram(context, program);
5134 if (!programObject)
5135 {
5136 return false;
5137 }
5138
5139 Shader *shaderObject = GetValidShader(context, shader);
5140 if (!shaderObject)
5141 {
5142 return false;
5143 }
5144
Jiawei Shao385b3e02018-03-21 09:43:28 +08005145 const Shader *attachedShader = programObject->getAttachedShader(shaderObject->getType());
Jamie Madillc1d770e2017-04-13 17:31:24 -04005146 if (attachedShader != shaderObject)
5147 {
Jamie Madille0472f32018-11-27 16:32:45 -05005148 context->validationError(GL_INVALID_OPERATION, kShaderToDetachMustBeAttached);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005149 return false;
5150 }
5151
5152 return true;
5153}
5154
Jamie Madill5b772312018-03-08 20:28:32 -05005155bool ValidateDisableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005156{
5157 if (index >= MAX_VERTEX_ATTRIBS)
5158 {
Jamie Madille0472f32018-11-27 16:32:45 -05005159 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005160 return false;
5161 }
5162
5163 return true;
5164}
5165
Jamie Madill5b772312018-03-08 20:28:32 -05005166bool ValidateEnableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005167{
5168 if (index >= MAX_VERTEX_ATTRIBS)
5169 {
Jamie Madille0472f32018-11-27 16:32:45 -05005170 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005171 return false;
5172 }
5173
5174 return true;
5175}
5176
Jamie Madill5b772312018-03-08 20:28:32 -05005177bool ValidateFinish(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005178{
5179 return true;
5180}
5181
Jamie Madill5b772312018-03-08 20:28:32 -05005182bool ValidateFlush(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005183{
5184 return true;
5185}
5186
Jamie Madill5b772312018-03-08 20:28:32 -05005187bool ValidateFrontFace(Context *context, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005188{
5189 switch (mode)
5190 {
5191 case GL_CW:
5192 case GL_CCW:
5193 break;
5194 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005195 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005196 return false;
5197 }
5198
5199 return true;
5200}
5201
Jamie Madill5b772312018-03-08 20:28:32 -05005202bool ValidateGetActiveAttrib(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005203 GLuint program,
5204 GLuint index,
5205 GLsizei bufsize,
5206 GLsizei *length,
5207 GLint *size,
5208 GLenum *type,
5209 GLchar *name)
5210{
5211 if (bufsize < 0)
5212 {
Jamie Madille0472f32018-11-27 16:32:45 -05005213 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005214 return false;
5215 }
5216
5217 Program *programObject = GetValidProgram(context, program);
5218
5219 if (!programObject)
5220 {
5221 return false;
5222 }
5223
5224 if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
5225 {
Jamie Madille0472f32018-11-27 16:32:45 -05005226 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005227 return false;
5228 }
5229
5230 return true;
5231}
5232
Jamie Madill5b772312018-03-08 20:28:32 -05005233bool ValidateGetActiveUniform(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005234 GLuint program,
5235 GLuint index,
5236 GLsizei bufsize,
5237 GLsizei *length,
5238 GLint *size,
5239 GLenum *type,
5240 GLchar *name)
5241{
5242 if (bufsize < 0)
5243 {
Jamie Madille0472f32018-11-27 16:32:45 -05005244 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005245 return false;
5246 }
5247
5248 Program *programObject = GetValidProgram(context, program);
5249
5250 if (!programObject)
5251 {
5252 return false;
5253 }
5254
5255 if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
5256 {
Jamie Madille0472f32018-11-27 16:32:45 -05005257 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005258 return false;
5259 }
5260
5261 return true;
5262}
5263
Jamie Madill5b772312018-03-08 20:28:32 -05005264bool ValidateGetAttachedShaders(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005265 GLuint program,
5266 GLsizei maxcount,
5267 GLsizei *count,
5268 GLuint *shaders)
5269{
5270 if (maxcount < 0)
5271 {
Jamie Madille0472f32018-11-27 16:32:45 -05005272 context->validationError(GL_INVALID_VALUE, kNegativeMaxCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005273 return false;
5274 }
5275
5276 Program *programObject = GetValidProgram(context, program);
5277
5278 if (!programObject)
5279 {
5280 return false;
5281 }
5282
5283 return true;
5284}
5285
Jamie Madill5b772312018-03-08 20:28:32 -05005286bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005287{
Geoff Langfc32e8b2017-05-31 14:16:59 -04005288 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5289 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005290 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005291 {
Jamie Madille0472f32018-11-27 16:32:45 -05005292 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005293 return false;
5294 }
5295
Jamie Madillc1d770e2017-04-13 17:31:24 -04005296 Program *programObject = GetValidProgram(context, program);
5297
5298 if (!programObject)
5299 {
Jamie Madille0472f32018-11-27 16:32:45 -05005300 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005301 return false;
5302 }
5303
5304 if (!programObject->isLinked())
5305 {
Jamie Madille0472f32018-11-27 16:32:45 -05005306 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005307 return false;
5308 }
5309
5310 return true;
5311}
5312
Jamie Madill5b772312018-03-08 20:28:32 -05005313bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005314{
5315 GLenum nativeType;
5316 unsigned int numParams = 0;
5317 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5318}
5319
Jamie Madill5b772312018-03-08 20:28:32 -05005320bool ValidateGetError(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005321{
5322 return true;
5323}
5324
Jamie Madill5b772312018-03-08 20:28:32 -05005325bool ValidateGetFloatv(Context *context, GLenum pname, GLfloat *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005326{
5327 GLenum nativeType;
5328 unsigned int numParams = 0;
5329 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5330}
5331
Jamie Madill5b772312018-03-08 20:28:32 -05005332bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005333{
5334 GLenum nativeType;
5335 unsigned int numParams = 0;
5336 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5337}
5338
Jamie Madill5b772312018-03-08 20:28:32 -05005339bool ValidateGetProgramInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005340 GLuint program,
5341 GLsizei bufsize,
5342 GLsizei *length,
5343 GLchar *infolog)
5344{
5345 if (bufsize < 0)
5346 {
Jamie Madille0472f32018-11-27 16:32:45 -05005347 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005348 return false;
5349 }
5350
5351 Program *programObject = GetValidProgram(context, program);
5352 if (!programObject)
5353 {
5354 return false;
5355 }
5356
5357 return true;
5358}
5359
Jamie Madill5b772312018-03-08 20:28:32 -05005360bool ValidateGetShaderInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005361 GLuint shader,
5362 GLsizei bufsize,
5363 GLsizei *length,
5364 GLchar *infolog)
5365{
5366 if (bufsize < 0)
5367 {
Jamie Madille0472f32018-11-27 16:32:45 -05005368 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005369 return false;
5370 }
5371
5372 Shader *shaderObject = GetValidShader(context, shader);
5373 if (!shaderObject)
5374 {
5375 return false;
5376 }
5377
5378 return true;
5379}
5380
Jamie Madill5b772312018-03-08 20:28:32 -05005381bool ValidateGetShaderPrecisionFormat(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005382 GLenum shadertype,
5383 GLenum precisiontype,
5384 GLint *range,
5385 GLint *precision)
5386{
5387 switch (shadertype)
5388 {
5389 case GL_VERTEX_SHADER:
5390 case GL_FRAGMENT_SHADER:
5391 break;
5392 case GL_COMPUTE_SHADER:
Jamie Madillc3e37312018-11-30 15:25:39 -05005393 context->validationError(GL_INVALID_OPERATION, kUnimplementedComputeShaderPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005394 return false;
5395 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005396 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005397 return false;
5398 }
5399
5400 switch (precisiontype)
5401 {
5402 case GL_LOW_FLOAT:
5403 case GL_MEDIUM_FLOAT:
5404 case GL_HIGH_FLOAT:
5405 case GL_LOW_INT:
5406 case GL_MEDIUM_INT:
5407 case GL_HIGH_INT:
5408 break;
5409
5410 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005411 context->validationError(GL_INVALID_ENUM, kInvalidPrecision);
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 ValidateGetShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005419 GLuint shader,
5420 GLsizei bufsize,
5421 GLsizei *length,
5422 GLchar *source)
5423{
5424 if (bufsize < 0)
5425 {
Jamie Madille0472f32018-11-27 16:32:45 -05005426 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005427 return false;
5428 }
5429
5430 Shader *shaderObject = GetValidShader(context, shader);
5431 if (!shaderObject)
5432 {
5433 return false;
5434 }
5435
5436 return true;
5437}
5438
Jamie Madill5b772312018-03-08 20:28:32 -05005439bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005440{
5441 if (strstr(name, "gl_") == name)
5442 {
5443 return false;
5444 }
5445
Geoff Langfc32e8b2017-05-31 14:16:59 -04005446 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5447 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005448 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005449 {
Jamie Madille0472f32018-11-27 16:32:45 -05005450 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005451 return false;
5452 }
5453
Jamie Madillc1d770e2017-04-13 17:31:24 -04005454 Program *programObject = GetValidProgram(context, program);
5455
5456 if (!programObject)
5457 {
5458 return false;
5459 }
5460
5461 if (!programObject->isLinked())
5462 {
Jamie Madille0472f32018-11-27 16:32:45 -05005463 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005464 return false;
5465 }
5466
5467 return true;
5468}
5469
Jamie Madill5b772312018-03-08 20:28:32 -05005470bool ValidateHint(Context *context, GLenum target, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005471{
5472 switch (mode)
5473 {
5474 case GL_FASTEST:
5475 case GL_NICEST:
5476 case GL_DONT_CARE:
5477 break;
5478
5479 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005480 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005481 return false;
5482 }
5483
5484 switch (target)
5485 {
5486 case GL_GENERATE_MIPMAP_HINT:
5487 break;
5488
Geoff Lange7bd2182017-06-16 16:13:13 -04005489 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
5490 if (context->getClientVersion() < ES_3_0 &&
5491 !context->getExtensions().standardDerivatives)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005492 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005493 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005494 return false;
5495 }
5496 break;
5497
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005498 case GL_PERSPECTIVE_CORRECTION_HINT:
5499 case GL_POINT_SMOOTH_HINT:
5500 case GL_LINE_SMOOTH_HINT:
5501 case GL_FOG_HINT:
5502 if (context->getClientMajorVersion() >= 2)
5503 {
Jamie Madille0472f32018-11-27 16:32:45 -05005504 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005505 return false;
5506 }
5507 break;
5508
Jamie Madillc1d770e2017-04-13 17:31:24 -04005509 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005510 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005511 return false;
5512 }
5513
5514 return true;
5515}
5516
Jamie Madill5b772312018-03-08 20:28:32 -05005517bool ValidateIsBuffer(Context *context, GLuint buffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005518{
5519 return true;
5520}
5521
Jamie Madill5b772312018-03-08 20:28:32 -05005522bool ValidateIsFramebuffer(Context *context, GLuint framebuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005523{
5524 return true;
5525}
5526
Jamie Madill5b772312018-03-08 20:28:32 -05005527bool ValidateIsProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005528{
5529 return true;
5530}
5531
Jamie Madill5b772312018-03-08 20:28:32 -05005532bool ValidateIsRenderbuffer(Context *context, GLuint renderbuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005533{
5534 return true;
5535}
5536
Jamie Madill5b772312018-03-08 20:28:32 -05005537bool ValidateIsShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005538{
5539 return true;
5540}
5541
Jamie Madill5b772312018-03-08 20:28:32 -05005542bool ValidateIsTexture(Context *context, GLuint texture)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005543{
5544 return true;
5545}
5546
Jamie Madill5b772312018-03-08 20:28:32 -05005547bool ValidatePixelStorei(Context *context, GLenum pname, GLint param)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005548{
5549 if (context->getClientMajorVersion() < 3)
5550 {
5551 switch (pname)
5552 {
5553 case GL_UNPACK_IMAGE_HEIGHT:
5554 case GL_UNPACK_SKIP_IMAGES:
Jamie Madille0472f32018-11-27 16:32:45 -05005555 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005556 return false;
5557
5558 case GL_UNPACK_ROW_LENGTH:
5559 case GL_UNPACK_SKIP_ROWS:
5560 case GL_UNPACK_SKIP_PIXELS:
5561 if (!context->getExtensions().unpackSubimage)
5562 {
Jamie Madille0472f32018-11-27 16:32:45 -05005563 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005564 return false;
5565 }
5566 break;
5567
5568 case GL_PACK_ROW_LENGTH:
5569 case GL_PACK_SKIP_ROWS:
5570 case GL_PACK_SKIP_PIXELS:
5571 if (!context->getExtensions().packSubimage)
5572 {
Jamie Madille0472f32018-11-27 16:32:45 -05005573 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005574 return false;
5575 }
5576 break;
5577 }
5578 }
5579
5580 if (param < 0)
5581 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005582 context->validationError(GL_INVALID_VALUE, kNegativeParam);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005583 return false;
5584 }
5585
5586 switch (pname)
5587 {
5588 case GL_UNPACK_ALIGNMENT:
5589 if (param != 1 && param != 2 && param != 4 && param != 8)
5590 {
Jamie Madille0472f32018-11-27 16:32:45 -05005591 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005592 return false;
5593 }
5594 break;
5595
5596 case GL_PACK_ALIGNMENT:
5597 if (param != 1 && param != 2 && param != 4 && param != 8)
5598 {
Jamie Madille0472f32018-11-27 16:32:45 -05005599 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005600 return false;
5601 }
5602 break;
5603
5604 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Geoff Lang000dab82017-09-27 14:27:07 -04005605 if (!context->getExtensions().packReverseRowOrder)
5606 {
Jamie Madille0472f32018-11-27 16:32:45 -05005607 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang000dab82017-09-27 14:27:07 -04005608 }
5609 break;
5610
Jamie Madillc1d770e2017-04-13 17:31:24 -04005611 case GL_UNPACK_ROW_LENGTH:
5612 case GL_UNPACK_IMAGE_HEIGHT:
5613 case GL_UNPACK_SKIP_IMAGES:
5614 case GL_UNPACK_SKIP_ROWS:
5615 case GL_UNPACK_SKIP_PIXELS:
5616 case GL_PACK_ROW_LENGTH:
5617 case GL_PACK_SKIP_ROWS:
5618 case GL_PACK_SKIP_PIXELS:
5619 break;
5620
5621 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005622 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005623 return false;
5624 }
5625
5626 return true;
5627}
5628
Jamie Madill5b772312018-03-08 20:28:32 -05005629bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005630{
5631 return true;
5632}
5633
Jamie Madill5b772312018-03-08 20:28:32 -05005634bool ValidateReleaseShaderCompiler(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005635{
5636 return true;
5637}
5638
Jamie Madill5b772312018-03-08 20:28:32 -05005639bool ValidateSampleCoverage(Context *context, GLfloat value, GLboolean invert)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005640{
5641 return true;
5642}
5643
Jamie Madill5b772312018-03-08 20:28:32 -05005644bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005645{
5646 if (width < 0 || height < 0)
5647 {
Jamie Madille0472f32018-11-27 16:32:45 -05005648 context->validationError(GL_INVALID_VALUE, kNegativeSize);
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 ValidateShaderBinary(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005656 GLsizei n,
5657 const GLuint *shaders,
5658 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005659 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005660 GLsizei length)
5661{
5662 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
5663 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
5664 shaderBinaryFormats.end())
5665 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005666 context->validationError(GL_INVALID_ENUM, kInvalidShaderBinaryFormat);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005667 return false;
5668 }
5669
5670 return true;
5671}
5672
Jamie Madill5b772312018-03-08 20:28:32 -05005673bool ValidateShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005674 GLuint shader,
5675 GLsizei count,
5676 const GLchar *const *string,
5677 const GLint *length)
5678{
5679 if (count < 0)
5680 {
Jamie Madille0472f32018-11-27 16:32:45 -05005681 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005682 return false;
5683 }
5684
Geoff Langfc32e8b2017-05-31 14:16:59 -04005685 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5686 // shader-related entry points
5687 if (context->getExtensions().webglCompatibility)
5688 {
5689 for (GLsizei i = 0; i < count; i++)
5690 {
Geoff Langcab92ee2017-07-19 17:32:07 -04005691 size_t len =
5692 (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
Geoff Langa71a98e2017-06-19 15:15:00 -04005693
5694 // Backslash as line-continuation is allowed in WebGL 2.0.
Geoff Langcab92ee2017-07-19 17:32:07 -04005695 if (!IsValidESSLShaderSourceString(string[i], len,
5696 context->getClientVersion() >= ES_3_0))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005697 {
Jamie Madille0472f32018-11-27 16:32:45 -05005698 context->validationError(GL_INVALID_VALUE, kShaderSourceInvalidCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005699 return false;
5700 }
5701 }
5702 }
5703
Jamie Madillc1d770e2017-04-13 17:31:24 -04005704 Shader *shaderObject = GetValidShader(context, shader);
5705 if (!shaderObject)
5706 {
5707 return false;
5708 }
5709
5710 return true;
5711}
5712
Jamie Madill5b772312018-03-08 20:28:32 -05005713bool ValidateStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005714{
5715 if (!IsValidStencilFunc(func))
5716 {
Jamie Madille0472f32018-11-27 16:32:45 -05005717 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005718 return false;
5719 }
5720
5721 return true;
5722}
5723
Jamie Madill5b772312018-03-08 20:28:32 -05005724bool ValidateStencilFuncSeparate(Context *context, GLenum face, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005725{
5726 if (!IsValidStencilFace(face))
5727 {
Jamie Madille0472f32018-11-27 16:32:45 -05005728 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005729 return false;
5730 }
5731
5732 if (!IsValidStencilFunc(func))
5733 {
Jamie Madille0472f32018-11-27 16:32:45 -05005734 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005735 return false;
5736 }
5737
5738 return true;
5739}
5740
Jamie Madill5b772312018-03-08 20:28:32 -05005741bool ValidateStencilMask(Context *context, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005742{
5743 return true;
5744}
5745
Jamie Madill5b772312018-03-08 20:28:32 -05005746bool ValidateStencilMaskSeparate(Context *context, GLenum face, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005747{
5748 if (!IsValidStencilFace(face))
5749 {
Jamie Madille0472f32018-11-27 16:32:45 -05005750 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005751 return false;
5752 }
5753
5754 return true;
5755}
5756
Jamie Madill5b772312018-03-08 20:28:32 -05005757bool ValidateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005758{
5759 if (!IsValidStencilOp(fail))
5760 {
Jamie Madille0472f32018-11-27 16:32:45 -05005761 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005762 return false;
5763 }
5764
5765 if (!IsValidStencilOp(zfail))
5766 {
Jamie Madille0472f32018-11-27 16:32:45 -05005767 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005768 return false;
5769 }
5770
5771 if (!IsValidStencilOp(zpass))
5772 {
Jamie Madille0472f32018-11-27 16:32:45 -05005773 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005774 return false;
5775 }
5776
5777 return true;
5778}
5779
Jamie Madill5b772312018-03-08 20:28:32 -05005780bool ValidateStencilOpSeparate(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005781 GLenum face,
5782 GLenum fail,
5783 GLenum zfail,
5784 GLenum zpass)
5785{
5786 if (!IsValidStencilFace(face))
5787 {
Jamie Madille0472f32018-11-27 16:32:45 -05005788 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005789 return false;
5790 }
5791
5792 return ValidateStencilOp(context, fail, zfail, zpass);
5793}
5794
Jamie Madill5b772312018-03-08 20:28:32 -05005795bool ValidateUniform1f(Context *context, GLint location, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005796{
5797 return ValidateUniform(context, GL_FLOAT, location, 1);
5798}
5799
Jamie Madill5b772312018-03-08 20:28:32 -05005800bool ValidateUniform1fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005801{
5802 return ValidateUniform(context, GL_FLOAT, location, count);
5803}
5804
Jamie Madill5b772312018-03-08 20:28:32 -05005805bool ValidateUniform1i(Context *context, GLint location, GLint x)
Jamie Madillbe849e42017-05-02 15:49:00 -04005806{
5807 return ValidateUniform1iv(context, location, 1, &x);
5808}
5809
Jamie Madill5b772312018-03-08 20:28:32 -05005810bool ValidateUniform2fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005811{
5812 return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
5813}
5814
Jamie Madill5b772312018-03-08 20:28:32 -05005815bool ValidateUniform2i(Context *context, GLint location, GLint x, GLint y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005816{
5817 return ValidateUniform(context, GL_INT_VEC2, location, 1);
5818}
5819
Jamie Madill5b772312018-03-08 20:28:32 -05005820bool ValidateUniform2iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005821{
5822 return ValidateUniform(context, GL_INT_VEC2, location, count);
5823}
5824
Jamie Madill5b772312018-03-08 20:28:32 -05005825bool ValidateUniform3f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005826{
5827 return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
5828}
5829
Jamie Madill5b772312018-03-08 20:28:32 -05005830bool ValidateUniform3fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005831{
5832 return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
5833}
5834
Jamie Madill5b772312018-03-08 20:28:32 -05005835bool ValidateUniform3i(Context *context, GLint location, GLint x, GLint y, GLint z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005836{
5837 return ValidateUniform(context, GL_INT_VEC3, location, 1);
5838}
5839
Jamie Madill5b772312018-03-08 20:28:32 -05005840bool ValidateUniform3iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841{
5842 return ValidateUniform(context, GL_INT_VEC3, location, count);
5843}
5844
Jamie Madill5b772312018-03-08 20:28:32 -05005845bool ValidateUniform4f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005846{
5847 return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
5848}
5849
Jamie Madill5b772312018-03-08 20:28:32 -05005850bool ValidateUniform4fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005851{
5852 return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
5853}
5854
Jamie Madill5b772312018-03-08 20:28:32 -05005855bool ValidateUniform4i(Context *context, GLint location, GLint x, GLint y, GLint z, GLint w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005856{
5857 return ValidateUniform(context, GL_INT_VEC4, location, 1);
5858}
5859
Jamie Madill5b772312018-03-08 20:28:32 -05005860bool ValidateUniform4iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005861{
5862 return ValidateUniform(context, GL_INT_VEC4, location, count);
5863}
5864
Jamie Madill5b772312018-03-08 20:28:32 -05005865bool ValidateUniformMatrix2fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005866 GLint location,
5867 GLsizei count,
5868 GLboolean transpose,
5869 const GLfloat *value)
5870{
5871 return ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose);
5872}
5873
Jamie Madill5b772312018-03-08 20:28:32 -05005874bool ValidateUniformMatrix3fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005875 GLint location,
5876 GLsizei count,
5877 GLboolean transpose,
5878 const GLfloat *value)
5879{
5880 return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
5881}
5882
Jamie Madill5b772312018-03-08 20:28:32 -05005883bool ValidateUniformMatrix4fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005884 GLint location,
5885 GLsizei count,
5886 GLboolean transpose,
5887 const GLfloat *value)
5888{
5889 return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
5890}
5891
Jamie Madill5b772312018-03-08 20:28:32 -05005892bool ValidateValidateProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005893{
5894 Program *programObject = GetValidProgram(context, program);
5895
5896 if (!programObject)
5897 {
5898 return false;
5899 }
5900
5901 return true;
5902}
5903
Jamie Madill5b772312018-03-08 20:28:32 -05005904bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005905{
5906 return ValidateVertexAttribIndex(context, index);
5907}
5908
Jamie Madill5b772312018-03-08 20:28:32 -05005909bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005910{
5911 return ValidateVertexAttribIndex(context, index);
5912}
5913
Jamie Madill5b772312018-03-08 20:28:32 -05005914bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005915{
5916 return ValidateVertexAttribIndex(context, index);
5917}
5918
Jamie Madill5b772312018-03-08 20:28:32 -05005919bool ValidateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005920{
5921 return ValidateVertexAttribIndex(context, index);
5922}
5923
Jamie Madill5b772312018-03-08 20:28:32 -05005924bool ValidateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925{
5926 return ValidateVertexAttribIndex(context, index);
5927}
5928
Jamie Madill5b772312018-03-08 20:28:32 -05005929bool ValidateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005930{
5931 return ValidateVertexAttribIndex(context, index);
5932}
5933
Jamie Madill5b772312018-03-08 20:28:32 -05005934bool ValidateVertexAttrib4f(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005935 GLuint index,
5936 GLfloat x,
5937 GLfloat y,
5938 GLfloat z,
5939 GLfloat w)
5940{
5941 return ValidateVertexAttribIndex(context, index);
5942}
5943
Jamie Madill5b772312018-03-08 20:28:32 -05005944bool ValidateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005945{
5946 return ValidateVertexAttribIndex(context, index);
5947}
5948
Jamie Madill5b772312018-03-08 20:28:32 -05005949bool ValidateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005950{
5951 if (width < 0 || height < 0)
5952 {
Jamie Madille0472f32018-11-27 16:32:45 -05005953 context->validationError(GL_INVALID_VALUE, kViewportNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005954 return false;
5955 }
5956
5957 return true;
5958}
5959
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08005960bool ValidateGetFramebufferAttachmentParameteriv(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04005961 GLenum target,
5962 GLenum attachment,
5963 GLenum pname,
5964 GLint *params)
5965{
5966 return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
5967 nullptr);
5968}
5969
Jamie Madill5b772312018-03-08 20:28:32 -05005970bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04005971{
5972 return ValidateGetProgramivBase(context, program, pname, nullptr);
5973}
5974
Jamie Madill5b772312018-03-08 20:28:32 -05005975bool ValidateCopyTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005976 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005977 GLint level,
5978 GLenum internalformat,
5979 GLint x,
5980 GLint y,
5981 GLsizei width,
5982 GLsizei height,
5983 GLint border)
5984{
5985 if (context->getClientMajorVersion() < 3)
5986 {
5987 return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
5988 0, x, y, width, height, border);
5989 }
5990
5991 ASSERT(context->getClientMajorVersion() == 3);
5992 return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
5993 0, x, y, width, height, border);
5994}
5995
5996bool ValidateCopyTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005997 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005998 GLint level,
5999 GLint xoffset,
6000 GLint yoffset,
6001 GLint x,
6002 GLint y,
6003 GLsizei width,
6004 GLsizei height)
6005{
6006 if (context->getClientMajorVersion() < 3)
6007 {
6008 return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
6009 yoffset, x, y, width, height, 0);
6010 }
6011
6012 return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
6013 yoffset, 0, x, y, width, height, 0);
6014}
6015
6016bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
6017{
6018 return ValidateGenOrDelete(context, n);
6019}
6020
6021bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
6022{
6023 return ValidateGenOrDelete(context, n);
6024}
6025
6026bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
6027{
6028 return ValidateGenOrDelete(context, n);
6029}
6030
6031bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
6032{
6033 return ValidateGenOrDelete(context, n);
6034}
6035
6036bool ValidateDisable(Context *context, GLenum cap)
6037{
6038 if (!ValidCap(context, cap, false))
6039 {
Jamie Madille0472f32018-11-27 16:32:45 -05006040 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006041 return false;
6042 }
6043
6044 return true;
6045}
6046
6047bool ValidateEnable(Context *context, GLenum cap)
6048{
6049 if (!ValidCap(context, cap, false))
6050 {
Jamie Madille0472f32018-11-27 16:32:45 -05006051 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006052 return false;
6053 }
6054
6055 if (context->getLimitations().noSampleAlphaToCoverageSupport &&
6056 cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
6057 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006058 context->validationError(GL_INVALID_OPERATION, kNoSampleAlphaToCoveragesLimitation);
Jamie Madillbe849e42017-05-02 15:49:00 -04006059
6060 // We also output an error message to the debugger window if tracing is active, so that
6061 // developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006062 ERR() << kNoSampleAlphaToCoveragesLimitation;
Jamie Madillbe849e42017-05-02 15:49:00 -04006063 return false;
6064 }
6065
6066 return true;
6067}
6068
6069bool ValidateFramebufferRenderbuffer(Context *context,
6070 GLenum target,
6071 GLenum attachment,
6072 GLenum renderbuffertarget,
6073 GLuint renderbuffer)
6074{
Geoff Lange8afa902017-09-27 15:00:43 -04006075 if (!ValidFramebufferTarget(context, target))
Jamie Madillbe849e42017-05-02 15:49:00 -04006076 {
Jamie Madille0472f32018-11-27 16:32:45 -05006077 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Brandon Jones6cad5662017-06-14 13:25:13 -07006078 return false;
6079 }
6080
6081 if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
6082 {
Jamie Madille0472f32018-11-27 16:32:45 -05006083 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006084 return false;
6085 }
6086
6087 return ValidateFramebufferRenderbufferParameters(context, target, attachment,
6088 renderbuffertarget, renderbuffer);
6089}
6090
6091bool ValidateFramebufferTexture2D(Context *context,
6092 GLenum target,
6093 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006094 TextureTarget textarget,
Jamie Madillbe849e42017-05-02 15:49:00 -04006095 GLuint texture,
6096 GLint level)
6097{
6098 // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
6099 // extension
6100 if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
6101 level != 0)
6102 {
Jamie Madille0472f32018-11-27 16:32:45 -05006103 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006104 return false;
6105 }
6106
6107 if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
6108 {
6109 return false;
6110 }
6111
6112 if (texture != 0)
6113 {
6114 gl::Texture *tex = context->getTexture(texture);
6115 ASSERT(tex);
6116
6117 const gl::Caps &caps = context->getCaps();
6118
6119 switch (textarget)
6120 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006121 case TextureTarget::_2D:
Jamie Madillbe849e42017-05-02 15:49:00 -04006122 {
6123 if (level > gl::log2(caps.max2DTextureSize))
6124 {
Jamie Madille0472f32018-11-27 16:32:45 -05006125 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006126 return false;
6127 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006128 if (tex->getType() != TextureType::_2D)
Jamie Madillbe849e42017-05-02 15:49:00 -04006129 {
Jamie Madille0472f32018-11-27 16:32:45 -05006130 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006131 return false;
6132 }
6133 }
6134 break;
6135
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006136 case TextureTarget::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006137 {
6138 if (level != 0)
6139 {
Jamie Madille0472f32018-11-27 16:32:45 -05006140 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006141 return false;
6142 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006143 if (tex->getType() != TextureType::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006144 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006145 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006146 return false;
6147 }
6148 }
6149 break;
6150
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006151 case TextureTarget::CubeMapNegativeX:
6152 case TextureTarget::CubeMapNegativeY:
6153 case TextureTarget::CubeMapNegativeZ:
6154 case TextureTarget::CubeMapPositiveX:
6155 case TextureTarget::CubeMapPositiveY:
6156 case TextureTarget::CubeMapPositiveZ:
Jamie Madillbe849e42017-05-02 15:49:00 -04006157 {
6158 if (level > gl::log2(caps.maxCubeMapTextureSize))
6159 {
Jamie Madille0472f32018-11-27 16:32:45 -05006160 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006161 return false;
6162 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006163 if (tex->getType() != TextureType::CubeMap)
Jamie Madillbe849e42017-05-02 15:49:00 -04006164 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006165 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006166 return false;
6167 }
6168 }
6169 break;
6170
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006171 case TextureTarget::_2DMultisample:
Jamie Madillbe849e42017-05-02 15:49:00 -04006172 {
Yizhou Jiang7818a852018-09-06 15:02:04 +08006173 if (context->getClientVersion() < ES_3_1 &&
6174 !context->getExtensions().textureMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006175 {
Jamie Madill610640f2018-11-21 17:28:41 -05006176 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05006177 kMultisampleTextureExtensionOrES31Required);
Jamie Madillbe849e42017-05-02 15:49:00 -04006178 return false;
6179 }
6180
6181 if (level != 0)
6182 {
Jamie Madille0472f32018-11-27 16:32:45 -05006183 context->validationError(GL_INVALID_VALUE, kLevelNotZero);
Jamie Madillbe849e42017-05-02 15:49:00 -04006184 return false;
6185 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006186 if (tex->getType() != TextureType::_2DMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006187 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006188 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006189 return false;
6190 }
6191 }
6192 break;
6193
6194 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006195 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006196 return false;
6197 }
Jamie Madillbe849e42017-05-02 15:49:00 -04006198 }
6199
6200 return true;
6201}
6202
6203bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
6204{
6205 return ValidateGenOrDelete(context, n);
6206}
6207
6208bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
6209{
6210 return ValidateGenOrDelete(context, n);
6211}
6212
6213bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
6214{
6215 return ValidateGenOrDelete(context, n);
6216}
6217
6218bool ValidateGenTextures(Context *context, GLint n, GLuint *)
6219{
6220 return ValidateGenOrDelete(context, n);
6221}
6222
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006223bool ValidateGenerateMipmap(Context *context, TextureType target)
Jamie Madillbe849e42017-05-02 15:49:00 -04006224{
6225 if (!ValidTextureTarget(context, target))
6226 {
Jamie Madille0472f32018-11-27 16:32:45 -05006227 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006228 return false;
6229 }
6230
Jamie Madillcfc73cc2019-04-08 16:26:51 -04006231 Texture *texture = context->getTextureByType(target);
Jamie Madillbe849e42017-05-02 15:49:00 -04006232
6233 if (texture == nullptr)
6234 {
Jamie Madille0472f32018-11-27 16:32:45 -05006235 context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
Jamie Madillbe849e42017-05-02 15:49:00 -04006236 return false;
6237 }
6238
6239 const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
6240
6241 // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
6242 // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
6243 if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6244 {
Jamie Madille0472f32018-11-27 16:32:45 -05006245 context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
Jamie Madillbe849e42017-05-02 15:49:00 -04006246 return false;
6247 }
6248
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006249 TextureTarget baseTarget = (target == TextureType::CubeMap)
6250 ? TextureTarget::CubeMapPositiveX
6251 : NonCubeTextureTypeToTarget(target);
Geoff Lang536eca12017-09-13 11:23:35 -04006252 const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
6253 if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
6254 format.stencilBits > 0)
Brandon Jones6cad5662017-06-14 13:25:13 -07006255 {
Jamie Madille0472f32018-11-27 16:32:45 -05006256 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Brandon Jones6cad5662017-06-14 13:25:13 -07006257 return false;
6258 }
6259
Geoff Lang536eca12017-09-13 11:23:35 -04006260 // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
6261 bool formatUnsized = !format.sized;
6262 bool formatColorRenderableAndFilterable =
6263 format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
Yuly Novikovf15f8862018-06-04 18:59:41 -04006264 format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
Geoff Lang536eca12017-09-13 11:23:35 -04006265 if (!formatUnsized && !formatColorRenderableAndFilterable)
Jamie Madillbe849e42017-05-02 15:49:00 -04006266 {
Jamie Madille0472f32018-11-27 16:32:45 -05006267 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006268 return false;
6269 }
6270
Geoff Lang536eca12017-09-13 11:23:35 -04006271 // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
6272 // generation
6273 if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
6274 {
Jamie Madille0472f32018-11-27 16:32:45 -05006275 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Geoff Lang536eca12017-09-13 11:23:35 -04006276 return false;
6277 }
6278
Jiange2c00842018-07-13 16:50:49 +08006279 // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
6280 // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
6281 if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
Jamie Madillbe849e42017-05-02 15:49:00 -04006282 {
Jamie Madille0472f32018-11-27 16:32:45 -05006283 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006284 return false;
6285 }
6286
6287 // Non-power of 2 ES2 check
6288 if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
6289 (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
6290 !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
6291 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006292 ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
6293 target == TextureType::CubeMap);
Jamie Madille0472f32018-11-27 16:32:45 -05006294 context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
Jamie Madillbe849e42017-05-02 15:49:00 -04006295 return false;
6296 }
6297
6298 // Cube completeness check
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006299 if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
Jamie Madillbe849e42017-05-02 15:49:00 -04006300 {
Jamie Madille0472f32018-11-27 16:32:45 -05006301 context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
Jamie Madillbe849e42017-05-02 15:49:00 -04006302 return false;
6303 }
6304
James Darpinian83b2f0e2018-11-27 15:56:01 -08006305 if (context->getExtensions().webglCompatibility &&
6306 (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
6307 texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
6308 {
6309 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
6310 return false;
6311 }
6312
Jamie Madillbe849e42017-05-02 15:49:00 -04006313 return true;
6314}
6315
Jamie Madill5b772312018-03-08 20:28:32 -05006316bool ValidateGetBufferParameteriv(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04006317 BufferBinding target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006318 GLenum pname,
6319 GLint *params)
6320{
6321 return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
6322}
6323
6324bool ValidateGetRenderbufferParameteriv(Context *context,
6325 GLenum target,
6326 GLenum pname,
6327 GLint *params)
6328{
6329 return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
6330}
6331
6332bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
6333{
6334 return ValidateGetShaderivBase(context, shader, pname, nullptr);
6335}
6336
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006337bool ValidateGetTexParameterfv(Context *context, TextureType target, GLenum pname, GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006338{
6339 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6340}
6341
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006342bool ValidateGetTexParameteriv(Context *context, TextureType target, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006343{
6344 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6345}
6346
Till Rathmannb8543632018-10-02 19:46:14 +02006347bool ValidateGetTexParameterIivOES(Context *context,
6348 TextureType target,
6349 GLenum pname,
6350 GLint *params)
6351{
6352 if (context->getClientMajorVersion() < 3)
6353 {
Jamie Madille0472f32018-11-27 16:32:45 -05006354 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006355 return false;
6356 }
6357 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6358}
6359
6360bool ValidateGetTexParameterIuivOES(Context *context,
6361 TextureType target,
6362 GLenum pname,
6363 GLuint *params)
6364{
6365 if (context->getClientMajorVersion() < 3)
6366 {
Jamie Madille0472f32018-11-27 16:32:45 -05006367 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006368 return false;
6369 }
6370 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6371}
6372
Jamie Madillbe849e42017-05-02 15:49:00 -04006373bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
6374{
6375 return ValidateGetUniformBase(context, program, location);
6376}
6377
6378bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
6379{
6380 return ValidateGetUniformBase(context, program, location);
6381}
6382
6383bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
6384{
6385 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6386}
6387
6388bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
6389{
6390 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6391}
6392
6393bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
6394{
6395 return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
6396}
6397
6398bool ValidateIsEnabled(Context *context, GLenum cap)
6399{
6400 if (!ValidCap(context, cap, true))
6401 {
Jamie Madille0472f32018-11-27 16:32:45 -05006402 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006403 return false;
6404 }
6405
6406 return true;
6407}
6408
6409bool ValidateLinkProgram(Context *context, GLuint program)
6410{
6411 if (context->hasActiveTransformFeedback(program))
6412 {
6413 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006414 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackActiveDuringLink);
Jamie Madillbe849e42017-05-02 15:49:00 -04006415 return false;
6416 }
6417
6418 Program *programObject = GetValidProgram(context, program);
6419 if (!programObject)
6420 {
6421 return false;
6422 }
6423
6424 return true;
6425}
6426
Jamie Madill4928b7c2017-06-20 12:57:39 -04006427bool ValidateReadPixels(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006428 GLint x,
6429 GLint y,
6430 GLsizei width,
6431 GLsizei height,
6432 GLenum format,
6433 GLenum type,
6434 void *pixels)
6435{
6436 return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
6437 nullptr, pixels);
6438}
6439
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006440bool ValidateTexParameterf(Context *context, TextureType target, GLenum pname, GLfloat param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006441{
Till Rathmannb8543632018-10-02 19:46:14 +02006442 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006443}
6444
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006445bool ValidateTexParameterfv(Context *context,
6446 TextureType target,
6447 GLenum pname,
6448 const GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006449{
Till Rathmannb8543632018-10-02 19:46:14 +02006450 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006451}
6452
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006453bool ValidateTexParameteri(Context *context, TextureType target, GLenum pname, GLint param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006454{
Till Rathmannb8543632018-10-02 19:46:14 +02006455 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006456}
6457
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006458bool ValidateTexParameteriv(Context *context, TextureType target, GLenum pname, const GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006459{
Till Rathmannb8543632018-10-02 19:46:14 +02006460 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6461}
6462
6463bool ValidateTexParameterIivOES(Context *context,
6464 TextureType target,
6465 GLenum pname,
6466 const GLint *params)
6467{
6468 if (context->getClientMajorVersion() < 3)
6469 {
Jamie Madille0472f32018-11-27 16:32:45 -05006470 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006471 return false;
6472 }
6473 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6474}
6475
6476bool ValidateTexParameterIuivOES(Context *context,
6477 TextureType target,
6478 GLenum pname,
6479 const GLuint *params)
6480{
6481 if (context->getClientMajorVersion() < 3)
6482 {
Jamie Madille0472f32018-11-27 16:32:45 -05006483 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006484 return false;
6485 }
6486 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006487}
6488
6489bool ValidateUseProgram(Context *context, GLuint program)
6490{
6491 if (program != 0)
6492 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006493 Program *programObject = context->getProgramResolveLink(program);
Jamie Madillbe849e42017-05-02 15:49:00 -04006494 if (!programObject)
6495 {
6496 // ES 3.1.0 section 7.3 page 72
6497 if (context->getShader(program))
6498 {
Jamie Madille0472f32018-11-27 16:32:45 -05006499 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006500 return false;
6501 }
6502 else
6503 {
Jamie Madille0472f32018-11-27 16:32:45 -05006504 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006505 return false;
6506 }
6507 }
6508 if (!programObject->isLinked())
6509 {
Jamie Madille0472f32018-11-27 16:32:45 -05006510 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillbe849e42017-05-02 15:49:00 -04006511 return false;
6512 }
6513 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006514 if (context->getState().isTransformFeedbackActiveUnpaused())
Jamie Madillbe849e42017-05-02 15:49:00 -04006515 {
6516 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006517 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackUseProgram);
Jamie Madillbe849e42017-05-02 15:49:00 -04006518 return false;
6519 }
6520
6521 return true;
6522}
6523
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006524bool ValidateDeleteFencesNV(Context *context, GLsizei n, const GLuint *fences)
6525{
6526 if (!context->getExtensions().fence)
6527 {
Jamie Madille0472f32018-11-27 16:32:45 -05006528 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006529 return false;
6530 }
6531
6532 if (n < 0)
6533 {
Jamie Madille0472f32018-11-27 16:32:45 -05006534 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006535 return false;
6536 }
6537
6538 return true;
6539}
6540
6541bool ValidateFinishFenceNV(Context *context, GLuint fence)
6542{
6543 if (!context->getExtensions().fence)
6544 {
Jamie Madille0472f32018-11-27 16:32:45 -05006545 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006546 return false;
6547 }
6548
6549 FenceNV *fenceObject = context->getFenceNV(fence);
6550
6551 if (fenceObject == nullptr)
6552 {
Jamie Madille0472f32018-11-27 16:32:45 -05006553 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006554 return false;
6555 }
6556
6557 if (!fenceObject->isSet())
6558 {
Jamie Madille0472f32018-11-27 16:32:45 -05006559 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006560 return false;
6561 }
6562
6563 return true;
6564}
6565
6566bool ValidateGenFencesNV(Context *context, GLsizei n, GLuint *fences)
6567{
6568 if (!context->getExtensions().fence)
6569 {
Jamie Madille0472f32018-11-27 16:32:45 -05006570 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006571 return false;
6572 }
6573
6574 if (n < 0)
6575 {
Jamie Madille0472f32018-11-27 16:32:45 -05006576 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006577 return false;
6578 }
6579
6580 return true;
6581}
6582
6583bool ValidateGetFenceivNV(Context *context, GLuint fence, GLenum pname, GLint *params)
6584{
6585 if (!context->getExtensions().fence)
6586 {
Jamie Madille0472f32018-11-27 16:32:45 -05006587 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006588 return false;
6589 }
6590
6591 FenceNV *fenceObject = context->getFenceNV(fence);
6592
6593 if (fenceObject == nullptr)
6594 {
Jamie Madille0472f32018-11-27 16:32:45 -05006595 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006596 return false;
6597 }
6598
6599 if (!fenceObject->isSet())
6600 {
Jamie Madille0472f32018-11-27 16:32:45 -05006601 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006602 return false;
6603 }
6604
6605 switch (pname)
6606 {
6607 case GL_FENCE_STATUS_NV:
6608 case GL_FENCE_CONDITION_NV:
6609 break;
6610
6611 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006612 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006613 return false;
6614 }
6615
6616 return true;
6617}
6618
6619bool ValidateGetGraphicsResetStatusEXT(Context *context)
6620{
6621 if (!context->getExtensions().robustness)
6622 {
Jamie Madille0472f32018-11-27 16:32:45 -05006623 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006624 return false;
6625 }
6626
6627 return true;
6628}
6629
6630bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
6631 GLuint shader,
6632 GLsizei bufsize,
6633 GLsizei *length,
6634 GLchar *source)
6635{
6636 if (!context->getExtensions().translatedShaderSource)
6637 {
Jamie Madille0472f32018-11-27 16:32:45 -05006638 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006639 return false;
6640 }
6641
6642 if (bufsize < 0)
6643 {
Jamie Madille0472f32018-11-27 16:32:45 -05006644 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006645 return false;
6646 }
6647
6648 Shader *shaderObject = context->getShader(shader);
6649
6650 if (!shaderObject)
6651 {
Jamie Madille0472f32018-11-27 16:32:45 -05006652 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006653 return false;
6654 }
6655
6656 return true;
6657}
6658
6659bool ValidateIsFenceNV(Context *context, GLuint fence)
6660{
6661 if (!context->getExtensions().fence)
6662 {
Jamie Madille0472f32018-11-27 16:32:45 -05006663 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006664 return false;
6665 }
6666
6667 return true;
6668}
6669
Jamie Madill007530e2017-12-28 14:27:04 -05006670bool ValidateSetFenceNV(Context *context, GLuint fence, GLenum condition)
6671{
6672 if (!context->getExtensions().fence)
6673 {
Jamie Madille0472f32018-11-27 16:32:45 -05006674 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006675 return false;
6676 }
6677
6678 if (condition != GL_ALL_COMPLETED_NV)
6679 {
Jamie Madille0472f32018-11-27 16:32:45 -05006680 context->validationError(GL_INVALID_ENUM, kInvalidFenceCondition);
Jamie Madill007530e2017-12-28 14:27:04 -05006681 return false;
6682 }
6683
6684 FenceNV *fenceObject = context->getFenceNV(fence);
6685
6686 if (fenceObject == nullptr)
6687 {
Jamie Madille0472f32018-11-27 16:32:45 -05006688 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006689 return false;
6690 }
6691
6692 return true;
6693}
6694
6695bool ValidateTestFenceNV(Context *context, GLuint fence)
6696{
6697 if (!context->getExtensions().fence)
6698 {
Jamie Madille0472f32018-11-27 16:32:45 -05006699 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006700 return false;
6701 }
6702
6703 FenceNV *fenceObject = context->getFenceNV(fence);
6704
6705 if (fenceObject == nullptr)
6706 {
Jamie Madille0472f32018-11-27 16:32:45 -05006707 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006708 return false;
6709 }
6710
6711 if (fenceObject->isSet() != GL_TRUE)
6712 {
Jamie Madille0472f32018-11-27 16:32:45 -05006713 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill007530e2017-12-28 14:27:04 -05006714 return false;
6715 }
6716
6717 return true;
6718}
6719
6720bool ValidateTexStorage2DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006721 TextureType type,
Jamie Madill007530e2017-12-28 14:27:04 -05006722 GLsizei levels,
6723 GLenum internalformat,
6724 GLsizei width,
6725 GLsizei height)
6726{
6727 if (!context->getExtensions().textureStorage)
6728 {
Jamie Madille0472f32018-11-27 16:32:45 -05006729 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006730 return false;
6731 }
6732
6733 if (context->getClientMajorVersion() < 3)
6734 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006735 return ValidateES2TexStorageParameters(context, type, levels, internalformat, width,
Jamie Madill007530e2017-12-28 14:27:04 -05006736 height);
6737 }
6738
6739 ASSERT(context->getClientMajorVersion() >= 3);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006740 return ValidateES3TexStorage2DParameters(context, type, levels, internalformat, width, height,
Jamie Madill007530e2017-12-28 14:27:04 -05006741 1);
6742}
6743
6744bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor)
6745{
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006746 if (!context->getExtensions().instancedArraysANGLE)
Jamie Madill007530e2017-12-28 14:27:04 -05006747 {
Jamie Madille0472f32018-11-27 16:32:45 -05006748 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006749 return false;
6750 }
6751
6752 if (index >= MAX_VERTEX_ATTRIBS)
6753 {
Jamie Madille0472f32018-11-27 16:32:45 -05006754 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill007530e2017-12-28 14:27:04 -05006755 return false;
6756 }
6757
6758 if (context->getLimitations().attributeZeroRequiresZeroDivisorInEXT)
6759 {
6760 if (index == 0 && divisor != 0)
6761 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006762 context->validationError(GL_INVALID_OPERATION, kAttributeZeroRequiresDivisorLimitation);
Jamie Madill007530e2017-12-28 14:27:04 -05006763
6764 // We also output an error message to the debugger window if tracing is active, so
6765 // that developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006766 ERR() << kAttributeZeroRequiresDivisorLimitation;
Jamie Madill007530e2017-12-28 14:27:04 -05006767 return false;
6768 }
6769 }
6770
6771 return true;
6772}
6773
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006774bool ValidateVertexAttribDivisorEXT(Context *context, GLuint index, GLuint divisor)
6775{
6776 if (!context->getExtensions().instancedArraysEXT)
6777 {
6778 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6779 return false;
6780 }
6781
6782 if (index >= MAX_VERTEX_ATTRIBS)
6783 {
6784 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
6785 return false;
6786 }
6787
6788 return true;
6789}
6790
Jamie Madill007530e2017-12-28 14:27:04 -05006791bool ValidateTexImage3DOES(Context *context,
6792 GLenum target,
6793 GLint level,
6794 GLenum internalformat,
6795 GLsizei width,
6796 GLsizei height,
6797 GLsizei depth,
6798 GLint border,
6799 GLenum format,
6800 GLenum type,
6801 const void *pixels)
6802{
6803 UNIMPLEMENTED(); // FIXME
6804 return false;
6805}
6806
6807bool ValidatePopGroupMarkerEXT(Context *context)
6808{
6809 if (!context->getExtensions().debugMarker)
6810 {
6811 // The debug marker calls should not set error state
6812 // However, it seems reasonable to set an error state if the extension is not enabled
Jamie Madille0472f32018-11-27 16:32:45 -05006813 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006814 return false;
6815 }
6816
6817 return true;
6818}
6819
Jamie Madillfa920eb2018-01-04 11:45:50 -05006820bool ValidateTexStorage1DEXT(Context *context,
6821 GLenum target,
6822 GLsizei levels,
6823 GLenum internalformat,
6824 GLsizei width)
6825{
6826 UNIMPLEMENTED();
Jamie Madille0472f32018-11-27 16:32:45 -05006827 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006828 return false;
6829}
6830
6831bool ValidateTexStorage3DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006832 TextureType target,
Jamie Madillfa920eb2018-01-04 11:45:50 -05006833 GLsizei levels,
6834 GLenum internalformat,
6835 GLsizei width,
6836 GLsizei height,
6837 GLsizei depth)
6838{
6839 if (!context->getExtensions().textureStorage)
6840 {
Jamie Madille0472f32018-11-27 16:32:45 -05006841 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006842 return false;
6843 }
6844
6845 if (context->getClientMajorVersion() < 3)
6846 {
Jamie Madille0472f32018-11-27 16:32:45 -05006847 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006848 return false;
6849 }
6850
6851 return ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
6852 depth);
6853}
6854
jchen1082af6202018-06-22 10:59:52 +08006855bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count)
6856{
6857 if (!context->getExtensions().parallelShaderCompile)
6858 {
Jamie Madille0472f32018-11-27 16:32:45 -05006859 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
jchen1082af6202018-06-22 10:59:52 +08006860 return false;
6861 }
6862 return true;
6863}
6864
Austin Eng1bf18ce2018-10-19 15:34:02 -07006865bool ValidateMultiDrawArraysANGLE(Context *context,
6866 PrimitiveMode mode,
6867 const GLint *firsts,
6868 const GLsizei *counts,
6869 GLsizei drawcount)
6870{
6871 if (!context->getExtensions().multiDraw)
6872 {
Jamie Madille0472f32018-11-27 16:32:45 -05006873 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006874 return false;
6875 }
6876 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6877 {
6878 if (!ValidateDrawArrays(context, mode, firsts[drawID], counts[drawID]))
6879 {
6880 return false;
6881 }
6882 }
6883 return true;
6884}
6885
6886bool ValidateMultiDrawElementsANGLE(Context *context,
6887 PrimitiveMode mode,
6888 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05006889 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08006890 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07006891 GLsizei drawcount)
6892{
6893 if (!context->getExtensions().multiDraw)
6894 {
Jamie Madille0472f32018-11-27 16:32:45 -05006895 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006896 return false;
6897 }
6898 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6899 {
Austin Eng3b7c9d02018-11-21 18:09:05 -08006900 if (!ValidateDrawElements(context, mode, counts[drawID], type, indices[drawID]))
Austin Eng1bf18ce2018-10-19 15:34:02 -07006901 {
6902 return false;
6903 }
6904 }
6905 return true;
6906}
6907
Jeff Gilbert465d6092019-01-02 16:21:18 -08006908bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked)
6909{
6910 if (!context->getExtensions().provokingVertex)
6911 {
6912 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6913 return false;
6914 }
6915
6916 switch (modePacked)
6917 {
6918 case ProvokingVertex::FirstVertexConvention:
6919 case ProvokingVertex::LastVertexConvention:
6920 break;
6921 default:
6922 context->validationError(GL_INVALID_ENUM, kInvalidProvokingVertex);
6923 return false;
6924 }
6925
6926 return true;
6927}
6928
Jamie Madilla5410482019-01-31 19:55:55 -05006929void RecordBindTextureTypeError(Context *context, TextureType target)
6930{
6931 ASSERT(!context->getStateCache().isValidBindTextureType(target));
6932
6933 switch (target)
6934 {
6935 case TextureType::Rectangle:
6936 ASSERT(!context->getExtensions().textureRectangle);
6937 context->validationError(GL_INVALID_ENUM, kTextureRectangleNotSupported);
6938 break;
6939
6940 case TextureType::_3D:
6941 case TextureType::_2DArray:
6942 ASSERT(context->getClientMajorVersion() < 3);
6943 context->validationError(GL_INVALID_ENUM, kES3Required);
6944 break;
6945
6946 case TextureType::_2DMultisample:
6947 ASSERT(context->getClientVersion() < Version(3, 1) &&
6948 !context->getExtensions().textureMultisample);
6949 context->validationError(GL_INVALID_ENUM, kMultisampleTextureExtensionOrES31Required);
6950 break;
6951
6952 case TextureType::_2DMultisampleArray:
6953 ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
6954 context->validationError(GL_INVALID_ENUM, kMultisampleArrayExtensionRequired);
6955 break;
6956
6957 case TextureType::External:
6958 ASSERT(!context->getExtensions().eglImageExternal &&
6959 !context->getExtensions().eglStreamConsumerExternal);
6960 context->validationError(GL_INVALID_ENUM, kExternalTextureNotSupported);
6961 break;
6962
6963 default:
6964 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
6965 }
6966}
6967
Jamie Madillc29968b2016-01-20 11:17:23 -05006968} // namespace gl