blob: 254db5b9d393290b75bf128103a4e45edd8d86c1 [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
Michael Spangf02a7672019-04-09 18:45:23 -04003160 if (context->getClientMajorVersion() < 3)
3161 {
3162 return ValidateES2TexStorageParameters(context, target, levels, internalFormat, width,
3163 height);
3164 }
3165
3166 ASSERT(context->getClientMajorVersion() >= 3);
3167 return ValidateES3TexStorage2DParameters(context, target, levels, internalFormat, width, height,
3168 1);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003169}
3170
3171bool ValidateTexStorageMem3DEXT(Context *context,
3172 TextureType target,
3173 GLsizei levels,
3174 GLenum internalFormat,
3175 GLsizei width,
3176 GLsizei height,
3177 GLsizei depth,
3178 GLuint memory,
3179 GLuint64 offset)
3180{
3181 if (!context->getExtensions().memoryObject)
3182 {
3183 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3184 return false;
3185 }
3186
3187 UNIMPLEMENTED();
3188 return false;
3189}
3190
Michael Spang9de3ddb2019-04-03 16:23:40 -04003191bool ValidateImportMemoryFdEXT(Context *context,
3192 GLuint memory,
3193 GLuint64 size,
Michael Spange0da9ce2019-04-16 14:34:51 -04003194 HandleType handleType,
Michael Spang9de3ddb2019-04-03 16:23:40 -04003195 GLint fd)
3196{
3197 if (!context->getExtensions().memoryObjectFd)
3198 {
3199 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3200 return false;
3201 }
3202
Michael Spang3b2c6bf2019-04-16 17:19:50 -04003203 switch (handleType)
3204 {
3205 case HandleType::OpaqueFd:
3206 break;
3207 default:
3208 context->validationError(GL_INVALID_ENUM, kInvalidHandleType);
3209 return false;
3210 }
3211
3212 return true;
Michael Spang9de3ddb2019-04-03 16:23:40 -04003213}
3214
Michael Spang7a8c3e52019-04-03 14:49:57 -04003215bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores)
3216{
3217 if (!context->getExtensions().semaphore)
3218 {
3219 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3220 return false;
3221 }
3222
3223 UNIMPLEMENTED();
3224 return false;
3225}
3226
3227bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores)
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 ValidateGetSemaphoreParameterui64vEXT(Context *context,
3240 GLuint semaphore,
3241 GLenum pname,
3242 GLuint64 *params)
3243{
3244 if (!context->getExtensions().semaphore)
3245 {
3246 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3247 return false;
3248 }
3249
3250 UNIMPLEMENTED();
3251 return false;
3252}
3253
3254bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore)
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 ValidateSemaphoreParameterui64vEXT(Context *context,
3267 GLuint semaphore,
3268 GLenum pname,
3269 const GLuint64 *params)
3270{
3271 if (!context->getExtensions().semaphore)
3272 {
3273 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3274 return false;
3275 }
3276
3277 UNIMPLEMENTED();
3278 return false;
3279}
3280
3281bool ValidateSignalSemaphoreEXT(Context *context,
3282 GLuint semaphore,
3283 GLuint numBufferBarriers,
3284 const GLuint *buffers,
3285 GLuint numTextureBarriers,
3286 const GLuint *textures,
3287 const GLenum *dstLayouts)
3288{
3289 if (!context->getExtensions().semaphore)
3290 {
3291 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3292 return false;
3293 }
3294
3295 UNIMPLEMENTED();
3296 return false;
3297}
3298
3299bool ValidateWaitSemaphoreEXT(Context *context,
3300 GLuint semaphore,
3301 GLuint numBufferBarriers,
3302 const GLuint *buffers,
3303 GLuint numTextureBarriers,
3304 const GLuint *textures,
3305 const GLenum *srcLayouts)
3306{
3307 if (!context->getExtensions().semaphore)
3308 {
3309 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3310 return false;
3311 }
3312
3313 UNIMPLEMENTED();
3314 return false;
3315}
3316
Michael Spange0da9ce2019-04-16 14:34:51 -04003317bool ValidateImportSemaphoreFdEXT(Context *context,
3318 GLuint semaphore,
3319 HandleType handleType,
3320 GLint fd)
Michael Spang9de3ddb2019-04-03 16:23:40 -04003321{
3322 if (!context->getExtensions().semaphoreFd)
3323 {
3324 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3325 return false;
3326 }
3327
3328 UNIMPLEMENTED();
3329 return false;
3330}
3331
Corentin Wallez336129f2017-10-17 15:55:40 -04003332bool ValidateMapBufferBase(Context *context, BufferBinding target)
Geoff Lang79f71042017-08-14 16:43:43 -04003333{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003334 Buffer *buffer = context->getState().getTargetBuffer(target);
Geoff Lang79f71042017-08-14 16:43:43 -04003335 ASSERT(buffer != nullptr);
3336
3337 // Check if this buffer is currently being used as a transform feedback output buffer
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003338 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Lang79f71042017-08-14 16:43:43 -04003339 if (transformFeedback != nullptr && transformFeedback->isActive())
3340 {
3341 for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3342 {
3343 const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
3344 if (transformFeedbackBuffer.get() == buffer)
3345 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003346 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
Geoff Lang79f71042017-08-14 16:43:43 -04003347 return false;
3348 }
3349 }
3350 }
3351
James Darpiniane8a93c62018-01-04 18:02:24 -08003352 if (context->getExtensions().webglCompatibility &&
3353 buffer->isBoundForTransformFeedbackAndOtherUse())
3354 {
Jamie Madille0472f32018-11-27 16:32:45 -05003355 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08003356 return false;
3357 }
3358
Geoff Lang79f71042017-08-14 16:43:43 -04003359 return true;
3360}
3361
Olli Etuaho4f667482016-03-30 15:56:35 +03003362bool ValidateFlushMappedBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003363 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003364 GLintptr offset,
3365 GLsizeiptr length)
3366{
3367 if (!context->getExtensions().mapBufferRange)
3368 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003369 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003370 return false;
3371 }
3372
3373 return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
3374}
3375
Geoff Langd8605522016-04-13 10:19:12 -04003376bool ValidateBindUniformLocationCHROMIUM(Context *context,
3377 GLuint program,
3378 GLint location,
3379 const GLchar *name)
3380{
3381 if (!context->getExtensions().bindUniformLocation)
3382 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003383 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langd8605522016-04-13 10:19:12 -04003384 return false;
3385 }
3386
3387 Program *programObject = GetValidProgram(context, program);
3388 if (!programObject)
3389 {
3390 return false;
3391 }
3392
3393 if (location < 0)
3394 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003395 context->validationError(GL_INVALID_VALUE, kNegativeLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003396 return false;
3397 }
3398
3399 const Caps &caps = context->getCaps();
3400 if (static_cast<size_t>(location) >=
3401 (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
3402 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003403 context->validationError(GL_INVALID_VALUE, kInvalidBindUniformLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003404 return false;
3405 }
3406
Geoff Langfc32e8b2017-05-31 14:16:59 -04003407 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
3408 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04003409 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04003410 {
Jamie Madille0472f32018-11-27 16:32:45 -05003411 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04003412 return false;
3413 }
3414
Geoff Langd8605522016-04-13 10:19:12 -04003415 if (strncmp(name, "gl_", 3) == 0)
3416 {
Jamie Madille0472f32018-11-27 16:32:45 -05003417 context->validationError(GL_INVALID_VALUE, kNameBeginsWithGL);
Geoff Langd8605522016-04-13 10:19:12 -04003418 return false;
3419 }
3420
3421 return true;
3422}
3423
Jamie Madille2e406c2016-06-02 13:04:10 -04003424bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03003425{
3426 if (!context->getExtensions().framebufferMixedSamples)
3427 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003428 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänena797e062016-05-12 15:23:40 +03003429 return false;
3430 }
3431 switch (components)
3432 {
3433 case GL_RGB:
3434 case GL_RGBA:
3435 case GL_ALPHA:
3436 case GL_NONE:
3437 break;
3438 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003439 context->validationError(GL_INVALID_ENUM, kInvalidCoverageComponents);
Sami Väisänena797e062016-05-12 15:23:40 +03003440 return false;
3441 }
3442
3443 return true;
3444}
3445
Sami Väisänene45e53b2016-05-25 10:36:04 +03003446// CHROMIUM_path_rendering
3447
Jamie Madill007530e2017-12-28 14:27:04 -05003448bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003449{
Jamie Madill007530e2017-12-28 14:27:04 -05003450 if (!ValidateMatrixMode(context, matrixMode))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003451 {
Sami Väisänene45e53b2016-05-25 10:36:04 +03003452 return false;
3453 }
Jamie Madill007530e2017-12-28 14:27:04 -05003454
Sami Väisänene45e53b2016-05-25 10:36:04 +03003455 if (matrix == nullptr)
3456 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003457 context->validationError(GL_INVALID_OPERATION, kInvalidPathMatrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003458 return false;
3459 }
Jamie Madill007530e2017-12-28 14:27:04 -05003460
Sami Väisänene45e53b2016-05-25 10:36:04 +03003461 return true;
3462}
3463
Jamie Madill007530e2017-12-28 14:27:04 -05003464bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003465{
Jamie Madill007530e2017-12-28 14:27:04 -05003466 return ValidateMatrixMode(context, matrixMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003467}
3468
Jamie Madill007530e2017-12-28 14:27:04 -05003469bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003470{
3471 if (!context->getExtensions().pathRendering)
3472 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003473 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003474 return false;
3475 }
3476
3477 // range = 0 is undefined in NV_path_rendering.
3478 // we add stricter semantic check here and require a non zero positive range.
3479 if (range <= 0)
3480 {
Jamie Madille0472f32018-11-27 16:32:45 -05003481 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003482 return false;
3483 }
3484
3485 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
3486 {
Jamie Madille0472f32018-11-27 16:32:45 -05003487 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003488 return false;
3489 }
3490
3491 return true;
3492}
3493
Jamie Madill007530e2017-12-28 14:27:04 -05003494bool ValidateDeletePathsCHROMIUM(Context *context, GLuint path, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003495{
3496 if (!context->getExtensions().pathRendering)
3497 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003498 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003499 return false;
3500 }
3501
3502 // range = 0 is undefined in NV_path_rendering.
3503 // we add stricter semantic check here and require a non zero positive range.
3504 if (range <= 0)
3505 {
Jamie Madille0472f32018-11-27 16:32:45 -05003506 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003507 return false;
3508 }
3509
3510 angle::CheckedNumeric<std::uint32_t> checkedRange(path);
3511 checkedRange += range;
3512
3513 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
3514 {
Jamie Madille0472f32018-11-27 16:32:45 -05003515 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003516 return false;
3517 }
3518 return true;
3519}
3520
Jamie Madill007530e2017-12-28 14:27:04 -05003521bool ValidatePathCommandsCHROMIUM(Context *context,
3522 GLuint path,
3523 GLsizei numCommands,
3524 const GLubyte *commands,
3525 GLsizei numCoords,
3526 GLenum coordType,
3527 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003528{
3529 if (!context->getExtensions().pathRendering)
3530 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003531 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003532 return false;
3533 }
Brandon Jones59770802018-04-02 13:18:42 -07003534 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003535 {
Jamie Madille0472f32018-11-27 16:32:45 -05003536 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003537 return false;
3538 }
3539
3540 if (numCommands < 0)
3541 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003542 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCommands);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003543 return false;
3544 }
3545 else if (numCommands > 0)
3546 {
3547 if (!commands)
3548 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003549 context->validationError(GL_INVALID_VALUE, kInvalidPathCommandsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003550 return false;
3551 }
3552 }
3553
3554 if (numCoords < 0)
3555 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003556 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003557 return false;
3558 }
3559 else if (numCoords > 0)
3560 {
3561 if (!coords)
3562 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003563 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoordsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003564 return false;
3565 }
3566 }
3567
3568 std::uint32_t coordTypeSize = 0;
3569 switch (coordType)
3570 {
3571 case GL_BYTE:
3572 coordTypeSize = sizeof(GLbyte);
3573 break;
3574
3575 case GL_UNSIGNED_BYTE:
3576 coordTypeSize = sizeof(GLubyte);
3577 break;
3578
3579 case GL_SHORT:
3580 coordTypeSize = sizeof(GLshort);
3581 break;
3582
3583 case GL_UNSIGNED_SHORT:
3584 coordTypeSize = sizeof(GLushort);
3585 break;
3586
3587 case GL_FLOAT:
3588 coordTypeSize = sizeof(GLfloat);
3589 break;
3590
3591 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003592 context->validationError(GL_INVALID_ENUM, kInvalidPathCoordinateType);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003593 return false;
3594 }
3595
3596 angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
3597 checkedSize += (coordTypeSize * numCoords);
3598 if (!checkedSize.IsValid())
3599 {
Jamie Madille0472f32018-11-27 16:32:45 -05003600 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003601 return false;
3602 }
3603
3604 // early return skips command data validation when it doesn't exist.
3605 if (!commands)
3606 return true;
3607
3608 GLsizei expectedNumCoords = 0;
3609 for (GLsizei i = 0; i < numCommands; ++i)
3610 {
3611 switch (commands[i])
3612 {
3613 case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
3614 break;
3615 case GL_MOVE_TO_CHROMIUM:
3616 case GL_LINE_TO_CHROMIUM:
3617 expectedNumCoords += 2;
3618 break;
3619 case GL_QUADRATIC_CURVE_TO_CHROMIUM:
3620 expectedNumCoords += 4;
3621 break;
3622 case GL_CUBIC_CURVE_TO_CHROMIUM:
3623 expectedNumCoords += 6;
3624 break;
3625 case GL_CONIC_CURVE_TO_CHROMIUM:
3626 expectedNumCoords += 5;
3627 break;
3628 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003629 context->validationError(GL_INVALID_ENUM, kInvalidPathCommand);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003630 return false;
3631 }
3632 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003633
Sami Väisänene45e53b2016-05-25 10:36:04 +03003634 if (expectedNumCoords != numCoords)
3635 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003636 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003637 return false;
3638 }
3639
3640 return true;
3641}
3642
Jamie Madill007530e2017-12-28 14:27:04 -05003643bool ValidatePathParameterfCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003644{
3645 if (!context->getExtensions().pathRendering)
3646 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003647 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003648 return false;
3649 }
Brandon Jones59770802018-04-02 13:18:42 -07003650 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003651 {
Jamie Madille0472f32018-11-27 16:32:45 -05003652 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003653 return false;
3654 }
3655
3656 switch (pname)
3657 {
3658 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3659 if (value < 0.0f)
3660 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003661 context->validationError(GL_INVALID_VALUE, kInvalidPathStrokeWidth);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003662 return false;
3663 }
3664 break;
3665 case GL_PATH_END_CAPS_CHROMIUM:
3666 switch (static_cast<GLenum>(value))
3667 {
3668 case GL_FLAT_CHROMIUM:
3669 case GL_SQUARE_CHROMIUM:
3670 case GL_ROUND_CHROMIUM:
3671 break;
3672 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003673 context->validationError(GL_INVALID_ENUM, kInvalidPathEndCaps);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003674 return false;
3675 }
3676 break;
3677 case GL_PATH_JOIN_STYLE_CHROMIUM:
3678 switch (static_cast<GLenum>(value))
3679 {
3680 case GL_MITER_REVERT_CHROMIUM:
3681 case GL_BEVEL_CHROMIUM:
3682 case GL_ROUND_CHROMIUM:
3683 break;
3684 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003685 context->validationError(GL_INVALID_ENUM, kInvalidPathJoinStyle);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003686 return false;
3687 }
Nico Weber41b072b2018-02-09 10:01:32 -05003688 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03003689 case GL_PATH_MITER_LIMIT_CHROMIUM:
3690 if (value < 0.0f)
3691 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003692 context->validationError(GL_INVALID_VALUE, kInvalidPathMiterLimit);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003693 return false;
3694 }
3695 break;
3696
3697 case GL_PATH_STROKE_BOUND_CHROMIUM:
3698 // no errors, only clamping.
3699 break;
3700
3701 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003702 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003703 return false;
3704 }
3705 return true;
3706}
3707
Jamie Madill007530e2017-12-28 14:27:04 -05003708bool ValidatePathParameteriCHROMIUM(Context *context, GLuint path, GLenum pname, GLint value)
3709{
3710 // TODO(jmadill): Use proper clamping cast.
3711 return ValidatePathParameterfCHROMIUM(context, path, pname, static_cast<GLfloat>(value));
3712}
3713
3714bool ValidateGetPathParameterfvCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat *value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003715{
3716 if (!context->getExtensions().pathRendering)
3717 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003718 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003719 return false;
3720 }
3721
Brandon Jones59770802018-04-02 13:18:42 -07003722 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003723 {
Jamie Madille0472f32018-11-27 16:32:45 -05003724 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003725 return false;
3726 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003727
Sami Väisänene45e53b2016-05-25 10:36:04 +03003728 if (!value)
3729 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003730 context->validationError(GL_INVALID_VALUE, kInvalidPathValueArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003731 return false;
3732 }
3733
3734 switch (pname)
3735 {
3736 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3737 case GL_PATH_END_CAPS_CHROMIUM:
3738 case GL_PATH_JOIN_STYLE_CHROMIUM:
3739 case GL_PATH_MITER_LIMIT_CHROMIUM:
3740 case GL_PATH_STROKE_BOUND_CHROMIUM:
3741 break;
3742
3743 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003744 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003745 return false;
3746 }
3747
3748 return true;
3749}
3750
Jamie Madill007530e2017-12-28 14:27:04 -05003751bool ValidateGetPathParameterivCHROMIUM(Context *context, GLuint path, GLenum pname, GLint *value)
3752{
3753 return ValidateGetPathParameterfvCHROMIUM(context, path, pname,
3754 reinterpret_cast<GLfloat *>(value));
3755}
3756
3757bool ValidatePathStencilFuncCHROMIUM(Context *context, GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003758{
3759 if (!context->getExtensions().pathRendering)
3760 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003761 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003762 return false;
3763 }
3764
3765 switch (func)
3766 {
3767 case GL_NEVER:
3768 case GL_ALWAYS:
3769 case GL_LESS:
3770 case GL_LEQUAL:
3771 case GL_EQUAL:
3772 case GL_GEQUAL:
3773 case GL_GREATER:
3774 case GL_NOTEQUAL:
3775 break;
3776 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003777 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003778 return false;
3779 }
3780
3781 return true;
3782}
3783
3784// Note that the spec specifies that for the path drawing commands
3785// if the path object is not an existing path object the command
3786// does nothing and no error is generated.
3787// However if the path object exists but has not been specified any
3788// commands then an error is generated.
3789
Jamie Madill007530e2017-12-28 14:27:04 -05003790bool ValidateStencilFillPathCHROMIUM(Context *context, GLuint path, GLenum fillMode, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003791{
3792 if (!context->getExtensions().pathRendering)
3793 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003794 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003795 return false;
3796 }
Brandon Jones59770802018-04-02 13:18:42 -07003797 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003798 {
Jamie Madille0472f32018-11-27 16:32:45 -05003799 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003800 return false;
3801 }
3802
3803 switch (fillMode)
3804 {
3805 case GL_COUNT_UP_CHROMIUM:
3806 case GL_COUNT_DOWN_CHROMIUM:
3807 break;
3808 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003809 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003810 return false;
3811 }
3812
3813 if (!isPow2(mask + 1))
3814 {
Jamie Madille0472f32018-11-27 16:32:45 -05003815 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003816 return false;
3817 }
3818
3819 return true;
3820}
3821
Jamie Madill007530e2017-12-28 14:27:04 -05003822bool ValidateStencilStrokePathCHROMIUM(Context *context, GLuint path, GLint reference, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003823{
3824 if (!context->getExtensions().pathRendering)
3825 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003826 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003827 return false;
3828 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003829
Brandon Jones59770802018-04-02 13:18:42 -07003830 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003831 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003832 context->validationError(GL_INVALID_OPERATION, kNoPathOrNoPathData);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003833 return false;
3834 }
3835
3836 return true;
3837}
3838
Jamie Madill007530e2017-12-28 14:27:04 -05003839bool ValidateCoverPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003840{
3841 if (!context->getExtensions().pathRendering)
3842 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003843 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003844 return false;
3845 }
Brandon Jones59770802018-04-02 13:18:42 -07003846 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003847 {
Jamie Madille0472f32018-11-27 16:32:45 -05003848 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003849 return false;
3850 }
3851
3852 switch (coverMode)
3853 {
3854 case GL_CONVEX_HULL_CHROMIUM:
3855 case GL_BOUNDING_BOX_CHROMIUM:
3856 break;
3857 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003858 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003859 return false;
3860 }
3861 return true;
3862}
3863
Jamie Madill778bf092018-11-14 09:54:36 -05003864bool ValidateCoverFillPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3865{
3866 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3867}
3868
3869bool ValidateCoverStrokePathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3870{
3871 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3872}
3873
Jamie Madill007530e2017-12-28 14:27:04 -05003874bool ValidateStencilThenCoverFillPathCHROMIUM(Context *context,
3875 GLuint path,
3876 GLenum fillMode,
3877 GLuint mask,
3878 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003879{
Jamie Madill007530e2017-12-28 14:27:04 -05003880 return ValidateStencilFillPathCHROMIUM(context, path, fillMode, mask) &&
3881 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003882}
3883
Jamie Madill007530e2017-12-28 14:27:04 -05003884bool ValidateStencilThenCoverStrokePathCHROMIUM(Context *context,
3885 GLuint path,
3886 GLint reference,
3887 GLuint mask,
3888 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003889{
Jamie Madill007530e2017-12-28 14:27:04 -05003890 return ValidateStencilStrokePathCHROMIUM(context, path, reference, mask) &&
3891 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003892}
3893
Brandon Jonesd1049182018-03-28 10:02:20 -07003894bool ValidateIsPathCHROMIUM(Context *context, GLuint path)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003895{
3896 if (!context->getExtensions().pathRendering)
3897 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003898 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003899 return false;
3900 }
3901 return true;
3902}
3903
Jamie Madill007530e2017-12-28 14:27:04 -05003904bool ValidateCoverFillPathInstancedCHROMIUM(Context *context,
3905 GLsizei numPaths,
3906 GLenum pathNameType,
3907 const void *paths,
3908 GLuint pathBase,
3909 GLenum coverMode,
3910 GLenum transformType,
3911 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003912{
3913 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3914 transformType, transformValues))
3915 return false;
3916
3917 switch (coverMode)
3918 {
3919 case GL_CONVEX_HULL_CHROMIUM:
3920 case GL_BOUNDING_BOX_CHROMIUM:
3921 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3922 break;
3923 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003924 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003925 return false;
3926 }
3927
3928 return true;
3929}
3930
Jamie Madill007530e2017-12-28 14:27:04 -05003931bool ValidateCoverStrokePathInstancedCHROMIUM(Context *context,
3932 GLsizei numPaths,
3933 GLenum pathNameType,
3934 const void *paths,
3935 GLuint pathBase,
3936 GLenum coverMode,
3937 GLenum transformType,
3938 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003939{
3940 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3941 transformType, transformValues))
3942 return false;
3943
3944 switch (coverMode)
3945 {
3946 case GL_CONVEX_HULL_CHROMIUM:
3947 case GL_BOUNDING_BOX_CHROMIUM:
3948 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3949 break;
3950 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003951 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003952 return false;
3953 }
3954
3955 return true;
3956}
3957
Jamie Madill007530e2017-12-28 14:27:04 -05003958bool ValidateStencilFillPathInstancedCHROMIUM(Context *context,
3959 GLsizei numPaths,
3960 GLenum pathNameType,
3961 const void *paths,
3962 GLuint pathBase,
3963 GLenum fillMode,
3964 GLuint mask,
3965 GLenum transformType,
3966 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003967{
3968
3969 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3970 transformType, transformValues))
3971 return false;
3972
3973 switch (fillMode)
3974 {
3975 case GL_COUNT_UP_CHROMIUM:
3976 case GL_COUNT_DOWN_CHROMIUM:
3977 break;
3978 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003979 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003980 return false;
3981 }
3982 if (!isPow2(mask + 1))
3983 {
Jamie Madille0472f32018-11-27 16:32:45 -05003984 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03003985 return false;
3986 }
3987 return true;
3988}
3989
Jamie Madill007530e2017-12-28 14:27:04 -05003990bool ValidateStencilStrokePathInstancedCHROMIUM(Context *context,
3991 GLsizei numPaths,
3992 GLenum pathNameType,
3993 const void *paths,
3994 GLuint pathBase,
3995 GLint reference,
3996 GLuint mask,
3997 GLenum transformType,
3998 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003999{
4000 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4001 transformType, transformValues))
4002 return false;
4003
4004 // no more validation here.
4005
4006 return true;
4007}
4008
Jamie Madill007530e2017-12-28 14:27:04 -05004009bool ValidateStencilThenCoverFillPathInstancedCHROMIUM(Context *context,
4010 GLsizei numPaths,
4011 GLenum pathNameType,
4012 const void *paths,
4013 GLuint pathBase,
4014 GLenum fillMode,
4015 GLuint mask,
4016 GLenum coverMode,
4017 GLenum transformType,
4018 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004019{
4020 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4021 transformType, transformValues))
4022 return false;
4023
4024 switch (coverMode)
4025 {
4026 case GL_CONVEX_HULL_CHROMIUM:
4027 case GL_BOUNDING_BOX_CHROMIUM:
4028 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4029 break;
4030 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004031 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004032 return false;
4033 }
4034
4035 switch (fillMode)
4036 {
4037 case GL_COUNT_UP_CHROMIUM:
4038 case GL_COUNT_DOWN_CHROMIUM:
4039 break;
4040 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004041 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004042 return false;
4043 }
4044 if (!isPow2(mask + 1))
4045 {
Jamie Madille0472f32018-11-27 16:32:45 -05004046 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004047 return false;
4048 }
4049
4050 return true;
4051}
4052
Jamie Madill007530e2017-12-28 14:27:04 -05004053bool ValidateStencilThenCoverStrokePathInstancedCHROMIUM(Context *context,
4054 GLsizei numPaths,
4055 GLenum pathNameType,
4056 const void *paths,
4057 GLuint pathBase,
4058 GLint reference,
4059 GLuint mask,
4060 GLenum coverMode,
4061 GLenum transformType,
4062 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004063{
4064 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4065 transformType, transformValues))
4066 return false;
4067
4068 switch (coverMode)
4069 {
4070 case GL_CONVEX_HULL_CHROMIUM:
4071 case GL_BOUNDING_BOX_CHROMIUM:
4072 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4073 break;
4074 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004075 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004076 return false;
4077 }
4078
4079 return true;
4080}
4081
Jamie Madill007530e2017-12-28 14:27:04 -05004082bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
4083 GLuint program,
4084 GLint location,
4085 const GLchar *name)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004086{
4087 if (!context->getExtensions().pathRendering)
4088 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004089 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004090 return false;
4091 }
4092
4093 const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
4094 if (location >= MaxLocation)
4095 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004096 context->validationError(GL_INVALID_VALUE, kInvalidVaryingLocation);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004097 return false;
4098 }
4099
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004100 const auto *programObject = context->getProgramNoResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004101 if (!programObject)
4102 {
Jamie Madille0472f32018-11-27 16:32:45 -05004103 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004104 return false;
4105 }
4106
4107 if (!name)
4108 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004109 context->validationError(GL_INVALID_VALUE, kMissingName);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004110 return false;
4111 }
4112
4113 if (angle::BeginsWith(name, "gl_"))
4114 {
Jamie Madille0472f32018-11-27 16:32:45 -05004115 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004116 return false;
4117 }
4118
4119 return true;
4120}
4121
Jamie Madill007530e2017-12-28 14:27:04 -05004122bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
4123 GLuint program,
4124 GLint location,
4125 GLenum genMode,
4126 GLint components,
4127 const GLfloat *coeffs)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004128{
4129 if (!context->getExtensions().pathRendering)
4130 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004131 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004132 return false;
4133 }
4134
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004135 const auto *programObject = context->getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004136 if (!programObject || programObject->isFlaggedForDeletion())
4137 {
Jamie Madille0472f32018-11-27 16:32:45 -05004138 context->validationError(GL_INVALID_OPERATION, kProgramDoesNotExist);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004139 return false;
4140 }
4141
4142 if (!programObject->isLinked())
4143 {
Jamie Madille0472f32018-11-27 16:32:45 -05004144 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004145 return false;
4146 }
4147
4148 switch (genMode)
4149 {
4150 case GL_NONE:
4151 if (components != 0)
4152 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004153 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004154 return false;
4155 }
4156 break;
4157
4158 case GL_OBJECT_LINEAR_CHROMIUM:
4159 case GL_EYE_LINEAR_CHROMIUM:
4160 case GL_CONSTANT_CHROMIUM:
4161 if (components < 1 || components > 4)
4162 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004163 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004164 return false;
4165 }
4166 if (!coeffs)
4167 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004168 context->validationError(GL_INVALID_VALUE, kInvalidPathCoefficientsArray);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004169 return false;
4170 }
4171 break;
4172
4173 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004174 context->validationError(GL_INVALID_ENUM, kInvalidPathGenMode);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004175 return false;
4176 }
4177
4178 // If the location is -1 then the command is silently ignored
4179 // and no further validation is needed.
4180 if (location == -1)
4181 return true;
4182
jchen103fd614d2018-08-13 12:21:58 +08004183 const auto &binding = programObject->getFragmentInputBindingInfo(location);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004184
4185 if (!binding.valid)
4186 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004187 context->validationError(GL_INVALID_OPERATION, kInvalidFragmentInputBinding);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004188 return false;
4189 }
4190
4191 if (binding.type != GL_NONE)
4192 {
4193 GLint expectedComponents = 0;
4194 switch (binding.type)
4195 {
4196 case GL_FLOAT:
4197 expectedComponents = 1;
4198 break;
4199 case GL_FLOAT_VEC2:
4200 expectedComponents = 2;
4201 break;
4202 case GL_FLOAT_VEC3:
4203 expectedComponents = 3;
4204 break;
4205 case GL_FLOAT_VEC4:
4206 expectedComponents = 4;
4207 break;
4208 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004209 context->validationError(GL_INVALID_OPERATION, kFragmentInputTypeNotFloatingPoint);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004210 return false;
4211 }
4212 if (expectedComponents != components && genMode != GL_NONE)
4213 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004214 context->validationError(GL_INVALID_OPERATION, kInvalidPathComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004215 return false;
4216 }
4217 }
4218 return true;
4219}
4220
Geoff Lang97073d12016-04-20 10:42:34 -07004221bool ValidateCopyTextureCHROMIUM(Context *context,
4222 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004223 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004224 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004225 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004226 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004227 GLint internalFormat,
4228 GLenum destType,
4229 GLboolean unpackFlipY,
4230 GLboolean unpackPremultiplyAlpha,
4231 GLboolean unpackUnmultiplyAlpha)
4232{
4233 if (!context->getExtensions().copyTexture)
4234 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004235 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004236 return false;
4237 }
4238
Geoff Lang4f0e0032017-05-01 16:04:35 -04004239 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004240 if (source == nullptr)
4241 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004242 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004243 return false;
4244 }
4245
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004246 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004247 {
Jamie Madille0472f32018-11-27 16:32:45 -05004248 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004249 return false;
4250 }
4251
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004252 TextureType sourceType = source->getType();
4253 ASSERT(sourceType != TextureType::CubeMap);
4254 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004255
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004256 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004257 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004258 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004259 return false;
4260 }
4261
Geoff Lang4f0e0032017-05-01 16:04:35 -04004262 GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
4263 GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
4264 if (sourceWidth == 0 || sourceHeight == 0)
4265 {
Jamie Madille0472f32018-11-27 16:32:45 -05004266 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004267 return false;
4268 }
4269
4270 const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
4271 if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004272 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004273 context->validationError(GL_INVALID_OPERATION, kInvalidSourceTextureInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004274 return false;
4275 }
4276
Geoff Lang63458a32017-10-30 15:16:53 -04004277 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4278 {
Jamie Madille0472f32018-11-27 16:32:45 -05004279 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004280 return false;
4281 }
4282
Geoff Lang4f0e0032017-05-01 16:04:35 -04004283 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004284 if (dest == nullptr)
4285 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004286 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004287 return false;
4288 }
4289
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004290 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004291 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004292 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004293 return false;
4294 }
4295
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004296 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, sourceWidth,
Brandon Jones28783792018-03-05 09:37:32 -08004297 sourceHeight, false))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004298 {
Jamie Madille0472f32018-11-27 16:32:45 -05004299 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004300 return false;
4301 }
4302
Geoff Lang97073d12016-04-20 10:42:34 -07004303 if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
4304 {
Geoff Lang97073d12016-04-20 10:42:34 -07004305 return false;
4306 }
4307
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004308 if (dest->getType() == TextureType::CubeMap && sourceWidth != sourceHeight)
Geoff Lang4f0e0032017-05-01 16:04:35 -04004309 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004310 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004311 return false;
4312 }
4313
Geoff Lang97073d12016-04-20 10:42:34 -07004314 if (dest->getImmutableFormat())
4315 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004316 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang97073d12016-04-20 10:42:34 -07004317 return false;
4318 }
4319
4320 return true;
4321}
4322
4323bool ValidateCopySubTextureCHROMIUM(Context *context,
4324 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004325 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004326 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004327 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004328 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004329 GLint xoffset,
4330 GLint yoffset,
4331 GLint x,
4332 GLint y,
4333 GLsizei width,
4334 GLsizei height,
4335 GLboolean unpackFlipY,
4336 GLboolean unpackPremultiplyAlpha,
4337 GLboolean unpackUnmultiplyAlpha)
4338{
4339 if (!context->getExtensions().copyTexture)
4340 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004341 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004342 return false;
4343 }
4344
Geoff Lang4f0e0032017-05-01 16:04:35 -04004345 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004346 if (source == nullptr)
4347 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004348 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004349 return false;
4350 }
4351
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004352 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004353 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004354 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004355 return false;
4356 }
4357
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004358 TextureType sourceType = source->getType();
4359 ASSERT(sourceType != TextureType::CubeMap);
4360 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004361
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004362 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004363 {
Jamie Madille0472f32018-11-27 16:32:45 -05004364 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004365 return false;
4366 }
4367
4368 if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
4369 source->getHeight(sourceTarget, sourceLevel) == 0)
Geoff Lang97073d12016-04-20 10:42:34 -07004370 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004371 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004372 return false;
4373 }
4374
4375 if (x < 0 || y < 0)
4376 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004377 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004378 return false;
4379 }
4380
4381 if (width < 0 || height < 0)
4382 {
Jamie Madille0472f32018-11-27 16:32:45 -05004383 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Geoff Lang97073d12016-04-20 10:42:34 -07004384 return false;
4385 }
4386
Geoff Lang4f0e0032017-05-01 16:04:35 -04004387 if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
4388 static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004389 {
Jamie Madille0472f32018-11-27 16:32:45 -05004390 context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
Geoff Lang97073d12016-04-20 10:42:34 -07004391 return false;
4392 }
4393
Geoff Lang4f0e0032017-05-01 16:04:35 -04004394 const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
4395 if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004396 {
Jamie Madille0472f32018-11-27 16:32:45 -05004397 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004398 return false;
4399 }
4400
Geoff Lang63458a32017-10-30 15:16:53 -04004401 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4402 {
Jamie Madille0472f32018-11-27 16:32:45 -05004403 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004404 return false;
4405 }
4406
Geoff Lang4f0e0032017-05-01 16:04:35 -04004407 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004408 if (dest == nullptr)
4409 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004410 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004411 return false;
4412 }
4413
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004414 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004415 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004416 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004417 return false;
4418 }
4419
Brandon Jones28783792018-03-05 09:37:32 -08004420 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, width, height,
4421 true))
Geoff Lang97073d12016-04-20 10:42:34 -07004422 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004423 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004424 return false;
4425 }
4426
Geoff Lang4f0e0032017-05-01 16:04:35 -04004427 if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
4428 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004429 context->validationError(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004430 return false;
4431 }
4432
4433 const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
4434 if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004435 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004436 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Lang97073d12016-04-20 10:42:34 -07004437 return false;
4438 }
4439
4440 if (xoffset < 0 || yoffset < 0)
4441 {
Jamie Madille0472f32018-11-27 16:32:45 -05004442 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004443 return false;
4444 }
4445
Geoff Lang4f0e0032017-05-01 16:04:35 -04004446 if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
4447 static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004448 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004449 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
Geoff Lang97073d12016-04-20 10:42:34 -07004450 return false;
4451 }
4452
4453 return true;
4454}
4455
Geoff Lang47110bf2016-04-20 11:13:22 -07004456bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
4457{
4458 if (!context->getExtensions().copyCompressedTexture)
4459 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004460 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang47110bf2016-04-20 11:13:22 -07004461 return false;
4462 }
4463
4464 const gl::Texture *source = context->getTexture(sourceId);
4465 if (source == nullptr)
4466 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004467 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004468 return false;
4469 }
4470
Corentin Wallez99d492c2018-02-27 15:17:10 -05004471 if (source->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004472 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004473 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004474 return false;
4475 }
4476
Corentin Wallez99d492c2018-02-27 15:17:10 -05004477 if (source->getWidth(TextureTarget::_2D, 0) == 0 ||
4478 source->getHeight(TextureTarget::_2D, 0) == 0)
Geoff Lang47110bf2016-04-20 11:13:22 -07004479 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004480 context->validationError(GL_INVALID_VALUE, kSourceTextureLevelZeroDefined);
Geoff Lang47110bf2016-04-20 11:13:22 -07004481 return false;
4482 }
4483
Corentin Wallez99d492c2018-02-27 15:17:10 -05004484 const gl::Format &sourceFormat = source->getFormat(TextureTarget::_2D, 0);
Geoff Lang47110bf2016-04-20 11:13:22 -07004485 if (!sourceFormat.info->compressed)
4486 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004487 context->validationError(GL_INVALID_OPERATION, kSourceTextureMustBeCompressed);
Geoff Lang47110bf2016-04-20 11:13:22 -07004488 return false;
4489 }
4490
4491 const gl::Texture *dest = context->getTexture(destId);
4492 if (dest == nullptr)
4493 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004494 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004495 return false;
4496 }
4497
Corentin Wallez99d492c2018-02-27 15:17:10 -05004498 if (dest->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004499 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004500 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004501 return false;
4502 }
4503
4504 if (dest->getImmutableFormat())
4505 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004506 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang47110bf2016-04-20 11:13:22 -07004507 return false;
4508 }
4509
4510 return true;
4511}
4512
Jiawei Shao385b3e02018-03-21 09:43:28 +08004513bool ValidateCreateShader(Context *context, ShaderType type)
Martin Radev4c4c8e72016-08-04 12:25:34 +03004514{
4515 switch (type)
4516 {
Jiawei Shao385b3e02018-03-21 09:43:28 +08004517 case ShaderType::Vertex:
4518 case ShaderType::Fragment:
Martin Radev4c4c8e72016-08-04 12:25:34 +03004519 break;
Geoff Langeb66a6e2016-10-31 13:06:12 -04004520
Jiawei Shao385b3e02018-03-21 09:43:28 +08004521 case ShaderType::Compute:
Geoff Langeb66a6e2016-10-31 13:06:12 -04004522 if (context->getClientVersion() < Version(3, 1))
Martin Radev4c4c8e72016-08-04 12:25:34 +03004523 {
Jamie Madille0472f32018-11-27 16:32:45 -05004524 context->validationError(GL_INVALID_ENUM, kES31Required);
Geoff Langeb66a6e2016-10-31 13:06:12 -04004525 return false;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004526 }
Geoff Langeb66a6e2016-10-31 13:06:12 -04004527 break;
4528
Jiawei Shao385b3e02018-03-21 09:43:28 +08004529 case ShaderType::Geometry:
Jiawei Shao89be29a2017-11-06 14:36:45 +08004530 if (!context->getExtensions().geometryShader)
4531 {
Jamie Madille0472f32018-11-27 16:32:45 -05004532 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jiawei Shao89be29a2017-11-06 14:36:45 +08004533 return false;
4534 }
4535 break;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004536 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004537 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Martin Radev4c4c8e72016-08-04 12:25:34 +03004538 return false;
4539 }
Jamie Madill29639852016-09-02 15:00:09 -04004540
4541 return true;
4542}
4543
Jamie Madill5b772312018-03-08 20:28:32 -05004544bool ValidateBufferData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004545 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004546 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004547 const void *data,
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004548 BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004549{
4550 if (size < 0)
4551 {
Jamie Madille0472f32018-11-27 16:32:45 -05004552 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madill29639852016-09-02 15:00:09 -04004553 return false;
4554 }
4555
4556 switch (usage)
4557 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004558 case BufferUsage::StreamDraw:
4559 case BufferUsage::StaticDraw:
4560 case BufferUsage::DynamicDraw:
Jamie Madill29639852016-09-02 15:00:09 -04004561 break;
4562
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004563 case BufferUsage::StreamRead:
4564 case BufferUsage::StaticRead:
4565 case BufferUsage::DynamicRead:
4566 case BufferUsage::StreamCopy:
4567 case BufferUsage::StaticCopy:
4568 case BufferUsage::DynamicCopy:
Jamie Madill29639852016-09-02 15:00:09 -04004569 if (context->getClientMajorVersion() < 3)
4570 {
Jamie Madille0472f32018-11-27 16:32:45 -05004571 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004572 return false;
4573 }
4574 break;
4575
4576 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004577 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004578 return false;
4579 }
4580
Corentin Walleze4477002017-12-01 14:39:58 -05004581 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004582 {
Jamie Madille0472f32018-11-27 16:32:45 -05004583 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004584 return false;
4585 }
4586
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004587 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004588
4589 if (!buffer)
4590 {
Jamie Madille0472f32018-11-27 16:32:45 -05004591 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004592 return false;
4593 }
4594
James Darpiniane8a93c62018-01-04 18:02:24 -08004595 if (context->getExtensions().webglCompatibility &&
4596 buffer->isBoundForTransformFeedbackAndOtherUse())
4597 {
Jamie Madille0472f32018-11-27 16:32:45 -05004598 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004599 return false;
4600 }
4601
Jamie Madill29639852016-09-02 15:00:09 -04004602 return true;
4603}
4604
Jamie Madill5b772312018-03-08 20:28:32 -05004605bool ValidateBufferSubData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004606 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004607 GLintptr offset,
4608 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004609 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004610{
Brandon Jones6cad5662017-06-14 13:25:13 -07004611 if (size < 0)
Jamie Madill29639852016-09-02 15:00:09 -04004612 {
Jamie Madille0472f32018-11-27 16:32:45 -05004613 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Brandon Jones6cad5662017-06-14 13:25:13 -07004614 return false;
4615 }
4616
4617 if (offset < 0)
4618 {
Jamie Madille0472f32018-11-27 16:32:45 -05004619 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Jamie Madill29639852016-09-02 15:00:09 -04004620 return false;
4621 }
4622
Corentin Walleze4477002017-12-01 14:39:58 -05004623 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004624 {
Jamie Madille0472f32018-11-27 16:32:45 -05004625 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004626 return false;
4627 }
4628
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004629 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004630
4631 if (!buffer)
4632 {
Jamie Madille0472f32018-11-27 16:32:45 -05004633 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004634 return false;
4635 }
4636
4637 if (buffer->isMapped())
4638 {
Jamie Madille0472f32018-11-27 16:32:45 -05004639 context->validationError(GL_INVALID_OPERATION, kBufferMapped);
Jamie Madill29639852016-09-02 15:00:09 -04004640 return false;
4641 }
4642
James Darpiniane8a93c62018-01-04 18:02:24 -08004643 if (context->getExtensions().webglCompatibility &&
4644 buffer->isBoundForTransformFeedbackAndOtherUse())
4645 {
Jamie Madille0472f32018-11-27 16:32:45 -05004646 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004647 return false;
4648 }
4649
Jamie Madill29639852016-09-02 15:00:09 -04004650 // Check for possible overflow of size + offset
4651 angle::CheckedNumeric<size_t> checkedSize(size);
4652 checkedSize += offset;
4653 if (!checkedSize.IsValid())
4654 {
Jamie Madille0472f32018-11-27 16:32:45 -05004655 context->validationError(GL_INVALID_VALUE, kParamOverflow);
Jamie Madill29639852016-09-02 15:00:09 -04004656 return false;
4657 }
4658
4659 if (size + offset > buffer->getSize())
4660 {
Jamie Madille0472f32018-11-27 16:32:45 -05004661 context->validationError(GL_INVALID_VALUE, kInsufficientBufferSize);
Jamie Madill29639852016-09-02 15:00:09 -04004662 return false;
4663 }
4664
Martin Radev4c4c8e72016-08-04 12:25:34 +03004665 return true;
4666}
4667
Geoff Lang111a99e2017-10-17 10:58:41 -04004668bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
Geoff Langc287ea62016-09-16 14:46:51 -04004669{
Geoff Langc339c4e2016-11-29 10:37:36 -05004670 if (!context->getExtensions().requestExtension)
Geoff Langc287ea62016-09-16 14:46:51 -04004671 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004672 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc287ea62016-09-16 14:46:51 -04004673 return false;
4674 }
4675
Geoff Lang111a99e2017-10-17 10:58:41 -04004676 if (!context->isExtensionRequestable(name))
Geoff Langc287ea62016-09-16 14:46:51 -04004677 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004678 context->validationError(GL_INVALID_OPERATION, kExtensionNotRequestable);
Geoff Langc287ea62016-09-16 14:46:51 -04004679 return false;
4680 }
4681
4682 return true;
4683}
4684
Jamie Madill5b772312018-03-08 20:28:32 -05004685bool ValidateActiveTexture(Context *context, GLenum texture)
Jamie Madillef300b12016-10-07 15:12:09 -04004686{
Lingfeng Yang038dd532018-03-29 17:31:52 -07004687 if (context->getClientMajorVersion() < 2)
4688 {
4689 return ValidateMultitextureUnit(context, texture);
4690 }
4691
Jamie Madillef300b12016-10-07 15:12:09 -04004692 if (texture < GL_TEXTURE0 ||
4693 texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
4694 {
Jamie Madille0472f32018-11-27 16:32:45 -05004695 context->validationError(GL_INVALID_ENUM, kInvalidCombinedImageUnit);
Jamie Madillef300b12016-10-07 15:12:09 -04004696 return false;
4697 }
4698
4699 return true;
4700}
4701
Jamie Madill5b772312018-03-08 20:28:32 -05004702bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillef300b12016-10-07 15:12:09 -04004703{
4704 Program *programObject = GetValidProgram(context, program);
4705 if (!programObject)
4706 {
4707 return false;
4708 }
4709
4710 Shader *shaderObject = GetValidShader(context, shader);
4711 if (!shaderObject)
4712 {
4713 return false;
4714 }
4715
Jiawei Shao385b3e02018-03-21 09:43:28 +08004716 if (programObject->getAttachedShader(shaderObject->getType()))
Jamie Madillef300b12016-10-07 15:12:09 -04004717 {
Jamie Madille0472f32018-11-27 16:32:45 -05004718 context->validationError(GL_INVALID_OPERATION, kShaderAttachmentHasShader);
Jiawei Shao385b3e02018-03-21 09:43:28 +08004719 return false;
Jamie Madillef300b12016-10-07 15:12:09 -04004720 }
4721
4722 return true;
4723}
4724
Jamie Madill5b772312018-03-08 20:28:32 -05004725bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004726{
4727 if (index >= MAX_VERTEX_ATTRIBS)
4728 {
Jamie Madille0472f32018-11-27 16:32:45 -05004729 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004730 return false;
4731 }
4732
4733 if (strncmp(name, "gl_", 3) == 0)
4734 {
Jamie Madille0472f32018-11-27 16:32:45 -05004735 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004736 return false;
4737 }
4738
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004739 if (context->isWebGL())
Geoff Langfc32e8b2017-05-31 14:16:59 -04004740 {
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004741 const size_t length = strlen(name);
4742
4743 if (!IsValidESSLString(name, length))
4744 {
4745 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
4746 // for shader-related entry points
Jamie Madille0472f32018-11-27 16:32:45 -05004747 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004748 return false;
4749 }
4750
4751 if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
4752 {
4753 return false;
4754 }
Geoff Langfc32e8b2017-05-31 14:16:59 -04004755 }
4756
Jamie Madill01a80ee2016-11-07 12:06:18 -05004757 return GetValidProgram(context, program) != nullptr;
4758}
4759
Jamie Madill5b772312018-03-08 20:28:32 -05004760bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004761{
Geoff Lange8afa902017-09-27 15:00:43 -04004762 if (!ValidFramebufferTarget(context, target))
Jamie Madill01a80ee2016-11-07 12:06:18 -05004763 {
Jamie Madille0472f32018-11-27 16:32:45 -05004764 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
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->isFramebufferGenerated(framebuffer))
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 -05004778bool ValidateBindRenderbuffer(Context *context, GLenum target, GLuint renderbuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004779{
4780 if (target != GL_RENDERBUFFER)
4781 {
Jamie Madille0472f32018-11-27 16:32:45 -05004782 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004783 return false;
4784 }
4785
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004786 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004787 !context->isRenderbufferGenerated(renderbuffer))
4788 {
Jamie Madille0472f32018-11-27 16:32:45 -05004789 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004790 return false;
4791 }
4792
4793 return true;
4794}
4795
Jamie Madill5b772312018-03-08 20:28:32 -05004796static bool ValidBlendEquationMode(const Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004797{
4798 switch (mode)
4799 {
4800 case GL_FUNC_ADD:
4801 case GL_FUNC_SUBTRACT:
4802 case GL_FUNC_REVERSE_SUBTRACT:
Geoff Lang50cac572017-09-26 17:37:43 -04004803 return true;
4804
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004805 case GL_MIN:
4806 case GL_MAX:
Geoff Lang50cac572017-09-26 17:37:43 -04004807 return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004808
4809 default:
4810 return false;
4811 }
4812}
4813
Jamie Madill5b772312018-03-08 20:28:32 -05004814bool ValidateBlendColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004815{
4816 return true;
4817}
4818
Jamie Madill5b772312018-03-08 20:28:32 -05004819bool ValidateBlendEquation(Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004820{
Geoff Lang50cac572017-09-26 17:37:43 -04004821 if (!ValidBlendEquationMode(context, mode))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004822 {
Jamie Madille0472f32018-11-27 16:32:45 -05004823 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004824 return false;
4825 }
4826
4827 return true;
4828}
4829
Jamie Madill5b772312018-03-08 20:28:32 -05004830bool ValidateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004831{
Geoff Lang50cac572017-09-26 17:37:43 -04004832 if (!ValidBlendEquationMode(context, modeRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004833 {
Jamie Madille0472f32018-11-27 16:32:45 -05004834 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004835 return false;
4836 }
4837
Geoff Lang50cac572017-09-26 17:37:43 -04004838 if (!ValidBlendEquationMode(context, modeAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004839 {
Jamie Madille0472f32018-11-27 16:32:45 -05004840 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004841 return false;
4842 }
4843
4844 return true;
4845}
4846
Jamie Madill5b772312018-03-08 20:28:32 -05004847bool ValidateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004848{
4849 return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
4850}
4851
Jamie Madill5b772312018-03-08 20:28:32 -05004852bool ValidateBlendFuncSeparate(Context *context,
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004853 GLenum srcRGB,
4854 GLenum dstRGB,
4855 GLenum srcAlpha,
4856 GLenum dstAlpha)
4857{
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004858 if (!ValidSrcBlendFunc(context, srcRGB))
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
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004864 if (!ValidDstBlendFunc(context, dstRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004865 {
Jamie Madille0472f32018-11-27 16:32:45 -05004866 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004867 return false;
4868 }
4869
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004870 if (!ValidSrcBlendFunc(context, srcAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004871 {
Jamie Madille0472f32018-11-27 16:32:45 -05004872 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004873 return false;
4874 }
4875
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004876 if (!ValidDstBlendFunc(context, dstAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004877 {
Jamie Madille0472f32018-11-27 16:32:45 -05004878 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004879 return false;
4880 }
4881
Frank Henigman146e8a12017-03-02 23:22:37 -05004882 if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
4883 context->getExtensions().webglCompatibility)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004884 {
4885 bool constantColorUsed =
4886 (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
4887 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
4888
4889 bool constantAlphaUsed =
4890 (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
4891 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
4892
4893 if (constantColorUsed && constantAlphaUsed)
4894 {
Frank Henigman146e8a12017-03-02 23:22:37 -05004895 if (context->getExtensions().webglCompatibility)
4896 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004897 context->validationError(GL_INVALID_OPERATION, kInvalidConstantColor);
4898 return false;
Frank Henigman146e8a12017-03-02 23:22:37 -05004899 }
Jamie Madillc3e37312018-11-30 15:25:39 -05004900
4901 WARN() << kConstantColorAlphaLimitation;
4902 context->validationError(GL_INVALID_OPERATION, kConstantColorAlphaLimitation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004903 return false;
4904 }
4905 }
4906
4907 return true;
4908}
4909
Geoff Langc339c4e2016-11-29 10:37:36 -05004910bool ValidateGetString(Context *context, GLenum name)
4911{
4912 switch (name)
4913 {
4914 case GL_VENDOR:
4915 case GL_RENDERER:
4916 case GL_VERSION:
4917 case GL_SHADING_LANGUAGE_VERSION:
4918 case GL_EXTENSIONS:
4919 break;
4920
4921 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
4922 if (!context->getExtensions().requestExtension)
4923 {
Jamie Madille0472f32018-11-27 16:32:45 -05004924 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004925 return false;
4926 }
4927 break;
4928
4929 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004930 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004931 return false;
4932 }
4933
4934 return true;
4935}
4936
Jamie Madill5b772312018-03-08 20:28:32 -05004937bool ValidateLineWidth(Context *context, GLfloat width)
Geoff Lang47c48082016-12-07 15:38:13 -05004938{
4939 if (width <= 0.0f || isNaN(width))
4940 {
Jamie Madille0472f32018-11-27 16:32:45 -05004941 context->validationError(GL_INVALID_VALUE, kInvalidWidth);
Geoff Lang47c48082016-12-07 15:38:13 -05004942 return false;
4943 }
4944
4945 return true;
4946}
4947
Jamie Madill5b772312018-03-08 20:28:32 -05004948bool ValidateDepthRangef(Context *context, GLfloat zNear, GLfloat zFar)
Frank Henigman6137ddc2017-02-10 18:55:07 -05004949{
4950 if (context->getExtensions().webglCompatibility && zNear > zFar)
4951 {
Jamie Madille0472f32018-11-27 16:32:45 -05004952 context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
Frank Henigman6137ddc2017-02-10 18:55:07 -05004953 return false;
4954 }
4955
4956 return true;
4957}
4958
Jamie Madill5b772312018-03-08 20:28:32 -05004959bool ValidateRenderbufferStorage(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004960 GLenum target,
4961 GLenum internalformat,
4962 GLsizei width,
4963 GLsizei height)
4964{
4965 return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
4966 height);
4967}
4968
Jamie Madill5b772312018-03-08 20:28:32 -05004969bool ValidateRenderbufferStorageMultisampleANGLE(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004970 GLenum target,
4971 GLsizei samples,
4972 GLenum internalformat,
4973 GLsizei width,
4974 GLsizei height)
4975{
4976 if (!context->getExtensions().framebufferMultisample)
4977 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004978 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madille8fb6402017-02-14 17:56:40 -05004979 return false;
4980 }
4981
4982 // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
Jamie Madill610640f2018-11-21 17:28:41 -05004983 // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_VALUE is
Jamie Madille8fb6402017-02-14 17:56:40 -05004984 // generated.
4985 if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
4986 {
Jamie Madille0472f32018-11-27 16:32:45 -05004987 context->validationError(GL_INVALID_VALUE, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004988 return false;
4989 }
4990
4991 // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
4992 // the specified storage. This is different than ES 3.0 in which a sample number higher
4993 // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
4994 // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
4995 if (context->getClientMajorVersion() >= 3)
4996 {
4997 const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
4998 if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
4999 {
Jamie Madille0472f32018-11-27 16:32:45 -05005000 context->validationError(GL_OUT_OF_MEMORY, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05005001 return false;
5002 }
5003 }
5004
5005 return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
5006 width, height);
5007}
5008
Jamie Madill5b772312018-03-08 20:28:32 -05005009bool ValidateCheckFramebufferStatus(Context *context, GLenum target)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005010{
Geoff Lange8afa902017-09-27 15:00:43 -04005011 if (!ValidFramebufferTarget(context, target))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005012 {
Jamie Madille0472f32018-11-27 16:32:45 -05005013 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005014 return false;
5015 }
5016
5017 return true;
5018}
5019
Jamie Madill5b772312018-03-08 20:28:32 -05005020bool ValidateClearColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005021{
5022 return true;
5023}
5024
Jamie Madill5b772312018-03-08 20:28:32 -05005025bool ValidateClearDepthf(Context *context, GLfloat depth)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005026{
5027 return true;
5028}
5029
Jamie Madill5b772312018-03-08 20:28:32 -05005030bool ValidateClearStencil(Context *context, GLint s)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005031{
5032 return true;
5033}
5034
Jamie Madill5b772312018-03-08 20:28:32 -05005035bool ValidateColorMask(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005036 GLboolean red,
5037 GLboolean green,
5038 GLboolean blue,
5039 GLboolean alpha)
5040{
5041 return true;
5042}
5043
Jamie Madill5b772312018-03-08 20:28:32 -05005044bool ValidateCompileShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005045{
5046 return true;
5047}
5048
Jamie Madill5b772312018-03-08 20:28:32 -05005049bool ValidateCreateProgram(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005050{
5051 return true;
5052}
5053
Jamie Madill5b772312018-03-08 20:28:32 -05005054bool ValidateCullFace(Context *context, CullFaceMode mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005055{
5056 switch (mode)
5057 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04005058 case CullFaceMode::Front:
5059 case CullFaceMode::Back:
5060 case CullFaceMode::FrontAndBack:
Jamie Madillc1d770e2017-04-13 17:31:24 -04005061 break;
5062
5063 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005064 context->validationError(GL_INVALID_ENUM, kInvalidCullMode);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005065 return false;
5066 }
5067
5068 return true;
5069}
5070
Jamie Madill5b772312018-03-08 20:28:32 -05005071bool ValidateDeleteProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005072{
5073 if (program == 0)
5074 {
5075 return false;
5076 }
5077
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005078 if (!context->getProgramResolveLink(program))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005079 {
5080 if (context->getShader(program))
5081 {
Jamie Madille0472f32018-11-27 16:32:45 -05005082 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005083 return false;
5084 }
5085 else
5086 {
Jamie Madille0472f32018-11-27 16:32:45 -05005087 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005088 return false;
5089 }
5090 }
5091
5092 return true;
5093}
5094
Jamie Madill5b772312018-03-08 20:28:32 -05005095bool ValidateDeleteShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005096{
5097 if (shader == 0)
5098 {
5099 return false;
5100 }
5101
5102 if (!context->getShader(shader))
5103 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005104 if (context->getProgramResolveLink(shader))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005105 {
Jamie Madille0472f32018-11-27 16:32:45 -05005106 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005107 return false;
5108 }
5109 else
5110 {
Jamie Madille0472f32018-11-27 16:32:45 -05005111 context->validationError(GL_INVALID_VALUE, kExpectedShaderName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005112 return false;
5113 }
5114 }
5115
5116 return true;
5117}
5118
Jamie Madill5b772312018-03-08 20:28:32 -05005119bool ValidateDepthFunc(Context *context, GLenum func)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005120{
5121 switch (func)
5122 {
5123 case GL_NEVER:
5124 case GL_ALWAYS:
5125 case GL_LESS:
5126 case GL_LEQUAL:
5127 case GL_EQUAL:
5128 case GL_GREATER:
5129 case GL_GEQUAL:
5130 case GL_NOTEQUAL:
5131 break;
5132
5133 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005134 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005135 return false;
5136 }
5137
5138 return true;
5139}
5140
Jamie Madill5b772312018-03-08 20:28:32 -05005141bool ValidateDepthMask(Context *context, GLboolean flag)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005142{
5143 return true;
5144}
5145
Jamie Madill5b772312018-03-08 20:28:32 -05005146bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005147{
5148 Program *programObject = GetValidProgram(context, program);
5149 if (!programObject)
5150 {
5151 return false;
5152 }
5153
5154 Shader *shaderObject = GetValidShader(context, shader);
5155 if (!shaderObject)
5156 {
5157 return false;
5158 }
5159
Jiawei Shao385b3e02018-03-21 09:43:28 +08005160 const Shader *attachedShader = programObject->getAttachedShader(shaderObject->getType());
Jamie Madillc1d770e2017-04-13 17:31:24 -04005161 if (attachedShader != shaderObject)
5162 {
Jamie Madille0472f32018-11-27 16:32:45 -05005163 context->validationError(GL_INVALID_OPERATION, kShaderToDetachMustBeAttached);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005164 return false;
5165 }
5166
5167 return true;
5168}
5169
Jamie Madill5b772312018-03-08 20:28:32 -05005170bool ValidateDisableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005171{
5172 if (index >= MAX_VERTEX_ATTRIBS)
5173 {
Jamie Madille0472f32018-11-27 16:32:45 -05005174 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005175 return false;
5176 }
5177
5178 return true;
5179}
5180
Jamie Madill5b772312018-03-08 20:28:32 -05005181bool ValidateEnableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005182{
5183 if (index >= MAX_VERTEX_ATTRIBS)
5184 {
Jamie Madille0472f32018-11-27 16:32:45 -05005185 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005186 return false;
5187 }
5188
5189 return true;
5190}
5191
Jamie Madill5b772312018-03-08 20:28:32 -05005192bool ValidateFinish(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005193{
5194 return true;
5195}
5196
Jamie Madill5b772312018-03-08 20:28:32 -05005197bool ValidateFlush(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005198{
5199 return true;
5200}
5201
Jamie Madill5b772312018-03-08 20:28:32 -05005202bool ValidateFrontFace(Context *context, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005203{
5204 switch (mode)
5205 {
5206 case GL_CW:
5207 case GL_CCW:
5208 break;
5209 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005210 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005211 return false;
5212 }
5213
5214 return true;
5215}
5216
Jamie Madill5b772312018-03-08 20:28:32 -05005217bool ValidateGetActiveAttrib(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005218 GLuint program,
5219 GLuint index,
5220 GLsizei bufsize,
5221 GLsizei *length,
5222 GLint *size,
5223 GLenum *type,
5224 GLchar *name)
5225{
5226 if (bufsize < 0)
5227 {
Jamie Madille0472f32018-11-27 16:32:45 -05005228 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005229 return false;
5230 }
5231
5232 Program *programObject = GetValidProgram(context, program);
5233
5234 if (!programObject)
5235 {
5236 return false;
5237 }
5238
5239 if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
5240 {
Jamie Madille0472f32018-11-27 16:32:45 -05005241 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005242 return false;
5243 }
5244
5245 return true;
5246}
5247
Jamie Madill5b772312018-03-08 20:28:32 -05005248bool ValidateGetActiveUniform(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005249 GLuint program,
5250 GLuint index,
5251 GLsizei bufsize,
5252 GLsizei *length,
5253 GLint *size,
5254 GLenum *type,
5255 GLchar *name)
5256{
5257 if (bufsize < 0)
5258 {
Jamie Madille0472f32018-11-27 16:32:45 -05005259 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005260 return false;
5261 }
5262
5263 Program *programObject = GetValidProgram(context, program);
5264
5265 if (!programObject)
5266 {
5267 return false;
5268 }
5269
5270 if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
5271 {
Jamie Madille0472f32018-11-27 16:32:45 -05005272 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005273 return false;
5274 }
5275
5276 return true;
5277}
5278
Jamie Madill5b772312018-03-08 20:28:32 -05005279bool ValidateGetAttachedShaders(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005280 GLuint program,
5281 GLsizei maxcount,
5282 GLsizei *count,
5283 GLuint *shaders)
5284{
5285 if (maxcount < 0)
5286 {
Jamie Madille0472f32018-11-27 16:32:45 -05005287 context->validationError(GL_INVALID_VALUE, kNegativeMaxCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005288 return false;
5289 }
5290
5291 Program *programObject = GetValidProgram(context, program);
5292
5293 if (!programObject)
5294 {
5295 return false;
5296 }
5297
5298 return true;
5299}
5300
Jamie Madill5b772312018-03-08 20:28:32 -05005301bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005302{
Geoff Langfc32e8b2017-05-31 14:16:59 -04005303 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5304 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005305 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005306 {
Jamie Madille0472f32018-11-27 16:32:45 -05005307 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005308 return false;
5309 }
5310
Jamie Madillc1d770e2017-04-13 17:31:24 -04005311 Program *programObject = GetValidProgram(context, program);
5312
5313 if (!programObject)
5314 {
Jamie Madille0472f32018-11-27 16:32:45 -05005315 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005316 return false;
5317 }
5318
5319 if (!programObject->isLinked())
5320 {
Jamie Madille0472f32018-11-27 16:32:45 -05005321 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005322 return false;
5323 }
5324
5325 return true;
5326}
5327
Jamie Madill5b772312018-03-08 20:28:32 -05005328bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005329{
5330 GLenum nativeType;
5331 unsigned int numParams = 0;
5332 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5333}
5334
Jamie Madill5b772312018-03-08 20:28:32 -05005335bool ValidateGetError(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005336{
5337 return true;
5338}
5339
Jamie Madill5b772312018-03-08 20:28:32 -05005340bool ValidateGetFloatv(Context *context, GLenum pname, GLfloat *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005341{
5342 GLenum nativeType;
5343 unsigned int numParams = 0;
5344 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5345}
5346
Jamie Madill5b772312018-03-08 20:28:32 -05005347bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005348{
5349 GLenum nativeType;
5350 unsigned int numParams = 0;
5351 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5352}
5353
Jamie Madill5b772312018-03-08 20:28:32 -05005354bool ValidateGetProgramInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005355 GLuint program,
5356 GLsizei bufsize,
5357 GLsizei *length,
5358 GLchar *infolog)
5359{
5360 if (bufsize < 0)
5361 {
Jamie Madille0472f32018-11-27 16:32:45 -05005362 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005363 return false;
5364 }
5365
5366 Program *programObject = GetValidProgram(context, program);
5367 if (!programObject)
5368 {
5369 return false;
5370 }
5371
5372 return true;
5373}
5374
Jamie Madill5b772312018-03-08 20:28:32 -05005375bool ValidateGetShaderInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005376 GLuint shader,
5377 GLsizei bufsize,
5378 GLsizei *length,
5379 GLchar *infolog)
5380{
5381 if (bufsize < 0)
5382 {
Jamie Madille0472f32018-11-27 16:32:45 -05005383 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005384 return false;
5385 }
5386
5387 Shader *shaderObject = GetValidShader(context, shader);
5388 if (!shaderObject)
5389 {
5390 return false;
5391 }
5392
5393 return true;
5394}
5395
Jamie Madill5b772312018-03-08 20:28:32 -05005396bool ValidateGetShaderPrecisionFormat(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005397 GLenum shadertype,
5398 GLenum precisiontype,
5399 GLint *range,
5400 GLint *precision)
5401{
5402 switch (shadertype)
5403 {
5404 case GL_VERTEX_SHADER:
5405 case GL_FRAGMENT_SHADER:
5406 break;
5407 case GL_COMPUTE_SHADER:
Jamie Madillc3e37312018-11-30 15:25:39 -05005408 context->validationError(GL_INVALID_OPERATION, kUnimplementedComputeShaderPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005409 return false;
5410 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005411 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005412 return false;
5413 }
5414
5415 switch (precisiontype)
5416 {
5417 case GL_LOW_FLOAT:
5418 case GL_MEDIUM_FLOAT:
5419 case GL_HIGH_FLOAT:
5420 case GL_LOW_INT:
5421 case GL_MEDIUM_INT:
5422 case GL_HIGH_INT:
5423 break;
5424
5425 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005426 context->validationError(GL_INVALID_ENUM, kInvalidPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005427 return false;
5428 }
5429
5430 return true;
5431}
5432
Jamie Madill5b772312018-03-08 20:28:32 -05005433bool ValidateGetShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005434 GLuint shader,
5435 GLsizei bufsize,
5436 GLsizei *length,
5437 GLchar *source)
5438{
5439 if (bufsize < 0)
5440 {
Jamie Madille0472f32018-11-27 16:32:45 -05005441 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005442 return false;
5443 }
5444
5445 Shader *shaderObject = GetValidShader(context, shader);
5446 if (!shaderObject)
5447 {
5448 return false;
5449 }
5450
5451 return true;
5452}
5453
Jamie Madill5b772312018-03-08 20:28:32 -05005454bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005455{
5456 if (strstr(name, "gl_") == name)
5457 {
5458 return false;
5459 }
5460
Geoff Langfc32e8b2017-05-31 14:16:59 -04005461 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5462 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005463 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005464 {
Jamie Madille0472f32018-11-27 16:32:45 -05005465 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005466 return false;
5467 }
5468
Jamie Madillc1d770e2017-04-13 17:31:24 -04005469 Program *programObject = GetValidProgram(context, program);
5470
5471 if (!programObject)
5472 {
5473 return false;
5474 }
5475
5476 if (!programObject->isLinked())
5477 {
Jamie Madille0472f32018-11-27 16:32:45 -05005478 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005479 return false;
5480 }
5481
5482 return true;
5483}
5484
Jamie Madill5b772312018-03-08 20:28:32 -05005485bool ValidateHint(Context *context, GLenum target, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005486{
5487 switch (mode)
5488 {
5489 case GL_FASTEST:
5490 case GL_NICEST:
5491 case GL_DONT_CARE:
5492 break;
5493
5494 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005495 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005496 return false;
5497 }
5498
5499 switch (target)
5500 {
5501 case GL_GENERATE_MIPMAP_HINT:
5502 break;
5503
Geoff Lange7bd2182017-06-16 16:13:13 -04005504 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
5505 if (context->getClientVersion() < ES_3_0 &&
5506 !context->getExtensions().standardDerivatives)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005507 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005508 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005509 return false;
5510 }
5511 break;
5512
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005513 case GL_PERSPECTIVE_CORRECTION_HINT:
5514 case GL_POINT_SMOOTH_HINT:
5515 case GL_LINE_SMOOTH_HINT:
5516 case GL_FOG_HINT:
5517 if (context->getClientMajorVersion() >= 2)
5518 {
Jamie Madille0472f32018-11-27 16:32:45 -05005519 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005520 return false;
5521 }
5522 break;
5523
Jamie Madillc1d770e2017-04-13 17:31:24 -04005524 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005525 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005526 return false;
5527 }
5528
5529 return true;
5530}
5531
Jamie Madill5b772312018-03-08 20:28:32 -05005532bool ValidateIsBuffer(Context *context, GLuint buffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005533{
5534 return true;
5535}
5536
Jamie Madill5b772312018-03-08 20:28:32 -05005537bool ValidateIsFramebuffer(Context *context, GLuint framebuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005538{
5539 return true;
5540}
5541
Jamie Madill5b772312018-03-08 20:28:32 -05005542bool ValidateIsProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005543{
5544 return true;
5545}
5546
Jamie Madill5b772312018-03-08 20:28:32 -05005547bool ValidateIsRenderbuffer(Context *context, GLuint renderbuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005548{
5549 return true;
5550}
5551
Jamie Madill5b772312018-03-08 20:28:32 -05005552bool ValidateIsShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005553{
5554 return true;
5555}
5556
Jamie Madill5b772312018-03-08 20:28:32 -05005557bool ValidateIsTexture(Context *context, GLuint texture)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005558{
5559 return true;
5560}
5561
Jamie Madill5b772312018-03-08 20:28:32 -05005562bool ValidatePixelStorei(Context *context, GLenum pname, GLint param)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005563{
5564 if (context->getClientMajorVersion() < 3)
5565 {
5566 switch (pname)
5567 {
5568 case GL_UNPACK_IMAGE_HEIGHT:
5569 case GL_UNPACK_SKIP_IMAGES:
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 case GL_UNPACK_ROW_LENGTH:
5574 case GL_UNPACK_SKIP_ROWS:
5575 case GL_UNPACK_SKIP_PIXELS:
5576 if (!context->getExtensions().unpackSubimage)
5577 {
Jamie Madille0472f32018-11-27 16:32:45 -05005578 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005579 return false;
5580 }
5581 break;
5582
5583 case GL_PACK_ROW_LENGTH:
5584 case GL_PACK_SKIP_ROWS:
5585 case GL_PACK_SKIP_PIXELS:
5586 if (!context->getExtensions().packSubimage)
5587 {
Jamie Madille0472f32018-11-27 16:32:45 -05005588 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005589 return false;
5590 }
5591 break;
5592 }
5593 }
5594
5595 if (param < 0)
5596 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005597 context->validationError(GL_INVALID_VALUE, kNegativeParam);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005598 return false;
5599 }
5600
5601 switch (pname)
5602 {
5603 case GL_UNPACK_ALIGNMENT:
5604 if (param != 1 && param != 2 && param != 4 && param != 8)
5605 {
Jamie Madille0472f32018-11-27 16:32:45 -05005606 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005607 return false;
5608 }
5609 break;
5610
5611 case GL_PACK_ALIGNMENT:
5612 if (param != 1 && param != 2 && param != 4 && param != 8)
5613 {
Jamie Madille0472f32018-11-27 16:32:45 -05005614 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005615 return false;
5616 }
5617 break;
5618
5619 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Geoff Lang000dab82017-09-27 14:27:07 -04005620 if (!context->getExtensions().packReverseRowOrder)
5621 {
Jamie Madille0472f32018-11-27 16:32:45 -05005622 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang000dab82017-09-27 14:27:07 -04005623 }
5624 break;
5625
Jamie Madillc1d770e2017-04-13 17:31:24 -04005626 case GL_UNPACK_ROW_LENGTH:
5627 case GL_UNPACK_IMAGE_HEIGHT:
5628 case GL_UNPACK_SKIP_IMAGES:
5629 case GL_UNPACK_SKIP_ROWS:
5630 case GL_UNPACK_SKIP_PIXELS:
5631 case GL_PACK_ROW_LENGTH:
5632 case GL_PACK_SKIP_ROWS:
5633 case GL_PACK_SKIP_PIXELS:
5634 break;
5635
5636 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005637 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005638 return false;
5639 }
5640
5641 return true;
5642}
5643
Jamie Madill5b772312018-03-08 20:28:32 -05005644bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005645{
5646 return true;
5647}
5648
Jamie Madill5b772312018-03-08 20:28:32 -05005649bool ValidateReleaseShaderCompiler(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005650{
5651 return true;
5652}
5653
Jamie Madill5b772312018-03-08 20:28:32 -05005654bool ValidateSampleCoverage(Context *context, GLfloat value, GLboolean invert)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005655{
5656 return true;
5657}
5658
Jamie Madill5b772312018-03-08 20:28:32 -05005659bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005660{
5661 if (width < 0 || height < 0)
5662 {
Jamie Madille0472f32018-11-27 16:32:45 -05005663 context->validationError(GL_INVALID_VALUE, kNegativeSize);
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 ValidateShaderBinary(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005671 GLsizei n,
5672 const GLuint *shaders,
5673 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005674 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005675 GLsizei length)
5676{
5677 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
5678 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
5679 shaderBinaryFormats.end())
5680 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005681 context->validationError(GL_INVALID_ENUM, kInvalidShaderBinaryFormat);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005682 return false;
5683 }
5684
5685 return true;
5686}
5687
Jamie Madill5b772312018-03-08 20:28:32 -05005688bool ValidateShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005689 GLuint shader,
5690 GLsizei count,
5691 const GLchar *const *string,
5692 const GLint *length)
5693{
5694 if (count < 0)
5695 {
Jamie Madille0472f32018-11-27 16:32:45 -05005696 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005697 return false;
5698 }
5699
Geoff Langfc32e8b2017-05-31 14:16:59 -04005700 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5701 // shader-related entry points
5702 if (context->getExtensions().webglCompatibility)
5703 {
5704 for (GLsizei i = 0; i < count; i++)
5705 {
Geoff Langcab92ee2017-07-19 17:32:07 -04005706 size_t len =
5707 (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
Geoff Langa71a98e2017-06-19 15:15:00 -04005708
5709 // Backslash as line-continuation is allowed in WebGL 2.0.
Geoff Langcab92ee2017-07-19 17:32:07 -04005710 if (!IsValidESSLShaderSourceString(string[i], len,
5711 context->getClientVersion() >= ES_3_0))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005712 {
Jamie Madille0472f32018-11-27 16:32:45 -05005713 context->validationError(GL_INVALID_VALUE, kShaderSourceInvalidCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005714 return false;
5715 }
5716 }
5717 }
5718
Jamie Madillc1d770e2017-04-13 17:31:24 -04005719 Shader *shaderObject = GetValidShader(context, shader);
5720 if (!shaderObject)
5721 {
5722 return false;
5723 }
5724
5725 return true;
5726}
5727
Jamie Madill5b772312018-03-08 20:28:32 -05005728bool ValidateStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005729{
5730 if (!IsValidStencilFunc(func))
5731 {
Jamie Madille0472f32018-11-27 16:32:45 -05005732 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005733 return false;
5734 }
5735
5736 return true;
5737}
5738
Jamie Madill5b772312018-03-08 20:28:32 -05005739bool ValidateStencilFuncSeparate(Context *context, GLenum face, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005740{
5741 if (!IsValidStencilFace(face))
5742 {
Jamie Madille0472f32018-11-27 16:32:45 -05005743 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005744 return false;
5745 }
5746
5747 if (!IsValidStencilFunc(func))
5748 {
Jamie Madille0472f32018-11-27 16:32:45 -05005749 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005750 return false;
5751 }
5752
5753 return true;
5754}
5755
Jamie Madill5b772312018-03-08 20:28:32 -05005756bool ValidateStencilMask(Context *context, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005757{
5758 return true;
5759}
5760
Jamie Madill5b772312018-03-08 20:28:32 -05005761bool ValidateStencilMaskSeparate(Context *context, GLenum face, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005762{
5763 if (!IsValidStencilFace(face))
5764 {
Jamie Madille0472f32018-11-27 16:32:45 -05005765 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005766 return false;
5767 }
5768
5769 return true;
5770}
5771
Jamie Madill5b772312018-03-08 20:28:32 -05005772bool ValidateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005773{
5774 if (!IsValidStencilOp(fail))
5775 {
Jamie Madille0472f32018-11-27 16:32:45 -05005776 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005777 return false;
5778 }
5779
5780 if (!IsValidStencilOp(zfail))
5781 {
Jamie Madille0472f32018-11-27 16:32:45 -05005782 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005783 return false;
5784 }
5785
5786 if (!IsValidStencilOp(zpass))
5787 {
Jamie Madille0472f32018-11-27 16:32:45 -05005788 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005789 return false;
5790 }
5791
5792 return true;
5793}
5794
Jamie Madill5b772312018-03-08 20:28:32 -05005795bool ValidateStencilOpSeparate(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005796 GLenum face,
5797 GLenum fail,
5798 GLenum zfail,
5799 GLenum zpass)
5800{
5801 if (!IsValidStencilFace(face))
5802 {
Jamie Madille0472f32018-11-27 16:32:45 -05005803 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005804 return false;
5805 }
5806
5807 return ValidateStencilOp(context, fail, zfail, zpass);
5808}
5809
Jamie Madill5b772312018-03-08 20:28:32 -05005810bool ValidateUniform1f(Context *context, GLint location, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005811{
5812 return ValidateUniform(context, GL_FLOAT, location, 1);
5813}
5814
Jamie Madill5b772312018-03-08 20:28:32 -05005815bool ValidateUniform1fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005816{
5817 return ValidateUniform(context, GL_FLOAT, location, count);
5818}
5819
Jamie Madill5b772312018-03-08 20:28:32 -05005820bool ValidateUniform1i(Context *context, GLint location, GLint x)
Jamie Madillbe849e42017-05-02 15:49:00 -04005821{
5822 return ValidateUniform1iv(context, location, 1, &x);
5823}
5824
Jamie Madill5b772312018-03-08 20:28:32 -05005825bool ValidateUniform2fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005826{
5827 return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
5828}
5829
Jamie Madill5b772312018-03-08 20:28:32 -05005830bool ValidateUniform2i(Context *context, GLint location, GLint x, GLint y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005831{
5832 return ValidateUniform(context, GL_INT_VEC2, location, 1);
5833}
5834
Jamie Madill5b772312018-03-08 20:28:32 -05005835bool ValidateUniform2iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005836{
5837 return ValidateUniform(context, GL_INT_VEC2, location, count);
5838}
5839
Jamie Madill5b772312018-03-08 20:28:32 -05005840bool ValidateUniform3f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005841{
5842 return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
5843}
5844
Jamie Madill5b772312018-03-08 20:28:32 -05005845bool ValidateUniform3fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005846{
5847 return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
5848}
5849
Jamie Madill5b772312018-03-08 20:28:32 -05005850bool ValidateUniform3i(Context *context, GLint location, GLint x, GLint y, GLint z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005851{
5852 return ValidateUniform(context, GL_INT_VEC3, location, 1);
5853}
5854
Jamie Madill5b772312018-03-08 20:28:32 -05005855bool ValidateUniform3iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005856{
5857 return ValidateUniform(context, GL_INT_VEC3, location, count);
5858}
5859
Jamie Madill5b772312018-03-08 20:28:32 -05005860bool ValidateUniform4f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005861{
5862 return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
5863}
5864
Jamie Madill5b772312018-03-08 20:28:32 -05005865bool ValidateUniform4fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005866{
5867 return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
5868}
5869
Jamie Madill5b772312018-03-08 20:28:32 -05005870bool ValidateUniform4i(Context *context, GLint location, GLint x, GLint y, GLint z, GLint w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005871{
5872 return ValidateUniform(context, GL_INT_VEC4, location, 1);
5873}
5874
Jamie Madill5b772312018-03-08 20:28:32 -05005875bool ValidateUniform4iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005876{
5877 return ValidateUniform(context, GL_INT_VEC4, location, count);
5878}
5879
Jamie Madill5b772312018-03-08 20:28:32 -05005880bool ValidateUniformMatrix2fv(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_MAT2, location, count, transpose);
5887}
5888
Jamie Madill5b772312018-03-08 20:28:32 -05005889bool ValidateUniformMatrix3fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005890 GLint location,
5891 GLsizei count,
5892 GLboolean transpose,
5893 const GLfloat *value)
5894{
5895 return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
5896}
5897
Jamie Madill5b772312018-03-08 20:28:32 -05005898bool ValidateUniformMatrix4fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005899 GLint location,
5900 GLsizei count,
5901 GLboolean transpose,
5902 const GLfloat *value)
5903{
5904 return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
5905}
5906
Jamie Madill5b772312018-03-08 20:28:32 -05005907bool ValidateValidateProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005908{
5909 Program *programObject = GetValidProgram(context, program);
5910
5911 if (!programObject)
5912 {
5913 return false;
5914 }
5915
5916 return true;
5917}
5918
Jamie Madill5b772312018-03-08 20:28:32 -05005919bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005920{
5921 return ValidateVertexAttribIndex(context, index);
5922}
5923
Jamie Madill5b772312018-03-08 20:28:32 -05005924bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005925{
5926 return ValidateVertexAttribIndex(context, index);
5927}
5928
Jamie Madill5b772312018-03-08 20:28:32 -05005929bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005930{
5931 return ValidateVertexAttribIndex(context, index);
5932}
5933
Jamie Madill5b772312018-03-08 20:28:32 -05005934bool ValidateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005935{
5936 return ValidateVertexAttribIndex(context, index);
5937}
5938
Jamie Madill5b772312018-03-08 20:28:32 -05005939bool ValidateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005940{
5941 return ValidateVertexAttribIndex(context, index);
5942}
5943
Jamie Madill5b772312018-03-08 20:28:32 -05005944bool ValidateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005945{
5946 return ValidateVertexAttribIndex(context, index);
5947}
5948
Jamie Madill5b772312018-03-08 20:28:32 -05005949bool ValidateVertexAttrib4f(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005950 GLuint index,
5951 GLfloat x,
5952 GLfloat y,
5953 GLfloat z,
5954 GLfloat w)
5955{
5956 return ValidateVertexAttribIndex(context, index);
5957}
5958
Jamie Madill5b772312018-03-08 20:28:32 -05005959bool ValidateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005960{
5961 return ValidateVertexAttribIndex(context, index);
5962}
5963
Jamie Madill5b772312018-03-08 20:28:32 -05005964bool ValidateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005965{
5966 if (width < 0 || height < 0)
5967 {
Jamie Madille0472f32018-11-27 16:32:45 -05005968 context->validationError(GL_INVALID_VALUE, kViewportNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005969 return false;
5970 }
5971
5972 return true;
5973}
5974
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08005975bool ValidateGetFramebufferAttachmentParameteriv(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04005976 GLenum target,
5977 GLenum attachment,
5978 GLenum pname,
5979 GLint *params)
5980{
5981 return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
5982 nullptr);
5983}
5984
Jamie Madill5b772312018-03-08 20:28:32 -05005985bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04005986{
5987 return ValidateGetProgramivBase(context, program, pname, nullptr);
5988}
5989
Jamie Madill5b772312018-03-08 20:28:32 -05005990bool ValidateCopyTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005991 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005992 GLint level,
5993 GLenum internalformat,
5994 GLint x,
5995 GLint y,
5996 GLsizei width,
5997 GLsizei height,
5998 GLint border)
5999{
6000 if (context->getClientMajorVersion() < 3)
6001 {
6002 return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
6003 0, x, y, width, height, border);
6004 }
6005
6006 ASSERT(context->getClientMajorVersion() == 3);
6007 return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
6008 0, x, y, width, height, border);
6009}
6010
6011bool ValidateCopyTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006012 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006013 GLint level,
6014 GLint xoffset,
6015 GLint yoffset,
6016 GLint x,
6017 GLint y,
6018 GLsizei width,
6019 GLsizei height)
6020{
6021 if (context->getClientMajorVersion() < 3)
6022 {
6023 return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
6024 yoffset, x, y, width, height, 0);
6025 }
6026
6027 return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
6028 yoffset, 0, x, y, width, height, 0);
6029}
6030
6031bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
6032{
6033 return ValidateGenOrDelete(context, n);
6034}
6035
6036bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
6037{
6038 return ValidateGenOrDelete(context, n);
6039}
6040
6041bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
6042{
6043 return ValidateGenOrDelete(context, n);
6044}
6045
6046bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
6047{
6048 return ValidateGenOrDelete(context, n);
6049}
6050
6051bool ValidateDisable(Context *context, GLenum cap)
6052{
6053 if (!ValidCap(context, cap, false))
6054 {
Jamie Madille0472f32018-11-27 16:32:45 -05006055 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006056 return false;
6057 }
6058
6059 return true;
6060}
6061
6062bool ValidateEnable(Context *context, GLenum cap)
6063{
6064 if (!ValidCap(context, cap, false))
6065 {
Jamie Madille0472f32018-11-27 16:32:45 -05006066 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006067 return false;
6068 }
6069
6070 if (context->getLimitations().noSampleAlphaToCoverageSupport &&
6071 cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
6072 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006073 context->validationError(GL_INVALID_OPERATION, kNoSampleAlphaToCoveragesLimitation);
Jamie Madillbe849e42017-05-02 15:49:00 -04006074
6075 // We also output an error message to the debugger window if tracing is active, so that
6076 // developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006077 ERR() << kNoSampleAlphaToCoveragesLimitation;
Jamie Madillbe849e42017-05-02 15:49:00 -04006078 return false;
6079 }
6080
6081 return true;
6082}
6083
6084bool ValidateFramebufferRenderbuffer(Context *context,
6085 GLenum target,
6086 GLenum attachment,
6087 GLenum renderbuffertarget,
6088 GLuint renderbuffer)
6089{
Geoff Lange8afa902017-09-27 15:00:43 -04006090 if (!ValidFramebufferTarget(context, target))
Jamie Madillbe849e42017-05-02 15:49:00 -04006091 {
Jamie Madille0472f32018-11-27 16:32:45 -05006092 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Brandon Jones6cad5662017-06-14 13:25:13 -07006093 return false;
6094 }
6095
6096 if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
6097 {
Jamie Madille0472f32018-11-27 16:32:45 -05006098 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006099 return false;
6100 }
6101
6102 return ValidateFramebufferRenderbufferParameters(context, target, attachment,
6103 renderbuffertarget, renderbuffer);
6104}
6105
6106bool ValidateFramebufferTexture2D(Context *context,
6107 GLenum target,
6108 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006109 TextureTarget textarget,
Jamie Madillbe849e42017-05-02 15:49:00 -04006110 GLuint texture,
6111 GLint level)
6112{
6113 // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
6114 // extension
6115 if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
6116 level != 0)
6117 {
Jamie Madille0472f32018-11-27 16:32:45 -05006118 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006119 return false;
6120 }
6121
6122 if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
6123 {
6124 return false;
6125 }
6126
6127 if (texture != 0)
6128 {
6129 gl::Texture *tex = context->getTexture(texture);
6130 ASSERT(tex);
6131
6132 const gl::Caps &caps = context->getCaps();
6133
6134 switch (textarget)
6135 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006136 case TextureTarget::_2D:
Jamie Madillbe849e42017-05-02 15:49:00 -04006137 {
6138 if (level > gl::log2(caps.max2DTextureSize))
6139 {
Jamie Madille0472f32018-11-27 16:32:45 -05006140 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006141 return false;
6142 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006143 if (tex->getType() != TextureType::_2D)
Jamie Madillbe849e42017-05-02 15:49:00 -04006144 {
Jamie Madille0472f32018-11-27 16:32:45 -05006145 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006146 return false;
6147 }
6148 }
6149 break;
6150
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006151 case TextureTarget::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006152 {
6153 if (level != 0)
6154 {
Jamie Madille0472f32018-11-27 16:32:45 -05006155 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006156 return false;
6157 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006158 if (tex->getType() != TextureType::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006159 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006160 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006161 return false;
6162 }
6163 }
6164 break;
6165
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006166 case TextureTarget::CubeMapNegativeX:
6167 case TextureTarget::CubeMapNegativeY:
6168 case TextureTarget::CubeMapNegativeZ:
6169 case TextureTarget::CubeMapPositiveX:
6170 case TextureTarget::CubeMapPositiveY:
6171 case TextureTarget::CubeMapPositiveZ:
Jamie Madillbe849e42017-05-02 15:49:00 -04006172 {
6173 if (level > gl::log2(caps.maxCubeMapTextureSize))
6174 {
Jamie Madille0472f32018-11-27 16:32:45 -05006175 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006176 return false;
6177 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006178 if (tex->getType() != TextureType::CubeMap)
Jamie Madillbe849e42017-05-02 15:49:00 -04006179 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006180 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006181 return false;
6182 }
6183 }
6184 break;
6185
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006186 case TextureTarget::_2DMultisample:
Jamie Madillbe849e42017-05-02 15:49:00 -04006187 {
Yizhou Jiang7818a852018-09-06 15:02:04 +08006188 if (context->getClientVersion() < ES_3_1 &&
6189 !context->getExtensions().textureMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006190 {
Jamie Madill610640f2018-11-21 17:28:41 -05006191 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05006192 kMultisampleTextureExtensionOrES31Required);
Jamie Madillbe849e42017-05-02 15:49:00 -04006193 return false;
6194 }
6195
6196 if (level != 0)
6197 {
Jamie Madille0472f32018-11-27 16:32:45 -05006198 context->validationError(GL_INVALID_VALUE, kLevelNotZero);
Jamie Madillbe849e42017-05-02 15:49:00 -04006199 return false;
6200 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006201 if (tex->getType() != TextureType::_2DMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006202 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006203 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006204 return false;
6205 }
6206 }
6207 break;
6208
6209 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006210 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006211 return false;
6212 }
Jamie Madillbe849e42017-05-02 15:49:00 -04006213 }
6214
6215 return true;
6216}
6217
6218bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
6219{
6220 return ValidateGenOrDelete(context, n);
6221}
6222
6223bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
6224{
6225 return ValidateGenOrDelete(context, n);
6226}
6227
6228bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
6229{
6230 return ValidateGenOrDelete(context, n);
6231}
6232
6233bool ValidateGenTextures(Context *context, GLint n, GLuint *)
6234{
6235 return ValidateGenOrDelete(context, n);
6236}
6237
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006238bool ValidateGenerateMipmap(Context *context, TextureType target)
Jamie Madillbe849e42017-05-02 15:49:00 -04006239{
6240 if (!ValidTextureTarget(context, target))
6241 {
Jamie Madille0472f32018-11-27 16:32:45 -05006242 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006243 return false;
6244 }
6245
Jamie Madillcfc73cc2019-04-08 16:26:51 -04006246 Texture *texture = context->getTextureByType(target);
Jamie Madillbe849e42017-05-02 15:49:00 -04006247
6248 if (texture == nullptr)
6249 {
Jamie Madille0472f32018-11-27 16:32:45 -05006250 context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
Jamie Madillbe849e42017-05-02 15:49:00 -04006251 return false;
6252 }
6253
6254 const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
6255
6256 // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
6257 // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
6258 if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6259 {
Jamie Madille0472f32018-11-27 16:32:45 -05006260 context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
Jamie Madillbe849e42017-05-02 15:49:00 -04006261 return false;
6262 }
6263
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006264 TextureTarget baseTarget = (target == TextureType::CubeMap)
6265 ? TextureTarget::CubeMapPositiveX
6266 : NonCubeTextureTypeToTarget(target);
Geoff Lang536eca12017-09-13 11:23:35 -04006267 const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
6268 if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
6269 format.stencilBits > 0)
Brandon Jones6cad5662017-06-14 13:25:13 -07006270 {
Jamie Madille0472f32018-11-27 16:32:45 -05006271 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Brandon Jones6cad5662017-06-14 13:25:13 -07006272 return false;
6273 }
6274
Geoff Lang536eca12017-09-13 11:23:35 -04006275 // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
6276 bool formatUnsized = !format.sized;
6277 bool formatColorRenderableAndFilterable =
6278 format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
Yuly Novikovf15f8862018-06-04 18:59:41 -04006279 format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
Geoff Lang536eca12017-09-13 11:23:35 -04006280 if (!formatUnsized && !formatColorRenderableAndFilterable)
Jamie Madillbe849e42017-05-02 15:49:00 -04006281 {
Jamie Madille0472f32018-11-27 16:32:45 -05006282 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006283 return false;
6284 }
6285
Geoff Lang536eca12017-09-13 11:23:35 -04006286 // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
6287 // generation
6288 if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
6289 {
Jamie Madille0472f32018-11-27 16:32:45 -05006290 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Geoff Lang536eca12017-09-13 11:23:35 -04006291 return false;
6292 }
6293
Jiange2c00842018-07-13 16:50:49 +08006294 // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
6295 // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
6296 if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
Jamie Madillbe849e42017-05-02 15:49:00 -04006297 {
Jamie Madille0472f32018-11-27 16:32:45 -05006298 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006299 return false;
6300 }
6301
6302 // Non-power of 2 ES2 check
6303 if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
6304 (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
6305 !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
6306 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006307 ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
6308 target == TextureType::CubeMap);
Jamie Madille0472f32018-11-27 16:32:45 -05006309 context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
Jamie Madillbe849e42017-05-02 15:49:00 -04006310 return false;
6311 }
6312
6313 // Cube completeness check
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006314 if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
Jamie Madillbe849e42017-05-02 15:49:00 -04006315 {
Jamie Madille0472f32018-11-27 16:32:45 -05006316 context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
Jamie Madillbe849e42017-05-02 15:49:00 -04006317 return false;
6318 }
6319
James Darpinian83b2f0e2018-11-27 15:56:01 -08006320 if (context->getExtensions().webglCompatibility &&
6321 (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
6322 texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
6323 {
6324 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
6325 return false;
6326 }
6327
Jamie Madillbe849e42017-05-02 15:49:00 -04006328 return true;
6329}
6330
Jamie Madill5b772312018-03-08 20:28:32 -05006331bool ValidateGetBufferParameteriv(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04006332 BufferBinding target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006333 GLenum pname,
6334 GLint *params)
6335{
6336 return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
6337}
6338
6339bool ValidateGetRenderbufferParameteriv(Context *context,
6340 GLenum target,
6341 GLenum pname,
6342 GLint *params)
6343{
6344 return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
6345}
6346
6347bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
6348{
6349 return ValidateGetShaderivBase(context, shader, pname, nullptr);
6350}
6351
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006352bool ValidateGetTexParameterfv(Context *context, TextureType target, GLenum pname, GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006353{
6354 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6355}
6356
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006357bool ValidateGetTexParameteriv(Context *context, TextureType target, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006358{
6359 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6360}
6361
Till Rathmannb8543632018-10-02 19:46:14 +02006362bool ValidateGetTexParameterIivOES(Context *context,
6363 TextureType target,
6364 GLenum pname,
6365 GLint *params)
6366{
6367 if (context->getClientMajorVersion() < 3)
6368 {
Jamie Madille0472f32018-11-27 16:32:45 -05006369 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006370 return false;
6371 }
6372 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6373}
6374
6375bool ValidateGetTexParameterIuivOES(Context *context,
6376 TextureType target,
6377 GLenum pname,
6378 GLuint *params)
6379{
6380 if (context->getClientMajorVersion() < 3)
6381 {
Jamie Madille0472f32018-11-27 16:32:45 -05006382 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006383 return false;
6384 }
6385 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6386}
6387
Jamie Madillbe849e42017-05-02 15:49:00 -04006388bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
6389{
6390 return ValidateGetUniformBase(context, program, location);
6391}
6392
6393bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
6394{
6395 return ValidateGetUniformBase(context, program, location);
6396}
6397
6398bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
6399{
6400 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6401}
6402
6403bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
6404{
6405 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6406}
6407
6408bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
6409{
6410 return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
6411}
6412
6413bool ValidateIsEnabled(Context *context, GLenum cap)
6414{
6415 if (!ValidCap(context, cap, true))
6416 {
Jamie Madille0472f32018-11-27 16:32:45 -05006417 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006418 return false;
6419 }
6420
6421 return true;
6422}
6423
6424bool ValidateLinkProgram(Context *context, GLuint program)
6425{
6426 if (context->hasActiveTransformFeedback(program))
6427 {
6428 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006429 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackActiveDuringLink);
Jamie Madillbe849e42017-05-02 15:49:00 -04006430 return false;
6431 }
6432
6433 Program *programObject = GetValidProgram(context, program);
6434 if (!programObject)
6435 {
6436 return false;
6437 }
6438
6439 return true;
6440}
6441
Jamie Madill4928b7c2017-06-20 12:57:39 -04006442bool ValidateReadPixels(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006443 GLint x,
6444 GLint y,
6445 GLsizei width,
6446 GLsizei height,
6447 GLenum format,
6448 GLenum type,
6449 void *pixels)
6450{
6451 return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
6452 nullptr, pixels);
6453}
6454
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006455bool ValidateTexParameterf(Context *context, TextureType target, GLenum pname, GLfloat param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006456{
Till Rathmannb8543632018-10-02 19:46:14 +02006457 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006458}
6459
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006460bool ValidateTexParameterfv(Context *context,
6461 TextureType target,
6462 GLenum pname,
6463 const GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006464{
Till Rathmannb8543632018-10-02 19:46:14 +02006465 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006466}
6467
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006468bool ValidateTexParameteri(Context *context, TextureType target, GLenum pname, GLint param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006469{
Till Rathmannb8543632018-10-02 19:46:14 +02006470 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006471}
6472
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006473bool ValidateTexParameteriv(Context *context, TextureType target, GLenum pname, const GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006474{
Till Rathmannb8543632018-10-02 19:46:14 +02006475 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6476}
6477
6478bool ValidateTexParameterIivOES(Context *context,
6479 TextureType target,
6480 GLenum pname,
6481 const GLint *params)
6482{
6483 if (context->getClientMajorVersion() < 3)
6484 {
Jamie Madille0472f32018-11-27 16:32:45 -05006485 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006486 return false;
6487 }
6488 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6489}
6490
6491bool ValidateTexParameterIuivOES(Context *context,
6492 TextureType target,
6493 GLenum pname,
6494 const GLuint *params)
6495{
6496 if (context->getClientMajorVersion() < 3)
6497 {
Jamie Madille0472f32018-11-27 16:32:45 -05006498 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006499 return false;
6500 }
6501 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006502}
6503
6504bool ValidateUseProgram(Context *context, GLuint program)
6505{
6506 if (program != 0)
6507 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006508 Program *programObject = context->getProgramResolveLink(program);
Jamie Madillbe849e42017-05-02 15:49:00 -04006509 if (!programObject)
6510 {
6511 // ES 3.1.0 section 7.3 page 72
6512 if (context->getShader(program))
6513 {
Jamie Madille0472f32018-11-27 16:32:45 -05006514 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006515 return false;
6516 }
6517 else
6518 {
Jamie Madille0472f32018-11-27 16:32:45 -05006519 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006520 return false;
6521 }
6522 }
6523 if (!programObject->isLinked())
6524 {
Jamie Madille0472f32018-11-27 16:32:45 -05006525 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillbe849e42017-05-02 15:49:00 -04006526 return false;
6527 }
6528 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006529 if (context->getState().isTransformFeedbackActiveUnpaused())
Jamie Madillbe849e42017-05-02 15:49:00 -04006530 {
6531 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006532 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackUseProgram);
Jamie Madillbe849e42017-05-02 15:49:00 -04006533 return false;
6534 }
6535
6536 return true;
6537}
6538
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006539bool ValidateDeleteFencesNV(Context *context, GLsizei n, const GLuint *fences)
6540{
6541 if (!context->getExtensions().fence)
6542 {
Jamie Madille0472f32018-11-27 16:32:45 -05006543 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006544 return false;
6545 }
6546
6547 if (n < 0)
6548 {
Jamie Madille0472f32018-11-27 16:32:45 -05006549 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006550 return false;
6551 }
6552
6553 return true;
6554}
6555
6556bool ValidateFinishFenceNV(Context *context, GLuint fence)
6557{
6558 if (!context->getExtensions().fence)
6559 {
Jamie Madille0472f32018-11-27 16:32:45 -05006560 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006561 return false;
6562 }
6563
6564 FenceNV *fenceObject = context->getFenceNV(fence);
6565
6566 if (fenceObject == nullptr)
6567 {
Jamie Madille0472f32018-11-27 16:32:45 -05006568 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006569 return false;
6570 }
6571
6572 if (!fenceObject->isSet())
6573 {
Jamie Madille0472f32018-11-27 16:32:45 -05006574 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006575 return false;
6576 }
6577
6578 return true;
6579}
6580
6581bool ValidateGenFencesNV(Context *context, GLsizei n, GLuint *fences)
6582{
6583 if (!context->getExtensions().fence)
6584 {
Jamie Madille0472f32018-11-27 16:32:45 -05006585 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006586 return false;
6587 }
6588
6589 if (n < 0)
6590 {
Jamie Madille0472f32018-11-27 16:32:45 -05006591 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006592 return false;
6593 }
6594
6595 return true;
6596}
6597
6598bool ValidateGetFenceivNV(Context *context, GLuint fence, GLenum pname, GLint *params)
6599{
6600 if (!context->getExtensions().fence)
6601 {
Jamie Madille0472f32018-11-27 16:32:45 -05006602 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006603 return false;
6604 }
6605
6606 FenceNV *fenceObject = context->getFenceNV(fence);
6607
6608 if (fenceObject == nullptr)
6609 {
Jamie Madille0472f32018-11-27 16:32:45 -05006610 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006611 return false;
6612 }
6613
6614 if (!fenceObject->isSet())
6615 {
Jamie Madille0472f32018-11-27 16:32:45 -05006616 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006617 return false;
6618 }
6619
6620 switch (pname)
6621 {
6622 case GL_FENCE_STATUS_NV:
6623 case GL_FENCE_CONDITION_NV:
6624 break;
6625
6626 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006627 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006628 return false;
6629 }
6630
6631 return true;
6632}
6633
6634bool ValidateGetGraphicsResetStatusEXT(Context *context)
6635{
6636 if (!context->getExtensions().robustness)
6637 {
Jamie Madille0472f32018-11-27 16:32:45 -05006638 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006639 return false;
6640 }
6641
6642 return true;
6643}
6644
6645bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
6646 GLuint shader,
6647 GLsizei bufsize,
6648 GLsizei *length,
6649 GLchar *source)
6650{
6651 if (!context->getExtensions().translatedShaderSource)
6652 {
Jamie Madille0472f32018-11-27 16:32:45 -05006653 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006654 return false;
6655 }
6656
6657 if (bufsize < 0)
6658 {
Jamie Madille0472f32018-11-27 16:32:45 -05006659 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006660 return false;
6661 }
6662
6663 Shader *shaderObject = context->getShader(shader);
6664
6665 if (!shaderObject)
6666 {
Jamie Madille0472f32018-11-27 16:32:45 -05006667 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006668 return false;
6669 }
6670
6671 return true;
6672}
6673
6674bool ValidateIsFenceNV(Context *context, GLuint fence)
6675{
6676 if (!context->getExtensions().fence)
6677 {
Jamie Madille0472f32018-11-27 16:32:45 -05006678 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006679 return false;
6680 }
6681
6682 return true;
6683}
6684
Jamie Madill007530e2017-12-28 14:27:04 -05006685bool ValidateSetFenceNV(Context *context, GLuint fence, GLenum condition)
6686{
6687 if (!context->getExtensions().fence)
6688 {
Jamie Madille0472f32018-11-27 16:32:45 -05006689 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006690 return false;
6691 }
6692
6693 if (condition != GL_ALL_COMPLETED_NV)
6694 {
Jamie Madille0472f32018-11-27 16:32:45 -05006695 context->validationError(GL_INVALID_ENUM, kInvalidFenceCondition);
Jamie Madill007530e2017-12-28 14:27:04 -05006696 return false;
6697 }
6698
6699 FenceNV *fenceObject = context->getFenceNV(fence);
6700
6701 if (fenceObject == nullptr)
6702 {
Jamie Madille0472f32018-11-27 16:32:45 -05006703 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006704 return false;
6705 }
6706
6707 return true;
6708}
6709
6710bool ValidateTestFenceNV(Context *context, GLuint fence)
6711{
6712 if (!context->getExtensions().fence)
6713 {
Jamie Madille0472f32018-11-27 16:32:45 -05006714 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006715 return false;
6716 }
6717
6718 FenceNV *fenceObject = context->getFenceNV(fence);
6719
6720 if (fenceObject == nullptr)
6721 {
Jamie Madille0472f32018-11-27 16:32:45 -05006722 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006723 return false;
6724 }
6725
6726 if (fenceObject->isSet() != GL_TRUE)
6727 {
Jamie Madille0472f32018-11-27 16:32:45 -05006728 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill007530e2017-12-28 14:27:04 -05006729 return false;
6730 }
6731
6732 return true;
6733}
6734
6735bool ValidateTexStorage2DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006736 TextureType type,
Jamie Madill007530e2017-12-28 14:27:04 -05006737 GLsizei levels,
6738 GLenum internalformat,
6739 GLsizei width,
6740 GLsizei height)
6741{
6742 if (!context->getExtensions().textureStorage)
6743 {
Jamie Madille0472f32018-11-27 16:32:45 -05006744 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006745 return false;
6746 }
6747
6748 if (context->getClientMajorVersion() < 3)
6749 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006750 return ValidateES2TexStorageParameters(context, type, levels, internalformat, width,
Jamie Madill007530e2017-12-28 14:27:04 -05006751 height);
6752 }
6753
6754 ASSERT(context->getClientMajorVersion() >= 3);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006755 return ValidateES3TexStorage2DParameters(context, type, levels, internalformat, width, height,
Jamie Madill007530e2017-12-28 14:27:04 -05006756 1);
6757}
6758
6759bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor)
6760{
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006761 if (!context->getExtensions().instancedArraysANGLE)
Jamie Madill007530e2017-12-28 14:27:04 -05006762 {
Jamie Madille0472f32018-11-27 16:32:45 -05006763 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006764 return false;
6765 }
6766
6767 if (index >= MAX_VERTEX_ATTRIBS)
6768 {
Jamie Madille0472f32018-11-27 16:32:45 -05006769 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill007530e2017-12-28 14:27:04 -05006770 return false;
6771 }
6772
6773 if (context->getLimitations().attributeZeroRequiresZeroDivisorInEXT)
6774 {
6775 if (index == 0 && divisor != 0)
6776 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006777 context->validationError(GL_INVALID_OPERATION, kAttributeZeroRequiresDivisorLimitation);
Jamie Madill007530e2017-12-28 14:27:04 -05006778
6779 // We also output an error message to the debugger window if tracing is active, so
6780 // that developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006781 ERR() << kAttributeZeroRequiresDivisorLimitation;
Jamie Madill007530e2017-12-28 14:27:04 -05006782 return false;
6783 }
6784 }
6785
6786 return true;
6787}
6788
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006789bool ValidateVertexAttribDivisorEXT(Context *context, GLuint index, GLuint divisor)
6790{
6791 if (!context->getExtensions().instancedArraysEXT)
6792 {
6793 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6794 return false;
6795 }
6796
6797 if (index >= MAX_VERTEX_ATTRIBS)
6798 {
6799 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
6800 return false;
6801 }
6802
6803 return true;
6804}
6805
Jamie Madill007530e2017-12-28 14:27:04 -05006806bool ValidateTexImage3DOES(Context *context,
6807 GLenum target,
6808 GLint level,
6809 GLenum internalformat,
6810 GLsizei width,
6811 GLsizei height,
6812 GLsizei depth,
6813 GLint border,
6814 GLenum format,
6815 GLenum type,
6816 const void *pixels)
6817{
6818 UNIMPLEMENTED(); // FIXME
6819 return false;
6820}
6821
6822bool ValidatePopGroupMarkerEXT(Context *context)
6823{
6824 if (!context->getExtensions().debugMarker)
6825 {
6826 // The debug marker calls should not set error state
6827 // However, it seems reasonable to set an error state if the extension is not enabled
Jamie Madille0472f32018-11-27 16:32:45 -05006828 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006829 return false;
6830 }
6831
6832 return true;
6833}
6834
Jamie Madillfa920eb2018-01-04 11:45:50 -05006835bool ValidateTexStorage1DEXT(Context *context,
6836 GLenum target,
6837 GLsizei levels,
6838 GLenum internalformat,
6839 GLsizei width)
6840{
6841 UNIMPLEMENTED();
Jamie Madille0472f32018-11-27 16:32:45 -05006842 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006843 return false;
6844}
6845
6846bool ValidateTexStorage3DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006847 TextureType target,
Jamie Madillfa920eb2018-01-04 11:45:50 -05006848 GLsizei levels,
6849 GLenum internalformat,
6850 GLsizei width,
6851 GLsizei height,
6852 GLsizei depth)
6853{
6854 if (!context->getExtensions().textureStorage)
6855 {
Jamie Madille0472f32018-11-27 16:32:45 -05006856 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006857 return false;
6858 }
6859
6860 if (context->getClientMajorVersion() < 3)
6861 {
Jamie Madille0472f32018-11-27 16:32:45 -05006862 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006863 return false;
6864 }
6865
6866 return ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
6867 depth);
6868}
6869
jchen1082af6202018-06-22 10:59:52 +08006870bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count)
6871{
6872 if (!context->getExtensions().parallelShaderCompile)
6873 {
Jamie Madille0472f32018-11-27 16:32:45 -05006874 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
jchen1082af6202018-06-22 10:59:52 +08006875 return false;
6876 }
6877 return true;
6878}
6879
Austin Eng1bf18ce2018-10-19 15:34:02 -07006880bool ValidateMultiDrawArraysANGLE(Context *context,
6881 PrimitiveMode mode,
6882 const GLint *firsts,
6883 const GLsizei *counts,
6884 GLsizei drawcount)
6885{
6886 if (!context->getExtensions().multiDraw)
6887 {
Jamie Madille0472f32018-11-27 16:32:45 -05006888 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006889 return false;
6890 }
6891 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6892 {
6893 if (!ValidateDrawArrays(context, mode, firsts[drawID], counts[drawID]))
6894 {
6895 return false;
6896 }
6897 }
6898 return true;
6899}
6900
6901bool ValidateMultiDrawElementsANGLE(Context *context,
6902 PrimitiveMode mode,
6903 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05006904 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08006905 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07006906 GLsizei drawcount)
6907{
6908 if (!context->getExtensions().multiDraw)
6909 {
Jamie Madille0472f32018-11-27 16:32:45 -05006910 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006911 return false;
6912 }
6913 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6914 {
Austin Eng3b7c9d02018-11-21 18:09:05 -08006915 if (!ValidateDrawElements(context, mode, counts[drawID], type, indices[drawID]))
Austin Eng1bf18ce2018-10-19 15:34:02 -07006916 {
6917 return false;
6918 }
6919 }
6920 return true;
6921}
6922
Jeff Gilbert465d6092019-01-02 16:21:18 -08006923bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked)
6924{
6925 if (!context->getExtensions().provokingVertex)
6926 {
6927 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6928 return false;
6929 }
6930
6931 switch (modePacked)
6932 {
6933 case ProvokingVertex::FirstVertexConvention:
6934 case ProvokingVertex::LastVertexConvention:
6935 break;
6936 default:
6937 context->validationError(GL_INVALID_ENUM, kInvalidProvokingVertex);
6938 return false;
6939 }
6940
6941 return true;
6942}
6943
Jamie Madilla5410482019-01-31 19:55:55 -05006944void RecordBindTextureTypeError(Context *context, TextureType target)
6945{
6946 ASSERT(!context->getStateCache().isValidBindTextureType(target));
6947
6948 switch (target)
6949 {
6950 case TextureType::Rectangle:
6951 ASSERT(!context->getExtensions().textureRectangle);
6952 context->validationError(GL_INVALID_ENUM, kTextureRectangleNotSupported);
6953 break;
6954
6955 case TextureType::_3D:
6956 case TextureType::_2DArray:
6957 ASSERT(context->getClientMajorVersion() < 3);
6958 context->validationError(GL_INVALID_ENUM, kES3Required);
6959 break;
6960
6961 case TextureType::_2DMultisample:
6962 ASSERT(context->getClientVersion() < Version(3, 1) &&
6963 !context->getExtensions().textureMultisample);
6964 context->validationError(GL_INVALID_ENUM, kMultisampleTextureExtensionOrES31Required);
6965 break;
6966
6967 case TextureType::_2DMultisampleArray:
6968 ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
6969 context->validationError(GL_INVALID_ENUM, kMultisampleArrayExtensionRequired);
6970 break;
6971
6972 case TextureType::External:
6973 ASSERT(!context->getExtensions().eglImageExternal &&
6974 !context->getExtensions().eglStreamConsumerExternal);
6975 context->validationError(GL_INVALID_ENUM, kExternalTextureNotSupported);
6976 break;
6977
6978 default:
6979 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
6980 }
6981}
6982
Jamie Madillc29968b2016-01-20 11:17:23 -05006983} // namespace gl