blob: b65a1ba591a4493d9b407f655dae6f35e5e16ff8 [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,
3187 GLenum handleType,
3188 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 Spang9de3ddb2019-04-03 16:23:40 -04003302bool ValidateImportSemaphoreFdEXT(Context *context, GLuint semaphore, GLenum handleType, GLint fd)
3303{
3304 if (!context->getExtensions().semaphoreFd)
3305 {
3306 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3307 return false;
3308 }
3309
3310 UNIMPLEMENTED();
3311 return false;
3312}
3313
Corentin Wallez336129f2017-10-17 15:55:40 -04003314bool ValidateMapBufferBase(Context *context, BufferBinding target)
Geoff Lang79f71042017-08-14 16:43:43 -04003315{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003316 Buffer *buffer = context->getState().getTargetBuffer(target);
Geoff Lang79f71042017-08-14 16:43:43 -04003317 ASSERT(buffer != nullptr);
3318
3319 // Check if this buffer is currently being used as a transform feedback output buffer
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003320 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Lang79f71042017-08-14 16:43:43 -04003321 if (transformFeedback != nullptr && transformFeedback->isActive())
3322 {
3323 for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3324 {
3325 const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
3326 if (transformFeedbackBuffer.get() == buffer)
3327 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003328 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
Geoff Lang79f71042017-08-14 16:43:43 -04003329 return false;
3330 }
3331 }
3332 }
3333
James Darpiniane8a93c62018-01-04 18:02:24 -08003334 if (context->getExtensions().webglCompatibility &&
3335 buffer->isBoundForTransformFeedbackAndOtherUse())
3336 {
Jamie Madille0472f32018-11-27 16:32:45 -05003337 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08003338 return false;
3339 }
3340
Geoff Lang79f71042017-08-14 16:43:43 -04003341 return true;
3342}
3343
Olli Etuaho4f667482016-03-30 15:56:35 +03003344bool ValidateFlushMappedBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003345 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003346 GLintptr offset,
3347 GLsizeiptr length)
3348{
3349 if (!context->getExtensions().mapBufferRange)
3350 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003351 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003352 return false;
3353 }
3354
3355 return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
3356}
3357
Geoff Langd8605522016-04-13 10:19:12 -04003358bool ValidateBindUniformLocationCHROMIUM(Context *context,
3359 GLuint program,
3360 GLint location,
3361 const GLchar *name)
3362{
3363 if (!context->getExtensions().bindUniformLocation)
3364 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003365 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langd8605522016-04-13 10:19:12 -04003366 return false;
3367 }
3368
3369 Program *programObject = GetValidProgram(context, program);
3370 if (!programObject)
3371 {
3372 return false;
3373 }
3374
3375 if (location < 0)
3376 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003377 context->validationError(GL_INVALID_VALUE, kNegativeLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003378 return false;
3379 }
3380
3381 const Caps &caps = context->getCaps();
3382 if (static_cast<size_t>(location) >=
3383 (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
3384 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003385 context->validationError(GL_INVALID_VALUE, kInvalidBindUniformLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003386 return false;
3387 }
3388
Geoff Langfc32e8b2017-05-31 14:16:59 -04003389 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
3390 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04003391 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04003392 {
Jamie Madille0472f32018-11-27 16:32:45 -05003393 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04003394 return false;
3395 }
3396
Geoff Langd8605522016-04-13 10:19:12 -04003397 if (strncmp(name, "gl_", 3) == 0)
3398 {
Jamie Madille0472f32018-11-27 16:32:45 -05003399 context->validationError(GL_INVALID_VALUE, kNameBeginsWithGL);
Geoff Langd8605522016-04-13 10:19:12 -04003400 return false;
3401 }
3402
3403 return true;
3404}
3405
Jamie Madille2e406c2016-06-02 13:04:10 -04003406bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03003407{
3408 if (!context->getExtensions().framebufferMixedSamples)
3409 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003410 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänena797e062016-05-12 15:23:40 +03003411 return false;
3412 }
3413 switch (components)
3414 {
3415 case GL_RGB:
3416 case GL_RGBA:
3417 case GL_ALPHA:
3418 case GL_NONE:
3419 break;
3420 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003421 context->validationError(GL_INVALID_ENUM, kInvalidCoverageComponents);
Sami Väisänena797e062016-05-12 15:23:40 +03003422 return false;
3423 }
3424
3425 return true;
3426}
3427
Sami Väisänene45e53b2016-05-25 10:36:04 +03003428// CHROMIUM_path_rendering
3429
Jamie Madill007530e2017-12-28 14:27:04 -05003430bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003431{
Jamie Madill007530e2017-12-28 14:27:04 -05003432 if (!ValidateMatrixMode(context, matrixMode))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003433 {
Sami Väisänene45e53b2016-05-25 10:36:04 +03003434 return false;
3435 }
Jamie Madill007530e2017-12-28 14:27:04 -05003436
Sami Väisänene45e53b2016-05-25 10:36:04 +03003437 if (matrix == nullptr)
3438 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003439 context->validationError(GL_INVALID_OPERATION, kInvalidPathMatrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003440 return false;
3441 }
Jamie Madill007530e2017-12-28 14:27:04 -05003442
Sami Väisänene45e53b2016-05-25 10:36:04 +03003443 return true;
3444}
3445
Jamie Madill007530e2017-12-28 14:27:04 -05003446bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003447{
Jamie Madill007530e2017-12-28 14:27:04 -05003448 return ValidateMatrixMode(context, matrixMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003449}
3450
Jamie Madill007530e2017-12-28 14:27:04 -05003451bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003452{
3453 if (!context->getExtensions().pathRendering)
3454 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003455 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003456 return false;
3457 }
3458
3459 // range = 0 is undefined in NV_path_rendering.
3460 // we add stricter semantic check here and require a non zero positive range.
3461 if (range <= 0)
3462 {
Jamie Madille0472f32018-11-27 16:32:45 -05003463 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003464 return false;
3465 }
3466
3467 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
3468 {
Jamie Madille0472f32018-11-27 16:32:45 -05003469 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003470 return false;
3471 }
3472
3473 return true;
3474}
3475
Jamie Madill007530e2017-12-28 14:27:04 -05003476bool ValidateDeletePathsCHROMIUM(Context *context, GLuint path, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003477{
3478 if (!context->getExtensions().pathRendering)
3479 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003480 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003481 return false;
3482 }
3483
3484 // range = 0 is undefined in NV_path_rendering.
3485 // we add stricter semantic check here and require a non zero positive range.
3486 if (range <= 0)
3487 {
Jamie Madille0472f32018-11-27 16:32:45 -05003488 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003489 return false;
3490 }
3491
3492 angle::CheckedNumeric<std::uint32_t> checkedRange(path);
3493 checkedRange += range;
3494
3495 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
3496 {
Jamie Madille0472f32018-11-27 16:32:45 -05003497 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003498 return false;
3499 }
3500 return true;
3501}
3502
Jamie Madill007530e2017-12-28 14:27:04 -05003503bool ValidatePathCommandsCHROMIUM(Context *context,
3504 GLuint path,
3505 GLsizei numCommands,
3506 const GLubyte *commands,
3507 GLsizei numCoords,
3508 GLenum coordType,
3509 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003510{
3511 if (!context->getExtensions().pathRendering)
3512 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003513 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003514 return false;
3515 }
Brandon Jones59770802018-04-02 13:18:42 -07003516 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003517 {
Jamie Madille0472f32018-11-27 16:32:45 -05003518 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003519 return false;
3520 }
3521
3522 if (numCommands < 0)
3523 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003524 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCommands);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003525 return false;
3526 }
3527 else if (numCommands > 0)
3528 {
3529 if (!commands)
3530 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003531 context->validationError(GL_INVALID_VALUE, kInvalidPathCommandsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003532 return false;
3533 }
3534 }
3535
3536 if (numCoords < 0)
3537 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003538 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003539 return false;
3540 }
3541 else if (numCoords > 0)
3542 {
3543 if (!coords)
3544 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003545 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoordsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003546 return false;
3547 }
3548 }
3549
3550 std::uint32_t coordTypeSize = 0;
3551 switch (coordType)
3552 {
3553 case GL_BYTE:
3554 coordTypeSize = sizeof(GLbyte);
3555 break;
3556
3557 case GL_UNSIGNED_BYTE:
3558 coordTypeSize = sizeof(GLubyte);
3559 break;
3560
3561 case GL_SHORT:
3562 coordTypeSize = sizeof(GLshort);
3563 break;
3564
3565 case GL_UNSIGNED_SHORT:
3566 coordTypeSize = sizeof(GLushort);
3567 break;
3568
3569 case GL_FLOAT:
3570 coordTypeSize = sizeof(GLfloat);
3571 break;
3572
3573 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003574 context->validationError(GL_INVALID_ENUM, kInvalidPathCoordinateType);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003575 return false;
3576 }
3577
3578 angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
3579 checkedSize += (coordTypeSize * numCoords);
3580 if (!checkedSize.IsValid())
3581 {
Jamie Madille0472f32018-11-27 16:32:45 -05003582 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003583 return false;
3584 }
3585
3586 // early return skips command data validation when it doesn't exist.
3587 if (!commands)
3588 return true;
3589
3590 GLsizei expectedNumCoords = 0;
3591 for (GLsizei i = 0; i < numCommands; ++i)
3592 {
3593 switch (commands[i])
3594 {
3595 case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
3596 break;
3597 case GL_MOVE_TO_CHROMIUM:
3598 case GL_LINE_TO_CHROMIUM:
3599 expectedNumCoords += 2;
3600 break;
3601 case GL_QUADRATIC_CURVE_TO_CHROMIUM:
3602 expectedNumCoords += 4;
3603 break;
3604 case GL_CUBIC_CURVE_TO_CHROMIUM:
3605 expectedNumCoords += 6;
3606 break;
3607 case GL_CONIC_CURVE_TO_CHROMIUM:
3608 expectedNumCoords += 5;
3609 break;
3610 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003611 context->validationError(GL_INVALID_ENUM, kInvalidPathCommand);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003612 return false;
3613 }
3614 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003615
Sami Väisänene45e53b2016-05-25 10:36:04 +03003616 if (expectedNumCoords != numCoords)
3617 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003618 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003619 return false;
3620 }
3621
3622 return true;
3623}
3624
Jamie Madill007530e2017-12-28 14:27:04 -05003625bool ValidatePathParameterfCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003626{
3627 if (!context->getExtensions().pathRendering)
3628 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003629 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003630 return false;
3631 }
Brandon Jones59770802018-04-02 13:18:42 -07003632 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003633 {
Jamie Madille0472f32018-11-27 16:32:45 -05003634 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003635 return false;
3636 }
3637
3638 switch (pname)
3639 {
3640 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3641 if (value < 0.0f)
3642 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003643 context->validationError(GL_INVALID_VALUE, kInvalidPathStrokeWidth);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003644 return false;
3645 }
3646 break;
3647 case GL_PATH_END_CAPS_CHROMIUM:
3648 switch (static_cast<GLenum>(value))
3649 {
3650 case GL_FLAT_CHROMIUM:
3651 case GL_SQUARE_CHROMIUM:
3652 case GL_ROUND_CHROMIUM:
3653 break;
3654 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003655 context->validationError(GL_INVALID_ENUM, kInvalidPathEndCaps);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003656 return false;
3657 }
3658 break;
3659 case GL_PATH_JOIN_STYLE_CHROMIUM:
3660 switch (static_cast<GLenum>(value))
3661 {
3662 case GL_MITER_REVERT_CHROMIUM:
3663 case GL_BEVEL_CHROMIUM:
3664 case GL_ROUND_CHROMIUM:
3665 break;
3666 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003667 context->validationError(GL_INVALID_ENUM, kInvalidPathJoinStyle);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003668 return false;
3669 }
Nico Weber41b072b2018-02-09 10:01:32 -05003670 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03003671 case GL_PATH_MITER_LIMIT_CHROMIUM:
3672 if (value < 0.0f)
3673 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003674 context->validationError(GL_INVALID_VALUE, kInvalidPathMiterLimit);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003675 return false;
3676 }
3677 break;
3678
3679 case GL_PATH_STROKE_BOUND_CHROMIUM:
3680 // no errors, only clamping.
3681 break;
3682
3683 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003684 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003685 return false;
3686 }
3687 return true;
3688}
3689
Jamie Madill007530e2017-12-28 14:27:04 -05003690bool ValidatePathParameteriCHROMIUM(Context *context, GLuint path, GLenum pname, GLint value)
3691{
3692 // TODO(jmadill): Use proper clamping cast.
3693 return ValidatePathParameterfCHROMIUM(context, path, pname, static_cast<GLfloat>(value));
3694}
3695
3696bool ValidateGetPathParameterfvCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat *value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003697{
3698 if (!context->getExtensions().pathRendering)
3699 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003700 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003701 return false;
3702 }
3703
Brandon Jones59770802018-04-02 13:18:42 -07003704 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003705 {
Jamie Madille0472f32018-11-27 16:32:45 -05003706 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003707 return false;
3708 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003709
Sami Väisänene45e53b2016-05-25 10:36:04 +03003710 if (!value)
3711 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003712 context->validationError(GL_INVALID_VALUE, kInvalidPathValueArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003713 return false;
3714 }
3715
3716 switch (pname)
3717 {
3718 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3719 case GL_PATH_END_CAPS_CHROMIUM:
3720 case GL_PATH_JOIN_STYLE_CHROMIUM:
3721 case GL_PATH_MITER_LIMIT_CHROMIUM:
3722 case GL_PATH_STROKE_BOUND_CHROMIUM:
3723 break;
3724
3725 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003726 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003727 return false;
3728 }
3729
3730 return true;
3731}
3732
Jamie Madill007530e2017-12-28 14:27:04 -05003733bool ValidateGetPathParameterivCHROMIUM(Context *context, GLuint path, GLenum pname, GLint *value)
3734{
3735 return ValidateGetPathParameterfvCHROMIUM(context, path, pname,
3736 reinterpret_cast<GLfloat *>(value));
3737}
3738
3739bool ValidatePathStencilFuncCHROMIUM(Context *context, GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003740{
3741 if (!context->getExtensions().pathRendering)
3742 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003743 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003744 return false;
3745 }
3746
3747 switch (func)
3748 {
3749 case GL_NEVER:
3750 case GL_ALWAYS:
3751 case GL_LESS:
3752 case GL_LEQUAL:
3753 case GL_EQUAL:
3754 case GL_GEQUAL:
3755 case GL_GREATER:
3756 case GL_NOTEQUAL:
3757 break;
3758 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003759 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003760 return false;
3761 }
3762
3763 return true;
3764}
3765
3766// Note that the spec specifies that for the path drawing commands
3767// if the path object is not an existing path object the command
3768// does nothing and no error is generated.
3769// However if the path object exists but has not been specified any
3770// commands then an error is generated.
3771
Jamie Madill007530e2017-12-28 14:27:04 -05003772bool ValidateStencilFillPathCHROMIUM(Context *context, GLuint path, GLenum fillMode, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003773{
3774 if (!context->getExtensions().pathRendering)
3775 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003776 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003777 return false;
3778 }
Brandon Jones59770802018-04-02 13:18:42 -07003779 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003780 {
Jamie Madille0472f32018-11-27 16:32:45 -05003781 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003782 return false;
3783 }
3784
3785 switch (fillMode)
3786 {
3787 case GL_COUNT_UP_CHROMIUM:
3788 case GL_COUNT_DOWN_CHROMIUM:
3789 break;
3790 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003791 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003792 return false;
3793 }
3794
3795 if (!isPow2(mask + 1))
3796 {
Jamie Madille0472f32018-11-27 16:32:45 -05003797 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003798 return false;
3799 }
3800
3801 return true;
3802}
3803
Jamie Madill007530e2017-12-28 14:27:04 -05003804bool ValidateStencilStrokePathCHROMIUM(Context *context, GLuint path, GLint reference, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003805{
3806 if (!context->getExtensions().pathRendering)
3807 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003808 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003809 return false;
3810 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003811
Brandon Jones59770802018-04-02 13:18:42 -07003812 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003813 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003814 context->validationError(GL_INVALID_OPERATION, kNoPathOrNoPathData);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003815 return false;
3816 }
3817
3818 return true;
3819}
3820
Jamie Madill007530e2017-12-28 14:27:04 -05003821bool ValidateCoverPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003822{
3823 if (!context->getExtensions().pathRendering)
3824 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003825 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003826 return false;
3827 }
Brandon Jones59770802018-04-02 13:18:42 -07003828 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003829 {
Jamie Madille0472f32018-11-27 16:32:45 -05003830 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003831 return false;
3832 }
3833
3834 switch (coverMode)
3835 {
3836 case GL_CONVEX_HULL_CHROMIUM:
3837 case GL_BOUNDING_BOX_CHROMIUM:
3838 break;
3839 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003840 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003841 return false;
3842 }
3843 return true;
3844}
3845
Jamie Madill778bf092018-11-14 09:54:36 -05003846bool ValidateCoverFillPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3847{
3848 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3849}
3850
3851bool ValidateCoverStrokePathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3852{
3853 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3854}
3855
Jamie Madill007530e2017-12-28 14:27:04 -05003856bool ValidateStencilThenCoverFillPathCHROMIUM(Context *context,
3857 GLuint path,
3858 GLenum fillMode,
3859 GLuint mask,
3860 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003861{
Jamie Madill007530e2017-12-28 14:27:04 -05003862 return ValidateStencilFillPathCHROMIUM(context, path, fillMode, mask) &&
3863 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003864}
3865
Jamie Madill007530e2017-12-28 14:27:04 -05003866bool ValidateStencilThenCoverStrokePathCHROMIUM(Context *context,
3867 GLuint path,
3868 GLint reference,
3869 GLuint mask,
3870 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003871{
Jamie Madill007530e2017-12-28 14:27:04 -05003872 return ValidateStencilStrokePathCHROMIUM(context, path, reference, mask) &&
3873 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003874}
3875
Brandon Jonesd1049182018-03-28 10:02:20 -07003876bool ValidateIsPathCHROMIUM(Context *context, GLuint path)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003877{
3878 if (!context->getExtensions().pathRendering)
3879 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003880 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003881 return false;
3882 }
3883 return true;
3884}
3885
Jamie Madill007530e2017-12-28 14:27:04 -05003886bool ValidateCoverFillPathInstancedCHROMIUM(Context *context,
3887 GLsizei numPaths,
3888 GLenum pathNameType,
3889 const void *paths,
3890 GLuint pathBase,
3891 GLenum coverMode,
3892 GLenum transformType,
3893 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003894{
3895 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3896 transformType, transformValues))
3897 return false;
3898
3899 switch (coverMode)
3900 {
3901 case GL_CONVEX_HULL_CHROMIUM:
3902 case GL_BOUNDING_BOX_CHROMIUM:
3903 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3904 break;
3905 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003906 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003907 return false;
3908 }
3909
3910 return true;
3911}
3912
Jamie Madill007530e2017-12-28 14:27:04 -05003913bool ValidateCoverStrokePathInstancedCHROMIUM(Context *context,
3914 GLsizei numPaths,
3915 GLenum pathNameType,
3916 const void *paths,
3917 GLuint pathBase,
3918 GLenum coverMode,
3919 GLenum transformType,
3920 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003921{
3922 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3923 transformType, transformValues))
3924 return false;
3925
3926 switch (coverMode)
3927 {
3928 case GL_CONVEX_HULL_CHROMIUM:
3929 case GL_BOUNDING_BOX_CHROMIUM:
3930 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3931 break;
3932 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003933 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003934 return false;
3935 }
3936
3937 return true;
3938}
3939
Jamie Madill007530e2017-12-28 14:27:04 -05003940bool ValidateStencilFillPathInstancedCHROMIUM(Context *context,
3941 GLsizei numPaths,
3942 GLenum pathNameType,
3943 const void *paths,
3944 GLuint pathBase,
3945 GLenum fillMode,
3946 GLuint mask,
3947 GLenum transformType,
3948 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003949{
3950
3951 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3952 transformType, transformValues))
3953 return false;
3954
3955 switch (fillMode)
3956 {
3957 case GL_COUNT_UP_CHROMIUM:
3958 case GL_COUNT_DOWN_CHROMIUM:
3959 break;
3960 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003961 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003962 return false;
3963 }
3964 if (!isPow2(mask + 1))
3965 {
Jamie Madille0472f32018-11-27 16:32:45 -05003966 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03003967 return false;
3968 }
3969 return true;
3970}
3971
Jamie Madill007530e2017-12-28 14:27:04 -05003972bool ValidateStencilStrokePathInstancedCHROMIUM(Context *context,
3973 GLsizei numPaths,
3974 GLenum pathNameType,
3975 const void *paths,
3976 GLuint pathBase,
3977 GLint reference,
3978 GLuint mask,
3979 GLenum transformType,
3980 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003981{
3982 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3983 transformType, transformValues))
3984 return false;
3985
3986 // no more validation here.
3987
3988 return true;
3989}
3990
Jamie Madill007530e2017-12-28 14:27:04 -05003991bool ValidateStencilThenCoverFillPathInstancedCHROMIUM(Context *context,
3992 GLsizei numPaths,
3993 GLenum pathNameType,
3994 const void *paths,
3995 GLuint pathBase,
3996 GLenum fillMode,
3997 GLuint mask,
3998 GLenum coverMode,
3999 GLenum transformType,
4000 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004001{
4002 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4003 transformType, transformValues))
4004 return false;
4005
4006 switch (coverMode)
4007 {
4008 case GL_CONVEX_HULL_CHROMIUM:
4009 case GL_BOUNDING_BOX_CHROMIUM:
4010 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4011 break;
4012 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004013 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004014 return false;
4015 }
4016
4017 switch (fillMode)
4018 {
4019 case GL_COUNT_UP_CHROMIUM:
4020 case GL_COUNT_DOWN_CHROMIUM:
4021 break;
4022 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004023 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004024 return false;
4025 }
4026 if (!isPow2(mask + 1))
4027 {
Jamie Madille0472f32018-11-27 16:32:45 -05004028 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004029 return false;
4030 }
4031
4032 return true;
4033}
4034
Jamie Madill007530e2017-12-28 14:27:04 -05004035bool ValidateStencilThenCoverStrokePathInstancedCHROMIUM(Context *context,
4036 GLsizei numPaths,
4037 GLenum pathNameType,
4038 const void *paths,
4039 GLuint pathBase,
4040 GLint reference,
4041 GLuint mask,
4042 GLenum coverMode,
4043 GLenum transformType,
4044 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004045{
4046 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4047 transformType, transformValues))
4048 return false;
4049
4050 switch (coverMode)
4051 {
4052 case GL_CONVEX_HULL_CHROMIUM:
4053 case GL_BOUNDING_BOX_CHROMIUM:
4054 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4055 break;
4056 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004057 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004058 return false;
4059 }
4060
4061 return true;
4062}
4063
Jamie Madill007530e2017-12-28 14:27:04 -05004064bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
4065 GLuint program,
4066 GLint location,
4067 const GLchar *name)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004068{
4069 if (!context->getExtensions().pathRendering)
4070 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004071 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004072 return false;
4073 }
4074
4075 const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
4076 if (location >= MaxLocation)
4077 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004078 context->validationError(GL_INVALID_VALUE, kInvalidVaryingLocation);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004079 return false;
4080 }
4081
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004082 const auto *programObject = context->getProgramNoResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004083 if (!programObject)
4084 {
Jamie Madille0472f32018-11-27 16:32:45 -05004085 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004086 return false;
4087 }
4088
4089 if (!name)
4090 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004091 context->validationError(GL_INVALID_VALUE, kMissingName);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004092 return false;
4093 }
4094
4095 if (angle::BeginsWith(name, "gl_"))
4096 {
Jamie Madille0472f32018-11-27 16:32:45 -05004097 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004098 return false;
4099 }
4100
4101 return true;
4102}
4103
Jamie Madill007530e2017-12-28 14:27:04 -05004104bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
4105 GLuint program,
4106 GLint location,
4107 GLenum genMode,
4108 GLint components,
4109 const GLfloat *coeffs)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004110{
4111 if (!context->getExtensions().pathRendering)
4112 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004113 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004114 return false;
4115 }
4116
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004117 const auto *programObject = context->getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004118 if (!programObject || programObject->isFlaggedForDeletion())
4119 {
Jamie Madille0472f32018-11-27 16:32:45 -05004120 context->validationError(GL_INVALID_OPERATION, kProgramDoesNotExist);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004121 return false;
4122 }
4123
4124 if (!programObject->isLinked())
4125 {
Jamie Madille0472f32018-11-27 16:32:45 -05004126 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004127 return false;
4128 }
4129
4130 switch (genMode)
4131 {
4132 case GL_NONE:
4133 if (components != 0)
4134 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004135 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004136 return false;
4137 }
4138 break;
4139
4140 case GL_OBJECT_LINEAR_CHROMIUM:
4141 case GL_EYE_LINEAR_CHROMIUM:
4142 case GL_CONSTANT_CHROMIUM:
4143 if (components < 1 || components > 4)
4144 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004145 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004146 return false;
4147 }
4148 if (!coeffs)
4149 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004150 context->validationError(GL_INVALID_VALUE, kInvalidPathCoefficientsArray);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004151 return false;
4152 }
4153 break;
4154
4155 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004156 context->validationError(GL_INVALID_ENUM, kInvalidPathGenMode);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004157 return false;
4158 }
4159
4160 // If the location is -1 then the command is silently ignored
4161 // and no further validation is needed.
4162 if (location == -1)
4163 return true;
4164
jchen103fd614d2018-08-13 12:21:58 +08004165 const auto &binding = programObject->getFragmentInputBindingInfo(location);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004166
4167 if (!binding.valid)
4168 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004169 context->validationError(GL_INVALID_OPERATION, kInvalidFragmentInputBinding);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004170 return false;
4171 }
4172
4173 if (binding.type != GL_NONE)
4174 {
4175 GLint expectedComponents = 0;
4176 switch (binding.type)
4177 {
4178 case GL_FLOAT:
4179 expectedComponents = 1;
4180 break;
4181 case GL_FLOAT_VEC2:
4182 expectedComponents = 2;
4183 break;
4184 case GL_FLOAT_VEC3:
4185 expectedComponents = 3;
4186 break;
4187 case GL_FLOAT_VEC4:
4188 expectedComponents = 4;
4189 break;
4190 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004191 context->validationError(GL_INVALID_OPERATION, kFragmentInputTypeNotFloatingPoint);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004192 return false;
4193 }
4194 if (expectedComponents != components && genMode != GL_NONE)
4195 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004196 context->validationError(GL_INVALID_OPERATION, kInvalidPathComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004197 return false;
4198 }
4199 }
4200 return true;
4201}
4202
Geoff Lang97073d12016-04-20 10:42:34 -07004203bool ValidateCopyTextureCHROMIUM(Context *context,
4204 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004205 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004206 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004207 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004208 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004209 GLint internalFormat,
4210 GLenum destType,
4211 GLboolean unpackFlipY,
4212 GLboolean unpackPremultiplyAlpha,
4213 GLboolean unpackUnmultiplyAlpha)
4214{
4215 if (!context->getExtensions().copyTexture)
4216 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004217 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004218 return false;
4219 }
4220
Geoff Lang4f0e0032017-05-01 16:04:35 -04004221 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004222 if (source == nullptr)
4223 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004224 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004225 return false;
4226 }
4227
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004228 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004229 {
Jamie Madille0472f32018-11-27 16:32:45 -05004230 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004231 return false;
4232 }
4233
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004234 TextureType sourceType = source->getType();
4235 ASSERT(sourceType != TextureType::CubeMap);
4236 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004237
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004238 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004239 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004240 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004241 return false;
4242 }
4243
Geoff Lang4f0e0032017-05-01 16:04:35 -04004244 GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
4245 GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
4246 if (sourceWidth == 0 || sourceHeight == 0)
4247 {
Jamie Madille0472f32018-11-27 16:32:45 -05004248 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004249 return false;
4250 }
4251
4252 const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
4253 if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004254 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004255 context->validationError(GL_INVALID_OPERATION, kInvalidSourceTextureInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004256 return false;
4257 }
4258
Geoff Lang63458a32017-10-30 15:16:53 -04004259 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4260 {
Jamie Madille0472f32018-11-27 16:32:45 -05004261 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004262 return false;
4263 }
4264
Geoff Lang4f0e0032017-05-01 16:04:35 -04004265 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004266 if (dest == nullptr)
4267 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004268 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004269 return false;
4270 }
4271
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004272 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004273 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004274 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004275 return false;
4276 }
4277
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004278 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, sourceWidth,
Brandon Jones28783792018-03-05 09:37:32 -08004279 sourceHeight, false))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004280 {
Jamie Madille0472f32018-11-27 16:32:45 -05004281 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004282 return false;
4283 }
4284
Geoff Lang97073d12016-04-20 10:42:34 -07004285 if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
4286 {
Geoff Lang97073d12016-04-20 10:42:34 -07004287 return false;
4288 }
4289
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004290 if (dest->getType() == TextureType::CubeMap && sourceWidth != sourceHeight)
Geoff Lang4f0e0032017-05-01 16:04:35 -04004291 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004292 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004293 return false;
4294 }
4295
Geoff Lang97073d12016-04-20 10:42:34 -07004296 if (dest->getImmutableFormat())
4297 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004298 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang97073d12016-04-20 10:42:34 -07004299 return false;
4300 }
4301
4302 return true;
4303}
4304
4305bool ValidateCopySubTextureCHROMIUM(Context *context,
4306 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004307 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004308 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004309 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004310 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004311 GLint xoffset,
4312 GLint yoffset,
4313 GLint x,
4314 GLint y,
4315 GLsizei width,
4316 GLsizei height,
4317 GLboolean unpackFlipY,
4318 GLboolean unpackPremultiplyAlpha,
4319 GLboolean unpackUnmultiplyAlpha)
4320{
4321 if (!context->getExtensions().copyTexture)
4322 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004323 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004324 return false;
4325 }
4326
Geoff Lang4f0e0032017-05-01 16:04:35 -04004327 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004328 if (source == nullptr)
4329 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004330 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004331 return false;
4332 }
4333
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004334 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004335 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004336 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004337 return false;
4338 }
4339
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004340 TextureType sourceType = source->getType();
4341 ASSERT(sourceType != TextureType::CubeMap);
4342 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004343
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004344 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004345 {
Jamie Madille0472f32018-11-27 16:32:45 -05004346 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004347 return false;
4348 }
4349
4350 if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
4351 source->getHeight(sourceTarget, sourceLevel) == 0)
Geoff Lang97073d12016-04-20 10:42:34 -07004352 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004353 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004354 return false;
4355 }
4356
4357 if (x < 0 || y < 0)
4358 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004359 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004360 return false;
4361 }
4362
4363 if (width < 0 || height < 0)
4364 {
Jamie Madille0472f32018-11-27 16:32:45 -05004365 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Geoff Lang97073d12016-04-20 10:42:34 -07004366 return false;
4367 }
4368
Geoff Lang4f0e0032017-05-01 16:04:35 -04004369 if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
4370 static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004371 {
Jamie Madille0472f32018-11-27 16:32:45 -05004372 context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
Geoff Lang97073d12016-04-20 10:42:34 -07004373 return false;
4374 }
4375
Geoff Lang4f0e0032017-05-01 16:04:35 -04004376 const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
4377 if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004378 {
Jamie Madille0472f32018-11-27 16:32:45 -05004379 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004380 return false;
4381 }
4382
Geoff Lang63458a32017-10-30 15:16:53 -04004383 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4384 {
Jamie Madille0472f32018-11-27 16:32:45 -05004385 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004386 return false;
4387 }
4388
Geoff Lang4f0e0032017-05-01 16:04:35 -04004389 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004390 if (dest == nullptr)
4391 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004392 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004393 return false;
4394 }
4395
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004396 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004397 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004398 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004399 return false;
4400 }
4401
Brandon Jones28783792018-03-05 09:37:32 -08004402 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, width, height,
4403 true))
Geoff Lang97073d12016-04-20 10:42:34 -07004404 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004405 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004406 return false;
4407 }
4408
Geoff Lang4f0e0032017-05-01 16:04:35 -04004409 if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
4410 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004411 context->validationError(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004412 return false;
4413 }
4414
4415 const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
4416 if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004417 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004418 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Lang97073d12016-04-20 10:42:34 -07004419 return false;
4420 }
4421
4422 if (xoffset < 0 || yoffset < 0)
4423 {
Jamie Madille0472f32018-11-27 16:32:45 -05004424 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004425 return false;
4426 }
4427
Geoff Lang4f0e0032017-05-01 16:04:35 -04004428 if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
4429 static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004430 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004431 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
Geoff Lang97073d12016-04-20 10:42:34 -07004432 return false;
4433 }
4434
4435 return true;
4436}
4437
Geoff Lang47110bf2016-04-20 11:13:22 -07004438bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
4439{
4440 if (!context->getExtensions().copyCompressedTexture)
4441 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004442 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang47110bf2016-04-20 11:13:22 -07004443 return false;
4444 }
4445
4446 const gl::Texture *source = context->getTexture(sourceId);
4447 if (source == nullptr)
4448 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004449 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004450 return false;
4451 }
4452
Corentin Wallez99d492c2018-02-27 15:17:10 -05004453 if (source->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004454 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004455 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004456 return false;
4457 }
4458
Corentin Wallez99d492c2018-02-27 15:17:10 -05004459 if (source->getWidth(TextureTarget::_2D, 0) == 0 ||
4460 source->getHeight(TextureTarget::_2D, 0) == 0)
Geoff Lang47110bf2016-04-20 11:13:22 -07004461 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004462 context->validationError(GL_INVALID_VALUE, kSourceTextureLevelZeroDefined);
Geoff Lang47110bf2016-04-20 11:13:22 -07004463 return false;
4464 }
4465
Corentin Wallez99d492c2018-02-27 15:17:10 -05004466 const gl::Format &sourceFormat = source->getFormat(TextureTarget::_2D, 0);
Geoff Lang47110bf2016-04-20 11:13:22 -07004467 if (!sourceFormat.info->compressed)
4468 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004469 context->validationError(GL_INVALID_OPERATION, kSourceTextureMustBeCompressed);
Geoff Lang47110bf2016-04-20 11:13:22 -07004470 return false;
4471 }
4472
4473 const gl::Texture *dest = context->getTexture(destId);
4474 if (dest == nullptr)
4475 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004476 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004477 return false;
4478 }
4479
Corentin Wallez99d492c2018-02-27 15:17:10 -05004480 if (dest->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004481 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004482 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004483 return false;
4484 }
4485
4486 if (dest->getImmutableFormat())
4487 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004488 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang47110bf2016-04-20 11:13:22 -07004489 return false;
4490 }
4491
4492 return true;
4493}
4494
Jiawei Shao385b3e02018-03-21 09:43:28 +08004495bool ValidateCreateShader(Context *context, ShaderType type)
Martin Radev4c4c8e72016-08-04 12:25:34 +03004496{
4497 switch (type)
4498 {
Jiawei Shao385b3e02018-03-21 09:43:28 +08004499 case ShaderType::Vertex:
4500 case ShaderType::Fragment:
Martin Radev4c4c8e72016-08-04 12:25:34 +03004501 break;
Geoff Langeb66a6e2016-10-31 13:06:12 -04004502
Jiawei Shao385b3e02018-03-21 09:43:28 +08004503 case ShaderType::Compute:
Geoff Langeb66a6e2016-10-31 13:06:12 -04004504 if (context->getClientVersion() < Version(3, 1))
Martin Radev4c4c8e72016-08-04 12:25:34 +03004505 {
Jamie Madille0472f32018-11-27 16:32:45 -05004506 context->validationError(GL_INVALID_ENUM, kES31Required);
Geoff Langeb66a6e2016-10-31 13:06:12 -04004507 return false;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004508 }
Geoff Langeb66a6e2016-10-31 13:06:12 -04004509 break;
4510
Jiawei Shao385b3e02018-03-21 09:43:28 +08004511 case ShaderType::Geometry:
Jiawei Shao89be29a2017-11-06 14:36:45 +08004512 if (!context->getExtensions().geometryShader)
4513 {
Jamie Madille0472f32018-11-27 16:32:45 -05004514 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jiawei Shao89be29a2017-11-06 14:36:45 +08004515 return false;
4516 }
4517 break;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004518 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004519 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Martin Radev4c4c8e72016-08-04 12:25:34 +03004520 return false;
4521 }
Jamie Madill29639852016-09-02 15:00:09 -04004522
4523 return true;
4524}
4525
Jamie Madill5b772312018-03-08 20:28:32 -05004526bool ValidateBufferData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004527 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004528 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004529 const void *data,
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004530 BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004531{
4532 if (size < 0)
4533 {
Jamie Madille0472f32018-11-27 16:32:45 -05004534 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madill29639852016-09-02 15:00:09 -04004535 return false;
4536 }
4537
4538 switch (usage)
4539 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004540 case BufferUsage::StreamDraw:
4541 case BufferUsage::StaticDraw:
4542 case BufferUsage::DynamicDraw:
Jamie Madill29639852016-09-02 15:00:09 -04004543 break;
4544
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004545 case BufferUsage::StreamRead:
4546 case BufferUsage::StaticRead:
4547 case BufferUsage::DynamicRead:
4548 case BufferUsage::StreamCopy:
4549 case BufferUsage::StaticCopy:
4550 case BufferUsage::DynamicCopy:
Jamie Madill29639852016-09-02 15:00:09 -04004551 if (context->getClientMajorVersion() < 3)
4552 {
Jamie Madille0472f32018-11-27 16:32:45 -05004553 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004554 return false;
4555 }
4556 break;
4557
4558 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004559 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004560 return false;
4561 }
4562
Corentin Walleze4477002017-12-01 14:39:58 -05004563 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004564 {
Jamie Madille0472f32018-11-27 16:32:45 -05004565 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004566 return false;
4567 }
4568
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004569 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004570
4571 if (!buffer)
4572 {
Jamie Madille0472f32018-11-27 16:32:45 -05004573 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004574 return false;
4575 }
4576
James Darpiniane8a93c62018-01-04 18:02:24 -08004577 if (context->getExtensions().webglCompatibility &&
4578 buffer->isBoundForTransformFeedbackAndOtherUse())
4579 {
Jamie Madille0472f32018-11-27 16:32:45 -05004580 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004581 return false;
4582 }
4583
Jamie Madill29639852016-09-02 15:00:09 -04004584 return true;
4585}
4586
Jamie Madill5b772312018-03-08 20:28:32 -05004587bool ValidateBufferSubData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004588 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004589 GLintptr offset,
4590 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004591 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004592{
Brandon Jones6cad5662017-06-14 13:25:13 -07004593 if (size < 0)
Jamie Madill29639852016-09-02 15:00:09 -04004594 {
Jamie Madille0472f32018-11-27 16:32:45 -05004595 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Brandon Jones6cad5662017-06-14 13:25:13 -07004596 return false;
4597 }
4598
4599 if (offset < 0)
4600 {
Jamie Madille0472f32018-11-27 16:32:45 -05004601 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Jamie Madill29639852016-09-02 15:00:09 -04004602 return false;
4603 }
4604
Corentin Walleze4477002017-12-01 14:39:58 -05004605 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004606 {
Jamie Madille0472f32018-11-27 16:32:45 -05004607 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004608 return false;
4609 }
4610
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004611 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004612
4613 if (!buffer)
4614 {
Jamie Madille0472f32018-11-27 16:32:45 -05004615 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004616 return false;
4617 }
4618
4619 if (buffer->isMapped())
4620 {
Jamie Madille0472f32018-11-27 16:32:45 -05004621 context->validationError(GL_INVALID_OPERATION, kBufferMapped);
Jamie Madill29639852016-09-02 15:00:09 -04004622 return false;
4623 }
4624
James Darpiniane8a93c62018-01-04 18:02:24 -08004625 if (context->getExtensions().webglCompatibility &&
4626 buffer->isBoundForTransformFeedbackAndOtherUse())
4627 {
Jamie Madille0472f32018-11-27 16:32:45 -05004628 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004629 return false;
4630 }
4631
Jamie Madill29639852016-09-02 15:00:09 -04004632 // Check for possible overflow of size + offset
4633 angle::CheckedNumeric<size_t> checkedSize(size);
4634 checkedSize += offset;
4635 if (!checkedSize.IsValid())
4636 {
Jamie Madille0472f32018-11-27 16:32:45 -05004637 context->validationError(GL_INVALID_VALUE, kParamOverflow);
Jamie Madill29639852016-09-02 15:00:09 -04004638 return false;
4639 }
4640
4641 if (size + offset > buffer->getSize())
4642 {
Jamie Madille0472f32018-11-27 16:32:45 -05004643 context->validationError(GL_INVALID_VALUE, kInsufficientBufferSize);
Jamie Madill29639852016-09-02 15:00:09 -04004644 return false;
4645 }
4646
Martin Radev4c4c8e72016-08-04 12:25:34 +03004647 return true;
4648}
4649
Geoff Lang111a99e2017-10-17 10:58:41 -04004650bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
Geoff Langc287ea62016-09-16 14:46:51 -04004651{
Geoff Langc339c4e2016-11-29 10:37:36 -05004652 if (!context->getExtensions().requestExtension)
Geoff Langc287ea62016-09-16 14:46:51 -04004653 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004654 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc287ea62016-09-16 14:46:51 -04004655 return false;
4656 }
4657
Geoff Lang111a99e2017-10-17 10:58:41 -04004658 if (!context->isExtensionRequestable(name))
Geoff Langc287ea62016-09-16 14:46:51 -04004659 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004660 context->validationError(GL_INVALID_OPERATION, kExtensionNotRequestable);
Geoff Langc287ea62016-09-16 14:46:51 -04004661 return false;
4662 }
4663
4664 return true;
4665}
4666
Jamie Madill5b772312018-03-08 20:28:32 -05004667bool ValidateActiveTexture(Context *context, GLenum texture)
Jamie Madillef300b12016-10-07 15:12:09 -04004668{
Lingfeng Yang038dd532018-03-29 17:31:52 -07004669 if (context->getClientMajorVersion() < 2)
4670 {
4671 return ValidateMultitextureUnit(context, texture);
4672 }
4673
Jamie Madillef300b12016-10-07 15:12:09 -04004674 if (texture < GL_TEXTURE0 ||
4675 texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
4676 {
Jamie Madille0472f32018-11-27 16:32:45 -05004677 context->validationError(GL_INVALID_ENUM, kInvalidCombinedImageUnit);
Jamie Madillef300b12016-10-07 15:12:09 -04004678 return false;
4679 }
4680
4681 return true;
4682}
4683
Jamie Madill5b772312018-03-08 20:28:32 -05004684bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillef300b12016-10-07 15:12:09 -04004685{
4686 Program *programObject = GetValidProgram(context, program);
4687 if (!programObject)
4688 {
4689 return false;
4690 }
4691
4692 Shader *shaderObject = GetValidShader(context, shader);
4693 if (!shaderObject)
4694 {
4695 return false;
4696 }
4697
Jiawei Shao385b3e02018-03-21 09:43:28 +08004698 if (programObject->getAttachedShader(shaderObject->getType()))
Jamie Madillef300b12016-10-07 15:12:09 -04004699 {
Jamie Madille0472f32018-11-27 16:32:45 -05004700 context->validationError(GL_INVALID_OPERATION, kShaderAttachmentHasShader);
Jiawei Shao385b3e02018-03-21 09:43:28 +08004701 return false;
Jamie Madillef300b12016-10-07 15:12:09 -04004702 }
4703
4704 return true;
4705}
4706
Jamie Madill5b772312018-03-08 20:28:32 -05004707bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004708{
4709 if (index >= MAX_VERTEX_ATTRIBS)
4710 {
Jamie Madille0472f32018-11-27 16:32:45 -05004711 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004712 return false;
4713 }
4714
4715 if (strncmp(name, "gl_", 3) == 0)
4716 {
Jamie Madille0472f32018-11-27 16:32:45 -05004717 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004718 return false;
4719 }
4720
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004721 if (context->isWebGL())
Geoff Langfc32e8b2017-05-31 14:16:59 -04004722 {
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004723 const size_t length = strlen(name);
4724
4725 if (!IsValidESSLString(name, length))
4726 {
4727 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
4728 // for shader-related entry points
Jamie Madille0472f32018-11-27 16:32:45 -05004729 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004730 return false;
4731 }
4732
4733 if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
4734 {
4735 return false;
4736 }
Geoff Langfc32e8b2017-05-31 14:16:59 -04004737 }
4738
Jamie Madill01a80ee2016-11-07 12:06:18 -05004739 return GetValidProgram(context, program) != nullptr;
4740}
4741
Jamie Madill5b772312018-03-08 20:28:32 -05004742bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004743{
Geoff Lange8afa902017-09-27 15:00:43 -04004744 if (!ValidFramebufferTarget(context, target))
Jamie Madill01a80ee2016-11-07 12:06:18 -05004745 {
Jamie Madille0472f32018-11-27 16:32:45 -05004746 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004747 return false;
4748 }
4749
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004750 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004751 !context->isFramebufferGenerated(framebuffer))
4752 {
Jamie Madille0472f32018-11-27 16:32:45 -05004753 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004754 return false;
4755 }
4756
4757 return true;
4758}
4759
Jamie Madill5b772312018-03-08 20:28:32 -05004760bool ValidateBindRenderbuffer(Context *context, GLenum target, GLuint renderbuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004761{
4762 if (target != GL_RENDERBUFFER)
4763 {
Jamie Madille0472f32018-11-27 16:32:45 -05004764 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004765 return false;
4766 }
4767
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004768 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004769 !context->isRenderbufferGenerated(renderbuffer))
4770 {
Jamie Madille0472f32018-11-27 16:32:45 -05004771 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004772 return false;
4773 }
4774
4775 return true;
4776}
4777
Jamie Madill5b772312018-03-08 20:28:32 -05004778static bool ValidBlendEquationMode(const Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004779{
4780 switch (mode)
4781 {
4782 case GL_FUNC_ADD:
4783 case GL_FUNC_SUBTRACT:
4784 case GL_FUNC_REVERSE_SUBTRACT:
Geoff Lang50cac572017-09-26 17:37:43 -04004785 return true;
4786
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004787 case GL_MIN:
4788 case GL_MAX:
Geoff Lang50cac572017-09-26 17:37:43 -04004789 return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004790
4791 default:
4792 return false;
4793 }
4794}
4795
Jamie Madill5b772312018-03-08 20:28:32 -05004796bool ValidateBlendColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004797{
4798 return true;
4799}
4800
Jamie Madill5b772312018-03-08 20:28:32 -05004801bool ValidateBlendEquation(Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004802{
Geoff Lang50cac572017-09-26 17:37:43 -04004803 if (!ValidBlendEquationMode(context, mode))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004804 {
Jamie Madille0472f32018-11-27 16:32:45 -05004805 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004806 return false;
4807 }
4808
4809 return true;
4810}
4811
Jamie Madill5b772312018-03-08 20:28:32 -05004812bool ValidateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004813{
Geoff Lang50cac572017-09-26 17:37:43 -04004814 if (!ValidBlendEquationMode(context, modeRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004815 {
Jamie Madille0472f32018-11-27 16:32:45 -05004816 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004817 return false;
4818 }
4819
Geoff Lang50cac572017-09-26 17:37:43 -04004820 if (!ValidBlendEquationMode(context, modeAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004821 {
Jamie Madille0472f32018-11-27 16:32:45 -05004822 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004823 return false;
4824 }
4825
4826 return true;
4827}
4828
Jamie Madill5b772312018-03-08 20:28:32 -05004829bool ValidateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004830{
4831 return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
4832}
4833
Jamie Madill5b772312018-03-08 20:28:32 -05004834bool ValidateBlendFuncSeparate(Context *context,
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004835 GLenum srcRGB,
4836 GLenum dstRGB,
4837 GLenum srcAlpha,
4838 GLenum dstAlpha)
4839{
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004840 if (!ValidSrcBlendFunc(context, srcRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004841 {
Jamie Madille0472f32018-11-27 16:32:45 -05004842 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004843 return false;
4844 }
4845
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004846 if (!ValidDstBlendFunc(context, dstRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004847 {
Jamie Madille0472f32018-11-27 16:32:45 -05004848 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004849 return false;
4850 }
4851
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004852 if (!ValidSrcBlendFunc(context, srcAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004853 {
Jamie Madille0472f32018-11-27 16:32:45 -05004854 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004855 return false;
4856 }
4857
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004858 if (!ValidDstBlendFunc(context, dstAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004859 {
Jamie Madille0472f32018-11-27 16:32:45 -05004860 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004861 return false;
4862 }
4863
Frank Henigman146e8a12017-03-02 23:22:37 -05004864 if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
4865 context->getExtensions().webglCompatibility)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004866 {
4867 bool constantColorUsed =
4868 (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
4869 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
4870
4871 bool constantAlphaUsed =
4872 (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
4873 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
4874
4875 if (constantColorUsed && constantAlphaUsed)
4876 {
Frank Henigman146e8a12017-03-02 23:22:37 -05004877 if (context->getExtensions().webglCompatibility)
4878 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004879 context->validationError(GL_INVALID_OPERATION, kInvalidConstantColor);
4880 return false;
Frank Henigman146e8a12017-03-02 23:22:37 -05004881 }
Jamie Madillc3e37312018-11-30 15:25:39 -05004882
4883 WARN() << kConstantColorAlphaLimitation;
4884 context->validationError(GL_INVALID_OPERATION, kConstantColorAlphaLimitation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004885 return false;
4886 }
4887 }
4888
4889 return true;
4890}
4891
Geoff Langc339c4e2016-11-29 10:37:36 -05004892bool ValidateGetString(Context *context, GLenum name)
4893{
4894 switch (name)
4895 {
4896 case GL_VENDOR:
4897 case GL_RENDERER:
4898 case GL_VERSION:
4899 case GL_SHADING_LANGUAGE_VERSION:
4900 case GL_EXTENSIONS:
4901 break;
4902
4903 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
4904 if (!context->getExtensions().requestExtension)
4905 {
Jamie Madille0472f32018-11-27 16:32:45 -05004906 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004907 return false;
4908 }
4909 break;
4910
4911 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004912 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004913 return false;
4914 }
4915
4916 return true;
4917}
4918
Jamie Madill5b772312018-03-08 20:28:32 -05004919bool ValidateLineWidth(Context *context, GLfloat width)
Geoff Lang47c48082016-12-07 15:38:13 -05004920{
4921 if (width <= 0.0f || isNaN(width))
4922 {
Jamie Madille0472f32018-11-27 16:32:45 -05004923 context->validationError(GL_INVALID_VALUE, kInvalidWidth);
Geoff Lang47c48082016-12-07 15:38:13 -05004924 return false;
4925 }
4926
4927 return true;
4928}
4929
Jamie Madill5b772312018-03-08 20:28:32 -05004930bool ValidateDepthRangef(Context *context, GLfloat zNear, GLfloat zFar)
Frank Henigman6137ddc2017-02-10 18:55:07 -05004931{
4932 if (context->getExtensions().webglCompatibility && zNear > zFar)
4933 {
Jamie Madille0472f32018-11-27 16:32:45 -05004934 context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
Frank Henigman6137ddc2017-02-10 18:55:07 -05004935 return false;
4936 }
4937
4938 return true;
4939}
4940
Jamie Madill5b772312018-03-08 20:28:32 -05004941bool ValidateRenderbufferStorage(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004942 GLenum target,
4943 GLenum internalformat,
4944 GLsizei width,
4945 GLsizei height)
4946{
4947 return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
4948 height);
4949}
4950
Jamie Madill5b772312018-03-08 20:28:32 -05004951bool ValidateRenderbufferStorageMultisampleANGLE(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004952 GLenum target,
4953 GLsizei samples,
4954 GLenum internalformat,
4955 GLsizei width,
4956 GLsizei height)
4957{
4958 if (!context->getExtensions().framebufferMultisample)
4959 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004960 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madille8fb6402017-02-14 17:56:40 -05004961 return false;
4962 }
4963
4964 // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
Jamie Madill610640f2018-11-21 17:28:41 -05004965 // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_VALUE is
Jamie Madille8fb6402017-02-14 17:56:40 -05004966 // generated.
4967 if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
4968 {
Jamie Madille0472f32018-11-27 16:32:45 -05004969 context->validationError(GL_INVALID_VALUE, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004970 return false;
4971 }
4972
4973 // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
4974 // the specified storage. This is different than ES 3.0 in which a sample number higher
4975 // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
4976 // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
4977 if (context->getClientMajorVersion() >= 3)
4978 {
4979 const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
4980 if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
4981 {
Jamie Madille0472f32018-11-27 16:32:45 -05004982 context->validationError(GL_OUT_OF_MEMORY, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004983 return false;
4984 }
4985 }
4986
4987 return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
4988 width, height);
4989}
4990
Jamie Madill5b772312018-03-08 20:28:32 -05004991bool ValidateCheckFramebufferStatus(Context *context, GLenum target)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004992{
Geoff Lange8afa902017-09-27 15:00:43 -04004993 if (!ValidFramebufferTarget(context, target))
Jamie Madillc1d770e2017-04-13 17:31:24 -04004994 {
Jamie Madille0472f32018-11-27 16:32:45 -05004995 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004996 return false;
4997 }
4998
4999 return true;
5000}
5001
Jamie Madill5b772312018-03-08 20:28:32 -05005002bool ValidateClearColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005003{
5004 return true;
5005}
5006
Jamie Madill5b772312018-03-08 20:28:32 -05005007bool ValidateClearDepthf(Context *context, GLfloat depth)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005008{
5009 return true;
5010}
5011
Jamie Madill5b772312018-03-08 20:28:32 -05005012bool ValidateClearStencil(Context *context, GLint s)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005013{
5014 return true;
5015}
5016
Jamie Madill5b772312018-03-08 20:28:32 -05005017bool ValidateColorMask(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005018 GLboolean red,
5019 GLboolean green,
5020 GLboolean blue,
5021 GLboolean alpha)
5022{
5023 return true;
5024}
5025
Jamie Madill5b772312018-03-08 20:28:32 -05005026bool ValidateCompileShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005027{
5028 return true;
5029}
5030
Jamie Madill5b772312018-03-08 20:28:32 -05005031bool ValidateCreateProgram(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005032{
5033 return true;
5034}
5035
Jamie Madill5b772312018-03-08 20:28:32 -05005036bool ValidateCullFace(Context *context, CullFaceMode mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005037{
5038 switch (mode)
5039 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04005040 case CullFaceMode::Front:
5041 case CullFaceMode::Back:
5042 case CullFaceMode::FrontAndBack:
Jamie Madillc1d770e2017-04-13 17:31:24 -04005043 break;
5044
5045 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005046 context->validationError(GL_INVALID_ENUM, kInvalidCullMode);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005047 return false;
5048 }
5049
5050 return true;
5051}
5052
Jamie Madill5b772312018-03-08 20:28:32 -05005053bool ValidateDeleteProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005054{
5055 if (program == 0)
5056 {
5057 return false;
5058 }
5059
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005060 if (!context->getProgramResolveLink(program))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005061 {
5062 if (context->getShader(program))
5063 {
Jamie Madille0472f32018-11-27 16:32:45 -05005064 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005065 return false;
5066 }
5067 else
5068 {
Jamie Madille0472f32018-11-27 16:32:45 -05005069 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005070 return false;
5071 }
5072 }
5073
5074 return true;
5075}
5076
Jamie Madill5b772312018-03-08 20:28:32 -05005077bool ValidateDeleteShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005078{
5079 if (shader == 0)
5080 {
5081 return false;
5082 }
5083
5084 if (!context->getShader(shader))
5085 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005086 if (context->getProgramResolveLink(shader))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005087 {
Jamie Madille0472f32018-11-27 16:32:45 -05005088 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005089 return false;
5090 }
5091 else
5092 {
Jamie Madille0472f32018-11-27 16:32:45 -05005093 context->validationError(GL_INVALID_VALUE, kExpectedShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005094 return false;
5095 }
5096 }
5097
5098 return true;
5099}
5100
Jamie Madill5b772312018-03-08 20:28:32 -05005101bool ValidateDepthFunc(Context *context, GLenum func)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005102{
5103 switch (func)
5104 {
5105 case GL_NEVER:
5106 case GL_ALWAYS:
5107 case GL_LESS:
5108 case GL_LEQUAL:
5109 case GL_EQUAL:
5110 case GL_GREATER:
5111 case GL_GEQUAL:
5112 case GL_NOTEQUAL:
5113 break;
5114
5115 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005116 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005117 return false;
5118 }
5119
5120 return true;
5121}
5122
Jamie Madill5b772312018-03-08 20:28:32 -05005123bool ValidateDepthMask(Context *context, GLboolean flag)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005124{
5125 return true;
5126}
5127
Jamie Madill5b772312018-03-08 20:28:32 -05005128bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005129{
5130 Program *programObject = GetValidProgram(context, program);
5131 if (!programObject)
5132 {
5133 return false;
5134 }
5135
5136 Shader *shaderObject = GetValidShader(context, shader);
5137 if (!shaderObject)
5138 {
5139 return false;
5140 }
5141
Jiawei Shao385b3e02018-03-21 09:43:28 +08005142 const Shader *attachedShader = programObject->getAttachedShader(shaderObject->getType());
Jamie Madillc1d770e2017-04-13 17:31:24 -04005143 if (attachedShader != shaderObject)
5144 {
Jamie Madille0472f32018-11-27 16:32:45 -05005145 context->validationError(GL_INVALID_OPERATION, kShaderToDetachMustBeAttached);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005146 return false;
5147 }
5148
5149 return true;
5150}
5151
Jamie Madill5b772312018-03-08 20:28:32 -05005152bool ValidateDisableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005153{
5154 if (index >= MAX_VERTEX_ATTRIBS)
5155 {
Jamie Madille0472f32018-11-27 16:32:45 -05005156 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005157 return false;
5158 }
5159
5160 return true;
5161}
5162
Jamie Madill5b772312018-03-08 20:28:32 -05005163bool ValidateEnableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005164{
5165 if (index >= MAX_VERTEX_ATTRIBS)
5166 {
Jamie Madille0472f32018-11-27 16:32:45 -05005167 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005168 return false;
5169 }
5170
5171 return true;
5172}
5173
Jamie Madill5b772312018-03-08 20:28:32 -05005174bool ValidateFinish(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005175{
5176 return true;
5177}
5178
Jamie Madill5b772312018-03-08 20:28:32 -05005179bool ValidateFlush(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005180{
5181 return true;
5182}
5183
Jamie Madill5b772312018-03-08 20:28:32 -05005184bool ValidateFrontFace(Context *context, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005185{
5186 switch (mode)
5187 {
5188 case GL_CW:
5189 case GL_CCW:
5190 break;
5191 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005192 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005193 return false;
5194 }
5195
5196 return true;
5197}
5198
Jamie Madill5b772312018-03-08 20:28:32 -05005199bool ValidateGetActiveAttrib(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005200 GLuint program,
5201 GLuint index,
5202 GLsizei bufsize,
5203 GLsizei *length,
5204 GLint *size,
5205 GLenum *type,
5206 GLchar *name)
5207{
5208 if (bufsize < 0)
5209 {
Jamie Madille0472f32018-11-27 16:32:45 -05005210 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005211 return false;
5212 }
5213
5214 Program *programObject = GetValidProgram(context, program);
5215
5216 if (!programObject)
5217 {
5218 return false;
5219 }
5220
5221 if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
5222 {
Jamie Madille0472f32018-11-27 16:32:45 -05005223 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005224 return false;
5225 }
5226
5227 return true;
5228}
5229
Jamie Madill5b772312018-03-08 20:28:32 -05005230bool ValidateGetActiveUniform(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005231 GLuint program,
5232 GLuint index,
5233 GLsizei bufsize,
5234 GLsizei *length,
5235 GLint *size,
5236 GLenum *type,
5237 GLchar *name)
5238{
5239 if (bufsize < 0)
5240 {
Jamie Madille0472f32018-11-27 16:32:45 -05005241 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005242 return false;
5243 }
5244
5245 Program *programObject = GetValidProgram(context, program);
5246
5247 if (!programObject)
5248 {
5249 return false;
5250 }
5251
5252 if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
5253 {
Jamie Madille0472f32018-11-27 16:32:45 -05005254 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005255 return false;
5256 }
5257
5258 return true;
5259}
5260
Jamie Madill5b772312018-03-08 20:28:32 -05005261bool ValidateGetAttachedShaders(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005262 GLuint program,
5263 GLsizei maxcount,
5264 GLsizei *count,
5265 GLuint *shaders)
5266{
5267 if (maxcount < 0)
5268 {
Jamie Madille0472f32018-11-27 16:32:45 -05005269 context->validationError(GL_INVALID_VALUE, kNegativeMaxCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005270 return false;
5271 }
5272
5273 Program *programObject = GetValidProgram(context, program);
5274
5275 if (!programObject)
5276 {
5277 return false;
5278 }
5279
5280 return true;
5281}
5282
Jamie Madill5b772312018-03-08 20:28:32 -05005283bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005284{
Geoff Langfc32e8b2017-05-31 14:16:59 -04005285 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5286 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005287 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005288 {
Jamie Madille0472f32018-11-27 16:32:45 -05005289 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005290 return false;
5291 }
5292
Jamie Madillc1d770e2017-04-13 17:31:24 -04005293 Program *programObject = GetValidProgram(context, program);
5294
5295 if (!programObject)
5296 {
Jamie Madille0472f32018-11-27 16:32:45 -05005297 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005298 return false;
5299 }
5300
5301 if (!programObject->isLinked())
5302 {
Jamie Madille0472f32018-11-27 16:32:45 -05005303 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005304 return false;
5305 }
5306
5307 return true;
5308}
5309
Jamie Madill5b772312018-03-08 20:28:32 -05005310bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005311{
5312 GLenum nativeType;
5313 unsigned int numParams = 0;
5314 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5315}
5316
Jamie Madill5b772312018-03-08 20:28:32 -05005317bool ValidateGetError(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005318{
5319 return true;
5320}
5321
Jamie Madill5b772312018-03-08 20:28:32 -05005322bool ValidateGetFloatv(Context *context, GLenum pname, GLfloat *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005323{
5324 GLenum nativeType;
5325 unsigned int numParams = 0;
5326 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5327}
5328
Jamie Madill5b772312018-03-08 20:28:32 -05005329bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005330{
5331 GLenum nativeType;
5332 unsigned int numParams = 0;
5333 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5334}
5335
Jamie Madill5b772312018-03-08 20:28:32 -05005336bool ValidateGetProgramInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005337 GLuint program,
5338 GLsizei bufsize,
5339 GLsizei *length,
5340 GLchar *infolog)
5341{
5342 if (bufsize < 0)
5343 {
Jamie Madille0472f32018-11-27 16:32:45 -05005344 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005345 return false;
5346 }
5347
5348 Program *programObject = GetValidProgram(context, program);
5349 if (!programObject)
5350 {
5351 return false;
5352 }
5353
5354 return true;
5355}
5356
Jamie Madill5b772312018-03-08 20:28:32 -05005357bool ValidateGetShaderInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005358 GLuint shader,
5359 GLsizei bufsize,
5360 GLsizei *length,
5361 GLchar *infolog)
5362{
5363 if (bufsize < 0)
5364 {
Jamie Madille0472f32018-11-27 16:32:45 -05005365 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005366 return false;
5367 }
5368
5369 Shader *shaderObject = GetValidShader(context, shader);
5370 if (!shaderObject)
5371 {
5372 return false;
5373 }
5374
5375 return true;
5376}
5377
Jamie Madill5b772312018-03-08 20:28:32 -05005378bool ValidateGetShaderPrecisionFormat(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005379 GLenum shadertype,
5380 GLenum precisiontype,
5381 GLint *range,
5382 GLint *precision)
5383{
5384 switch (shadertype)
5385 {
5386 case GL_VERTEX_SHADER:
5387 case GL_FRAGMENT_SHADER:
5388 break;
5389 case GL_COMPUTE_SHADER:
Jamie Madillc3e37312018-11-30 15:25:39 -05005390 context->validationError(GL_INVALID_OPERATION, kUnimplementedComputeShaderPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005391 return false;
5392 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005393 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005394 return false;
5395 }
5396
5397 switch (precisiontype)
5398 {
5399 case GL_LOW_FLOAT:
5400 case GL_MEDIUM_FLOAT:
5401 case GL_HIGH_FLOAT:
5402 case GL_LOW_INT:
5403 case GL_MEDIUM_INT:
5404 case GL_HIGH_INT:
5405 break;
5406
5407 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005408 context->validationError(GL_INVALID_ENUM, kInvalidPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005409 return false;
5410 }
5411
5412 return true;
5413}
5414
Jamie Madill5b772312018-03-08 20:28:32 -05005415bool ValidateGetShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005416 GLuint shader,
5417 GLsizei bufsize,
5418 GLsizei *length,
5419 GLchar *source)
5420{
5421 if (bufsize < 0)
5422 {
Jamie Madille0472f32018-11-27 16:32:45 -05005423 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005424 return false;
5425 }
5426
5427 Shader *shaderObject = GetValidShader(context, shader);
5428 if (!shaderObject)
5429 {
5430 return false;
5431 }
5432
5433 return true;
5434}
5435
Jamie Madill5b772312018-03-08 20:28:32 -05005436bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005437{
5438 if (strstr(name, "gl_") == name)
5439 {
5440 return false;
5441 }
5442
Geoff Langfc32e8b2017-05-31 14:16:59 -04005443 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5444 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005445 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005446 {
Jamie Madille0472f32018-11-27 16:32:45 -05005447 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005448 return false;
5449 }
5450
Jamie Madillc1d770e2017-04-13 17:31:24 -04005451 Program *programObject = GetValidProgram(context, program);
5452
5453 if (!programObject)
5454 {
5455 return false;
5456 }
5457
5458 if (!programObject->isLinked())
5459 {
Jamie Madille0472f32018-11-27 16:32:45 -05005460 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005461 return false;
5462 }
5463
5464 return true;
5465}
5466
Jamie Madill5b772312018-03-08 20:28:32 -05005467bool ValidateHint(Context *context, GLenum target, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005468{
5469 switch (mode)
5470 {
5471 case GL_FASTEST:
5472 case GL_NICEST:
5473 case GL_DONT_CARE:
5474 break;
5475
5476 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005477 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005478 return false;
5479 }
5480
5481 switch (target)
5482 {
5483 case GL_GENERATE_MIPMAP_HINT:
5484 break;
5485
Geoff Lange7bd2182017-06-16 16:13:13 -04005486 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
5487 if (context->getClientVersion() < ES_3_0 &&
5488 !context->getExtensions().standardDerivatives)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005489 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005490 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005491 return false;
5492 }
5493 break;
5494
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005495 case GL_PERSPECTIVE_CORRECTION_HINT:
5496 case GL_POINT_SMOOTH_HINT:
5497 case GL_LINE_SMOOTH_HINT:
5498 case GL_FOG_HINT:
5499 if (context->getClientMajorVersion() >= 2)
5500 {
Jamie Madille0472f32018-11-27 16:32:45 -05005501 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005502 return false;
5503 }
5504 break;
5505
Jamie Madillc1d770e2017-04-13 17:31:24 -04005506 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005507 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005508 return false;
5509 }
5510
5511 return true;
5512}
5513
Jamie Madill5b772312018-03-08 20:28:32 -05005514bool ValidateIsBuffer(Context *context, GLuint buffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005515{
5516 return true;
5517}
5518
Jamie Madill5b772312018-03-08 20:28:32 -05005519bool ValidateIsFramebuffer(Context *context, GLuint framebuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005520{
5521 return true;
5522}
5523
Jamie Madill5b772312018-03-08 20:28:32 -05005524bool ValidateIsProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005525{
5526 return true;
5527}
5528
Jamie Madill5b772312018-03-08 20:28:32 -05005529bool ValidateIsRenderbuffer(Context *context, GLuint renderbuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005530{
5531 return true;
5532}
5533
Jamie Madill5b772312018-03-08 20:28:32 -05005534bool ValidateIsShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005535{
5536 return true;
5537}
5538
Jamie Madill5b772312018-03-08 20:28:32 -05005539bool ValidateIsTexture(Context *context, GLuint texture)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005540{
5541 return true;
5542}
5543
Jamie Madill5b772312018-03-08 20:28:32 -05005544bool ValidatePixelStorei(Context *context, GLenum pname, GLint param)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005545{
5546 if (context->getClientMajorVersion() < 3)
5547 {
5548 switch (pname)
5549 {
5550 case GL_UNPACK_IMAGE_HEIGHT:
5551 case GL_UNPACK_SKIP_IMAGES:
Jamie Madille0472f32018-11-27 16:32:45 -05005552 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005553 return false;
5554
5555 case GL_UNPACK_ROW_LENGTH:
5556 case GL_UNPACK_SKIP_ROWS:
5557 case GL_UNPACK_SKIP_PIXELS:
5558 if (!context->getExtensions().unpackSubimage)
5559 {
Jamie Madille0472f32018-11-27 16:32:45 -05005560 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005561 return false;
5562 }
5563 break;
5564
5565 case GL_PACK_ROW_LENGTH:
5566 case GL_PACK_SKIP_ROWS:
5567 case GL_PACK_SKIP_PIXELS:
5568 if (!context->getExtensions().packSubimage)
5569 {
Jamie Madille0472f32018-11-27 16:32:45 -05005570 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005571 return false;
5572 }
5573 break;
5574 }
5575 }
5576
5577 if (param < 0)
5578 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005579 context->validationError(GL_INVALID_VALUE, kNegativeParam);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005580 return false;
5581 }
5582
5583 switch (pname)
5584 {
5585 case GL_UNPACK_ALIGNMENT:
5586 if (param != 1 && param != 2 && param != 4 && param != 8)
5587 {
Jamie Madille0472f32018-11-27 16:32:45 -05005588 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005589 return false;
5590 }
5591 break;
5592
5593 case GL_PACK_ALIGNMENT:
5594 if (param != 1 && param != 2 && param != 4 && param != 8)
5595 {
Jamie Madille0472f32018-11-27 16:32:45 -05005596 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005597 return false;
5598 }
5599 break;
5600
5601 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Geoff Lang000dab82017-09-27 14:27:07 -04005602 if (!context->getExtensions().packReverseRowOrder)
5603 {
Jamie Madille0472f32018-11-27 16:32:45 -05005604 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang000dab82017-09-27 14:27:07 -04005605 }
5606 break;
5607
Jamie Madillc1d770e2017-04-13 17:31:24 -04005608 case GL_UNPACK_ROW_LENGTH:
5609 case GL_UNPACK_IMAGE_HEIGHT:
5610 case GL_UNPACK_SKIP_IMAGES:
5611 case GL_UNPACK_SKIP_ROWS:
5612 case GL_UNPACK_SKIP_PIXELS:
5613 case GL_PACK_ROW_LENGTH:
5614 case GL_PACK_SKIP_ROWS:
5615 case GL_PACK_SKIP_PIXELS:
5616 break;
5617
5618 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005619 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005620 return false;
5621 }
5622
5623 return true;
5624}
5625
Jamie Madill5b772312018-03-08 20:28:32 -05005626bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005627{
5628 return true;
5629}
5630
Jamie Madill5b772312018-03-08 20:28:32 -05005631bool ValidateReleaseShaderCompiler(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005632{
5633 return true;
5634}
5635
Jamie Madill5b772312018-03-08 20:28:32 -05005636bool ValidateSampleCoverage(Context *context, GLfloat value, GLboolean invert)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005637{
5638 return true;
5639}
5640
Jamie Madill5b772312018-03-08 20:28:32 -05005641bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005642{
5643 if (width < 0 || height < 0)
5644 {
Jamie Madille0472f32018-11-27 16:32:45 -05005645 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005646 return false;
5647 }
5648
5649 return true;
5650}
5651
Jamie Madill5b772312018-03-08 20:28:32 -05005652bool ValidateShaderBinary(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005653 GLsizei n,
5654 const GLuint *shaders,
5655 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005656 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005657 GLsizei length)
5658{
5659 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
5660 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
5661 shaderBinaryFormats.end())
5662 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005663 context->validationError(GL_INVALID_ENUM, kInvalidShaderBinaryFormat);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005664 return false;
5665 }
5666
5667 return true;
5668}
5669
Jamie Madill5b772312018-03-08 20:28:32 -05005670bool ValidateShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671 GLuint shader,
5672 GLsizei count,
5673 const GLchar *const *string,
5674 const GLint *length)
5675{
5676 if (count < 0)
5677 {
Jamie Madille0472f32018-11-27 16:32:45 -05005678 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005679 return false;
5680 }
5681
Geoff Langfc32e8b2017-05-31 14:16:59 -04005682 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5683 // shader-related entry points
5684 if (context->getExtensions().webglCompatibility)
5685 {
5686 for (GLsizei i = 0; i < count; i++)
5687 {
Geoff Langcab92ee2017-07-19 17:32:07 -04005688 size_t len =
5689 (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
Geoff Langa71a98e2017-06-19 15:15:00 -04005690
5691 // Backslash as line-continuation is allowed in WebGL 2.0.
Geoff Langcab92ee2017-07-19 17:32:07 -04005692 if (!IsValidESSLShaderSourceString(string[i], len,
5693 context->getClientVersion() >= ES_3_0))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005694 {
Jamie Madille0472f32018-11-27 16:32:45 -05005695 context->validationError(GL_INVALID_VALUE, kShaderSourceInvalidCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005696 return false;
5697 }
5698 }
5699 }
5700
Jamie Madillc1d770e2017-04-13 17:31:24 -04005701 Shader *shaderObject = GetValidShader(context, shader);
5702 if (!shaderObject)
5703 {
5704 return false;
5705 }
5706
5707 return true;
5708}
5709
Jamie Madill5b772312018-03-08 20:28:32 -05005710bool ValidateStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005711{
5712 if (!IsValidStencilFunc(func))
5713 {
Jamie Madille0472f32018-11-27 16:32:45 -05005714 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005715 return false;
5716 }
5717
5718 return true;
5719}
5720
Jamie Madill5b772312018-03-08 20:28:32 -05005721bool ValidateStencilFuncSeparate(Context *context, GLenum face, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005722{
5723 if (!IsValidStencilFace(face))
5724 {
Jamie Madille0472f32018-11-27 16:32:45 -05005725 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005726 return false;
5727 }
5728
5729 if (!IsValidStencilFunc(func))
5730 {
Jamie Madille0472f32018-11-27 16:32:45 -05005731 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005732 return false;
5733 }
5734
5735 return true;
5736}
5737
Jamie Madill5b772312018-03-08 20:28:32 -05005738bool ValidateStencilMask(Context *context, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005739{
5740 return true;
5741}
5742
Jamie Madill5b772312018-03-08 20:28:32 -05005743bool ValidateStencilMaskSeparate(Context *context, GLenum face, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005744{
5745 if (!IsValidStencilFace(face))
5746 {
Jamie Madille0472f32018-11-27 16:32:45 -05005747 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005748 return false;
5749 }
5750
5751 return true;
5752}
5753
Jamie Madill5b772312018-03-08 20:28:32 -05005754bool ValidateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005755{
5756 if (!IsValidStencilOp(fail))
5757 {
Jamie Madille0472f32018-11-27 16:32:45 -05005758 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005759 return false;
5760 }
5761
5762 if (!IsValidStencilOp(zfail))
5763 {
Jamie Madille0472f32018-11-27 16:32:45 -05005764 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005765 return false;
5766 }
5767
5768 if (!IsValidStencilOp(zpass))
5769 {
Jamie Madille0472f32018-11-27 16:32:45 -05005770 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005771 return false;
5772 }
5773
5774 return true;
5775}
5776
Jamie Madill5b772312018-03-08 20:28:32 -05005777bool ValidateStencilOpSeparate(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005778 GLenum face,
5779 GLenum fail,
5780 GLenum zfail,
5781 GLenum zpass)
5782{
5783 if (!IsValidStencilFace(face))
5784 {
Jamie Madille0472f32018-11-27 16:32:45 -05005785 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005786 return false;
5787 }
5788
5789 return ValidateStencilOp(context, fail, zfail, zpass);
5790}
5791
Jamie Madill5b772312018-03-08 20:28:32 -05005792bool ValidateUniform1f(Context *context, GLint location, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005793{
5794 return ValidateUniform(context, GL_FLOAT, location, 1);
5795}
5796
Jamie Madill5b772312018-03-08 20:28:32 -05005797bool ValidateUniform1fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005798{
5799 return ValidateUniform(context, GL_FLOAT, location, count);
5800}
5801
Jamie Madill5b772312018-03-08 20:28:32 -05005802bool ValidateUniform1i(Context *context, GLint location, GLint x)
Jamie Madillbe849e42017-05-02 15:49:00 -04005803{
5804 return ValidateUniform1iv(context, location, 1, &x);
5805}
5806
Jamie Madill5b772312018-03-08 20:28:32 -05005807bool ValidateUniform2fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005808{
5809 return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
5810}
5811
Jamie Madill5b772312018-03-08 20:28:32 -05005812bool ValidateUniform2i(Context *context, GLint location, GLint x, GLint y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005813{
5814 return ValidateUniform(context, GL_INT_VEC2, location, 1);
5815}
5816
Jamie Madill5b772312018-03-08 20:28:32 -05005817bool ValidateUniform2iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005818{
5819 return ValidateUniform(context, GL_INT_VEC2, location, count);
5820}
5821
Jamie Madill5b772312018-03-08 20:28:32 -05005822bool ValidateUniform3f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005823{
5824 return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
5825}
5826
Jamie Madill5b772312018-03-08 20:28:32 -05005827bool ValidateUniform3fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005828{
5829 return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
5830}
5831
Jamie Madill5b772312018-03-08 20:28:32 -05005832bool ValidateUniform3i(Context *context, GLint location, GLint x, GLint y, GLint z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005833{
5834 return ValidateUniform(context, GL_INT_VEC3, location, 1);
5835}
5836
Jamie Madill5b772312018-03-08 20:28:32 -05005837bool ValidateUniform3iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005838{
5839 return ValidateUniform(context, GL_INT_VEC3, location, count);
5840}
5841
Jamie Madill5b772312018-03-08 20:28:32 -05005842bool ValidateUniform4f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005843{
5844 return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
5845}
5846
Jamie Madill5b772312018-03-08 20:28:32 -05005847bool ValidateUniform4fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005848{
5849 return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
5850}
5851
Jamie Madill5b772312018-03-08 20:28:32 -05005852bool ValidateUniform4i(Context *context, GLint location, GLint x, GLint y, GLint z, GLint w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005853{
5854 return ValidateUniform(context, GL_INT_VEC4, location, 1);
5855}
5856
Jamie Madill5b772312018-03-08 20:28:32 -05005857bool ValidateUniform4iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005858{
5859 return ValidateUniform(context, GL_INT_VEC4, location, count);
5860}
5861
Jamie Madill5b772312018-03-08 20:28:32 -05005862bool ValidateUniformMatrix2fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005863 GLint location,
5864 GLsizei count,
5865 GLboolean transpose,
5866 const GLfloat *value)
5867{
5868 return ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose);
5869}
5870
Jamie Madill5b772312018-03-08 20:28:32 -05005871bool ValidateUniformMatrix3fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005872 GLint location,
5873 GLsizei count,
5874 GLboolean transpose,
5875 const GLfloat *value)
5876{
5877 return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
5878}
5879
Jamie Madill5b772312018-03-08 20:28:32 -05005880bool ValidateUniformMatrix4fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005881 GLint location,
5882 GLsizei count,
5883 GLboolean transpose,
5884 const GLfloat *value)
5885{
5886 return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
5887}
5888
Jamie Madill5b772312018-03-08 20:28:32 -05005889bool ValidateValidateProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005890{
5891 Program *programObject = GetValidProgram(context, program);
5892
5893 if (!programObject)
5894 {
5895 return false;
5896 }
5897
5898 return true;
5899}
5900
Jamie Madill5b772312018-03-08 20:28:32 -05005901bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005902{
5903 return ValidateVertexAttribIndex(context, index);
5904}
5905
Jamie Madill5b772312018-03-08 20:28:32 -05005906bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005907{
5908 return ValidateVertexAttribIndex(context, index);
5909}
5910
Jamie Madill5b772312018-03-08 20:28:32 -05005911bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005912{
5913 return ValidateVertexAttribIndex(context, index);
5914}
5915
Jamie Madill5b772312018-03-08 20:28:32 -05005916bool ValidateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005917{
5918 return ValidateVertexAttribIndex(context, index);
5919}
5920
Jamie Madill5b772312018-03-08 20:28:32 -05005921bool ValidateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005922{
5923 return ValidateVertexAttribIndex(context, index);
5924}
5925
Jamie Madill5b772312018-03-08 20:28:32 -05005926bool ValidateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005927{
5928 return ValidateVertexAttribIndex(context, index);
5929}
5930
Jamie Madill5b772312018-03-08 20:28:32 -05005931bool ValidateVertexAttrib4f(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005932 GLuint index,
5933 GLfloat x,
5934 GLfloat y,
5935 GLfloat z,
5936 GLfloat w)
5937{
5938 return ValidateVertexAttribIndex(context, index);
5939}
5940
Jamie Madill5b772312018-03-08 20:28:32 -05005941bool ValidateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005942{
5943 return ValidateVertexAttribIndex(context, index);
5944}
5945
Jamie Madill5b772312018-03-08 20:28:32 -05005946bool ValidateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005947{
5948 if (width < 0 || height < 0)
5949 {
Jamie Madille0472f32018-11-27 16:32:45 -05005950 context->validationError(GL_INVALID_VALUE, kViewportNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005951 return false;
5952 }
5953
5954 return true;
5955}
5956
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08005957bool ValidateGetFramebufferAttachmentParameteriv(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04005958 GLenum target,
5959 GLenum attachment,
5960 GLenum pname,
5961 GLint *params)
5962{
5963 return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
5964 nullptr);
5965}
5966
Jamie Madill5b772312018-03-08 20:28:32 -05005967bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04005968{
5969 return ValidateGetProgramivBase(context, program, pname, nullptr);
5970}
5971
Jamie Madill5b772312018-03-08 20:28:32 -05005972bool ValidateCopyTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005973 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005974 GLint level,
5975 GLenum internalformat,
5976 GLint x,
5977 GLint y,
5978 GLsizei width,
5979 GLsizei height,
5980 GLint border)
5981{
5982 if (context->getClientMajorVersion() < 3)
5983 {
5984 return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
5985 0, x, y, width, height, border);
5986 }
5987
5988 ASSERT(context->getClientMajorVersion() == 3);
5989 return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
5990 0, x, y, width, height, border);
5991}
5992
5993bool ValidateCopyTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005994 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005995 GLint level,
5996 GLint xoffset,
5997 GLint yoffset,
5998 GLint x,
5999 GLint y,
6000 GLsizei width,
6001 GLsizei height)
6002{
6003 if (context->getClientMajorVersion() < 3)
6004 {
6005 return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
6006 yoffset, x, y, width, height, 0);
6007 }
6008
6009 return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
6010 yoffset, 0, x, y, width, height, 0);
6011}
6012
6013bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
6014{
6015 return ValidateGenOrDelete(context, n);
6016}
6017
6018bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
6019{
6020 return ValidateGenOrDelete(context, n);
6021}
6022
6023bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
6024{
6025 return ValidateGenOrDelete(context, n);
6026}
6027
6028bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
6029{
6030 return ValidateGenOrDelete(context, n);
6031}
6032
6033bool ValidateDisable(Context *context, GLenum cap)
6034{
6035 if (!ValidCap(context, cap, false))
6036 {
Jamie Madille0472f32018-11-27 16:32:45 -05006037 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006038 return false;
6039 }
6040
6041 return true;
6042}
6043
6044bool ValidateEnable(Context *context, GLenum cap)
6045{
6046 if (!ValidCap(context, cap, false))
6047 {
Jamie Madille0472f32018-11-27 16:32:45 -05006048 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006049 return false;
6050 }
6051
6052 if (context->getLimitations().noSampleAlphaToCoverageSupport &&
6053 cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
6054 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006055 context->validationError(GL_INVALID_OPERATION, kNoSampleAlphaToCoveragesLimitation);
Jamie Madillbe849e42017-05-02 15:49:00 -04006056
6057 // We also output an error message to the debugger window if tracing is active, so that
6058 // developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006059 ERR() << kNoSampleAlphaToCoveragesLimitation;
Jamie Madillbe849e42017-05-02 15:49:00 -04006060 return false;
6061 }
6062
6063 return true;
6064}
6065
6066bool ValidateFramebufferRenderbuffer(Context *context,
6067 GLenum target,
6068 GLenum attachment,
6069 GLenum renderbuffertarget,
6070 GLuint renderbuffer)
6071{
Geoff Lange8afa902017-09-27 15:00:43 -04006072 if (!ValidFramebufferTarget(context, target))
Jamie Madillbe849e42017-05-02 15:49:00 -04006073 {
Jamie Madille0472f32018-11-27 16:32:45 -05006074 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Brandon Jones6cad5662017-06-14 13:25:13 -07006075 return false;
6076 }
6077
6078 if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
6079 {
Jamie Madille0472f32018-11-27 16:32:45 -05006080 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006081 return false;
6082 }
6083
6084 return ValidateFramebufferRenderbufferParameters(context, target, attachment,
6085 renderbuffertarget, renderbuffer);
6086}
6087
6088bool ValidateFramebufferTexture2D(Context *context,
6089 GLenum target,
6090 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006091 TextureTarget textarget,
Jamie Madillbe849e42017-05-02 15:49:00 -04006092 GLuint texture,
6093 GLint level)
6094{
6095 // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
6096 // extension
6097 if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
6098 level != 0)
6099 {
Jamie Madille0472f32018-11-27 16:32:45 -05006100 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006101 return false;
6102 }
6103
6104 if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
6105 {
6106 return false;
6107 }
6108
6109 if (texture != 0)
6110 {
6111 gl::Texture *tex = context->getTexture(texture);
6112 ASSERT(tex);
6113
6114 const gl::Caps &caps = context->getCaps();
6115
6116 switch (textarget)
6117 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006118 case TextureTarget::_2D:
Jamie Madillbe849e42017-05-02 15:49:00 -04006119 {
6120 if (level > gl::log2(caps.max2DTextureSize))
6121 {
Jamie Madille0472f32018-11-27 16:32:45 -05006122 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006123 return false;
6124 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006125 if (tex->getType() != TextureType::_2D)
Jamie Madillbe849e42017-05-02 15:49:00 -04006126 {
Jamie Madille0472f32018-11-27 16:32:45 -05006127 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006128 return false;
6129 }
6130 }
6131 break;
6132
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006133 case TextureTarget::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006134 {
6135 if (level != 0)
6136 {
Jamie Madille0472f32018-11-27 16:32:45 -05006137 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006138 return false;
6139 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006140 if (tex->getType() != TextureType::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006141 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006142 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006143 return false;
6144 }
6145 }
6146 break;
6147
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006148 case TextureTarget::CubeMapNegativeX:
6149 case TextureTarget::CubeMapNegativeY:
6150 case TextureTarget::CubeMapNegativeZ:
6151 case TextureTarget::CubeMapPositiveX:
6152 case TextureTarget::CubeMapPositiveY:
6153 case TextureTarget::CubeMapPositiveZ:
Jamie Madillbe849e42017-05-02 15:49:00 -04006154 {
6155 if (level > gl::log2(caps.maxCubeMapTextureSize))
6156 {
Jamie Madille0472f32018-11-27 16:32:45 -05006157 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006158 return false;
6159 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006160 if (tex->getType() != TextureType::CubeMap)
Jamie Madillbe849e42017-05-02 15:49:00 -04006161 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006162 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006163 return false;
6164 }
6165 }
6166 break;
6167
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006168 case TextureTarget::_2DMultisample:
Jamie Madillbe849e42017-05-02 15:49:00 -04006169 {
Yizhou Jiang7818a852018-09-06 15:02:04 +08006170 if (context->getClientVersion() < ES_3_1 &&
6171 !context->getExtensions().textureMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006172 {
Jamie Madill610640f2018-11-21 17:28:41 -05006173 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05006174 kMultisampleTextureExtensionOrES31Required);
Jamie Madillbe849e42017-05-02 15:49:00 -04006175 return false;
6176 }
6177
6178 if (level != 0)
6179 {
Jamie Madille0472f32018-11-27 16:32:45 -05006180 context->validationError(GL_INVALID_VALUE, kLevelNotZero);
Jamie Madillbe849e42017-05-02 15:49:00 -04006181 return false;
6182 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006183 if (tex->getType() != TextureType::_2DMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006184 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006185 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006186 return false;
6187 }
6188 }
6189 break;
6190
6191 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006192 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006193 return false;
6194 }
Jamie Madillbe849e42017-05-02 15:49:00 -04006195 }
6196
6197 return true;
6198}
6199
6200bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
6201{
6202 return ValidateGenOrDelete(context, n);
6203}
6204
6205bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
6206{
6207 return ValidateGenOrDelete(context, n);
6208}
6209
6210bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
6211{
6212 return ValidateGenOrDelete(context, n);
6213}
6214
6215bool ValidateGenTextures(Context *context, GLint n, GLuint *)
6216{
6217 return ValidateGenOrDelete(context, n);
6218}
6219
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006220bool ValidateGenerateMipmap(Context *context, TextureType target)
Jamie Madillbe849e42017-05-02 15:49:00 -04006221{
6222 if (!ValidTextureTarget(context, target))
6223 {
Jamie Madille0472f32018-11-27 16:32:45 -05006224 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006225 return false;
6226 }
6227
Jamie Madillcfc73cc2019-04-08 16:26:51 -04006228 Texture *texture = context->getTextureByType(target);
Jamie Madillbe849e42017-05-02 15:49:00 -04006229
6230 if (texture == nullptr)
6231 {
Jamie Madille0472f32018-11-27 16:32:45 -05006232 context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
Jamie Madillbe849e42017-05-02 15:49:00 -04006233 return false;
6234 }
6235
6236 const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
6237
6238 // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
6239 // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
6240 if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6241 {
Jamie Madille0472f32018-11-27 16:32:45 -05006242 context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
Jamie Madillbe849e42017-05-02 15:49:00 -04006243 return false;
6244 }
6245
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006246 TextureTarget baseTarget = (target == TextureType::CubeMap)
6247 ? TextureTarget::CubeMapPositiveX
6248 : NonCubeTextureTypeToTarget(target);
Geoff Lang536eca12017-09-13 11:23:35 -04006249 const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
6250 if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
6251 format.stencilBits > 0)
Brandon Jones6cad5662017-06-14 13:25:13 -07006252 {
Jamie Madille0472f32018-11-27 16:32:45 -05006253 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Brandon Jones6cad5662017-06-14 13:25:13 -07006254 return false;
6255 }
6256
Geoff Lang536eca12017-09-13 11:23:35 -04006257 // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
6258 bool formatUnsized = !format.sized;
6259 bool formatColorRenderableAndFilterable =
6260 format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
Yuly Novikovf15f8862018-06-04 18:59:41 -04006261 format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
Geoff Lang536eca12017-09-13 11:23:35 -04006262 if (!formatUnsized && !formatColorRenderableAndFilterable)
Jamie Madillbe849e42017-05-02 15:49:00 -04006263 {
Jamie Madille0472f32018-11-27 16:32:45 -05006264 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006265 return false;
6266 }
6267
Geoff Lang536eca12017-09-13 11:23:35 -04006268 // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
6269 // generation
6270 if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
6271 {
Jamie Madille0472f32018-11-27 16:32:45 -05006272 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Geoff Lang536eca12017-09-13 11:23:35 -04006273 return false;
6274 }
6275
Jiange2c00842018-07-13 16:50:49 +08006276 // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
6277 // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
6278 if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
Jamie Madillbe849e42017-05-02 15:49:00 -04006279 {
Jamie Madille0472f32018-11-27 16:32:45 -05006280 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006281 return false;
6282 }
6283
6284 // Non-power of 2 ES2 check
6285 if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
6286 (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
6287 !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
6288 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006289 ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
6290 target == TextureType::CubeMap);
Jamie Madille0472f32018-11-27 16:32:45 -05006291 context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
Jamie Madillbe849e42017-05-02 15:49:00 -04006292 return false;
6293 }
6294
6295 // Cube completeness check
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006296 if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
Jamie Madillbe849e42017-05-02 15:49:00 -04006297 {
Jamie Madille0472f32018-11-27 16:32:45 -05006298 context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
Jamie Madillbe849e42017-05-02 15:49:00 -04006299 return false;
6300 }
6301
James Darpinian83b2f0e2018-11-27 15:56:01 -08006302 if (context->getExtensions().webglCompatibility &&
6303 (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
6304 texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
6305 {
6306 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
6307 return false;
6308 }
6309
Jamie Madillbe849e42017-05-02 15:49:00 -04006310 return true;
6311}
6312
Jamie Madill5b772312018-03-08 20:28:32 -05006313bool ValidateGetBufferParameteriv(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04006314 BufferBinding target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006315 GLenum pname,
6316 GLint *params)
6317{
6318 return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
6319}
6320
6321bool ValidateGetRenderbufferParameteriv(Context *context,
6322 GLenum target,
6323 GLenum pname,
6324 GLint *params)
6325{
6326 return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
6327}
6328
6329bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
6330{
6331 return ValidateGetShaderivBase(context, shader, pname, nullptr);
6332}
6333
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006334bool ValidateGetTexParameterfv(Context *context, TextureType target, GLenum pname, GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006335{
6336 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6337}
6338
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006339bool ValidateGetTexParameteriv(Context *context, TextureType target, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006340{
6341 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6342}
6343
Till Rathmannb8543632018-10-02 19:46:14 +02006344bool ValidateGetTexParameterIivOES(Context *context,
6345 TextureType target,
6346 GLenum pname,
6347 GLint *params)
6348{
6349 if (context->getClientMajorVersion() < 3)
6350 {
Jamie Madille0472f32018-11-27 16:32:45 -05006351 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006352 return false;
6353 }
6354 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6355}
6356
6357bool ValidateGetTexParameterIuivOES(Context *context,
6358 TextureType target,
6359 GLenum pname,
6360 GLuint *params)
6361{
6362 if (context->getClientMajorVersion() < 3)
6363 {
Jamie Madille0472f32018-11-27 16:32:45 -05006364 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006365 return false;
6366 }
6367 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6368}
6369
Jamie Madillbe849e42017-05-02 15:49:00 -04006370bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
6371{
6372 return ValidateGetUniformBase(context, program, location);
6373}
6374
6375bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
6376{
6377 return ValidateGetUniformBase(context, program, location);
6378}
6379
6380bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
6381{
6382 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6383}
6384
6385bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
6386{
6387 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6388}
6389
6390bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
6391{
6392 return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
6393}
6394
6395bool ValidateIsEnabled(Context *context, GLenum cap)
6396{
6397 if (!ValidCap(context, cap, true))
6398 {
Jamie Madille0472f32018-11-27 16:32:45 -05006399 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006400 return false;
6401 }
6402
6403 return true;
6404}
6405
6406bool ValidateLinkProgram(Context *context, GLuint program)
6407{
6408 if (context->hasActiveTransformFeedback(program))
6409 {
6410 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006411 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackActiveDuringLink);
Jamie Madillbe849e42017-05-02 15:49:00 -04006412 return false;
6413 }
6414
6415 Program *programObject = GetValidProgram(context, program);
6416 if (!programObject)
6417 {
6418 return false;
6419 }
6420
6421 return true;
6422}
6423
Jamie Madill4928b7c2017-06-20 12:57:39 -04006424bool ValidateReadPixels(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006425 GLint x,
6426 GLint y,
6427 GLsizei width,
6428 GLsizei height,
6429 GLenum format,
6430 GLenum type,
6431 void *pixels)
6432{
6433 return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
6434 nullptr, pixels);
6435}
6436
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006437bool ValidateTexParameterf(Context *context, TextureType target, GLenum pname, GLfloat param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006438{
Till Rathmannb8543632018-10-02 19:46:14 +02006439 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006440}
6441
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006442bool ValidateTexParameterfv(Context *context,
6443 TextureType target,
6444 GLenum pname,
6445 const GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006446{
Till Rathmannb8543632018-10-02 19:46:14 +02006447 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006448}
6449
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006450bool ValidateTexParameteri(Context *context, TextureType target, GLenum pname, GLint param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006451{
Till Rathmannb8543632018-10-02 19:46:14 +02006452 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006453}
6454
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006455bool ValidateTexParameteriv(Context *context, TextureType target, GLenum pname, const GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006456{
Till Rathmannb8543632018-10-02 19:46:14 +02006457 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6458}
6459
6460bool ValidateTexParameterIivOES(Context *context,
6461 TextureType target,
6462 GLenum pname,
6463 const GLint *params)
6464{
6465 if (context->getClientMajorVersion() < 3)
6466 {
Jamie Madille0472f32018-11-27 16:32:45 -05006467 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006468 return false;
6469 }
6470 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6471}
6472
6473bool ValidateTexParameterIuivOES(Context *context,
6474 TextureType target,
6475 GLenum pname,
6476 const GLuint *params)
6477{
6478 if (context->getClientMajorVersion() < 3)
6479 {
Jamie Madille0472f32018-11-27 16:32:45 -05006480 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006481 return false;
6482 }
6483 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006484}
6485
6486bool ValidateUseProgram(Context *context, GLuint program)
6487{
6488 if (program != 0)
6489 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006490 Program *programObject = context->getProgramResolveLink(program);
Jamie Madillbe849e42017-05-02 15:49:00 -04006491 if (!programObject)
6492 {
6493 // ES 3.1.0 section 7.3 page 72
6494 if (context->getShader(program))
6495 {
Jamie Madille0472f32018-11-27 16:32:45 -05006496 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006497 return false;
6498 }
6499 else
6500 {
Jamie Madille0472f32018-11-27 16:32:45 -05006501 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006502 return false;
6503 }
6504 }
6505 if (!programObject->isLinked())
6506 {
Jamie Madille0472f32018-11-27 16:32:45 -05006507 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillbe849e42017-05-02 15:49:00 -04006508 return false;
6509 }
6510 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006511 if (context->getState().isTransformFeedbackActiveUnpaused())
Jamie Madillbe849e42017-05-02 15:49:00 -04006512 {
6513 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006514 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackUseProgram);
Jamie Madillbe849e42017-05-02 15:49:00 -04006515 return false;
6516 }
6517
6518 return true;
6519}
6520
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006521bool ValidateDeleteFencesNV(Context *context, GLsizei n, const GLuint *fences)
6522{
6523 if (!context->getExtensions().fence)
6524 {
Jamie Madille0472f32018-11-27 16:32:45 -05006525 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006526 return false;
6527 }
6528
6529 if (n < 0)
6530 {
Jamie Madille0472f32018-11-27 16:32:45 -05006531 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006532 return false;
6533 }
6534
6535 return true;
6536}
6537
6538bool ValidateFinishFenceNV(Context *context, GLuint fence)
6539{
6540 if (!context->getExtensions().fence)
6541 {
Jamie Madille0472f32018-11-27 16:32:45 -05006542 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006543 return false;
6544 }
6545
6546 FenceNV *fenceObject = context->getFenceNV(fence);
6547
6548 if (fenceObject == nullptr)
6549 {
Jamie Madille0472f32018-11-27 16:32:45 -05006550 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006551 return false;
6552 }
6553
6554 if (!fenceObject->isSet())
6555 {
Jamie Madille0472f32018-11-27 16:32:45 -05006556 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006557 return false;
6558 }
6559
6560 return true;
6561}
6562
6563bool ValidateGenFencesNV(Context *context, GLsizei n, GLuint *fences)
6564{
6565 if (!context->getExtensions().fence)
6566 {
Jamie Madille0472f32018-11-27 16:32:45 -05006567 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006568 return false;
6569 }
6570
6571 if (n < 0)
6572 {
Jamie Madille0472f32018-11-27 16:32:45 -05006573 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006574 return false;
6575 }
6576
6577 return true;
6578}
6579
6580bool ValidateGetFenceivNV(Context *context, GLuint fence, GLenum pname, GLint *params)
6581{
6582 if (!context->getExtensions().fence)
6583 {
Jamie Madille0472f32018-11-27 16:32:45 -05006584 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006585 return false;
6586 }
6587
6588 FenceNV *fenceObject = context->getFenceNV(fence);
6589
6590 if (fenceObject == nullptr)
6591 {
Jamie Madille0472f32018-11-27 16:32:45 -05006592 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006593 return false;
6594 }
6595
6596 if (!fenceObject->isSet())
6597 {
Jamie Madille0472f32018-11-27 16:32:45 -05006598 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006599 return false;
6600 }
6601
6602 switch (pname)
6603 {
6604 case GL_FENCE_STATUS_NV:
6605 case GL_FENCE_CONDITION_NV:
6606 break;
6607
6608 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006609 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006610 return false;
6611 }
6612
6613 return true;
6614}
6615
6616bool ValidateGetGraphicsResetStatusEXT(Context *context)
6617{
6618 if (!context->getExtensions().robustness)
6619 {
Jamie Madille0472f32018-11-27 16:32:45 -05006620 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006621 return false;
6622 }
6623
6624 return true;
6625}
6626
6627bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
6628 GLuint shader,
6629 GLsizei bufsize,
6630 GLsizei *length,
6631 GLchar *source)
6632{
6633 if (!context->getExtensions().translatedShaderSource)
6634 {
Jamie Madille0472f32018-11-27 16:32:45 -05006635 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006636 return false;
6637 }
6638
6639 if (bufsize < 0)
6640 {
Jamie Madille0472f32018-11-27 16:32:45 -05006641 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006642 return false;
6643 }
6644
6645 Shader *shaderObject = context->getShader(shader);
6646
6647 if (!shaderObject)
6648 {
Jamie Madille0472f32018-11-27 16:32:45 -05006649 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006650 return false;
6651 }
6652
6653 return true;
6654}
6655
6656bool ValidateIsFenceNV(Context *context, GLuint fence)
6657{
6658 if (!context->getExtensions().fence)
6659 {
Jamie Madille0472f32018-11-27 16:32:45 -05006660 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006661 return false;
6662 }
6663
6664 return true;
6665}
6666
Jamie Madill007530e2017-12-28 14:27:04 -05006667bool ValidateSetFenceNV(Context *context, GLuint fence, GLenum condition)
6668{
6669 if (!context->getExtensions().fence)
6670 {
Jamie Madille0472f32018-11-27 16:32:45 -05006671 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006672 return false;
6673 }
6674
6675 if (condition != GL_ALL_COMPLETED_NV)
6676 {
Jamie Madille0472f32018-11-27 16:32:45 -05006677 context->validationError(GL_INVALID_ENUM, kInvalidFenceCondition);
Jamie Madill007530e2017-12-28 14:27:04 -05006678 return false;
6679 }
6680
6681 FenceNV *fenceObject = context->getFenceNV(fence);
6682
6683 if (fenceObject == nullptr)
6684 {
Jamie Madille0472f32018-11-27 16:32:45 -05006685 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006686 return false;
6687 }
6688
6689 return true;
6690}
6691
6692bool ValidateTestFenceNV(Context *context, GLuint fence)
6693{
6694 if (!context->getExtensions().fence)
6695 {
Jamie Madille0472f32018-11-27 16:32:45 -05006696 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006697 return false;
6698 }
6699
6700 FenceNV *fenceObject = context->getFenceNV(fence);
6701
6702 if (fenceObject == nullptr)
6703 {
Jamie Madille0472f32018-11-27 16:32:45 -05006704 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006705 return false;
6706 }
6707
6708 if (fenceObject->isSet() != GL_TRUE)
6709 {
Jamie Madille0472f32018-11-27 16:32:45 -05006710 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill007530e2017-12-28 14:27:04 -05006711 return false;
6712 }
6713
6714 return true;
6715}
6716
6717bool ValidateTexStorage2DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006718 TextureType type,
Jamie Madill007530e2017-12-28 14:27:04 -05006719 GLsizei levels,
6720 GLenum internalformat,
6721 GLsizei width,
6722 GLsizei height)
6723{
6724 if (!context->getExtensions().textureStorage)
6725 {
Jamie Madille0472f32018-11-27 16:32:45 -05006726 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006727 return false;
6728 }
6729
6730 if (context->getClientMajorVersion() < 3)
6731 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006732 return ValidateES2TexStorageParameters(context, type, levels, internalformat, width,
Jamie Madill007530e2017-12-28 14:27:04 -05006733 height);
6734 }
6735
6736 ASSERT(context->getClientMajorVersion() >= 3);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006737 return ValidateES3TexStorage2DParameters(context, type, levels, internalformat, width, height,
Jamie Madill007530e2017-12-28 14:27:04 -05006738 1);
6739}
6740
6741bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor)
6742{
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006743 if (!context->getExtensions().instancedArraysANGLE)
Jamie Madill007530e2017-12-28 14:27:04 -05006744 {
Jamie Madille0472f32018-11-27 16:32:45 -05006745 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006746 return false;
6747 }
6748
6749 if (index >= MAX_VERTEX_ATTRIBS)
6750 {
Jamie Madille0472f32018-11-27 16:32:45 -05006751 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill007530e2017-12-28 14:27:04 -05006752 return false;
6753 }
6754
6755 if (context->getLimitations().attributeZeroRequiresZeroDivisorInEXT)
6756 {
6757 if (index == 0 && divisor != 0)
6758 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006759 context->validationError(GL_INVALID_OPERATION, kAttributeZeroRequiresDivisorLimitation);
Jamie Madill007530e2017-12-28 14:27:04 -05006760
6761 // We also output an error message to the debugger window if tracing is active, so
6762 // that developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006763 ERR() << kAttributeZeroRequiresDivisorLimitation;
Jamie Madill007530e2017-12-28 14:27:04 -05006764 return false;
6765 }
6766 }
6767
6768 return true;
6769}
6770
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006771bool ValidateVertexAttribDivisorEXT(Context *context, GLuint index, GLuint divisor)
6772{
6773 if (!context->getExtensions().instancedArraysEXT)
6774 {
6775 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6776 return false;
6777 }
6778
6779 if (index >= MAX_VERTEX_ATTRIBS)
6780 {
6781 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
6782 return false;
6783 }
6784
6785 return true;
6786}
6787
Jamie Madill007530e2017-12-28 14:27:04 -05006788bool ValidateTexImage3DOES(Context *context,
6789 GLenum target,
6790 GLint level,
6791 GLenum internalformat,
6792 GLsizei width,
6793 GLsizei height,
6794 GLsizei depth,
6795 GLint border,
6796 GLenum format,
6797 GLenum type,
6798 const void *pixels)
6799{
6800 UNIMPLEMENTED(); // FIXME
6801 return false;
6802}
6803
6804bool ValidatePopGroupMarkerEXT(Context *context)
6805{
6806 if (!context->getExtensions().debugMarker)
6807 {
6808 // The debug marker calls should not set error state
6809 // However, it seems reasonable to set an error state if the extension is not enabled
Jamie Madille0472f32018-11-27 16:32:45 -05006810 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006811 return false;
6812 }
6813
6814 return true;
6815}
6816
Jamie Madillfa920eb2018-01-04 11:45:50 -05006817bool ValidateTexStorage1DEXT(Context *context,
6818 GLenum target,
6819 GLsizei levels,
6820 GLenum internalformat,
6821 GLsizei width)
6822{
6823 UNIMPLEMENTED();
Jamie Madille0472f32018-11-27 16:32:45 -05006824 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006825 return false;
6826}
6827
6828bool ValidateTexStorage3DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006829 TextureType target,
Jamie Madillfa920eb2018-01-04 11:45:50 -05006830 GLsizei levels,
6831 GLenum internalformat,
6832 GLsizei width,
6833 GLsizei height,
6834 GLsizei depth)
6835{
6836 if (!context->getExtensions().textureStorage)
6837 {
Jamie Madille0472f32018-11-27 16:32:45 -05006838 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006839 return false;
6840 }
6841
6842 if (context->getClientMajorVersion() < 3)
6843 {
Jamie Madille0472f32018-11-27 16:32:45 -05006844 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006845 return false;
6846 }
6847
6848 return ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
6849 depth);
6850}
6851
jchen1082af6202018-06-22 10:59:52 +08006852bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count)
6853{
6854 if (!context->getExtensions().parallelShaderCompile)
6855 {
Jamie Madille0472f32018-11-27 16:32:45 -05006856 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
jchen1082af6202018-06-22 10:59:52 +08006857 return false;
6858 }
6859 return true;
6860}
6861
Austin Eng1bf18ce2018-10-19 15:34:02 -07006862bool ValidateMultiDrawArraysANGLE(Context *context,
6863 PrimitiveMode mode,
6864 const GLint *firsts,
6865 const GLsizei *counts,
6866 GLsizei drawcount)
6867{
6868 if (!context->getExtensions().multiDraw)
6869 {
Jamie Madille0472f32018-11-27 16:32:45 -05006870 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006871 return false;
6872 }
6873 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6874 {
6875 if (!ValidateDrawArrays(context, mode, firsts[drawID], counts[drawID]))
6876 {
6877 return false;
6878 }
6879 }
6880 return true;
6881}
6882
6883bool ValidateMultiDrawElementsANGLE(Context *context,
6884 PrimitiveMode mode,
6885 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05006886 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08006887 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07006888 GLsizei drawcount)
6889{
6890 if (!context->getExtensions().multiDraw)
6891 {
Jamie Madille0472f32018-11-27 16:32:45 -05006892 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006893 return false;
6894 }
6895 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6896 {
Austin Eng3b7c9d02018-11-21 18:09:05 -08006897 if (!ValidateDrawElements(context, mode, counts[drawID], type, indices[drawID]))
Austin Eng1bf18ce2018-10-19 15:34:02 -07006898 {
6899 return false;
6900 }
6901 }
6902 return true;
6903}
6904
Jeff Gilbert465d6092019-01-02 16:21:18 -08006905bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked)
6906{
6907 if (!context->getExtensions().provokingVertex)
6908 {
6909 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6910 return false;
6911 }
6912
6913 switch (modePacked)
6914 {
6915 case ProvokingVertex::FirstVertexConvention:
6916 case ProvokingVertex::LastVertexConvention:
6917 break;
6918 default:
6919 context->validationError(GL_INVALID_ENUM, kInvalidProvokingVertex);
6920 return false;
6921 }
6922
6923 return true;
6924}
6925
Jamie Madilla5410482019-01-31 19:55:55 -05006926void RecordBindTextureTypeError(Context *context, TextureType target)
6927{
6928 ASSERT(!context->getStateCache().isValidBindTextureType(target));
6929
6930 switch (target)
6931 {
6932 case TextureType::Rectangle:
6933 ASSERT(!context->getExtensions().textureRectangle);
6934 context->validationError(GL_INVALID_ENUM, kTextureRectangleNotSupported);
6935 break;
6936
6937 case TextureType::_3D:
6938 case TextureType::_2DArray:
6939 ASSERT(context->getClientMajorVersion() < 3);
6940 context->validationError(GL_INVALID_ENUM, kES3Required);
6941 break;
6942
6943 case TextureType::_2DMultisample:
6944 ASSERT(context->getClientVersion() < Version(3, 1) &&
6945 !context->getExtensions().textureMultisample);
6946 context->validationError(GL_INVALID_ENUM, kMultisampleTextureExtensionOrES31Required);
6947 break;
6948
6949 case TextureType::_2DMultisampleArray:
6950 ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
6951 context->validationError(GL_INVALID_ENUM, kMultisampleArrayExtensionRequired);
6952 break;
6953
6954 case TextureType::External:
6955 ASSERT(!context->getExtensions().eglImageExternal &&
6956 !context->getExtensions().eglStreamConsumerExternal);
6957 context->validationError(GL_INVALID_ENUM, kExternalTextureNotSupported);
6958 break;
6959
6960 default:
6961 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
6962 }
6963}
6964
Jamie Madillc29968b2016-01-20 11:17:23 -05006965} // namespace gl