blob: ffbf24c16d944998f780c0df4274afdfba09c5b3 [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
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001206 gl::Texture *texture = context->getTargetTexture(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
1649 if (format != GL_NONE)
1650 {
1651 if (GetInternalFormatInfo(format, type).sizedInternalFormat !=
1652 textureInternalFormat.sizedInternalFormat)
1653 {
1654 context->validationError(GL_INVALID_OPERATION, kTypeMismatch);
1655 return false;
1656 }
1657 }
1658
1659 if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
1660 static_cast<size_t>(yoffset + height) > texture->getHeight(target, level))
1661 {
1662 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
1663 return false;
1664 }
1665
1666 if (width > 0 && height > 0 && pixels == nullptr &&
1667 context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
1668 {
1669 context->validationError(GL_INVALID_VALUE, kPixelDataNull);
1670 return false;
1671 }
1672 }
1673 else
1674 {
1675 if (texture->getImmutableFormat())
1676 {
1677 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
1678 return false;
1679 }
1680 }
1681
1682 // From GL_CHROMIUM_color_buffer_float_rgb[a]:
1683 // GL_RGB[A] / GL_RGB[A]32F becomes an allowable format / internalformat parameter pair for
1684 // TexImage2D. The restriction in section 3.7.1 of the OpenGL ES 2.0 spec that the
1685 // internalformat parameter and format parameter of TexImage2D must match is lifted for this
1686 // case.
1687 if (!isSubImage && !isCompressed && internalformat != format && !nonEqualFormatsAllowed)
1688 {
1689 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Langff5b2d52016-09-07 11:32:23 -04001690 return false;
1691 }
1692
Tim Van Patten208af3e2019-03-19 09:15:55 -06001693 GLenum sizeCheckFormat = isSubImage ? format : internalformat;
1694 return ValidImageDataSize(context, texType, width, height, 1, sizeCheckFormat, type, pixels,
1695 imageSize);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001696}
1697
He Yunchaoced53ae2016-11-29 15:00:51 +08001698bool ValidateES2TexStorageParameters(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001699 TextureType target,
He Yunchaoced53ae2016-11-29 15:00:51 +08001700 GLsizei levels,
1701 GLenum internalformat,
1702 GLsizei width,
1703 GLsizei height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001704{
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001705 if (target != TextureType::_2D && target != TextureType::CubeMap &&
1706 target != TextureType::Rectangle)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001707 {
Jamie Madille0472f32018-11-27 16:32:45 -05001708 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Langb1196682014-07-23 13:47:29 -04001709 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001710 }
1711
1712 if (width < 1 || height < 1 || levels < 1)
1713 {
Jamie Madille0472f32018-11-27 16:32:45 -05001714 context->validationError(GL_INVALID_VALUE, kTextureSizeTooSmall);
Geoff Langb1196682014-07-23 13:47:29 -04001715 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001716 }
1717
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001718 if (target == TextureType::CubeMap && width != height)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001719 {
Jamie Madille0472f32018-11-27 16:32:45 -05001720 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Langb1196682014-07-23 13:47:29 -04001721 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001722 }
1723
1724 if (levels != 1 && levels != gl::log2(std::max(width, height)) + 1)
1725 {
Jamie Madille0472f32018-11-27 16:32:45 -05001726 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
Geoff Langb1196682014-07-23 13:47:29 -04001727 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001728 }
1729
Geoff Langca271392017-04-05 12:30:00 -04001730 const gl::InternalFormat &formatInfo = gl::GetSizedInternalFormatInfo(internalformat);
Geoff Lang5d601382014-07-22 15:14:06 -04001731 if (formatInfo.format == GL_NONE || formatInfo.type == GL_NONE)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001732 {
Jamie Madille0472f32018-11-27 16:32:45 -05001733 context->validationError(GL_INVALID_ENUM, kInvalidFormat);
Geoff Langb1196682014-07-23 13:47:29 -04001734 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001735 }
1736
Geoff Langaae65a42014-05-26 12:43:44 -04001737 const gl::Caps &caps = context->getCaps();
1738
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001739 switch (target)
1740 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001741 case TextureType::_2D:
He Yunchaoced53ae2016-11-29 15:00:51 +08001742 if (static_cast<GLuint>(width) > caps.max2DTextureSize ||
1743 static_cast<GLuint>(height) > caps.max2DTextureSize)
1744 {
Jamie Madille0472f32018-11-27 16:32:45 -05001745 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001746 return false;
1747 }
1748 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001749 case TextureType::Rectangle:
Jamie Madill610640f2018-11-21 17:28:41 -05001750 if (levels != 1)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001751 {
Jamie Madille0472f32018-11-27 16:32:45 -05001752 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madill610640f2018-11-21 17:28:41 -05001753 return false;
1754 }
1755
1756 if (static_cast<GLuint>(width) > caps.maxRectangleTextureSize ||
1757 static_cast<GLuint>(height) > caps.maxRectangleTextureSize)
1758 {
Jamie Madille0472f32018-11-27 16:32:45 -05001759 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001760 return false;
1761 }
1762 if (formatInfo.compressed)
1763 {
Jamie Madille0472f32018-11-27 16:32:45 -05001764 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04001765 return false;
1766 }
1767 break;
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001768 case TextureType::CubeMap:
He Yunchaoced53ae2016-11-29 15:00:51 +08001769 if (static_cast<GLuint>(width) > caps.maxCubeMapTextureSize ||
1770 static_cast<GLuint>(height) > caps.maxCubeMapTextureSize)
1771 {
Jamie Madille0472f32018-11-27 16:32:45 -05001772 context->validationError(GL_INVALID_VALUE, kResourceMaxTextureSize);
He Yunchaoced53ae2016-11-29 15:00:51 +08001773 return false;
1774 }
1775 break;
1776 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001777 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Langb1196682014-07-23 13:47:29 -04001778 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001779 }
1780
Geoff Langc0b9ef42014-07-02 10:02:37 -04001781 if (levels != 1 && !context->getExtensions().textureNPOT)
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001782 {
1783 if (!gl::isPow2(width) || !gl::isPow2(height))
1784 {
Jamie Madille0472f32018-11-27 16:32:45 -05001785 context->validationError(GL_INVALID_OPERATION, kDimensionsMustBePow2);
Geoff Langb1196682014-07-23 13:47:29 -04001786 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001787 }
1788 }
1789
1790 switch (internalformat)
1791 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001792 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
1793 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
1794 if (!context->getExtensions().textureCompressionDXT1)
1795 {
Jamie Madille0472f32018-11-27 16:32:45 -05001796 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001797 return false;
1798 }
1799 break;
1800 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
1801 if (!context->getExtensions().textureCompressionDXT3)
1802 {
Jamie Madille0472f32018-11-27 16:32:45 -05001803 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001804 return false;
1805 }
1806 break;
1807 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
1808 if (!context->getExtensions().textureCompressionDXT5)
1809 {
Jamie Madille0472f32018-11-27 16:32:45 -05001810 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001811 return false;
1812 }
1813 break;
1814 case GL_ETC1_RGB8_OES:
1815 if (!context->getExtensions().compressedETC1RGB8Texture)
1816 {
Jamie Madille0472f32018-11-27 16:32:45 -05001817 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001818 return false;
1819 }
1820 break;
1821 case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
Minmin Gong390208b2017-02-28 18:03:06 -08001822 case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
1823 case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
1824 case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
1825 case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
He Yunchaoced53ae2016-11-29 15:00:51 +08001826 if (!context->getExtensions().lossyETCDecode)
1827 {
Jamie Madillc3e37312018-11-30 15:25:39 -05001828 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001829 return false;
1830 }
1831 break;
1832 case GL_RGBA32F_EXT:
1833 case GL_RGB32F_EXT:
1834 case GL_ALPHA32F_EXT:
1835 case GL_LUMINANCE32F_EXT:
1836 case GL_LUMINANCE_ALPHA32F_EXT:
1837 if (!context->getExtensions().textureFloat)
1838 {
Jamie Madille0472f32018-11-27 16:32:45 -05001839 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001840 return false;
1841 }
1842 break;
1843 case GL_RGBA16F_EXT:
1844 case GL_RGB16F_EXT:
1845 case GL_ALPHA16F_EXT:
1846 case GL_LUMINANCE16F_EXT:
1847 case GL_LUMINANCE_ALPHA16F_EXT:
1848 if (!context->getExtensions().textureHalfFloat)
1849 {
Jamie Madille0472f32018-11-27 16:32:45 -05001850 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001851 return false;
1852 }
1853 break;
1854 case GL_R8_EXT:
1855 case GL_RG8_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001856 if (!context->getExtensions().textureRG)
1857 {
Jamie Madille0472f32018-11-27 16:32:45 -05001858 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001859 return false;
1860 }
1861 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001862 case GL_R16F_EXT:
1863 case GL_RG16F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001864 if (!context->getExtensions().textureRG || !context->getExtensions().textureHalfFloat)
1865 {
Jamie Madille0472f32018-11-27 16:32:45 -05001866 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang677bb6f2017-04-05 12:40:40 -04001867 return false;
1868 }
1869 break;
He Yunchaoced53ae2016-11-29 15:00:51 +08001870 case GL_R32F_EXT:
1871 case GL_RG32F_EXT:
Geoff Lang677bb6f2017-04-05 12:40:40 -04001872 if (!context->getExtensions().textureRG || !context->getExtensions().textureFloat)
He Yunchaoced53ae2016-11-29 15:00:51 +08001873 {
Jamie Madille0472f32018-11-27 16:32:45 -05001874 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001875 return false;
1876 }
1877 break;
1878 case GL_DEPTH_COMPONENT16:
1879 case GL_DEPTH_COMPONENT32_OES:
1880 case GL_DEPTH24_STENCIL8_OES:
1881 if (!context->getExtensions().depthTextures)
1882 {
Jamie Madille0472f32018-11-27 16:32:45 -05001883 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
He Yunchaoced53ae2016-11-29 15:00:51 +08001884 return false;
1885 }
Corentin Wallezf0e89be2017-11-08 14:00:32 -08001886 if (target != TextureType::_2D)
He Yunchaoced53ae2016-11-29 15:00:51 +08001887 {
Jamie Madille0472f32018-11-27 16:32:45 -05001888 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08001889 return false;
1890 }
1891 // ANGLE_depth_texture only supports 1-level textures
1892 if (levels != 1)
1893 {
Jamie Madille0472f32018-11-27 16:32:45 -05001894 context->validationError(GL_INVALID_OPERATION, kInvalidMipLevels);
He Yunchaoced53ae2016-11-29 15:00:51 +08001895 return false;
1896 }
1897 break;
1898 default:
1899 break;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001900 }
1901
Geoff Lang691e58c2014-12-19 17:03:25 -05001902 gl::Texture *texture = context->getTargetTexture(target);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001903 if (!texture || texture->id() == 0)
1904 {
Jamie Madille0472f32018-11-27 16:32:45 -05001905 context->validationError(GL_INVALID_OPERATION, kMissingTexture);
Geoff Langb1196682014-07-23 13:47:29 -04001906 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001907 }
1908
Geoff Lang69cce582015-09-17 13:20:36 -04001909 if (texture->getImmutableFormat())
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001910 {
Jamie Madille0472f32018-11-27 16:32:45 -05001911 context->validationError(GL_INVALID_OPERATION, kTextureIsImmutable);
Geoff Langb1196682014-07-23 13:47:29 -04001912 return false;
Geoff Lange8ebe7f2013-08-05 15:03:13 -04001913 }
1914
1915 return true;
1916}
1917
He Yunchaoced53ae2016-11-29 15:00:51 +08001918bool ValidateDiscardFramebufferEXT(Context *context,
1919 GLenum target,
1920 GLsizei numAttachments,
Austin Kinross08332632015-05-05 13:35:47 -07001921 const GLenum *attachments)
1922{
Jamie Madillc29968b2016-01-20 11:17:23 -05001923 if (!context->getExtensions().discardFramebuffer)
1924 {
Jamie Madille0472f32018-11-27 16:32:45 -05001925 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05001926 return false;
1927 }
1928
Austin Kinross08332632015-05-05 13:35:47 -07001929 bool defaultFramebuffer = false;
1930
1931 switch (target)
1932 {
He Yunchaoced53ae2016-11-29 15:00:51 +08001933 case GL_FRAMEBUFFER:
1934 defaultFramebuffer =
Jamie Madillc3dc5d42018-12-30 12:12:04 -05001935 (context->getState().getTargetFramebuffer(GL_FRAMEBUFFER)->id() == 0);
He Yunchaoced53ae2016-11-29 15:00:51 +08001936 break;
1937 default:
Jamie Madille0472f32018-11-27 16:32:45 -05001938 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
He Yunchaoced53ae2016-11-29 15:00:51 +08001939 return false;
Austin Kinross08332632015-05-05 13:35:47 -07001940 }
1941
He Yunchaoced53ae2016-11-29 15:00:51 +08001942 return ValidateDiscardFramebufferBase(context, target, numAttachments, attachments,
1943 defaultFramebuffer);
Austin Kinross08332632015-05-05 13:35:47 -07001944}
1945
Austin Kinrossbc781f32015-10-26 09:27:38 -07001946bool ValidateBindVertexArrayOES(Context *context, GLuint array)
1947{
1948 if (!context->getExtensions().vertexArrayObject)
1949 {
Jamie Madille0472f32018-11-27 16:32:45 -05001950 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001951 return false;
1952 }
1953
1954 return ValidateBindVertexArrayBase(context, array);
1955}
1956
Jamie Madilld7576732017-08-26 18:49:50 -04001957bool ValidateDeleteVertexArraysOES(Context *context, GLsizei n, const GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001958{
1959 if (!context->getExtensions().vertexArrayObject)
1960 {
Jamie Madille0472f32018-11-27 16:32:45 -05001961 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001962 return false;
1963 }
1964
Olli Etuaho41997e72016-03-10 13:38:39 +02001965 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001966}
1967
Jamie Madilld7576732017-08-26 18:49:50 -04001968bool ValidateGenVertexArraysOES(Context *context, GLsizei n, GLuint *arrays)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001969{
1970 if (!context->getExtensions().vertexArrayObject)
1971 {
Jamie Madille0472f32018-11-27 16:32:45 -05001972 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001973 return false;
1974 }
1975
Olli Etuaho41997e72016-03-10 13:38:39 +02001976 return ValidateGenOrDelete(context, n);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001977}
1978
Jamie Madilld7576732017-08-26 18:49:50 -04001979bool ValidateIsVertexArrayOES(Context *context, GLuint array)
Austin Kinrossbc781f32015-10-26 09:27:38 -07001980{
1981 if (!context->getExtensions().vertexArrayObject)
1982 {
Jamie Madille0472f32018-11-27 16:32:45 -05001983 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Kinrossbc781f32015-10-26 09:27:38 -07001984 return false;
1985 }
1986
1987 return true;
1988}
Geoff Langc5629752015-12-07 16:29:04 -05001989
1990bool ValidateProgramBinaryOES(Context *context,
1991 GLuint program,
1992 GLenum binaryFormat,
1993 const void *binary,
1994 GLint length)
1995{
1996 if (!context->getExtensions().getProgramBinary)
1997 {
Jamie Madille0472f32018-11-27 16:32:45 -05001998 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05001999 return false;
2000 }
2001
2002 return ValidateProgramBinaryBase(context, program, binaryFormat, binary, length);
2003}
2004
2005bool ValidateGetProgramBinaryOES(Context *context,
2006 GLuint program,
2007 GLsizei bufSize,
2008 GLsizei *length,
2009 GLenum *binaryFormat,
2010 void *binary)
2011{
2012 if (!context->getExtensions().getProgramBinary)
2013 {
Jamie Madille0472f32018-11-27 16:32:45 -05002014 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc5629752015-12-07 16:29:04 -05002015 return false;
2016 }
2017
2018 return ValidateGetProgramBinaryBase(context, program, bufSize, length, binaryFormat, binary);
2019}
Geoff Lange102fee2015-12-10 11:23:30 -05002020
Geoff Lang70d0f492015-12-10 17:45:46 -05002021static bool ValidDebugSource(GLenum source, bool mustBeThirdPartyOrApplication)
2022{
2023 switch (source)
2024 {
2025 case GL_DEBUG_SOURCE_API:
2026 case GL_DEBUG_SOURCE_SHADER_COMPILER:
2027 case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
2028 case GL_DEBUG_SOURCE_OTHER:
2029 // Only THIRD_PARTY and APPLICATION sources are allowed to be manually inserted
2030 return !mustBeThirdPartyOrApplication;
2031
2032 case GL_DEBUG_SOURCE_THIRD_PARTY:
2033 case GL_DEBUG_SOURCE_APPLICATION:
2034 return true;
2035
2036 default:
2037 return false;
2038 }
2039}
2040
2041static bool ValidDebugType(GLenum type)
2042{
2043 switch (type)
2044 {
2045 case GL_DEBUG_TYPE_ERROR:
2046 case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
2047 case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
2048 case GL_DEBUG_TYPE_PERFORMANCE:
2049 case GL_DEBUG_TYPE_PORTABILITY:
2050 case GL_DEBUG_TYPE_OTHER:
2051 case GL_DEBUG_TYPE_MARKER:
2052 case GL_DEBUG_TYPE_PUSH_GROUP:
2053 case GL_DEBUG_TYPE_POP_GROUP:
2054 return true;
2055
2056 default:
2057 return false;
2058 }
2059}
2060
2061static bool ValidDebugSeverity(GLenum severity)
2062{
2063 switch (severity)
2064 {
2065 case GL_DEBUG_SEVERITY_HIGH:
2066 case GL_DEBUG_SEVERITY_MEDIUM:
2067 case GL_DEBUG_SEVERITY_LOW:
2068 case GL_DEBUG_SEVERITY_NOTIFICATION:
2069 return true;
2070
2071 default:
2072 return false;
2073 }
2074}
2075
Geoff Lange102fee2015-12-10 11:23:30 -05002076bool ValidateDebugMessageControlKHR(Context *context,
2077 GLenum source,
2078 GLenum type,
2079 GLenum severity,
2080 GLsizei count,
2081 const GLuint *ids,
2082 GLboolean enabled)
2083{
2084 if (!context->getExtensions().debug)
2085 {
Jamie Madille0472f32018-11-27 16:32:45 -05002086 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002087 return false;
2088 }
2089
Geoff Lang70d0f492015-12-10 17:45:46 -05002090 if (!ValidDebugSource(source, false) && source != GL_DONT_CARE)
2091 {
Jamie Madille0472f32018-11-27 16:32:45 -05002092 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002093 return false;
2094 }
2095
2096 if (!ValidDebugType(type) && type != GL_DONT_CARE)
2097 {
Jamie Madille0472f32018-11-27 16:32:45 -05002098 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002099 return false;
2100 }
2101
2102 if (!ValidDebugSeverity(severity) && severity != GL_DONT_CARE)
2103 {
Jamie Madille0472f32018-11-27 16:32:45 -05002104 context->validationError(GL_INVALID_ENUM, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002105 return false;
2106 }
2107
2108 if (count > 0)
2109 {
2110 if (source == GL_DONT_CARE || type == GL_DONT_CARE)
2111 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002112 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSourceType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002113 return false;
2114 }
2115
2116 if (severity != GL_DONT_CARE)
2117 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002118 context->validationError(GL_INVALID_OPERATION, kInvalidDebugSeverity);
Geoff Lang70d0f492015-12-10 17:45:46 -05002119 return false;
2120 }
2121 }
2122
Geoff Lange102fee2015-12-10 11:23:30 -05002123 return true;
2124}
2125
2126bool ValidateDebugMessageInsertKHR(Context *context,
2127 GLenum source,
2128 GLenum type,
2129 GLuint id,
2130 GLenum severity,
2131 GLsizei length,
2132 const GLchar *buf)
2133{
2134 if (!context->getExtensions().debug)
2135 {
Jamie Madille0472f32018-11-27 16:32:45 -05002136 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002137 return false;
2138 }
2139
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002140 if (!context->getState().getDebug().isOutputEnabled())
Geoff Lang70d0f492015-12-10 17:45:46 -05002141 {
2142 // If the DEBUG_OUTPUT state is disabled calls to DebugMessageInsert are discarded and do
2143 // not generate an error.
2144 return false;
2145 }
2146
2147 if (!ValidDebugSeverity(severity))
2148 {
Jamie Madille0472f32018-11-27 16:32:45 -05002149 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002150 return false;
2151 }
2152
2153 if (!ValidDebugType(type))
2154 {
Jamie Madille0472f32018-11-27 16:32:45 -05002155 context->validationError(GL_INVALID_ENUM, kInvalidDebugType);
Geoff Lang70d0f492015-12-10 17:45:46 -05002156 return false;
2157 }
2158
2159 if (!ValidDebugSource(source, true))
2160 {
Jamie Madille0472f32018-11-27 16:32:45 -05002161 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002162 return false;
2163 }
2164
2165 size_t messageLength = (length < 0) ? strlen(buf) : length;
2166 if (messageLength > context->getExtensions().maxDebugMessageLength)
2167 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002168 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002169 return false;
2170 }
2171
Geoff Lange102fee2015-12-10 11:23:30 -05002172 return true;
2173}
2174
2175bool ValidateDebugMessageCallbackKHR(Context *context,
2176 GLDEBUGPROCKHR callback,
2177 const void *userParam)
2178{
2179 if (!context->getExtensions().debug)
2180 {
Jamie Madille0472f32018-11-27 16:32:45 -05002181 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002182 return false;
2183 }
2184
Geoff Lange102fee2015-12-10 11:23:30 -05002185 return true;
2186}
2187
2188bool ValidateGetDebugMessageLogKHR(Context *context,
2189 GLuint count,
2190 GLsizei bufSize,
2191 GLenum *sources,
2192 GLenum *types,
2193 GLuint *ids,
2194 GLenum *severities,
2195 GLsizei *lengths,
2196 GLchar *messageLog)
2197{
2198 if (!context->getExtensions().debug)
2199 {
Jamie Madille0472f32018-11-27 16:32:45 -05002200 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002201 return false;
2202 }
2203
Geoff Lang70d0f492015-12-10 17:45:46 -05002204 if (bufSize < 0 && messageLog != nullptr)
2205 {
Jamie Madille0472f32018-11-27 16:32:45 -05002206 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002207 return false;
2208 }
2209
Geoff Lange102fee2015-12-10 11:23:30 -05002210 return true;
2211}
2212
2213bool ValidatePushDebugGroupKHR(Context *context,
2214 GLenum source,
2215 GLuint id,
2216 GLsizei length,
2217 const GLchar *message)
2218{
2219 if (!context->getExtensions().debug)
2220 {
Jamie Madille0472f32018-11-27 16:32:45 -05002221 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002222 return false;
2223 }
2224
Geoff Lang70d0f492015-12-10 17:45:46 -05002225 if (!ValidDebugSource(source, true))
2226 {
Jamie Madille0472f32018-11-27 16:32:45 -05002227 context->validationError(GL_INVALID_ENUM, kInvalidDebugSource);
Geoff Lang70d0f492015-12-10 17:45:46 -05002228 return false;
2229 }
2230
2231 size_t messageLength = (length < 0) ? strlen(message) : length;
2232 if (messageLength > context->getExtensions().maxDebugMessageLength)
2233 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002234 context->validationError(GL_INVALID_VALUE, kExceedsMaxDebugMessageLength);
Geoff Lang70d0f492015-12-10 17:45:46 -05002235 return false;
2236 }
2237
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002238 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002239 if (currentStackSize >= context->getExtensions().maxDebugGroupStackDepth)
2240 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002241 context->validationError(GL_STACK_OVERFLOW, kExceedsMaxDebugGroupStackDepth);
Geoff Lang70d0f492015-12-10 17:45:46 -05002242 return false;
2243 }
2244
Geoff Lange102fee2015-12-10 11:23:30 -05002245 return true;
2246}
2247
2248bool ValidatePopDebugGroupKHR(Context *context)
2249{
2250 if (!context->getExtensions().debug)
2251 {
Jamie Madille0472f32018-11-27 16:32:45 -05002252 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002253 return false;
2254 }
2255
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002256 size_t currentStackSize = context->getState().getDebug().getGroupStackDepth();
Geoff Lang70d0f492015-12-10 17:45:46 -05002257 if (currentStackSize <= 1)
2258 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002259 context->validationError(GL_STACK_UNDERFLOW, kCannotPopDefaultDebugGroup);
Geoff Lang70d0f492015-12-10 17:45:46 -05002260 return false;
2261 }
2262
2263 return true;
2264}
2265
2266static bool ValidateObjectIdentifierAndName(Context *context, GLenum identifier, GLuint name)
2267{
2268 switch (identifier)
2269 {
2270 case GL_BUFFER:
2271 if (context->getBuffer(name) == nullptr)
2272 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002273 context->validationError(GL_INVALID_VALUE, kInvalidBufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002274 return false;
2275 }
2276 return true;
2277
2278 case GL_SHADER:
2279 if (context->getShader(name) == nullptr)
2280 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002281 context->validationError(GL_INVALID_VALUE, kInvalidShaderName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002282 return false;
2283 }
2284 return true;
2285
2286 case GL_PROGRAM:
Jamie Madill44a6fbf2018-10-02 13:38:56 -04002287 if (context->getProgramNoResolveLink(name) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002288 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002289 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002290 return false;
2291 }
2292 return true;
2293
2294 case GL_VERTEX_ARRAY:
2295 if (context->getVertexArray(name) == nullptr)
2296 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002297 context->validationError(GL_INVALID_VALUE, kInvalidVertexArrayName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002298 return false;
2299 }
2300 return true;
2301
2302 case GL_QUERY:
2303 if (context->getQuery(name) == nullptr)
2304 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002305 context->validationError(GL_INVALID_VALUE, kInvalidQueryName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002306 return false;
2307 }
2308 return true;
2309
2310 case GL_TRANSFORM_FEEDBACK:
2311 if (context->getTransformFeedback(name) == nullptr)
2312 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002313 context->validationError(GL_INVALID_VALUE, kInvalidTransformFeedbackName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002314 return false;
2315 }
2316 return true;
2317
2318 case GL_SAMPLER:
2319 if (context->getSampler(name) == nullptr)
2320 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002321 context->validationError(GL_INVALID_VALUE, kInvalidSamplerName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002322 return false;
2323 }
2324 return true;
2325
2326 case GL_TEXTURE:
2327 if (context->getTexture(name) == nullptr)
2328 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002329 context->validationError(GL_INVALID_VALUE, kInvalidTextureName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002330 return false;
2331 }
2332 return true;
2333
2334 case GL_RENDERBUFFER:
2335 if (context->getRenderbuffer(name) == nullptr)
2336 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002337 context->validationError(GL_INVALID_VALUE, kInvalidRenderbufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002338 return false;
2339 }
2340 return true;
2341
2342 case GL_FRAMEBUFFER:
2343 if (context->getFramebuffer(name) == nullptr)
2344 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002345 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferName);
Geoff Lang70d0f492015-12-10 17:45:46 -05002346 return false;
2347 }
2348 return true;
2349
2350 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05002351 context->validationError(GL_INVALID_ENUM, kInvalidIndentifier);
Geoff Lang70d0f492015-12-10 17:45:46 -05002352 return false;
2353 }
Geoff Lange102fee2015-12-10 11:23:30 -05002354}
2355
Martin Radev9d901792016-07-15 15:58:58 +03002356static bool ValidateLabelLength(Context *context, GLsizei length, const GLchar *label)
2357{
2358 size_t labelLength = 0;
2359
2360 if (length < 0)
2361 {
2362 if (label != nullptr)
2363 {
2364 labelLength = strlen(label);
2365 }
2366 }
2367 else
2368 {
2369 labelLength = static_cast<size_t>(length);
2370 }
2371
2372 if (labelLength > context->getExtensions().maxLabelLength)
2373 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002374 context->validationError(GL_INVALID_VALUE, kExceedsMaxLabelLength);
Martin Radev9d901792016-07-15 15:58:58 +03002375 return false;
2376 }
2377
2378 return true;
2379}
2380
Geoff Lange102fee2015-12-10 11:23:30 -05002381bool ValidateObjectLabelKHR(Context *context,
2382 GLenum identifier,
2383 GLuint name,
2384 GLsizei length,
2385 const GLchar *label)
2386{
2387 if (!context->getExtensions().debug)
2388 {
Jamie Madille0472f32018-11-27 16:32:45 -05002389 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002390 return false;
2391 }
2392
Geoff Lang70d0f492015-12-10 17:45:46 -05002393 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2394 {
2395 return false;
2396 }
2397
Martin Radev9d901792016-07-15 15:58:58 +03002398 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002399 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002400 return false;
2401 }
2402
Geoff Lange102fee2015-12-10 11:23:30 -05002403 return true;
2404}
2405
2406bool ValidateGetObjectLabelKHR(Context *context,
2407 GLenum identifier,
2408 GLuint name,
2409 GLsizei bufSize,
2410 GLsizei *length,
2411 GLchar *label)
2412{
2413 if (!context->getExtensions().debug)
2414 {
Jamie Madille0472f32018-11-27 16:32:45 -05002415 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002416 return false;
2417 }
2418
Geoff Lang70d0f492015-12-10 17:45:46 -05002419 if (bufSize < 0)
2420 {
Jamie Madille0472f32018-11-27 16:32:45 -05002421 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002422 return false;
2423 }
2424
2425 if (!ValidateObjectIdentifierAndName(context, identifier, name))
2426 {
2427 return false;
2428 }
2429
Martin Radev9d901792016-07-15 15:58:58 +03002430 return true;
Geoff Lang70d0f492015-12-10 17:45:46 -05002431}
2432
2433static bool ValidateObjectPtrName(Context *context, const void *ptr)
2434{
Jamie Madill70b5bb02017-08-28 13:32:37 -04002435 if (context->getSync(reinterpret_cast<GLsync>(const_cast<void *>(ptr))) == nullptr)
Geoff Lang70d0f492015-12-10 17:45:46 -05002436 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002437 context->validationError(GL_INVALID_VALUE, kInvalidSyncPointer);
Geoff Lang70d0f492015-12-10 17:45:46 -05002438 return false;
2439 }
2440
Geoff Lange102fee2015-12-10 11:23:30 -05002441 return true;
2442}
2443
2444bool ValidateObjectPtrLabelKHR(Context *context,
2445 const void *ptr,
2446 GLsizei length,
2447 const GLchar *label)
2448{
2449 if (!context->getExtensions().debug)
2450 {
Jamie Madille0472f32018-11-27 16:32:45 -05002451 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002452 return false;
2453 }
2454
Geoff Lang70d0f492015-12-10 17:45:46 -05002455 if (!ValidateObjectPtrName(context, ptr))
2456 {
2457 return false;
2458 }
2459
Martin Radev9d901792016-07-15 15:58:58 +03002460 if (!ValidateLabelLength(context, length, label))
Geoff Lang70d0f492015-12-10 17:45:46 -05002461 {
Geoff Lang70d0f492015-12-10 17:45:46 -05002462 return false;
2463 }
2464
Geoff Lange102fee2015-12-10 11:23:30 -05002465 return true;
2466}
2467
2468bool ValidateGetObjectPtrLabelKHR(Context *context,
2469 const void *ptr,
2470 GLsizei bufSize,
2471 GLsizei *length,
2472 GLchar *label)
2473{
2474 if (!context->getExtensions().debug)
2475 {
Jamie Madille0472f32018-11-27 16:32:45 -05002476 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002477 return false;
2478 }
2479
Geoff Lang70d0f492015-12-10 17:45:46 -05002480 if (bufSize < 0)
2481 {
Jamie Madille0472f32018-11-27 16:32:45 -05002482 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Geoff Lang70d0f492015-12-10 17:45:46 -05002483 return false;
2484 }
2485
2486 if (!ValidateObjectPtrName(context, ptr))
2487 {
2488 return false;
2489 }
2490
Martin Radev9d901792016-07-15 15:58:58 +03002491 return true;
Geoff Lange102fee2015-12-10 11:23:30 -05002492}
2493
2494bool ValidateGetPointervKHR(Context *context, GLenum pname, void **params)
2495{
2496 if (!context->getExtensions().debug)
2497 {
Jamie Madille0472f32018-11-27 16:32:45 -05002498 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lange102fee2015-12-10 11:23:30 -05002499 return false;
2500 }
2501
Geoff Lang70d0f492015-12-10 17:45:46 -05002502 // TODO: represent this in Context::getQueryParameterInfo.
2503 switch (pname)
2504 {
2505 case GL_DEBUG_CALLBACK_FUNCTION:
2506 case GL_DEBUG_CALLBACK_USER_PARAM:
2507 break;
2508
2509 default:
Jamie Madille0472f32018-11-27 16:32:45 -05002510 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang70d0f492015-12-10 17:45:46 -05002511 return false;
2512 }
2513
Geoff Lange102fee2015-12-10 11:23:30 -05002514 return true;
2515}
Jamie Madillc29968b2016-01-20 11:17:23 -05002516
Brandon Jonesfe4bbe62018-04-06 13:50:14 -07002517bool ValidateGetPointervRobustANGLERobustANGLE(Context *context,
2518 GLenum pname,
2519 GLsizei bufSize,
2520 GLsizei *length,
2521 void **params)
2522{
2523 UNIMPLEMENTED();
2524 return false;
2525}
2526
Jamie Madillc29968b2016-01-20 11:17:23 -05002527bool ValidateBlitFramebufferANGLE(Context *context,
2528 GLint srcX0,
2529 GLint srcY0,
2530 GLint srcX1,
2531 GLint srcY1,
2532 GLint dstX0,
2533 GLint dstY0,
2534 GLint dstX1,
2535 GLint dstY1,
2536 GLbitfield mask,
2537 GLenum filter)
2538{
2539 if (!context->getExtensions().framebufferBlit)
2540 {
Jamie Madille0472f32018-11-27 16:32:45 -05002541 context->validationError(GL_INVALID_OPERATION, kBlitExtensionNotAvailable);
Jamie Madillc29968b2016-01-20 11:17:23 -05002542 return false;
2543 }
2544
2545 if (srcX1 - srcX0 != dstX1 - dstX0 || srcY1 - srcY0 != dstY1 - dstY0)
2546 {
2547 // TODO(jmadill): Determine if this should be available on other implementations.
Jamie Madille0472f32018-11-27 16:32:45 -05002548 context->validationError(GL_INVALID_OPERATION, kBlitExtensionScaleOrFlip);
Jamie Madillc29968b2016-01-20 11:17:23 -05002549 return false;
2550 }
2551
2552 if (filter == GL_LINEAR)
2553 {
Jamie Madille0472f32018-11-27 16:32:45 -05002554 context->validationError(GL_INVALID_ENUM, kBlitExtensionLinear);
Jamie Madillc29968b2016-01-20 11:17:23 -05002555 return false;
2556 }
2557
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002558 Framebuffer *readFramebuffer = context->getState().getReadFramebuffer();
2559 Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
Jamie Madillc29968b2016-01-20 11:17:23 -05002560
2561 if (mask & GL_COLOR_BUFFER_BIT)
2562 {
2563 const FramebufferAttachment *readColorAttachment = readFramebuffer->getReadColorbuffer();
2564 const FramebufferAttachment *drawColorAttachment = drawFramebuffer->getFirstColorbuffer();
2565
2566 if (readColorAttachment && drawColorAttachment)
2567 {
2568 if (!(readColorAttachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002569 readColorAttachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002570 readColorAttachment->type() != GL_RENDERBUFFER &&
2571 readColorAttachment->type() != GL_FRAMEBUFFER_DEFAULT)
2572 {
Jamie Madill610640f2018-11-21 17:28:41 -05002573 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002574 kBlitExtensionFromInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002575 return false;
2576 }
2577
Geoff Langa15472a2015-08-11 11:48:03 -04002578 for (size_t drawbufferIdx = 0;
2579 drawbufferIdx < drawFramebuffer->getDrawbufferStateCount(); ++drawbufferIdx)
Jamie Madillc29968b2016-01-20 11:17:23 -05002580 {
Geoff Langa15472a2015-08-11 11:48:03 -04002581 const FramebufferAttachment *attachment =
2582 drawFramebuffer->getDrawBuffer(drawbufferIdx);
2583 if (attachment)
Jamie Madillc29968b2016-01-20 11:17:23 -05002584 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002585 if (!(attachment->type() == GL_TEXTURE &&
Jamie Madillcc129372018-04-12 09:13:18 -04002586 attachment->getTextureImageIndex().getType() == TextureType::_2D) &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002587 attachment->type() != GL_RENDERBUFFER &&
2588 attachment->type() != GL_FRAMEBUFFER_DEFAULT)
2589 {
Jamie Madill610640f2018-11-21 17:28:41 -05002590 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002591 kBlitExtensionToInvalidAttachmentType);
Jamie Madillc29968b2016-01-20 11:17:23 -05002592 return false;
2593 }
2594
2595 // Return an error if the destination formats do not match
Kenneth Russell69382852017-07-21 16:38:44 -04002596 if (!Format::EquivalentForBlit(attachment->getFormat(),
2597 readColorAttachment->getFormat()))
Jamie Madillc29968b2016-01-20 11:17:23 -05002598 {
Jamie Madill610640f2018-11-21 17:28:41 -05002599 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002600 kBlitExtensionFormatMismatch);
Jamie Madillc29968b2016-01-20 11:17:23 -05002601 return false;
2602 }
2603 }
2604 }
2605
Jamie Madill427064d2018-04-13 16:20:34 -04002606 GLint samples = readFramebuffer->getSamples(context);
Jamie Madille98b1b52018-03-08 09:47:23 -05002607 if (samples != 0 &&
Jamie Madillc29968b2016-01-20 11:17:23 -05002608 IsPartialBlit(context, readColorAttachment, drawColorAttachment, srcX0, srcY0,
2609 srcX1, srcY1, dstX0, dstY0, dstX1, dstY1))
2610 {
Jamie Madill610640f2018-11-21 17:28:41 -05002611 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002612 kBlitExtensionMultisampledWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002613 return false;
2614 }
2615 }
2616 }
2617
2618 GLenum masks[] = {GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT};
2619 GLenum attachments[] = {GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT};
2620 for (size_t i = 0; i < 2; i++)
2621 {
2622 if (mask & masks[i])
2623 {
2624 const FramebufferAttachment *readBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002625 readFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002626 const FramebufferAttachment *drawBuffer =
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08002627 drawFramebuffer->getAttachment(context, attachments[i]);
Jamie Madillc29968b2016-01-20 11:17:23 -05002628
2629 if (readBuffer && drawBuffer)
2630 {
2631 if (IsPartialBlit(context, readBuffer, drawBuffer, srcX0, srcY0, srcX1, srcY1,
2632 dstX0, dstY0, dstX1, dstY1))
2633 {
2634 // only whole-buffer copies are permitted
Jamie Madill610640f2018-11-21 17:28:41 -05002635 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002636 kBlitExtensionDepthStencilWholeBufferBlit);
Jamie Madillc29968b2016-01-20 11:17:23 -05002637 return false;
2638 }
2639
2640 if (readBuffer->getSamples() != 0 || drawBuffer->getSamples() != 0)
2641 {
Jamie Madill610640f2018-11-21 17:28:41 -05002642 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05002643 kBlitExtensionMultisampledDepthOrStencil);
Jamie Madillc29968b2016-01-20 11:17:23 -05002644 return false;
2645 }
2646 }
2647 }
2648 }
2649
2650 return ValidateBlitFramebufferParameters(context, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0,
2651 dstX1, dstY1, mask, filter);
Geoff Lange8ebe7f2013-08-05 15:03:13 -04002652}
Jamie Madillc29968b2016-01-20 11:17:23 -05002653
Jamie Madill5b772312018-03-08 20:28:32 -05002654bool ValidateClear(Context *context, GLbitfield mask)
Jamie Madillc29968b2016-01-20 11:17:23 -05002655{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002656 Framebuffer *fbo = context->getState().getDrawFramebuffer();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002657 const Extensions &extensions = context->getExtensions();
Jamie Madille98b1b52018-03-08 09:47:23 -05002658
Jamie Madill427064d2018-04-13 16:20:34 -04002659 if (!ValidateFramebufferComplete(context, fbo))
Jamie Madillc29968b2016-01-20 11:17:23 -05002660 {
Jamie Madillc29968b2016-01-20 11:17:23 -05002661 return false;
2662 }
2663
2664 if ((mask & ~(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) != 0)
2665 {
Jamie Madille0472f32018-11-27 16:32:45 -05002666 context->validationError(GL_INVALID_VALUE, kInvalidClearMask);
Jamie Madillc29968b2016-01-20 11:17:23 -05002667 return false;
2668 }
2669
Olli Etuaho94c91a92018-07-19 15:10:24 +03002670 if (extensions.webglCompatibility && (mask & GL_COLOR_BUFFER_BIT) != 0)
Geoff Lang76e65652017-03-27 14:58:02 -04002671 {
2672 constexpr GLenum validComponentTypes[] = {GL_FLOAT, GL_UNSIGNED_NORMALIZED,
2673 GL_SIGNED_NORMALIZED};
2674
Corentin Wallez59c41592017-07-11 13:19:54 -04002675 for (GLuint drawBufferIdx = 0; drawBufferIdx < fbo->getDrawbufferStateCount();
Geoff Lang76e65652017-03-27 14:58:02 -04002676 drawBufferIdx++)
2677 {
2678 if (!ValidateWebGLFramebufferAttachmentClearType(
2679 context, drawBufferIdx, validComponentTypes, ArraySize(validComponentTypes)))
2680 {
2681 return false;
2682 }
2683 }
2684 }
2685
Olli Etuaho94c91a92018-07-19 15:10:24 +03002686 if (extensions.multiview && extensions.disjointTimerQuery)
2687 {
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002688 const State &state = context->getState();
Olli Etuaho94c91a92018-07-19 15:10:24 +03002689 Framebuffer *framebuffer = state.getDrawFramebuffer();
2690 if (framebuffer->getNumViews() > 1 && state.isQueryActive(QueryType::TimeElapsed))
2691 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002692 context->validationError(GL_INVALID_OPERATION, kMultiviewTimerQuery);
Olli Etuaho94c91a92018-07-19 15:10:24 +03002693 return false;
2694 }
2695 }
2696
Jamie Madillc29968b2016-01-20 11:17:23 -05002697 return true;
2698}
2699
Jamie Madill5b772312018-03-08 20:28:32 -05002700bool ValidateDrawBuffersEXT(Context *context, GLsizei n, const GLenum *bufs)
Jamie Madillc29968b2016-01-20 11:17:23 -05002701{
2702 if (!context->getExtensions().drawBuffers)
2703 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002704 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillc29968b2016-01-20 11:17:23 -05002705 return false;
2706 }
2707
2708 return ValidateDrawBuffersBase(context, n, bufs);
2709}
2710
Jamie Madill73a84962016-02-12 09:27:23 -05002711bool ValidateTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002712 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002713 GLint level,
2714 GLint internalformat,
2715 GLsizei width,
2716 GLsizei height,
2717 GLint border,
2718 GLenum format,
2719 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002720 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002721{
Martin Radev1be913c2016-07-11 17:59:16 +03002722 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002723 {
2724 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
Geoff Langff5b2d52016-09-07 11:32:23 -04002725 0, 0, width, height, border, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002726 }
2727
Martin Radev1be913c2016-07-11 17:59:16 +03002728 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002729 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002730 0, 0, width, height, 1, border, format, type, -1,
2731 pixels);
2732}
2733
Brandon Jones416aaf92018-04-10 08:10:16 -07002734bool ValidateTexImage2DRobustANGLE(Context *context,
2735 TextureTarget target,
2736 GLint level,
2737 GLint internalformat,
2738 GLsizei width,
2739 GLsizei height,
2740 GLint border,
2741 GLenum format,
2742 GLenum type,
2743 GLsizei bufSize,
2744 const void *pixels)
Geoff Langff5b2d52016-09-07 11:32:23 -04002745{
2746 if (!ValidateRobustEntryPoint(context, bufSize))
2747 {
2748 return false;
2749 }
2750
2751 if (context->getClientMajorVersion() < 3)
2752 {
2753 return ValidateES2TexImageParameters(context, target, level, internalformat, false, false,
2754 0, 0, width, height, border, format, type, bufSize,
2755 pixels);
2756 }
2757
2758 ASSERT(context->getClientMajorVersion() >= 3);
2759 return ValidateES3TexImage2DParameters(context, target, level, internalformat, false, false, 0,
2760 0, 0, width, height, 1, border, format, type, bufSize,
2761 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002762}
2763
2764bool ValidateTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002765 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002766 GLint level,
2767 GLint xoffset,
2768 GLint yoffset,
2769 GLsizei width,
2770 GLsizei height,
2771 GLenum format,
2772 GLenum type,
Jamie Madill876429b2017-04-20 15:46:24 -04002773 const void *pixels)
Jamie Madill73a84962016-02-12 09:27:23 -05002774{
2775
Martin Radev1be913c2016-07-11 17:59:16 +03002776 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002777 {
2778 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002779 yoffset, width, height, 0, format, type, -1, pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002780 }
2781
Martin Radev1be913c2016-07-11 17:59:16 +03002782 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002783 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
Geoff Langff5b2d52016-09-07 11:32:23 -04002784 yoffset, 0, width, height, 1, 0, format, type, -1,
2785 pixels);
Jamie Madill73a84962016-02-12 09:27:23 -05002786}
2787
Geoff Langc52f6f12016-10-14 10:18:00 -04002788bool ValidateTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002789 TextureTarget target,
Geoff Langc52f6f12016-10-14 10:18:00 -04002790 GLint level,
2791 GLint xoffset,
2792 GLint yoffset,
2793 GLsizei width,
2794 GLsizei height,
2795 GLenum format,
2796 GLenum type,
2797 GLsizei bufSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002798 const void *pixels)
Geoff Langc52f6f12016-10-14 10:18:00 -04002799{
2800 if (!ValidateRobustEntryPoint(context, bufSize))
2801 {
2802 return false;
2803 }
2804
2805 if (context->getClientMajorVersion() < 3)
2806 {
2807 return ValidateES2TexImageParameters(context, target, level, GL_NONE, false, true, xoffset,
2808 yoffset, width, height, 0, format, type, bufSize,
2809 pixels);
2810 }
2811
2812 ASSERT(context->getClientMajorVersion() >= 3);
2813 return ValidateES3TexImage2DParameters(context, target, level, GL_NONE, false, true, xoffset,
2814 yoffset, 0, width, height, 1, 0, format, type, bufSize,
2815 pixels);
2816}
2817
Jamie Madill73a84962016-02-12 09:27:23 -05002818bool ValidateCompressedTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002819 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002820 GLint level,
2821 GLenum internalformat,
2822 GLsizei width,
2823 GLsizei height,
2824 GLint border,
2825 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002826 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05002827{
Martin Radev1be913c2016-07-11 17:59:16 +03002828 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002829 {
2830 if (!ValidateES2TexImageParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002831 0, width, height, border, GL_NONE, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05002832 {
2833 return false;
2834 }
2835 }
2836 else
2837 {
Martin Radev1be913c2016-07-11 17:59:16 +03002838 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002839 if (!ValidateES3TexImage2DParameters(context, target, level, internalformat, true, false, 0,
Geoff Langff5b2d52016-09-07 11:32:23 -04002840 0, 0, width, height, 1, border, GL_NONE, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05002841 data))
2842 {
2843 return false;
2844 }
2845 }
2846
Geoff Langca271392017-04-05 12:30:00 -04002847 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
Jamie Madillca2ff382018-07-11 09:01:17 -04002848
2849 GLuint blockSize = 0;
2850 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04002851 {
Jamie Madille0472f32018-11-27 16:32:45 -05002852 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04002853 return false;
2854 }
2855
Jamie Madillca2ff382018-07-11 09:01:17 -04002856 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05002857 {
Jamie Madille0472f32018-11-27 16:32:45 -05002858 context->validationError(GL_INVALID_VALUE, kCompressedTextureDimensionsMustMatchData);
Jamie Madill73a84962016-02-12 09:27:23 -05002859 return false;
2860 }
2861
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002862 if (target == TextureTarget::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002863 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002864 context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04002865 return false;
2866 }
2867
Jamie Madill73a84962016-02-12 09:27:23 -05002868 return true;
2869}
2870
Corentin Wallezb2931602017-04-11 15:58:57 -04002871bool ValidateCompressedTexImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002872 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04002873 GLint level,
2874 GLenum internalformat,
2875 GLsizei width,
2876 GLsizei height,
2877 GLint border,
2878 GLsizei imageSize,
2879 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002880 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04002881{
2882 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
2883 {
2884 return false;
2885 }
2886
2887 return ValidateCompressedTexImage2D(context, target, level, internalformat, width, height,
2888 border, imageSize, data);
2889}
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002890
Corentin Wallezb2931602017-04-11 15:58:57 -04002891bool ValidateCompressedTexSubImage2DRobustANGLE(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002892 TextureTarget target,
Corentin Wallezb2931602017-04-11 15:58:57 -04002893 GLint level,
2894 GLint xoffset,
2895 GLint yoffset,
2896 GLsizei width,
2897 GLsizei height,
2898 GLenum format,
2899 GLsizei imageSize,
2900 GLsizei dataSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002901 const void *data)
Corentin Wallezb2931602017-04-11 15:58:57 -04002902{
2903 if (!ValidateRobustCompressedTexImageBase(context, imageSize, dataSize))
2904 {
2905 return false;
2906 }
2907
2908 return ValidateCompressedTexSubImage2D(context, target, level, xoffset, yoffset, width, height,
2909 format, imageSize, data);
2910}
2911
Jamie Madill73a84962016-02-12 09:27:23 -05002912bool ValidateCompressedTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08002913 TextureTarget target,
Jamie Madill73a84962016-02-12 09:27:23 -05002914 GLint level,
2915 GLint xoffset,
2916 GLint yoffset,
2917 GLsizei width,
2918 GLsizei height,
2919 GLenum format,
2920 GLsizei imageSize,
Jamie Madill876429b2017-04-20 15:46:24 -04002921 const void *data)
Jamie Madill73a84962016-02-12 09:27:23 -05002922{
Martin Radev1be913c2016-07-11 17:59:16 +03002923 if (context->getClientMajorVersion() < 3)
Jamie Madill73a84962016-02-12 09:27:23 -05002924 {
2925 if (!ValidateES2TexImageParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04002926 yoffset, width, height, 0, format, GL_NONE, -1, data))
Jamie Madill73a84962016-02-12 09:27:23 -05002927 {
2928 return false;
2929 }
2930 }
2931 else
2932 {
Martin Radev1be913c2016-07-11 17:59:16 +03002933 ASSERT(context->getClientMajorVersion() >= 3);
Jamie Madill73a84962016-02-12 09:27:23 -05002934 if (!ValidateES3TexImage2DParameters(context, target, level, GL_NONE, true, true, xoffset,
Geoff Lang966c9402017-04-18 12:38:27 -04002935 yoffset, 0, width, height, 1, 0, format, GL_NONE, -1,
Jamie Madill73a84962016-02-12 09:27:23 -05002936 data))
2937 {
2938 return false;
2939 }
2940 }
2941
Geoff Langca271392017-04-05 12:30:00 -04002942 const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
Jamie Madillca2ff382018-07-11 09:01:17 -04002943 GLuint blockSize = 0;
2944 if (!formatInfo.computeCompressedImageSize(gl::Extents(width, height, 1), &blockSize))
Jamie Madille2e406c2016-06-02 13:04:10 -04002945 {
Jamie Madille0472f32018-11-27 16:32:45 -05002946 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Jamie Madille2e406c2016-06-02 13:04:10 -04002947 return false;
2948 }
2949
Jamie Madillca2ff382018-07-11 09:01:17 -04002950 if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
Jamie Madill73a84962016-02-12 09:27:23 -05002951 {
Jamie Madille0472f32018-11-27 16:32:45 -05002952 context->validationError(GL_INVALID_VALUE, kInvalidCompressedImageSize);
Jamie Madill73a84962016-02-12 09:27:23 -05002953 return false;
2954 }
2955
2956 return true;
2957}
2958
Corentin Wallez336129f2017-10-17 15:55:40 -04002959bool ValidateGetBufferPointervOES(Context *context,
2960 BufferBinding target,
2961 GLenum pname,
2962 void **params)
Olli Etuaho4f667482016-03-30 15:56:35 +03002963{
Jamie Madillc3e37312018-11-30 15:25:39 -05002964 if (!context->getExtensions().mapBuffer)
2965 {
2966 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
2967 return false;
2968 }
2969
Geoff Lang496c02d2016-10-20 11:38:11 -07002970 return ValidateGetBufferPointervBase(context, target, pname, nullptr, params);
Olli Etuaho4f667482016-03-30 15:56:35 +03002971}
2972
Corentin Wallez336129f2017-10-17 15:55:40 -04002973bool ValidateMapBufferOES(Context *context, BufferBinding target, GLenum access)
Olli Etuaho4f667482016-03-30 15:56:35 +03002974{
2975 if (!context->getExtensions().mapBuffer)
2976 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002977 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03002978 return false;
2979 }
2980
Corentin Walleze4477002017-12-01 14:39:58 -05002981 if (!context->isValidBufferBinding(target))
Olli Etuaho4f667482016-03-30 15:56:35 +03002982 {
Jamie Madille0472f32018-11-27 16:32:45 -05002983 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Olli Etuaho4f667482016-03-30 15:56:35 +03002984 return false;
2985 }
2986
Jamie Madillc3dc5d42018-12-30 12:12:04 -05002987 Buffer *buffer = context->getState().getTargetBuffer(target);
Olli Etuaho4f667482016-03-30 15:56:35 +03002988
2989 if (buffer == nullptr)
2990 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002991 context->validationError(GL_INVALID_OPERATION, kBufferNotMappable);
Olli Etuaho4f667482016-03-30 15:56:35 +03002992 return false;
2993 }
2994
2995 if (access != GL_WRITE_ONLY_OES)
2996 {
Jamie Madillc3e37312018-11-30 15:25:39 -05002997 context->validationError(GL_INVALID_ENUM, kInvalidAccessBits);
Olli Etuaho4f667482016-03-30 15:56:35 +03002998 return false;
2999 }
3000
3001 if (buffer->isMapped())
3002 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003003 context->validationError(GL_INVALID_OPERATION, kBufferAlreadyMapped);
Olli Etuaho4f667482016-03-30 15:56:35 +03003004 return false;
3005 }
3006
Geoff Lang79f71042017-08-14 16:43:43 -04003007 return ValidateMapBufferBase(context, target);
Olli Etuaho4f667482016-03-30 15:56:35 +03003008}
3009
Corentin Wallez336129f2017-10-17 15:55:40 -04003010bool ValidateUnmapBufferOES(Context *context, BufferBinding target)
Olli Etuaho4f667482016-03-30 15:56:35 +03003011{
3012 if (!context->getExtensions().mapBuffer)
3013 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003014 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003015 return false;
3016 }
3017
3018 return ValidateUnmapBufferBase(context, target);
3019}
3020
3021bool ValidateMapBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003022 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003023 GLintptr offset,
3024 GLsizeiptr length,
3025 GLbitfield access)
3026{
3027 if (!context->getExtensions().mapBufferRange)
3028 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003029 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003030 return false;
3031 }
3032
3033 return ValidateMapBufferRangeBase(context, target, offset, length, access);
3034}
3035
Michael Spang7a8c3e52019-04-03 14:49:57 -04003036bool ValidateBufferStorageMemEXT(Context *context,
3037 TextureType target,
3038 GLsizeiptr size,
3039 GLuint memory,
3040 GLuint64 offset)
3041{
3042 if (!context->getExtensions().memoryObject)
3043 {
3044 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3045 return false;
3046 }
3047
3048 UNIMPLEMENTED();
3049 return false;
3050}
3051
3052bool ValidateCreateMemoryObjectsEXT(Context *context, GLsizei n, GLuint *memoryObjects)
3053{
3054 if (!context->getExtensions().memoryObject)
3055 {
3056 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3057 return false;
3058 }
3059
Michael Spangfb201c52019-04-03 14:57:35 -04003060 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003061}
3062
3063bool ValidateDeleteMemoryObjectsEXT(Context *context, GLsizei n, const GLuint *memoryObjects)
3064{
3065 if (!context->getExtensions().memoryObject)
3066 {
3067 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3068 return false;
3069 }
3070
Michael Spangfb201c52019-04-03 14:57:35 -04003071 return ValidateGenOrDelete(context, n);
Michael Spang7a8c3e52019-04-03 14:49:57 -04003072}
3073
3074bool ValidateGetMemoryObjectParameterivEXT(Context *context,
3075 GLuint memoryObject,
3076 GLenum pname,
3077 GLint *params)
3078{
3079 if (!context->getExtensions().memoryObject)
3080 {
3081 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3082 return false;
3083 }
3084
3085 UNIMPLEMENTED();
3086 return false;
3087}
3088
3089bool ValidateGetUnsignedBytevEXT(Context *context, GLenum pname, GLubyte *data)
3090{
3091 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3092 {
3093 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3094 return false;
3095 }
3096
3097 UNIMPLEMENTED();
3098 return false;
3099}
3100
3101bool ValidateGetUnsignedBytei_vEXT(Context *context, GLenum target, GLuint index, GLubyte *data)
3102{
3103 if (!context->getExtensions().memoryObject && !context->getExtensions().semaphore)
3104 {
3105 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3106 return false;
3107 }
3108
3109 UNIMPLEMENTED();
3110 return false;
3111}
3112
3113bool ValidateIsMemoryObjectEXT(Context *context, GLuint memoryObject)
3114{
3115 if (!context->getExtensions().memoryObject)
3116 {
3117 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3118 return false;
3119 }
3120
Michael Spangfb201c52019-04-03 14:57:35 -04003121 return true;
Michael Spang7a8c3e52019-04-03 14:49:57 -04003122}
3123
3124bool ValidateMemoryObjectParameterivEXT(Context *context,
3125 GLuint memoryObject,
3126 GLenum pname,
3127 const GLint *params)
3128{
3129 if (!context->getExtensions().memoryObject)
3130 {
3131 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3132 return false;
3133 }
3134
3135 UNIMPLEMENTED();
3136 return false;
3137}
3138
3139bool ValidateTexStorageMem2DEXT(Context *context,
3140 TextureType target,
3141 GLsizei levels,
3142 GLenum internalFormat,
3143 GLsizei width,
3144 GLsizei height,
3145 GLuint memory,
3146 GLuint64 offset)
3147{
3148 if (!context->getExtensions().memoryObject)
3149 {
3150 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3151 return false;
3152 }
3153
3154 UNIMPLEMENTED();
3155 return false;
3156}
3157
3158bool ValidateTexStorageMem3DEXT(Context *context,
3159 TextureType target,
3160 GLsizei levels,
3161 GLenum internalFormat,
3162 GLsizei width,
3163 GLsizei height,
3164 GLsizei depth,
3165 GLuint memory,
3166 GLuint64 offset)
3167{
3168 if (!context->getExtensions().memoryObject)
3169 {
3170 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3171 return false;
3172 }
3173
3174 UNIMPLEMENTED();
3175 return false;
3176}
3177
Michael Spang9de3ddb2019-04-03 16:23:40 -04003178bool ValidateImportMemoryFdEXT(Context *context,
3179 GLuint memory,
3180 GLuint64 size,
3181 GLenum handleType,
3182 GLint fd)
3183{
3184 if (!context->getExtensions().memoryObjectFd)
3185 {
3186 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3187 return false;
3188 }
3189
3190 UNIMPLEMENTED();
3191 return false;
3192}
3193
Michael Spang7a8c3e52019-04-03 14:49:57 -04003194bool ValidateDeleteSemaphoresEXT(Context *context, GLsizei n, const GLuint *semaphores)
3195{
3196 if (!context->getExtensions().semaphore)
3197 {
3198 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3199 return false;
3200 }
3201
3202 UNIMPLEMENTED();
3203 return false;
3204}
3205
3206bool ValidateGenSemaphoresEXT(Context *context, GLsizei n, GLuint *semaphores)
3207{
3208 if (!context->getExtensions().semaphore)
3209 {
3210 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3211 return false;
3212 }
3213
3214 UNIMPLEMENTED();
3215 return false;
3216}
3217
3218bool ValidateGetSemaphoreParameterui64vEXT(Context *context,
3219 GLuint semaphore,
3220 GLenum pname,
3221 GLuint64 *params)
3222{
3223 if (!context->getExtensions().semaphore)
3224 {
3225 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3226 return false;
3227 }
3228
3229 UNIMPLEMENTED();
3230 return false;
3231}
3232
3233bool ValidateIsSemaphoreEXT(Context *context, GLuint semaphore)
3234{
3235 if (!context->getExtensions().semaphore)
3236 {
3237 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3238 return false;
3239 }
3240
3241 UNIMPLEMENTED();
3242 return false;
3243}
3244
3245bool ValidateSemaphoreParameterui64vEXT(Context *context,
3246 GLuint semaphore,
3247 GLenum pname,
3248 const GLuint64 *params)
3249{
3250 if (!context->getExtensions().semaphore)
3251 {
3252 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3253 return false;
3254 }
3255
3256 UNIMPLEMENTED();
3257 return false;
3258}
3259
3260bool ValidateSignalSemaphoreEXT(Context *context,
3261 GLuint semaphore,
3262 GLuint numBufferBarriers,
3263 const GLuint *buffers,
3264 GLuint numTextureBarriers,
3265 const GLuint *textures,
3266 const GLenum *dstLayouts)
3267{
3268 if (!context->getExtensions().semaphore)
3269 {
3270 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3271 return false;
3272 }
3273
3274 UNIMPLEMENTED();
3275 return false;
3276}
3277
3278bool ValidateWaitSemaphoreEXT(Context *context,
3279 GLuint semaphore,
3280 GLuint numBufferBarriers,
3281 const GLuint *buffers,
3282 GLuint numTextureBarriers,
3283 const GLuint *textures,
3284 const GLenum *srcLayouts)
3285{
3286 if (!context->getExtensions().semaphore)
3287 {
3288 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3289 return false;
3290 }
3291
3292 UNIMPLEMENTED();
3293 return false;
3294}
3295
Michael Spang9de3ddb2019-04-03 16:23:40 -04003296bool ValidateImportSemaphoreFdEXT(Context *context, GLuint semaphore, GLenum handleType, GLint fd)
3297{
3298 if (!context->getExtensions().semaphoreFd)
3299 {
3300 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
3301 return false;
3302 }
3303
3304 UNIMPLEMENTED();
3305 return false;
3306}
3307
Corentin Wallez336129f2017-10-17 15:55:40 -04003308bool ValidateMapBufferBase(Context *context, BufferBinding target)
Geoff Lang79f71042017-08-14 16:43:43 -04003309{
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003310 Buffer *buffer = context->getState().getTargetBuffer(target);
Geoff Lang79f71042017-08-14 16:43:43 -04003311 ASSERT(buffer != nullptr);
3312
3313 // Check if this buffer is currently being used as a transform feedback output buffer
Jamie Madillc3dc5d42018-12-30 12:12:04 -05003314 TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
Geoff Lang79f71042017-08-14 16:43:43 -04003315 if (transformFeedback != nullptr && transformFeedback->isActive())
3316 {
3317 for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3318 {
3319 const auto &transformFeedbackBuffer = transformFeedback->getIndexedBuffer(i);
3320 if (transformFeedbackBuffer.get() == buffer)
3321 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003322 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
Geoff Lang79f71042017-08-14 16:43:43 -04003323 return false;
3324 }
3325 }
3326 }
3327
James Darpiniane8a93c62018-01-04 18:02:24 -08003328 if (context->getExtensions().webglCompatibility &&
3329 buffer->isBoundForTransformFeedbackAndOtherUse())
3330 {
Jamie Madille0472f32018-11-27 16:32:45 -05003331 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08003332 return false;
3333 }
3334
Geoff Lang79f71042017-08-14 16:43:43 -04003335 return true;
3336}
3337
Olli Etuaho4f667482016-03-30 15:56:35 +03003338bool ValidateFlushMappedBufferRangeEXT(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04003339 BufferBinding target,
Olli Etuaho4f667482016-03-30 15:56:35 +03003340 GLintptr offset,
3341 GLsizeiptr length)
3342{
3343 if (!context->getExtensions().mapBufferRange)
3344 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003345 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Olli Etuaho4f667482016-03-30 15:56:35 +03003346 return false;
3347 }
3348
3349 return ValidateFlushMappedBufferRangeBase(context, target, offset, length);
3350}
3351
Geoff Langd8605522016-04-13 10:19:12 -04003352bool ValidateBindUniformLocationCHROMIUM(Context *context,
3353 GLuint program,
3354 GLint location,
3355 const GLchar *name)
3356{
3357 if (!context->getExtensions().bindUniformLocation)
3358 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003359 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langd8605522016-04-13 10:19:12 -04003360 return false;
3361 }
3362
3363 Program *programObject = GetValidProgram(context, program);
3364 if (!programObject)
3365 {
3366 return false;
3367 }
3368
3369 if (location < 0)
3370 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003371 context->validationError(GL_INVALID_VALUE, kNegativeLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003372 return false;
3373 }
3374
3375 const Caps &caps = context->getCaps();
3376 if (static_cast<size_t>(location) >=
3377 (caps.maxVertexUniformVectors + caps.maxFragmentUniformVectors) * 4)
3378 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003379 context->validationError(GL_INVALID_VALUE, kInvalidBindUniformLocation);
Geoff Langd8605522016-04-13 10:19:12 -04003380 return false;
3381 }
3382
Geoff Langfc32e8b2017-05-31 14:16:59 -04003383 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
3384 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04003385 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04003386 {
Jamie Madille0472f32018-11-27 16:32:45 -05003387 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04003388 return false;
3389 }
3390
Geoff Langd8605522016-04-13 10:19:12 -04003391 if (strncmp(name, "gl_", 3) == 0)
3392 {
Jamie Madille0472f32018-11-27 16:32:45 -05003393 context->validationError(GL_INVALID_VALUE, kNameBeginsWithGL);
Geoff Langd8605522016-04-13 10:19:12 -04003394 return false;
3395 }
3396
3397 return true;
3398}
3399
Jamie Madille2e406c2016-06-02 13:04:10 -04003400bool ValidateCoverageModulationCHROMIUM(Context *context, GLenum components)
Sami Väisänena797e062016-05-12 15:23:40 +03003401{
3402 if (!context->getExtensions().framebufferMixedSamples)
3403 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003404 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänena797e062016-05-12 15:23:40 +03003405 return false;
3406 }
3407 switch (components)
3408 {
3409 case GL_RGB:
3410 case GL_RGBA:
3411 case GL_ALPHA:
3412 case GL_NONE:
3413 break;
3414 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003415 context->validationError(GL_INVALID_ENUM, kInvalidCoverageComponents);
Sami Väisänena797e062016-05-12 15:23:40 +03003416 return false;
3417 }
3418
3419 return true;
3420}
3421
Sami Väisänene45e53b2016-05-25 10:36:04 +03003422// CHROMIUM_path_rendering
3423
Jamie Madill007530e2017-12-28 14:27:04 -05003424bool ValidateMatrixLoadfCHROMIUM(Context *context, GLenum matrixMode, const GLfloat *matrix)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003425{
Jamie Madill007530e2017-12-28 14:27:04 -05003426 if (!ValidateMatrixMode(context, matrixMode))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003427 {
Sami Väisänene45e53b2016-05-25 10:36:04 +03003428 return false;
3429 }
Jamie Madill007530e2017-12-28 14:27:04 -05003430
Sami Väisänene45e53b2016-05-25 10:36:04 +03003431 if (matrix == nullptr)
3432 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003433 context->validationError(GL_INVALID_OPERATION, kInvalidPathMatrix);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003434 return false;
3435 }
Jamie Madill007530e2017-12-28 14:27:04 -05003436
Sami Väisänene45e53b2016-05-25 10:36:04 +03003437 return true;
3438}
3439
Jamie Madill007530e2017-12-28 14:27:04 -05003440bool ValidateMatrixLoadIdentityCHROMIUM(Context *context, GLenum matrixMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003441{
Jamie Madill007530e2017-12-28 14:27:04 -05003442 return ValidateMatrixMode(context, matrixMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003443}
3444
Jamie Madill007530e2017-12-28 14:27:04 -05003445bool ValidateGenPathsCHROMIUM(Context *context, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003446{
3447 if (!context->getExtensions().pathRendering)
3448 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003449 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003450 return false;
3451 }
3452
3453 // range = 0 is undefined in NV_path_rendering.
3454 // we add stricter semantic check here and require a non zero positive range.
3455 if (range <= 0)
3456 {
Jamie Madille0472f32018-11-27 16:32:45 -05003457 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003458 return false;
3459 }
3460
3461 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range))
3462 {
Jamie Madille0472f32018-11-27 16:32:45 -05003463 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003464 return false;
3465 }
3466
3467 return true;
3468}
3469
Jamie Madill007530e2017-12-28 14:27:04 -05003470bool ValidateDeletePathsCHROMIUM(Context *context, GLuint path, GLsizei range)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003471{
3472 if (!context->getExtensions().pathRendering)
3473 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003474 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003475 return false;
3476 }
3477
3478 // range = 0 is undefined in NV_path_rendering.
3479 // we add stricter semantic check here and require a non zero positive range.
3480 if (range <= 0)
3481 {
Jamie Madille0472f32018-11-27 16:32:45 -05003482 context->validationError(GL_INVALID_VALUE, kInvalidRange);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003483 return false;
3484 }
3485
3486 angle::CheckedNumeric<std::uint32_t> checkedRange(path);
3487 checkedRange += range;
3488
3489 if (!angle::IsValueInRangeForNumericType<std::uint32_t>(range) || !checkedRange.IsValid())
3490 {
Jamie Madille0472f32018-11-27 16:32:45 -05003491 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003492 return false;
3493 }
3494 return true;
3495}
3496
Jamie Madill007530e2017-12-28 14:27:04 -05003497bool ValidatePathCommandsCHROMIUM(Context *context,
3498 GLuint path,
3499 GLsizei numCommands,
3500 const GLubyte *commands,
3501 GLsizei numCoords,
3502 GLenum coordType,
3503 const void *coords)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003504{
3505 if (!context->getExtensions().pathRendering)
3506 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003507 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003508 return false;
3509 }
Brandon Jones59770802018-04-02 13:18:42 -07003510 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003511 {
Jamie Madille0472f32018-11-27 16:32:45 -05003512 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003513 return false;
3514 }
3515
3516 if (numCommands < 0)
3517 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003518 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCommands);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003519 return false;
3520 }
3521 else if (numCommands > 0)
3522 {
3523 if (!commands)
3524 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003525 context->validationError(GL_INVALID_VALUE, kInvalidPathCommandsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003526 return false;
3527 }
3528 }
3529
3530 if (numCoords < 0)
3531 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003532 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003533 return false;
3534 }
3535 else if (numCoords > 0)
3536 {
3537 if (!coords)
3538 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003539 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoordsArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003540 return false;
3541 }
3542 }
3543
3544 std::uint32_t coordTypeSize = 0;
3545 switch (coordType)
3546 {
3547 case GL_BYTE:
3548 coordTypeSize = sizeof(GLbyte);
3549 break;
3550
3551 case GL_UNSIGNED_BYTE:
3552 coordTypeSize = sizeof(GLubyte);
3553 break;
3554
3555 case GL_SHORT:
3556 coordTypeSize = sizeof(GLshort);
3557 break;
3558
3559 case GL_UNSIGNED_SHORT:
3560 coordTypeSize = sizeof(GLushort);
3561 break;
3562
3563 case GL_FLOAT:
3564 coordTypeSize = sizeof(GLfloat);
3565 break;
3566
3567 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003568 context->validationError(GL_INVALID_ENUM, kInvalidPathCoordinateType);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003569 return false;
3570 }
3571
3572 angle::CheckedNumeric<std::uint32_t> checkedSize(numCommands);
3573 checkedSize += (coordTypeSize * numCoords);
3574 if (!checkedSize.IsValid())
3575 {
Jamie Madille0472f32018-11-27 16:32:45 -05003576 context->validationError(GL_INVALID_OPERATION, kIntegerOverflow);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003577 return false;
3578 }
3579
3580 // early return skips command data validation when it doesn't exist.
3581 if (!commands)
3582 return true;
3583
3584 GLsizei expectedNumCoords = 0;
3585 for (GLsizei i = 0; i < numCommands; ++i)
3586 {
3587 switch (commands[i])
3588 {
3589 case GL_CLOSE_PATH_CHROMIUM: // no coordinates.
3590 break;
3591 case GL_MOVE_TO_CHROMIUM:
3592 case GL_LINE_TO_CHROMIUM:
3593 expectedNumCoords += 2;
3594 break;
3595 case GL_QUADRATIC_CURVE_TO_CHROMIUM:
3596 expectedNumCoords += 4;
3597 break;
3598 case GL_CUBIC_CURVE_TO_CHROMIUM:
3599 expectedNumCoords += 6;
3600 break;
3601 case GL_CONIC_CURVE_TO_CHROMIUM:
3602 expectedNumCoords += 5;
3603 break;
3604 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003605 context->validationError(GL_INVALID_ENUM, kInvalidPathCommand);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003606 return false;
3607 }
3608 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003609
Sami Väisänene45e53b2016-05-25 10:36:04 +03003610 if (expectedNumCoords != numCoords)
3611 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003612 context->validationError(GL_INVALID_VALUE, kInvalidPathNumCoords);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003613 return false;
3614 }
3615
3616 return true;
3617}
3618
Jamie Madill007530e2017-12-28 14:27:04 -05003619bool ValidatePathParameterfCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003620{
3621 if (!context->getExtensions().pathRendering)
3622 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003623 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003624 return false;
3625 }
Brandon Jones59770802018-04-02 13:18:42 -07003626 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003627 {
Jamie Madille0472f32018-11-27 16:32:45 -05003628 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003629 return false;
3630 }
3631
3632 switch (pname)
3633 {
3634 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3635 if (value < 0.0f)
3636 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003637 context->validationError(GL_INVALID_VALUE, kInvalidPathStrokeWidth);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003638 return false;
3639 }
3640 break;
3641 case GL_PATH_END_CAPS_CHROMIUM:
3642 switch (static_cast<GLenum>(value))
3643 {
3644 case GL_FLAT_CHROMIUM:
3645 case GL_SQUARE_CHROMIUM:
3646 case GL_ROUND_CHROMIUM:
3647 break;
3648 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003649 context->validationError(GL_INVALID_ENUM, kInvalidPathEndCaps);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003650 return false;
3651 }
3652 break;
3653 case GL_PATH_JOIN_STYLE_CHROMIUM:
3654 switch (static_cast<GLenum>(value))
3655 {
3656 case GL_MITER_REVERT_CHROMIUM:
3657 case GL_BEVEL_CHROMIUM:
3658 case GL_ROUND_CHROMIUM:
3659 break;
3660 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003661 context->validationError(GL_INVALID_ENUM, kInvalidPathJoinStyle);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003662 return false;
3663 }
Nico Weber41b072b2018-02-09 10:01:32 -05003664 break;
Sami Väisänene45e53b2016-05-25 10:36:04 +03003665 case GL_PATH_MITER_LIMIT_CHROMIUM:
3666 if (value < 0.0f)
3667 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003668 context->validationError(GL_INVALID_VALUE, kInvalidPathMiterLimit);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003669 return false;
3670 }
3671 break;
3672
3673 case GL_PATH_STROKE_BOUND_CHROMIUM:
3674 // no errors, only clamping.
3675 break;
3676
3677 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003678 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003679 return false;
3680 }
3681 return true;
3682}
3683
Jamie Madill007530e2017-12-28 14:27:04 -05003684bool ValidatePathParameteriCHROMIUM(Context *context, GLuint path, GLenum pname, GLint value)
3685{
3686 // TODO(jmadill): Use proper clamping cast.
3687 return ValidatePathParameterfCHROMIUM(context, path, pname, static_cast<GLfloat>(value));
3688}
3689
3690bool ValidateGetPathParameterfvCHROMIUM(Context *context, GLuint path, GLenum pname, GLfloat *value)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003691{
3692 if (!context->getExtensions().pathRendering)
3693 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003694 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003695 return false;
3696 }
3697
Brandon Jones59770802018-04-02 13:18:42 -07003698 if (!context->isPathGenerated(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003699 {
Jamie Madille0472f32018-11-27 16:32:45 -05003700 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003701 return false;
3702 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003703
Sami Väisänene45e53b2016-05-25 10:36:04 +03003704 if (!value)
3705 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003706 context->validationError(GL_INVALID_VALUE, kInvalidPathValueArray);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003707 return false;
3708 }
3709
3710 switch (pname)
3711 {
3712 case GL_PATH_STROKE_WIDTH_CHROMIUM:
3713 case GL_PATH_END_CAPS_CHROMIUM:
3714 case GL_PATH_JOIN_STYLE_CHROMIUM:
3715 case GL_PATH_MITER_LIMIT_CHROMIUM:
3716 case GL_PATH_STROKE_BOUND_CHROMIUM:
3717 break;
3718
3719 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05003720 context->validationError(GL_INVALID_ENUM, kInvalidPathParameter);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003721 return false;
3722 }
3723
3724 return true;
3725}
3726
Jamie Madill007530e2017-12-28 14:27:04 -05003727bool ValidateGetPathParameterivCHROMIUM(Context *context, GLuint path, GLenum pname, GLint *value)
3728{
3729 return ValidateGetPathParameterfvCHROMIUM(context, path, pname,
3730 reinterpret_cast<GLfloat *>(value));
3731}
3732
3733bool ValidatePathStencilFuncCHROMIUM(Context *context, GLenum func, GLint ref, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003734{
3735 if (!context->getExtensions().pathRendering)
3736 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003737 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003738 return false;
3739 }
3740
3741 switch (func)
3742 {
3743 case GL_NEVER:
3744 case GL_ALWAYS:
3745 case GL_LESS:
3746 case GL_LEQUAL:
3747 case GL_EQUAL:
3748 case GL_GEQUAL:
3749 case GL_GREATER:
3750 case GL_NOTEQUAL:
3751 break;
3752 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003753 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003754 return false;
3755 }
3756
3757 return true;
3758}
3759
3760// Note that the spec specifies that for the path drawing commands
3761// if the path object is not an existing path object the command
3762// does nothing and no error is generated.
3763// However if the path object exists but has not been specified any
3764// commands then an error is generated.
3765
Jamie Madill007530e2017-12-28 14:27:04 -05003766bool ValidateStencilFillPathCHROMIUM(Context *context, GLuint path, GLenum fillMode, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003767{
3768 if (!context->getExtensions().pathRendering)
3769 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003770 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003771 return false;
3772 }
Brandon Jones59770802018-04-02 13:18:42 -07003773 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003774 {
Jamie Madille0472f32018-11-27 16:32:45 -05003775 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003776 return false;
3777 }
3778
3779 switch (fillMode)
3780 {
3781 case GL_COUNT_UP_CHROMIUM:
3782 case GL_COUNT_DOWN_CHROMIUM:
3783 break;
3784 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003785 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003786 return false;
3787 }
3788
3789 if (!isPow2(mask + 1))
3790 {
Jamie Madille0472f32018-11-27 16:32:45 -05003791 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003792 return false;
3793 }
3794
3795 return true;
3796}
3797
Jamie Madill007530e2017-12-28 14:27:04 -05003798bool ValidateStencilStrokePathCHROMIUM(Context *context, GLuint path, GLint reference, GLuint mask)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003799{
3800 if (!context->getExtensions().pathRendering)
3801 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003802 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003803 return false;
3804 }
Jamie Madillc3e37312018-11-30 15:25:39 -05003805
Brandon Jones59770802018-04-02 13:18:42 -07003806 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003807 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003808 context->validationError(GL_INVALID_OPERATION, kNoPathOrNoPathData);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003809 return false;
3810 }
3811
3812 return true;
3813}
3814
Jamie Madill007530e2017-12-28 14:27:04 -05003815bool ValidateCoverPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003816{
3817 if (!context->getExtensions().pathRendering)
3818 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003819 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003820 return false;
3821 }
Brandon Jones59770802018-04-02 13:18:42 -07003822 if (context->isPathGenerated(path) && !context->isPath(path))
Sami Väisänene45e53b2016-05-25 10:36:04 +03003823 {
Jamie Madille0472f32018-11-27 16:32:45 -05003824 context->validationError(GL_INVALID_OPERATION, kNoSuchPath);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003825 return false;
3826 }
3827
3828 switch (coverMode)
3829 {
3830 case GL_CONVEX_HULL_CHROMIUM:
3831 case GL_BOUNDING_BOX_CHROMIUM:
3832 break;
3833 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003834 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003835 return false;
3836 }
3837 return true;
3838}
3839
Jamie Madill778bf092018-11-14 09:54:36 -05003840bool ValidateCoverFillPathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3841{
3842 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3843}
3844
3845bool ValidateCoverStrokePathCHROMIUM(Context *context, GLuint path, GLenum coverMode)
3846{
3847 return ValidateCoverPathCHROMIUM(context, path, coverMode);
3848}
3849
Jamie Madill007530e2017-12-28 14:27:04 -05003850bool ValidateStencilThenCoverFillPathCHROMIUM(Context *context,
3851 GLuint path,
3852 GLenum fillMode,
3853 GLuint mask,
3854 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003855{
Jamie Madill007530e2017-12-28 14:27:04 -05003856 return ValidateStencilFillPathCHROMIUM(context, path, fillMode, mask) &&
3857 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003858}
3859
Jamie Madill007530e2017-12-28 14:27:04 -05003860bool ValidateStencilThenCoverStrokePathCHROMIUM(Context *context,
3861 GLuint path,
3862 GLint reference,
3863 GLuint mask,
3864 GLenum coverMode)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003865{
Jamie Madill007530e2017-12-28 14:27:04 -05003866 return ValidateStencilStrokePathCHROMIUM(context, path, reference, mask) &&
3867 ValidateCoverPathCHROMIUM(context, path, coverMode);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003868}
3869
Brandon Jonesd1049182018-03-28 10:02:20 -07003870bool ValidateIsPathCHROMIUM(Context *context, GLuint path)
Sami Väisänene45e53b2016-05-25 10:36:04 +03003871{
3872 if (!context->getExtensions().pathRendering)
3873 {
Jamie Madillc3e37312018-11-30 15:25:39 -05003874 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänene45e53b2016-05-25 10:36:04 +03003875 return false;
3876 }
3877 return true;
3878}
3879
Jamie Madill007530e2017-12-28 14:27:04 -05003880bool ValidateCoverFillPathInstancedCHROMIUM(Context *context,
3881 GLsizei numPaths,
3882 GLenum pathNameType,
3883 const void *paths,
3884 GLuint pathBase,
3885 GLenum coverMode,
3886 GLenum transformType,
3887 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003888{
3889 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3890 transformType, transformValues))
3891 return false;
3892
3893 switch (coverMode)
3894 {
3895 case GL_CONVEX_HULL_CHROMIUM:
3896 case GL_BOUNDING_BOX_CHROMIUM:
3897 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3898 break;
3899 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003900 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003901 return false;
3902 }
3903
3904 return true;
3905}
3906
Jamie Madill007530e2017-12-28 14:27:04 -05003907bool ValidateCoverStrokePathInstancedCHROMIUM(Context *context,
3908 GLsizei numPaths,
3909 GLenum pathNameType,
3910 const void *paths,
3911 GLuint pathBase,
3912 GLenum coverMode,
3913 GLenum transformType,
3914 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003915{
3916 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3917 transformType, transformValues))
3918 return false;
3919
3920 switch (coverMode)
3921 {
3922 case GL_CONVEX_HULL_CHROMIUM:
3923 case GL_BOUNDING_BOX_CHROMIUM:
3924 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
3925 break;
3926 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003927 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003928 return false;
3929 }
3930
3931 return true;
3932}
3933
Jamie Madill007530e2017-12-28 14:27:04 -05003934bool ValidateStencilFillPathInstancedCHROMIUM(Context *context,
3935 GLsizei numPaths,
3936 GLenum pathNameType,
3937 const void *paths,
3938 GLuint pathBase,
3939 GLenum fillMode,
3940 GLuint mask,
3941 GLenum transformType,
3942 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003943{
3944
3945 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3946 transformType, transformValues))
3947 return false;
3948
3949 switch (fillMode)
3950 {
3951 case GL_COUNT_UP_CHROMIUM:
3952 case GL_COUNT_DOWN_CHROMIUM:
3953 break;
3954 default:
Jamie Madille0472f32018-11-27 16:32:45 -05003955 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03003956 return false;
3957 }
3958 if (!isPow2(mask + 1))
3959 {
Jamie Madille0472f32018-11-27 16:32:45 -05003960 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03003961 return false;
3962 }
3963 return true;
3964}
3965
Jamie Madill007530e2017-12-28 14:27:04 -05003966bool ValidateStencilStrokePathInstancedCHROMIUM(Context *context,
3967 GLsizei numPaths,
3968 GLenum pathNameType,
3969 const void *paths,
3970 GLuint pathBase,
3971 GLint reference,
3972 GLuint mask,
3973 GLenum transformType,
3974 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003975{
3976 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3977 transformType, transformValues))
3978 return false;
3979
3980 // no more validation here.
3981
3982 return true;
3983}
3984
Jamie Madill007530e2017-12-28 14:27:04 -05003985bool ValidateStencilThenCoverFillPathInstancedCHROMIUM(Context *context,
3986 GLsizei numPaths,
3987 GLenum pathNameType,
3988 const void *paths,
3989 GLuint pathBase,
3990 GLenum fillMode,
3991 GLuint mask,
3992 GLenum coverMode,
3993 GLenum transformType,
3994 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03003995{
3996 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
3997 transformType, transformValues))
3998 return false;
3999
4000 switch (coverMode)
4001 {
4002 case GL_CONVEX_HULL_CHROMIUM:
4003 case GL_BOUNDING_BOX_CHROMIUM:
4004 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4005 break;
4006 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004007 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004008 return false;
4009 }
4010
4011 switch (fillMode)
4012 {
4013 case GL_COUNT_UP_CHROMIUM:
4014 case GL_COUNT_DOWN_CHROMIUM:
4015 break;
4016 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004017 context->validationError(GL_INVALID_ENUM, kInvalidFillMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004018 return false;
4019 }
4020 if (!isPow2(mask + 1))
4021 {
Jamie Madille0472f32018-11-27 16:32:45 -05004022 context->validationError(GL_INVALID_VALUE, kInvalidStencilBitMask);
Sami Väisänend59ca052016-06-21 16:10:00 +03004023 return false;
4024 }
4025
4026 return true;
4027}
4028
Jamie Madill007530e2017-12-28 14:27:04 -05004029bool ValidateStencilThenCoverStrokePathInstancedCHROMIUM(Context *context,
4030 GLsizei numPaths,
4031 GLenum pathNameType,
4032 const void *paths,
4033 GLuint pathBase,
4034 GLint reference,
4035 GLuint mask,
4036 GLenum coverMode,
4037 GLenum transformType,
4038 const GLfloat *transformValues)
Sami Väisänend59ca052016-06-21 16:10:00 +03004039{
4040 if (!ValidateInstancedPathParameters(context, numPaths, pathNameType, paths, pathBase,
4041 transformType, transformValues))
4042 return false;
4043
4044 switch (coverMode)
4045 {
4046 case GL_CONVEX_HULL_CHROMIUM:
4047 case GL_BOUNDING_BOX_CHROMIUM:
4048 case GL_BOUNDING_BOX_OF_BOUNDING_BOXES_CHROMIUM:
4049 break;
4050 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004051 context->validationError(GL_INVALID_ENUM, kInvalidCoverMode);
Sami Väisänend59ca052016-06-21 16:10:00 +03004052 return false;
4053 }
4054
4055 return true;
4056}
4057
Jamie Madill007530e2017-12-28 14:27:04 -05004058bool ValidateBindFragmentInputLocationCHROMIUM(Context *context,
4059 GLuint program,
4060 GLint location,
4061 const GLchar *name)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004062{
4063 if (!context->getExtensions().pathRendering)
4064 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004065 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004066 return false;
4067 }
4068
4069 const GLint MaxLocation = context->getCaps().maxVaryingVectors * 4;
4070 if (location >= MaxLocation)
4071 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004072 context->validationError(GL_INVALID_VALUE, kInvalidVaryingLocation);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004073 return false;
4074 }
4075
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004076 const auto *programObject = context->getProgramNoResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004077 if (!programObject)
4078 {
Jamie Madille0472f32018-11-27 16:32:45 -05004079 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004080 return false;
4081 }
4082
4083 if (!name)
4084 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004085 context->validationError(GL_INVALID_VALUE, kMissingName);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004086 return false;
4087 }
4088
4089 if (angle::BeginsWith(name, "gl_"))
4090 {
Jamie Madille0472f32018-11-27 16:32:45 -05004091 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004092 return false;
4093 }
4094
4095 return true;
4096}
4097
Jamie Madill007530e2017-12-28 14:27:04 -05004098bool ValidateProgramPathFragmentInputGenCHROMIUM(Context *context,
4099 GLuint program,
4100 GLint location,
4101 GLenum genMode,
4102 GLint components,
4103 const GLfloat *coeffs)
Sami Väisänen46eaa942016-06-29 10:26:37 +03004104{
4105 if (!context->getExtensions().pathRendering)
4106 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004107 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004108 return false;
4109 }
4110
Jamie Madill44a6fbf2018-10-02 13:38:56 -04004111 const auto *programObject = context->getProgramResolveLink(program);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004112 if (!programObject || programObject->isFlaggedForDeletion())
4113 {
Jamie Madille0472f32018-11-27 16:32:45 -05004114 context->validationError(GL_INVALID_OPERATION, kProgramDoesNotExist);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004115 return false;
4116 }
4117
4118 if (!programObject->isLinked())
4119 {
Jamie Madille0472f32018-11-27 16:32:45 -05004120 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004121 return false;
4122 }
4123
4124 switch (genMode)
4125 {
4126 case GL_NONE:
4127 if (components != 0)
4128 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004129 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004130 return false;
4131 }
4132 break;
4133
4134 case GL_OBJECT_LINEAR_CHROMIUM:
4135 case GL_EYE_LINEAR_CHROMIUM:
4136 case GL_CONSTANT_CHROMIUM:
4137 if (components < 1 || components > 4)
4138 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004139 context->validationError(GL_INVALID_VALUE, kInvalidComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004140 return false;
4141 }
4142 if (!coeffs)
4143 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004144 context->validationError(GL_INVALID_VALUE, kInvalidPathCoefficientsArray);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004145 return false;
4146 }
4147 break;
4148
4149 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004150 context->validationError(GL_INVALID_ENUM, kInvalidPathGenMode);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004151 return false;
4152 }
4153
4154 // If the location is -1 then the command is silently ignored
4155 // and no further validation is needed.
4156 if (location == -1)
4157 return true;
4158
jchen103fd614d2018-08-13 12:21:58 +08004159 const auto &binding = programObject->getFragmentInputBindingInfo(location);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004160
4161 if (!binding.valid)
4162 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004163 context->validationError(GL_INVALID_OPERATION, kInvalidFragmentInputBinding);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004164 return false;
4165 }
4166
4167 if (binding.type != GL_NONE)
4168 {
4169 GLint expectedComponents = 0;
4170 switch (binding.type)
4171 {
4172 case GL_FLOAT:
4173 expectedComponents = 1;
4174 break;
4175 case GL_FLOAT_VEC2:
4176 expectedComponents = 2;
4177 break;
4178 case GL_FLOAT_VEC3:
4179 expectedComponents = 3;
4180 break;
4181 case GL_FLOAT_VEC4:
4182 expectedComponents = 4;
4183 break;
4184 default:
Jamie Madillc3e37312018-11-30 15:25:39 -05004185 context->validationError(GL_INVALID_OPERATION, kFragmentInputTypeNotFloatingPoint);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004186 return false;
4187 }
4188 if (expectedComponents != components && genMode != GL_NONE)
4189 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004190 context->validationError(GL_INVALID_OPERATION, kInvalidPathComponents);
Sami Väisänen46eaa942016-06-29 10:26:37 +03004191 return false;
4192 }
4193 }
4194 return true;
4195}
4196
Geoff Lang97073d12016-04-20 10:42:34 -07004197bool ValidateCopyTextureCHROMIUM(Context *context,
4198 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004199 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004200 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004201 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004202 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004203 GLint internalFormat,
4204 GLenum destType,
4205 GLboolean unpackFlipY,
4206 GLboolean unpackPremultiplyAlpha,
4207 GLboolean unpackUnmultiplyAlpha)
4208{
4209 if (!context->getExtensions().copyTexture)
4210 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004211 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004212 return false;
4213 }
4214
Geoff Lang4f0e0032017-05-01 16:04:35 -04004215 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004216 if (source == nullptr)
4217 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004218 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004219 return false;
4220 }
4221
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004222 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004223 {
Jamie Madille0472f32018-11-27 16:32:45 -05004224 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004225 return false;
4226 }
4227
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004228 TextureType sourceType = source->getType();
4229 ASSERT(sourceType != TextureType::CubeMap);
4230 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004231
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004232 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004233 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004234 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004235 return false;
4236 }
4237
Geoff Lang4f0e0032017-05-01 16:04:35 -04004238 GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
4239 GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
4240 if (sourceWidth == 0 || sourceHeight == 0)
4241 {
Jamie Madille0472f32018-11-27 16:32:45 -05004242 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004243 return false;
4244 }
4245
4246 const InternalFormat &sourceFormat = *source->getFormat(sourceTarget, sourceLevel).info;
4247 if (!IsValidCopyTextureSourceInternalFormatEnum(sourceFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004248 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004249 context->validationError(GL_INVALID_OPERATION, kInvalidSourceTextureInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004250 return false;
4251 }
4252
Geoff Lang63458a32017-10-30 15:16:53 -04004253 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4254 {
Jamie Madille0472f32018-11-27 16:32:45 -05004255 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004256 return false;
4257 }
4258
Geoff Lang4f0e0032017-05-01 16:04:35 -04004259 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004260 if (dest == nullptr)
4261 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004262 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004263 return false;
4264 }
4265
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004266 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004267 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004268 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004269 return false;
4270 }
4271
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004272 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, sourceWidth,
Brandon Jones28783792018-03-05 09:37:32 -08004273 sourceHeight, false))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004274 {
Jamie Madille0472f32018-11-27 16:32:45 -05004275 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004276 return false;
4277 }
4278
Geoff Lang97073d12016-04-20 10:42:34 -07004279 if (!IsValidCopyTextureDestinationFormatType(context, internalFormat, destType))
4280 {
Geoff Lang97073d12016-04-20 10:42:34 -07004281 return false;
4282 }
4283
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004284 if (dest->getType() == TextureType::CubeMap && sourceWidth != sourceHeight)
Geoff Lang4f0e0032017-05-01 16:04:35 -04004285 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004286 context->validationError(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004287 return false;
4288 }
4289
Geoff Lang97073d12016-04-20 10:42:34 -07004290 if (dest->getImmutableFormat())
4291 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004292 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang97073d12016-04-20 10:42:34 -07004293 return false;
4294 }
4295
4296 return true;
4297}
4298
4299bool ValidateCopySubTextureCHROMIUM(Context *context,
4300 GLuint sourceId,
Geoff Langfc72a072017-03-24 14:52:39 -04004301 GLint sourceLevel,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004302 TextureTarget destTarget,
Geoff Lang97073d12016-04-20 10:42:34 -07004303 GLuint destId,
Geoff Langfc72a072017-03-24 14:52:39 -04004304 GLint destLevel,
Geoff Lang97073d12016-04-20 10:42:34 -07004305 GLint xoffset,
4306 GLint yoffset,
4307 GLint x,
4308 GLint y,
4309 GLsizei width,
4310 GLsizei height,
4311 GLboolean unpackFlipY,
4312 GLboolean unpackPremultiplyAlpha,
4313 GLboolean unpackUnmultiplyAlpha)
4314{
4315 if (!context->getExtensions().copyTexture)
4316 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004317 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang97073d12016-04-20 10:42:34 -07004318 return false;
4319 }
4320
Geoff Lang4f0e0032017-05-01 16:04:35 -04004321 const Texture *source = context->getTexture(sourceId);
Geoff Lang97073d12016-04-20 10:42:34 -07004322 if (source == nullptr)
4323 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004324 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004325 return false;
4326 }
4327
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004328 if (!IsValidCopyTextureSourceTarget(context, source->getType()))
Geoff Lang97073d12016-04-20 10:42:34 -07004329 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004330 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004331 return false;
4332 }
4333
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004334 TextureType sourceType = source->getType();
4335 ASSERT(sourceType != TextureType::CubeMap);
4336 TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004337
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004338 if (!IsValidCopyTextureSourceLevel(context, sourceType, sourceLevel))
Geoff Lang4f0e0032017-05-01 16:04:35 -04004339 {
Jamie Madille0472f32018-11-27 16:32:45 -05004340 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004341 return false;
4342 }
4343
4344 if (source->getWidth(sourceTarget, sourceLevel) == 0 ||
4345 source->getHeight(sourceTarget, sourceLevel) == 0)
Geoff Lang97073d12016-04-20 10:42:34 -07004346 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004347 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004348 return false;
4349 }
4350
4351 if (x < 0 || y < 0)
4352 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004353 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004354 return false;
4355 }
4356
4357 if (width < 0 || height < 0)
4358 {
Jamie Madille0472f32018-11-27 16:32:45 -05004359 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Geoff Lang97073d12016-04-20 10:42:34 -07004360 return false;
4361 }
4362
Geoff Lang4f0e0032017-05-01 16:04:35 -04004363 if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
4364 static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004365 {
Jamie Madille0472f32018-11-27 16:32:45 -05004366 context->validationError(GL_INVALID_VALUE, kSourceTextureTooSmall);
Geoff Lang97073d12016-04-20 10:42:34 -07004367 return false;
4368 }
4369
Geoff Lang4f0e0032017-05-01 16:04:35 -04004370 const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
4371 if (!IsValidCopySubTextureSourceInternalFormat(sourceFormat.info->internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004372 {
Jamie Madille0472f32018-11-27 16:32:45 -05004373 context->validationError(GL_INVALID_OPERATION, kInvalidInternalFormat);
Geoff Lang97073d12016-04-20 10:42:34 -07004374 return false;
4375 }
4376
Geoff Lang63458a32017-10-30 15:16:53 -04004377 if (!IsValidCopyTextureDestinationTargetEnum(context, destTarget))
4378 {
Jamie Madille0472f32018-11-27 16:32:45 -05004379 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Geoff Lang63458a32017-10-30 15:16:53 -04004380 return false;
4381 }
4382
Geoff Lang4f0e0032017-05-01 16:04:35 -04004383 const Texture *dest = context->getTexture(destId);
Geoff Lang97073d12016-04-20 10:42:34 -07004384 if (dest == nullptr)
4385 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004386 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang97073d12016-04-20 10:42:34 -07004387 return false;
4388 }
4389
Corentin Wallezf0e89be2017-11-08 14:00:32 -08004390 if (!IsValidCopyTextureDestinationTarget(context, dest->getType(), destTarget))
Geoff Lang97073d12016-04-20 10:42:34 -07004391 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004392 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang97073d12016-04-20 10:42:34 -07004393 return false;
4394 }
4395
Brandon Jones28783792018-03-05 09:37:32 -08004396 if (!IsValidCopyTextureDestinationLevel(context, dest->getType(), destLevel, width, height,
4397 true))
Geoff Lang97073d12016-04-20 10:42:34 -07004398 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004399 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Geoff Lang97073d12016-04-20 10:42:34 -07004400 return false;
4401 }
4402
Geoff Lang4f0e0032017-05-01 16:04:35 -04004403 if (dest->getWidth(destTarget, destLevel) == 0 || dest->getHeight(destTarget, destLevel) == 0)
4404 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004405 context->validationError(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
Geoff Lang4f0e0032017-05-01 16:04:35 -04004406 return false;
4407 }
4408
4409 const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
4410 if (!IsValidCopySubTextureDestionationInternalFormat(destFormat.internalFormat))
Geoff Lang97073d12016-04-20 10:42:34 -07004411 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004412 context->validationError(GL_INVALID_OPERATION, kInvalidFormatCombination);
Geoff Lang97073d12016-04-20 10:42:34 -07004413 return false;
4414 }
4415
4416 if (xoffset < 0 || yoffset < 0)
4417 {
Jamie Madille0472f32018-11-27 16:32:45 -05004418 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Geoff Lang97073d12016-04-20 10:42:34 -07004419 return false;
4420 }
4421
Geoff Lang4f0e0032017-05-01 16:04:35 -04004422 if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
4423 static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel))
Geoff Lang97073d12016-04-20 10:42:34 -07004424 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004425 context->validationError(GL_INVALID_VALUE, kOffsetOverflow);
Geoff Lang97073d12016-04-20 10:42:34 -07004426 return false;
4427 }
4428
4429 return true;
4430}
4431
Geoff Lang47110bf2016-04-20 11:13:22 -07004432bool ValidateCompressedCopyTextureCHROMIUM(Context *context, GLuint sourceId, GLuint destId)
4433{
4434 if (!context->getExtensions().copyCompressedTexture)
4435 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004436 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Lang47110bf2016-04-20 11:13:22 -07004437 return false;
4438 }
4439
4440 const gl::Texture *source = context->getTexture(sourceId);
4441 if (source == nullptr)
4442 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004443 context->validationError(GL_INVALID_VALUE, kInvalidSourceTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004444 return false;
4445 }
4446
Corentin Wallez99d492c2018-02-27 15:17:10 -05004447 if (source->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004448 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004449 context->validationError(GL_INVALID_VALUE, kInvalidSourceTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004450 return false;
4451 }
4452
Corentin Wallez99d492c2018-02-27 15:17:10 -05004453 if (source->getWidth(TextureTarget::_2D, 0) == 0 ||
4454 source->getHeight(TextureTarget::_2D, 0) == 0)
Geoff Lang47110bf2016-04-20 11:13:22 -07004455 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004456 context->validationError(GL_INVALID_VALUE, kSourceTextureLevelZeroDefined);
Geoff Lang47110bf2016-04-20 11:13:22 -07004457 return false;
4458 }
4459
Corentin Wallez99d492c2018-02-27 15:17:10 -05004460 const gl::Format &sourceFormat = source->getFormat(TextureTarget::_2D, 0);
Geoff Lang47110bf2016-04-20 11:13:22 -07004461 if (!sourceFormat.info->compressed)
4462 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004463 context->validationError(GL_INVALID_OPERATION, kSourceTextureMustBeCompressed);
Geoff Lang47110bf2016-04-20 11:13:22 -07004464 return false;
4465 }
4466
4467 const gl::Texture *dest = context->getTexture(destId);
4468 if (dest == nullptr)
4469 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004470 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTexture);
Geoff Lang47110bf2016-04-20 11:13:22 -07004471 return false;
4472 }
4473
Corentin Wallez99d492c2018-02-27 15:17:10 -05004474 if (dest->getType() != TextureType::_2D)
Geoff Lang47110bf2016-04-20 11:13:22 -07004475 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004476 context->validationError(GL_INVALID_VALUE, kInvalidDestinationTextureType);
Geoff Lang47110bf2016-04-20 11:13:22 -07004477 return false;
4478 }
4479
4480 if (dest->getImmutableFormat())
4481 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004482 context->validationError(GL_INVALID_OPERATION, kDestinationImmutable);
Geoff Lang47110bf2016-04-20 11:13:22 -07004483 return false;
4484 }
4485
4486 return true;
4487}
4488
Jiawei Shao385b3e02018-03-21 09:43:28 +08004489bool ValidateCreateShader(Context *context, ShaderType type)
Martin Radev4c4c8e72016-08-04 12:25:34 +03004490{
4491 switch (type)
4492 {
Jiawei Shao385b3e02018-03-21 09:43:28 +08004493 case ShaderType::Vertex:
4494 case ShaderType::Fragment:
Martin Radev4c4c8e72016-08-04 12:25:34 +03004495 break;
Geoff Langeb66a6e2016-10-31 13:06:12 -04004496
Jiawei Shao385b3e02018-03-21 09:43:28 +08004497 case ShaderType::Compute:
Geoff Langeb66a6e2016-10-31 13:06:12 -04004498 if (context->getClientVersion() < Version(3, 1))
Martin Radev4c4c8e72016-08-04 12:25:34 +03004499 {
Jamie Madille0472f32018-11-27 16:32:45 -05004500 context->validationError(GL_INVALID_ENUM, kES31Required);
Geoff Langeb66a6e2016-10-31 13:06:12 -04004501 return false;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004502 }
Geoff Langeb66a6e2016-10-31 13:06:12 -04004503 break;
4504
Jiawei Shao385b3e02018-03-21 09:43:28 +08004505 case ShaderType::Geometry:
Jiawei Shao89be29a2017-11-06 14:36:45 +08004506 if (!context->getExtensions().geometryShader)
4507 {
Jamie Madille0472f32018-11-27 16:32:45 -05004508 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jiawei Shao89be29a2017-11-06 14:36:45 +08004509 return false;
4510 }
4511 break;
Martin Radev4c4c8e72016-08-04 12:25:34 +03004512 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004513 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Martin Radev4c4c8e72016-08-04 12:25:34 +03004514 return false;
4515 }
Jamie Madill29639852016-09-02 15:00:09 -04004516
4517 return true;
4518}
4519
Jamie Madill5b772312018-03-08 20:28:32 -05004520bool ValidateBufferData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004521 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004522 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004523 const void *data,
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004524 BufferUsage usage)
Jamie Madill29639852016-09-02 15:00:09 -04004525{
4526 if (size < 0)
4527 {
Jamie Madille0472f32018-11-27 16:32:45 -05004528 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madill29639852016-09-02 15:00:09 -04004529 return false;
4530 }
4531
4532 switch (usage)
4533 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004534 case BufferUsage::StreamDraw:
4535 case BufferUsage::StaticDraw:
4536 case BufferUsage::DynamicDraw:
Jamie Madill29639852016-09-02 15:00:09 -04004537 break;
4538
Corentin Wallez2e568cf2017-09-18 17:05:22 -04004539 case BufferUsage::StreamRead:
4540 case BufferUsage::StaticRead:
4541 case BufferUsage::DynamicRead:
4542 case BufferUsage::StreamCopy:
4543 case BufferUsage::StaticCopy:
4544 case BufferUsage::DynamicCopy:
Jamie Madill29639852016-09-02 15:00:09 -04004545 if (context->getClientMajorVersion() < 3)
4546 {
Jamie Madille0472f32018-11-27 16:32:45 -05004547 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004548 return false;
4549 }
4550 break;
4551
4552 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004553 context->validationError(GL_INVALID_ENUM, kInvalidBufferUsage);
Jamie Madill29639852016-09-02 15:00:09 -04004554 return false;
4555 }
4556
Corentin Walleze4477002017-12-01 14:39:58 -05004557 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004558 {
Jamie Madille0472f32018-11-27 16:32:45 -05004559 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004560 return false;
4561 }
4562
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004563 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004564
4565 if (!buffer)
4566 {
Jamie Madille0472f32018-11-27 16:32:45 -05004567 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004568 return false;
4569 }
4570
James Darpiniane8a93c62018-01-04 18:02:24 -08004571 if (context->getExtensions().webglCompatibility &&
4572 buffer->isBoundForTransformFeedbackAndOtherUse())
4573 {
Jamie Madille0472f32018-11-27 16:32:45 -05004574 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004575 return false;
4576 }
4577
Jamie Madill29639852016-09-02 15:00:09 -04004578 return true;
4579}
4580
Jamie Madill5b772312018-03-08 20:28:32 -05004581bool ValidateBufferSubData(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04004582 BufferBinding target,
Jamie Madill29639852016-09-02 15:00:09 -04004583 GLintptr offset,
4584 GLsizeiptr size,
Jamie Madill876429b2017-04-20 15:46:24 -04004585 const void *data)
Jamie Madill29639852016-09-02 15:00:09 -04004586{
Brandon Jones6cad5662017-06-14 13:25:13 -07004587 if (size < 0)
Jamie Madill29639852016-09-02 15:00:09 -04004588 {
Jamie Madille0472f32018-11-27 16:32:45 -05004589 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Brandon Jones6cad5662017-06-14 13:25:13 -07004590 return false;
4591 }
4592
4593 if (offset < 0)
4594 {
Jamie Madille0472f32018-11-27 16:32:45 -05004595 context->validationError(GL_INVALID_VALUE, kNegativeOffset);
Jamie Madill29639852016-09-02 15:00:09 -04004596 return false;
4597 }
4598
Corentin Walleze4477002017-12-01 14:39:58 -05004599 if (!context->isValidBufferBinding(target))
Jamie Madill29639852016-09-02 15:00:09 -04004600 {
Jamie Madille0472f32018-11-27 16:32:45 -05004601 context->validationError(GL_INVALID_ENUM, kInvalidBufferTypes);
Jamie Madill29639852016-09-02 15:00:09 -04004602 return false;
4603 }
4604
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004605 Buffer *buffer = context->getState().getTargetBuffer(target);
Jamie Madill29639852016-09-02 15:00:09 -04004606
4607 if (!buffer)
4608 {
Jamie Madille0472f32018-11-27 16:32:45 -05004609 context->validationError(GL_INVALID_OPERATION, kBufferNotBound);
Jamie Madill29639852016-09-02 15:00:09 -04004610 return false;
4611 }
4612
4613 if (buffer->isMapped())
4614 {
Jamie Madille0472f32018-11-27 16:32:45 -05004615 context->validationError(GL_INVALID_OPERATION, kBufferMapped);
Jamie Madill29639852016-09-02 15:00:09 -04004616 return false;
4617 }
4618
James Darpiniane8a93c62018-01-04 18:02:24 -08004619 if (context->getExtensions().webglCompatibility &&
4620 buffer->isBoundForTransformFeedbackAndOtherUse())
4621 {
Jamie Madille0472f32018-11-27 16:32:45 -05004622 context->validationError(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
James Darpiniane8a93c62018-01-04 18:02:24 -08004623 return false;
4624 }
4625
Jamie Madill29639852016-09-02 15:00:09 -04004626 // Check for possible overflow of size + offset
4627 angle::CheckedNumeric<size_t> checkedSize(size);
4628 checkedSize += offset;
4629 if (!checkedSize.IsValid())
4630 {
Jamie Madille0472f32018-11-27 16:32:45 -05004631 context->validationError(GL_INVALID_VALUE, kParamOverflow);
Jamie Madill29639852016-09-02 15:00:09 -04004632 return false;
4633 }
4634
4635 if (size + offset > buffer->getSize())
4636 {
Jamie Madille0472f32018-11-27 16:32:45 -05004637 context->validationError(GL_INVALID_VALUE, kInsufficientBufferSize);
Jamie Madill29639852016-09-02 15:00:09 -04004638 return false;
4639 }
4640
Martin Radev4c4c8e72016-08-04 12:25:34 +03004641 return true;
4642}
4643
Geoff Lang111a99e2017-10-17 10:58:41 -04004644bool ValidateRequestExtensionANGLE(Context *context, const GLchar *name)
Geoff Langc287ea62016-09-16 14:46:51 -04004645{
Geoff Langc339c4e2016-11-29 10:37:36 -05004646 if (!context->getExtensions().requestExtension)
Geoff Langc287ea62016-09-16 14:46:51 -04004647 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004648 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Geoff Langc287ea62016-09-16 14:46:51 -04004649 return false;
4650 }
4651
Geoff Lang111a99e2017-10-17 10:58:41 -04004652 if (!context->isExtensionRequestable(name))
Geoff Langc287ea62016-09-16 14:46:51 -04004653 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004654 context->validationError(GL_INVALID_OPERATION, kExtensionNotRequestable);
Geoff Langc287ea62016-09-16 14:46:51 -04004655 return false;
4656 }
4657
4658 return true;
4659}
4660
Jamie Madill5b772312018-03-08 20:28:32 -05004661bool ValidateActiveTexture(Context *context, GLenum texture)
Jamie Madillef300b12016-10-07 15:12:09 -04004662{
Lingfeng Yang038dd532018-03-29 17:31:52 -07004663 if (context->getClientMajorVersion() < 2)
4664 {
4665 return ValidateMultitextureUnit(context, texture);
4666 }
4667
Jamie Madillef300b12016-10-07 15:12:09 -04004668 if (texture < GL_TEXTURE0 ||
4669 texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
4670 {
Jamie Madille0472f32018-11-27 16:32:45 -05004671 context->validationError(GL_INVALID_ENUM, kInvalidCombinedImageUnit);
Jamie Madillef300b12016-10-07 15:12:09 -04004672 return false;
4673 }
4674
4675 return true;
4676}
4677
Jamie Madill5b772312018-03-08 20:28:32 -05004678bool ValidateAttachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillef300b12016-10-07 15:12:09 -04004679{
4680 Program *programObject = GetValidProgram(context, program);
4681 if (!programObject)
4682 {
4683 return false;
4684 }
4685
4686 Shader *shaderObject = GetValidShader(context, shader);
4687 if (!shaderObject)
4688 {
4689 return false;
4690 }
4691
Jiawei Shao385b3e02018-03-21 09:43:28 +08004692 if (programObject->getAttachedShader(shaderObject->getType()))
Jamie Madillef300b12016-10-07 15:12:09 -04004693 {
Jamie Madille0472f32018-11-27 16:32:45 -05004694 context->validationError(GL_INVALID_OPERATION, kShaderAttachmentHasShader);
Jiawei Shao385b3e02018-03-21 09:43:28 +08004695 return false;
Jamie Madillef300b12016-10-07 15:12:09 -04004696 }
4697
4698 return true;
4699}
4700
Jamie Madill5b772312018-03-08 20:28:32 -05004701bool ValidateBindAttribLocation(Context *context, GLuint program, GLuint index, const GLchar *name)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004702{
4703 if (index >= MAX_VERTEX_ATTRIBS)
4704 {
Jamie Madille0472f32018-11-27 16:32:45 -05004705 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004706 return false;
4707 }
4708
4709 if (strncmp(name, "gl_", 3) == 0)
4710 {
Jamie Madille0472f32018-11-27 16:32:45 -05004711 context->validationError(GL_INVALID_OPERATION, kNameBeginsWithGL);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004712 return false;
4713 }
4714
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004715 if (context->isWebGL())
Geoff Langfc32e8b2017-05-31 14:16:59 -04004716 {
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004717 const size_t length = strlen(name);
4718
4719 if (!IsValidESSLString(name, length))
4720 {
4721 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters
4722 // for shader-related entry points
Jamie Madille0472f32018-11-27 16:32:45 -05004723 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Brandon Jonesed5b46f2017-07-21 08:39:17 -07004724 return false;
4725 }
4726
4727 if (!ValidateWebGLNameLength(context, length) || !ValidateWebGLNamePrefix(context, name))
4728 {
4729 return false;
4730 }
Geoff Langfc32e8b2017-05-31 14:16:59 -04004731 }
4732
Jamie Madill01a80ee2016-11-07 12:06:18 -05004733 return GetValidProgram(context, program) != nullptr;
4734}
4735
Jamie Madill5b772312018-03-08 20:28:32 -05004736bool ValidateBindFramebuffer(Context *context, GLenum target, GLuint framebuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004737{
Geoff Lange8afa902017-09-27 15:00:43 -04004738 if (!ValidFramebufferTarget(context, target))
Jamie Madill01a80ee2016-11-07 12:06:18 -05004739 {
Jamie Madille0472f32018-11-27 16:32:45 -05004740 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004741 return false;
4742 }
4743
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004744 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004745 !context->isFramebufferGenerated(framebuffer))
4746 {
Jamie Madille0472f32018-11-27 16:32:45 -05004747 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004748 return false;
4749 }
4750
4751 return true;
4752}
4753
Jamie Madill5b772312018-03-08 20:28:32 -05004754bool ValidateBindRenderbuffer(Context *context, GLenum target, GLuint renderbuffer)
Jamie Madill01a80ee2016-11-07 12:06:18 -05004755{
4756 if (target != GL_RENDERBUFFER)
4757 {
Jamie Madille0472f32018-11-27 16:32:45 -05004758 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004759 return false;
4760 }
4761
Jamie Madillc3dc5d42018-12-30 12:12:04 -05004762 if (!context->getState().isBindGeneratesResourceEnabled() &&
Jamie Madill01a80ee2016-11-07 12:06:18 -05004763 !context->isRenderbufferGenerated(renderbuffer))
4764 {
Jamie Madille0472f32018-11-27 16:32:45 -05004765 context->validationError(GL_INVALID_OPERATION, kObjectNotGenerated);
Jamie Madill01a80ee2016-11-07 12:06:18 -05004766 return false;
4767 }
4768
4769 return true;
4770}
4771
Jamie Madill5b772312018-03-08 20:28:32 -05004772static bool ValidBlendEquationMode(const Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004773{
4774 switch (mode)
4775 {
4776 case GL_FUNC_ADD:
4777 case GL_FUNC_SUBTRACT:
4778 case GL_FUNC_REVERSE_SUBTRACT:
Geoff Lang50cac572017-09-26 17:37:43 -04004779 return true;
4780
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004781 case GL_MIN:
4782 case GL_MAX:
Geoff Lang50cac572017-09-26 17:37:43 -04004783 return context->getClientVersion() >= ES_3_0 || context->getExtensions().blendMinMax;
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004784
4785 default:
4786 return false;
4787 }
4788}
4789
Jamie Madill5b772312018-03-08 20:28:32 -05004790bool ValidateBlendColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004791{
4792 return true;
4793}
4794
Jamie Madill5b772312018-03-08 20:28:32 -05004795bool ValidateBlendEquation(Context *context, GLenum mode)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004796{
Geoff Lang50cac572017-09-26 17:37:43 -04004797 if (!ValidBlendEquationMode(context, mode))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004798 {
Jamie Madille0472f32018-11-27 16:32:45 -05004799 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004800 return false;
4801 }
4802
4803 return true;
4804}
4805
Jamie Madill5b772312018-03-08 20:28:32 -05004806bool ValidateBlendEquationSeparate(Context *context, GLenum modeRGB, GLenum modeAlpha)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004807{
Geoff Lang50cac572017-09-26 17:37:43 -04004808 if (!ValidBlendEquationMode(context, modeRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004809 {
Jamie Madille0472f32018-11-27 16:32:45 -05004810 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004811 return false;
4812 }
4813
Geoff Lang50cac572017-09-26 17:37:43 -04004814 if (!ValidBlendEquationMode(context, modeAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004815 {
Jamie Madille0472f32018-11-27 16:32:45 -05004816 context->validationError(GL_INVALID_ENUM, kInvalidBlendEquation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004817 return false;
4818 }
4819
4820 return true;
4821}
4822
Jamie Madill5b772312018-03-08 20:28:32 -05004823bool ValidateBlendFunc(Context *context, GLenum sfactor, GLenum dfactor)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004824{
4825 return ValidateBlendFuncSeparate(context, sfactor, dfactor, sfactor, dfactor);
4826}
4827
Jamie Madill5b772312018-03-08 20:28:32 -05004828bool ValidateBlendFuncSeparate(Context *context,
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004829 GLenum srcRGB,
4830 GLenum dstRGB,
4831 GLenum srcAlpha,
4832 GLenum dstAlpha)
4833{
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004834 if (!ValidSrcBlendFunc(context, srcRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004835 {
Jamie Madille0472f32018-11-27 16:32:45 -05004836 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004837 return false;
4838 }
4839
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004840 if (!ValidDstBlendFunc(context, dstRGB))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004841 {
Jamie Madille0472f32018-11-27 16:32:45 -05004842 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004843 return false;
4844 }
4845
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004846 if (!ValidSrcBlendFunc(context, srcAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004847 {
Jamie Madille0472f32018-11-27 16:32:45 -05004848 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004849 return false;
4850 }
4851
Olli Etuahoab5fb5e2018-09-18 17:23:28 +03004852 if (!ValidDstBlendFunc(context, dstAlpha))
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004853 {
Jamie Madille0472f32018-11-27 16:32:45 -05004854 context->validationError(GL_INVALID_ENUM, kInvalidBlendFunction);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004855 return false;
4856 }
4857
Frank Henigman146e8a12017-03-02 23:22:37 -05004858 if (context->getLimitations().noSimultaneousConstantColorAndAlphaBlendFunc ||
4859 context->getExtensions().webglCompatibility)
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004860 {
4861 bool constantColorUsed =
4862 (srcRGB == GL_CONSTANT_COLOR || srcRGB == GL_ONE_MINUS_CONSTANT_COLOR ||
4863 dstRGB == GL_CONSTANT_COLOR || dstRGB == GL_ONE_MINUS_CONSTANT_COLOR);
4864
4865 bool constantAlphaUsed =
4866 (srcRGB == GL_CONSTANT_ALPHA || srcRGB == GL_ONE_MINUS_CONSTANT_ALPHA ||
4867 dstRGB == GL_CONSTANT_ALPHA || dstRGB == GL_ONE_MINUS_CONSTANT_ALPHA);
4868
4869 if (constantColorUsed && constantAlphaUsed)
4870 {
Frank Henigman146e8a12017-03-02 23:22:37 -05004871 if (context->getExtensions().webglCompatibility)
4872 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004873 context->validationError(GL_INVALID_OPERATION, kInvalidConstantColor);
4874 return false;
Frank Henigman146e8a12017-03-02 23:22:37 -05004875 }
Jamie Madillc3e37312018-11-30 15:25:39 -05004876
4877 WARN() << kConstantColorAlphaLimitation;
4878 context->validationError(GL_INVALID_OPERATION, kConstantColorAlphaLimitation);
Jamie Madill8a9e4bc2016-11-13 20:02:12 -05004879 return false;
4880 }
4881 }
4882
4883 return true;
4884}
4885
Geoff Langc339c4e2016-11-29 10:37:36 -05004886bool ValidateGetString(Context *context, GLenum name)
4887{
4888 switch (name)
4889 {
4890 case GL_VENDOR:
4891 case GL_RENDERER:
4892 case GL_VERSION:
4893 case GL_SHADING_LANGUAGE_VERSION:
4894 case GL_EXTENSIONS:
4895 break;
4896
4897 case GL_REQUESTABLE_EXTENSIONS_ANGLE:
4898 if (!context->getExtensions().requestExtension)
4899 {
Jamie Madille0472f32018-11-27 16:32:45 -05004900 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004901 return false;
4902 }
4903 break;
4904
4905 default:
Jamie Madille0472f32018-11-27 16:32:45 -05004906 context->validationError(GL_INVALID_ENUM, kInvalidName);
Geoff Langc339c4e2016-11-29 10:37:36 -05004907 return false;
4908 }
4909
4910 return true;
4911}
4912
Jamie Madill5b772312018-03-08 20:28:32 -05004913bool ValidateLineWidth(Context *context, GLfloat width)
Geoff Lang47c48082016-12-07 15:38:13 -05004914{
4915 if (width <= 0.0f || isNaN(width))
4916 {
Jamie Madille0472f32018-11-27 16:32:45 -05004917 context->validationError(GL_INVALID_VALUE, kInvalidWidth);
Geoff Lang47c48082016-12-07 15:38:13 -05004918 return false;
4919 }
4920
4921 return true;
4922}
4923
Jamie Madill5b772312018-03-08 20:28:32 -05004924bool ValidateDepthRangef(Context *context, GLfloat zNear, GLfloat zFar)
Frank Henigman6137ddc2017-02-10 18:55:07 -05004925{
4926 if (context->getExtensions().webglCompatibility && zNear > zFar)
4927 {
Jamie Madille0472f32018-11-27 16:32:45 -05004928 context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
Frank Henigman6137ddc2017-02-10 18:55:07 -05004929 return false;
4930 }
4931
4932 return true;
4933}
4934
Jamie Madill5b772312018-03-08 20:28:32 -05004935bool ValidateRenderbufferStorage(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004936 GLenum target,
4937 GLenum internalformat,
4938 GLsizei width,
4939 GLsizei height)
4940{
4941 return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
4942 height);
4943}
4944
Jamie Madill5b772312018-03-08 20:28:32 -05004945bool ValidateRenderbufferStorageMultisampleANGLE(Context *context,
Jamie Madille8fb6402017-02-14 17:56:40 -05004946 GLenum target,
4947 GLsizei samples,
4948 GLenum internalformat,
4949 GLsizei width,
4950 GLsizei height)
4951{
4952 if (!context->getExtensions().framebufferMultisample)
4953 {
Jamie Madillc3e37312018-11-30 15:25:39 -05004954 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madille8fb6402017-02-14 17:56:40 -05004955 return false;
4956 }
4957
4958 // ANGLE_framebuffer_multisample states that the value of samples must be less than or equal
Jamie Madill610640f2018-11-21 17:28:41 -05004959 // to MAX_SAMPLES_ANGLE (Context::getCaps().maxSamples) otherwise GL_INVALID_VALUE is
Jamie Madille8fb6402017-02-14 17:56:40 -05004960 // generated.
4961 if (static_cast<GLuint>(samples) > context->getCaps().maxSamples)
4962 {
Jamie Madille0472f32018-11-27 16:32:45 -05004963 context->validationError(GL_INVALID_VALUE, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004964 return false;
4965 }
4966
4967 // ANGLE_framebuffer_multisample states GL_OUT_OF_MEMORY is generated on a failure to create
4968 // the specified storage. This is different than ES 3.0 in which a sample number higher
4969 // than the maximum sample number supported by this format generates a GL_INVALID_VALUE.
4970 // The TextureCaps::getMaxSamples method is only guarenteed to be valid when the context is ES3.
4971 if (context->getClientMajorVersion() >= 3)
4972 {
4973 const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
4974 if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
4975 {
Jamie Madille0472f32018-11-27 16:32:45 -05004976 context->validationError(GL_OUT_OF_MEMORY, kSamplesOutOfRange);
Jamie Madille8fb6402017-02-14 17:56:40 -05004977 return false;
4978 }
4979 }
4980
4981 return ValidateRenderbufferStorageParametersBase(context, target, samples, internalformat,
4982 width, height);
4983}
4984
Jamie Madill5b772312018-03-08 20:28:32 -05004985bool ValidateCheckFramebufferStatus(Context *context, GLenum target)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004986{
Geoff Lange8afa902017-09-27 15:00:43 -04004987 if (!ValidFramebufferTarget(context, target))
Jamie Madillc1d770e2017-04-13 17:31:24 -04004988 {
Jamie Madille0472f32018-11-27 16:32:45 -05004989 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Jamie Madillc1d770e2017-04-13 17:31:24 -04004990 return false;
4991 }
4992
4993 return true;
4994}
4995
Jamie Madill5b772312018-03-08 20:28:32 -05004996bool ValidateClearColor(Context *context, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
Jamie Madillc1d770e2017-04-13 17:31:24 -04004997{
4998 return true;
4999}
5000
Jamie Madill5b772312018-03-08 20:28:32 -05005001bool ValidateClearDepthf(Context *context, GLfloat depth)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005002{
5003 return true;
5004}
5005
Jamie Madill5b772312018-03-08 20:28:32 -05005006bool ValidateClearStencil(Context *context, GLint s)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005007{
5008 return true;
5009}
5010
Jamie Madill5b772312018-03-08 20:28:32 -05005011bool ValidateColorMask(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005012 GLboolean red,
5013 GLboolean green,
5014 GLboolean blue,
5015 GLboolean alpha)
5016{
5017 return true;
5018}
5019
Jamie Madill5b772312018-03-08 20:28:32 -05005020bool ValidateCompileShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005021{
5022 return true;
5023}
5024
Jamie Madill5b772312018-03-08 20:28:32 -05005025bool ValidateCreateProgram(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005026{
5027 return true;
5028}
5029
Jamie Madill5b772312018-03-08 20:28:32 -05005030bool ValidateCullFace(Context *context, CullFaceMode mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005031{
5032 switch (mode)
5033 {
Corentin Wallez2e568cf2017-09-18 17:05:22 -04005034 case CullFaceMode::Front:
5035 case CullFaceMode::Back:
5036 case CullFaceMode::FrontAndBack:
Jamie Madillc1d770e2017-04-13 17:31:24 -04005037 break;
5038
5039 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005040 context->validationError(GL_INVALID_ENUM, kInvalidCullMode);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005041 return false;
5042 }
5043
5044 return true;
5045}
5046
Jamie Madill5b772312018-03-08 20:28:32 -05005047bool ValidateDeleteProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005048{
5049 if (program == 0)
5050 {
5051 return false;
5052 }
5053
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005054 if (!context->getProgramResolveLink(program))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005055 {
5056 if (context->getShader(program))
5057 {
Jamie Madille0472f32018-11-27 16:32:45 -05005058 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005059 return false;
5060 }
5061 else
5062 {
Jamie Madille0472f32018-11-27 16:32:45 -05005063 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005064 return false;
5065 }
5066 }
5067
5068 return true;
5069}
5070
Jamie Madill5b772312018-03-08 20:28:32 -05005071bool ValidateDeleteShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005072{
5073 if (shader == 0)
5074 {
5075 return false;
5076 }
5077
5078 if (!context->getShader(shader))
5079 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04005080 if (context->getProgramResolveLink(shader))
Jamie Madillc1d770e2017-04-13 17:31:24 -04005081 {
Jamie Madille0472f32018-11-27 16:32:45 -05005082 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
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, kExpectedShaderName);
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 ValidateDepthFunc(Context *context, GLenum func)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005096{
5097 switch (func)
5098 {
5099 case GL_NEVER:
5100 case GL_ALWAYS:
5101 case GL_LESS:
5102 case GL_LEQUAL:
5103 case GL_EQUAL:
5104 case GL_GREATER:
5105 case GL_GEQUAL:
5106 case GL_NOTEQUAL:
5107 break;
5108
5109 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005110 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005111 return false;
5112 }
5113
5114 return true;
5115}
5116
Jamie Madill5b772312018-03-08 20:28:32 -05005117bool ValidateDepthMask(Context *context, GLboolean flag)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005118{
5119 return true;
5120}
5121
Jamie Madill5b772312018-03-08 20:28:32 -05005122bool ValidateDetachShader(Context *context, GLuint program, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005123{
5124 Program *programObject = GetValidProgram(context, program);
5125 if (!programObject)
5126 {
5127 return false;
5128 }
5129
5130 Shader *shaderObject = GetValidShader(context, shader);
5131 if (!shaderObject)
5132 {
5133 return false;
5134 }
5135
Jiawei Shao385b3e02018-03-21 09:43:28 +08005136 const Shader *attachedShader = programObject->getAttachedShader(shaderObject->getType());
Jamie Madillc1d770e2017-04-13 17:31:24 -04005137 if (attachedShader != shaderObject)
5138 {
Jamie Madille0472f32018-11-27 16:32:45 -05005139 context->validationError(GL_INVALID_OPERATION, kShaderToDetachMustBeAttached);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005140 return false;
5141 }
5142
5143 return true;
5144}
5145
Jamie Madill5b772312018-03-08 20:28:32 -05005146bool ValidateDisableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005147{
5148 if (index >= MAX_VERTEX_ATTRIBS)
5149 {
Jamie Madille0472f32018-11-27 16:32:45 -05005150 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005151 return false;
5152 }
5153
5154 return true;
5155}
5156
Jamie Madill5b772312018-03-08 20:28:32 -05005157bool ValidateEnableVertexAttribArray(Context *context, GLuint index)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005158{
5159 if (index >= MAX_VERTEX_ATTRIBS)
5160 {
Jamie Madille0472f32018-11-27 16:32:45 -05005161 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005162 return false;
5163 }
5164
5165 return true;
5166}
5167
Jamie Madill5b772312018-03-08 20:28:32 -05005168bool ValidateFinish(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005169{
5170 return true;
5171}
5172
Jamie Madill5b772312018-03-08 20:28:32 -05005173bool ValidateFlush(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005174{
5175 return true;
5176}
5177
Jamie Madill5b772312018-03-08 20:28:32 -05005178bool ValidateFrontFace(Context *context, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005179{
5180 switch (mode)
5181 {
5182 case GL_CW:
5183 case GL_CCW:
5184 break;
5185 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005186 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005187 return false;
5188 }
5189
5190 return true;
5191}
5192
Jamie Madill5b772312018-03-08 20:28:32 -05005193bool ValidateGetActiveAttrib(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005194 GLuint program,
5195 GLuint index,
5196 GLsizei bufsize,
5197 GLsizei *length,
5198 GLint *size,
5199 GLenum *type,
5200 GLchar *name)
5201{
5202 if (bufsize < 0)
5203 {
Jamie Madille0472f32018-11-27 16:32:45 -05005204 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005205 return false;
5206 }
5207
5208 Program *programObject = GetValidProgram(context, program);
5209
5210 if (!programObject)
5211 {
5212 return false;
5213 }
5214
5215 if (index >= static_cast<GLuint>(programObject->getActiveAttributeCount()))
5216 {
Jamie Madille0472f32018-11-27 16:32:45 -05005217 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005218 return false;
5219 }
5220
5221 return true;
5222}
5223
Jamie Madill5b772312018-03-08 20:28:32 -05005224bool ValidateGetActiveUniform(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005225 GLuint program,
5226 GLuint index,
5227 GLsizei bufsize,
5228 GLsizei *length,
5229 GLint *size,
5230 GLenum *type,
5231 GLchar *name)
5232{
5233 if (bufsize < 0)
5234 {
Jamie Madille0472f32018-11-27 16:32:45 -05005235 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005236 return false;
5237 }
5238
5239 Program *programObject = GetValidProgram(context, program);
5240
5241 if (!programObject)
5242 {
5243 return false;
5244 }
5245
5246 if (index >= static_cast<GLuint>(programObject->getActiveUniformCount()))
5247 {
Jamie Madille0472f32018-11-27 16:32:45 -05005248 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005249 return false;
5250 }
5251
5252 return true;
5253}
5254
Jamie Madill5b772312018-03-08 20:28:32 -05005255bool ValidateGetAttachedShaders(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005256 GLuint program,
5257 GLsizei maxcount,
5258 GLsizei *count,
5259 GLuint *shaders)
5260{
5261 if (maxcount < 0)
5262 {
Jamie Madille0472f32018-11-27 16:32:45 -05005263 context->validationError(GL_INVALID_VALUE, kNegativeMaxCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005264 return false;
5265 }
5266
5267 Program *programObject = GetValidProgram(context, program);
5268
5269 if (!programObject)
5270 {
5271 return false;
5272 }
5273
5274 return true;
5275}
5276
Jamie Madill5b772312018-03-08 20:28:32 -05005277bool ValidateGetAttribLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005278{
Geoff Langfc32e8b2017-05-31 14:16:59 -04005279 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5280 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005281 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005282 {
Jamie Madille0472f32018-11-27 16:32:45 -05005283 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005284 return false;
5285 }
5286
Jamie Madillc1d770e2017-04-13 17:31:24 -04005287 Program *programObject = GetValidProgram(context, program);
5288
5289 if (!programObject)
5290 {
Jamie Madille0472f32018-11-27 16:32:45 -05005291 context->validationError(GL_INVALID_OPERATION, kProgramNotBound);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005292 return false;
5293 }
5294
5295 if (!programObject->isLinked())
5296 {
Jamie Madille0472f32018-11-27 16:32:45 -05005297 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005298 return false;
5299 }
5300
5301 return true;
5302}
5303
Jamie Madill5b772312018-03-08 20:28:32 -05005304bool ValidateGetBooleanv(Context *context, GLenum pname, GLboolean *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005305{
5306 GLenum nativeType;
5307 unsigned int numParams = 0;
5308 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5309}
5310
Jamie Madill5b772312018-03-08 20:28:32 -05005311bool ValidateGetError(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005312{
5313 return true;
5314}
5315
Jamie Madill5b772312018-03-08 20:28:32 -05005316bool ValidateGetFloatv(Context *context, GLenum pname, GLfloat *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005317{
5318 GLenum nativeType;
5319 unsigned int numParams = 0;
5320 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5321}
5322
Jamie Madill5b772312018-03-08 20:28:32 -05005323bool ValidateGetIntegerv(Context *context, GLenum pname, GLint *params)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005324{
5325 GLenum nativeType;
5326 unsigned int numParams = 0;
5327 return ValidateStateQuery(context, pname, &nativeType, &numParams);
5328}
5329
Jamie Madill5b772312018-03-08 20:28:32 -05005330bool ValidateGetProgramInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005331 GLuint program,
5332 GLsizei bufsize,
5333 GLsizei *length,
5334 GLchar *infolog)
5335{
5336 if (bufsize < 0)
5337 {
Jamie Madille0472f32018-11-27 16:32:45 -05005338 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005339 return false;
5340 }
5341
5342 Program *programObject = GetValidProgram(context, program);
5343 if (!programObject)
5344 {
5345 return false;
5346 }
5347
5348 return true;
5349}
5350
Jamie Madill5b772312018-03-08 20:28:32 -05005351bool ValidateGetShaderInfoLog(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005352 GLuint shader,
5353 GLsizei bufsize,
5354 GLsizei *length,
5355 GLchar *infolog)
5356{
5357 if (bufsize < 0)
5358 {
Jamie Madille0472f32018-11-27 16:32:45 -05005359 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005360 return false;
5361 }
5362
5363 Shader *shaderObject = GetValidShader(context, shader);
5364 if (!shaderObject)
5365 {
5366 return false;
5367 }
5368
5369 return true;
5370}
5371
Jamie Madill5b772312018-03-08 20:28:32 -05005372bool ValidateGetShaderPrecisionFormat(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005373 GLenum shadertype,
5374 GLenum precisiontype,
5375 GLint *range,
5376 GLint *precision)
5377{
5378 switch (shadertype)
5379 {
5380 case GL_VERTEX_SHADER:
5381 case GL_FRAGMENT_SHADER:
5382 break;
5383 case GL_COMPUTE_SHADER:
Jamie Madillc3e37312018-11-30 15:25:39 -05005384 context->validationError(GL_INVALID_OPERATION, kUnimplementedComputeShaderPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005385 return false;
5386 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005387 context->validationError(GL_INVALID_ENUM, kInvalidShaderType);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005388 return false;
5389 }
5390
5391 switch (precisiontype)
5392 {
5393 case GL_LOW_FLOAT:
5394 case GL_MEDIUM_FLOAT:
5395 case GL_HIGH_FLOAT:
5396 case GL_LOW_INT:
5397 case GL_MEDIUM_INT:
5398 case GL_HIGH_INT:
5399 break;
5400
5401 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005402 context->validationError(GL_INVALID_ENUM, kInvalidPrecision);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005403 return false;
5404 }
5405
5406 return true;
5407}
5408
Jamie Madill5b772312018-03-08 20:28:32 -05005409bool ValidateGetShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005410 GLuint shader,
5411 GLsizei bufsize,
5412 GLsizei *length,
5413 GLchar *source)
5414{
5415 if (bufsize < 0)
5416 {
Jamie Madille0472f32018-11-27 16:32:45 -05005417 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005418 return false;
5419 }
5420
5421 Shader *shaderObject = GetValidShader(context, shader);
5422 if (!shaderObject)
5423 {
5424 return false;
5425 }
5426
5427 return true;
5428}
5429
Jamie Madill5b772312018-03-08 20:28:32 -05005430bool ValidateGetUniformLocation(Context *context, GLuint program, const GLchar *name)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005431{
5432 if (strstr(name, "gl_") == name)
5433 {
5434 return false;
5435 }
5436
Geoff Langfc32e8b2017-05-31 14:16:59 -04005437 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5438 // shader-related entry points
Geoff Langcab92ee2017-07-19 17:32:07 -04005439 if (context->getExtensions().webglCompatibility && !IsValidESSLString(name, strlen(name)))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005440 {
Jamie Madille0472f32018-11-27 16:32:45 -05005441 context->validationError(GL_INVALID_VALUE, kInvalidNameCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005442 return false;
5443 }
5444
Jamie Madillc1d770e2017-04-13 17:31:24 -04005445 Program *programObject = GetValidProgram(context, program);
5446
5447 if (!programObject)
5448 {
5449 return false;
5450 }
5451
5452 if (!programObject->isLinked())
5453 {
Jamie Madille0472f32018-11-27 16:32:45 -05005454 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005455 return false;
5456 }
5457
5458 return true;
5459}
5460
Jamie Madill5b772312018-03-08 20:28:32 -05005461bool ValidateHint(Context *context, GLenum target, GLenum mode)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005462{
5463 switch (mode)
5464 {
5465 case GL_FASTEST:
5466 case GL_NICEST:
5467 case GL_DONT_CARE:
5468 break;
5469
5470 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005471 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005472 return false;
5473 }
5474
5475 switch (target)
5476 {
5477 case GL_GENERATE_MIPMAP_HINT:
5478 break;
5479
Geoff Lange7bd2182017-06-16 16:13:13 -04005480 case GL_FRAGMENT_SHADER_DERIVATIVE_HINT:
5481 if (context->getClientVersion() < ES_3_0 &&
5482 !context->getExtensions().standardDerivatives)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005483 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005484 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005485 return false;
5486 }
5487 break;
5488
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005489 case GL_PERSPECTIVE_CORRECTION_HINT:
5490 case GL_POINT_SMOOTH_HINT:
5491 case GL_LINE_SMOOTH_HINT:
5492 case GL_FOG_HINT:
5493 if (context->getClientMajorVersion() >= 2)
5494 {
Jamie Madille0472f32018-11-27 16:32:45 -05005495 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Lingfeng Yang6e5bf362018-08-15 09:53:17 -07005496 return false;
5497 }
5498 break;
5499
Jamie Madillc1d770e2017-04-13 17:31:24 -04005500 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005501 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005502 return false;
5503 }
5504
5505 return true;
5506}
5507
Jamie Madill5b772312018-03-08 20:28:32 -05005508bool ValidateIsBuffer(Context *context, GLuint buffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005509{
5510 return true;
5511}
5512
Jamie Madill5b772312018-03-08 20:28:32 -05005513bool ValidateIsFramebuffer(Context *context, GLuint framebuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005514{
5515 return true;
5516}
5517
Jamie Madill5b772312018-03-08 20:28:32 -05005518bool ValidateIsProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005519{
5520 return true;
5521}
5522
Jamie Madill5b772312018-03-08 20:28:32 -05005523bool ValidateIsRenderbuffer(Context *context, GLuint renderbuffer)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005524{
5525 return true;
5526}
5527
Jamie Madill5b772312018-03-08 20:28:32 -05005528bool ValidateIsShader(Context *context, GLuint shader)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005529{
5530 return true;
5531}
5532
Jamie Madill5b772312018-03-08 20:28:32 -05005533bool ValidateIsTexture(Context *context, GLuint texture)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005534{
5535 return true;
5536}
5537
Jamie Madill5b772312018-03-08 20:28:32 -05005538bool ValidatePixelStorei(Context *context, GLenum pname, GLint param)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005539{
5540 if (context->getClientMajorVersion() < 3)
5541 {
5542 switch (pname)
5543 {
5544 case GL_UNPACK_IMAGE_HEIGHT:
5545 case GL_UNPACK_SKIP_IMAGES:
Jamie Madille0472f32018-11-27 16:32:45 -05005546 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005547 return false;
5548
5549 case GL_UNPACK_ROW_LENGTH:
5550 case GL_UNPACK_SKIP_ROWS:
5551 case GL_UNPACK_SKIP_PIXELS:
5552 if (!context->getExtensions().unpackSubimage)
5553 {
Jamie Madille0472f32018-11-27 16:32:45 -05005554 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005555 return false;
5556 }
5557 break;
5558
5559 case GL_PACK_ROW_LENGTH:
5560 case GL_PACK_SKIP_ROWS:
5561 case GL_PACK_SKIP_PIXELS:
5562 if (!context->getExtensions().packSubimage)
5563 {
Jamie Madille0472f32018-11-27 16:32:45 -05005564 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005565 return false;
5566 }
5567 break;
5568 }
5569 }
5570
5571 if (param < 0)
5572 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005573 context->validationError(GL_INVALID_VALUE, kNegativeParam);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005574 return false;
5575 }
5576
5577 switch (pname)
5578 {
5579 case GL_UNPACK_ALIGNMENT:
5580 if (param != 1 && param != 2 && param != 4 && param != 8)
5581 {
Jamie Madille0472f32018-11-27 16:32:45 -05005582 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005583 return false;
5584 }
5585 break;
5586
5587 case GL_PACK_ALIGNMENT:
5588 if (param != 1 && param != 2 && param != 4 && param != 8)
5589 {
Jamie Madille0472f32018-11-27 16:32:45 -05005590 context->validationError(GL_INVALID_VALUE, kInvalidUnpackAlignment);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005591 return false;
5592 }
5593 break;
5594
5595 case GL_PACK_REVERSE_ROW_ORDER_ANGLE:
Geoff Lang000dab82017-09-27 14:27:07 -04005596 if (!context->getExtensions().packReverseRowOrder)
5597 {
Jamie Madille0472f32018-11-27 16:32:45 -05005598 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Geoff Lang000dab82017-09-27 14:27:07 -04005599 }
5600 break;
5601
Jamie Madillc1d770e2017-04-13 17:31:24 -04005602 case GL_UNPACK_ROW_LENGTH:
5603 case GL_UNPACK_IMAGE_HEIGHT:
5604 case GL_UNPACK_SKIP_IMAGES:
5605 case GL_UNPACK_SKIP_ROWS:
5606 case GL_UNPACK_SKIP_PIXELS:
5607 case GL_PACK_ROW_LENGTH:
5608 case GL_PACK_SKIP_ROWS:
5609 case GL_PACK_SKIP_PIXELS:
5610 break;
5611
5612 default:
Jamie Madille0472f32018-11-27 16:32:45 -05005613 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005614 return false;
5615 }
5616
5617 return true;
5618}
5619
Jamie Madill5b772312018-03-08 20:28:32 -05005620bool ValidatePolygonOffset(Context *context, GLfloat factor, GLfloat units)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005621{
5622 return true;
5623}
5624
Jamie Madill5b772312018-03-08 20:28:32 -05005625bool ValidateReleaseShaderCompiler(Context *context)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005626{
5627 return true;
5628}
5629
Jamie Madill5b772312018-03-08 20:28:32 -05005630bool ValidateSampleCoverage(Context *context, GLfloat value, GLboolean invert)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005631{
5632 return true;
5633}
5634
Jamie Madill5b772312018-03-08 20:28:32 -05005635bool ValidateScissor(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005636{
5637 if (width < 0 || height < 0)
5638 {
Jamie Madille0472f32018-11-27 16:32:45 -05005639 context->validationError(GL_INVALID_VALUE, kNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005640 return false;
5641 }
5642
5643 return true;
5644}
5645
Jamie Madill5b772312018-03-08 20:28:32 -05005646bool ValidateShaderBinary(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005647 GLsizei n,
5648 const GLuint *shaders,
5649 GLenum binaryformat,
Jamie Madill876429b2017-04-20 15:46:24 -04005650 const void *binary,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005651 GLsizei length)
5652{
5653 const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
5654 if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) ==
5655 shaderBinaryFormats.end())
5656 {
Jamie Madillc3e37312018-11-30 15:25:39 -05005657 context->validationError(GL_INVALID_ENUM, kInvalidShaderBinaryFormat);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005658 return false;
5659 }
5660
5661 return true;
5662}
5663
Jamie Madill5b772312018-03-08 20:28:32 -05005664bool ValidateShaderSource(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005665 GLuint shader,
5666 GLsizei count,
5667 const GLchar *const *string,
5668 const GLint *length)
5669{
5670 if (count < 0)
5671 {
Jamie Madille0472f32018-11-27 16:32:45 -05005672 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005673 return false;
5674 }
5675
Geoff Langfc32e8b2017-05-31 14:16:59 -04005676 // The WebGL spec (section 6.20) disallows strings containing invalid ESSL characters for
5677 // shader-related entry points
5678 if (context->getExtensions().webglCompatibility)
5679 {
5680 for (GLsizei i = 0; i < count; i++)
5681 {
Geoff Langcab92ee2017-07-19 17:32:07 -04005682 size_t len =
5683 (length && length[i] >= 0) ? static_cast<size_t>(length[i]) : strlen(string[i]);
Geoff Langa71a98e2017-06-19 15:15:00 -04005684
5685 // Backslash as line-continuation is allowed in WebGL 2.0.
Geoff Langcab92ee2017-07-19 17:32:07 -04005686 if (!IsValidESSLShaderSourceString(string[i], len,
5687 context->getClientVersion() >= ES_3_0))
Geoff Langfc32e8b2017-05-31 14:16:59 -04005688 {
Jamie Madille0472f32018-11-27 16:32:45 -05005689 context->validationError(GL_INVALID_VALUE, kShaderSourceInvalidCharacters);
Geoff Langfc32e8b2017-05-31 14:16:59 -04005690 return false;
5691 }
5692 }
5693 }
5694
Jamie Madillc1d770e2017-04-13 17:31:24 -04005695 Shader *shaderObject = GetValidShader(context, shader);
5696 if (!shaderObject)
5697 {
5698 return false;
5699 }
5700
5701 return true;
5702}
5703
Jamie Madill5b772312018-03-08 20:28:32 -05005704bool ValidateStencilFunc(Context *context, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005705{
5706 if (!IsValidStencilFunc(func))
5707 {
Jamie Madille0472f32018-11-27 16:32:45 -05005708 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005709 return false;
5710 }
5711
5712 return true;
5713}
5714
Jamie Madill5b772312018-03-08 20:28:32 -05005715bool ValidateStencilFuncSeparate(Context *context, GLenum face, GLenum func, GLint ref, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005716{
5717 if (!IsValidStencilFace(face))
5718 {
Jamie Madille0472f32018-11-27 16:32:45 -05005719 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005720 return false;
5721 }
5722
5723 if (!IsValidStencilFunc(func))
5724 {
Jamie Madille0472f32018-11-27 16:32:45 -05005725 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005726 return false;
5727 }
5728
5729 return true;
5730}
5731
Jamie Madill5b772312018-03-08 20:28:32 -05005732bool ValidateStencilMask(Context *context, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005733{
5734 return true;
5735}
5736
Jamie Madill5b772312018-03-08 20:28:32 -05005737bool ValidateStencilMaskSeparate(Context *context, GLenum face, GLuint mask)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005738{
5739 if (!IsValidStencilFace(face))
5740 {
Jamie Madille0472f32018-11-27 16:32:45 -05005741 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005742 return false;
5743 }
5744
5745 return true;
5746}
5747
Jamie Madill5b772312018-03-08 20:28:32 -05005748bool ValidateStencilOp(Context *context, GLenum fail, GLenum zfail, GLenum zpass)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005749{
5750 if (!IsValidStencilOp(fail))
5751 {
Jamie Madille0472f32018-11-27 16:32:45 -05005752 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005753 return false;
5754 }
5755
5756 if (!IsValidStencilOp(zfail))
5757 {
Jamie Madille0472f32018-11-27 16:32:45 -05005758 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005759 return false;
5760 }
5761
5762 if (!IsValidStencilOp(zpass))
5763 {
Jamie Madille0472f32018-11-27 16:32:45 -05005764 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005765 return false;
5766 }
5767
5768 return true;
5769}
5770
Jamie Madill5b772312018-03-08 20:28:32 -05005771bool ValidateStencilOpSeparate(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005772 GLenum face,
5773 GLenum fail,
5774 GLenum zfail,
5775 GLenum zpass)
5776{
5777 if (!IsValidStencilFace(face))
5778 {
Jamie Madille0472f32018-11-27 16:32:45 -05005779 context->validationError(GL_INVALID_ENUM, kInvalidStencil);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005780 return false;
5781 }
5782
5783 return ValidateStencilOp(context, fail, zfail, zpass);
5784}
5785
Jamie Madill5b772312018-03-08 20:28:32 -05005786bool ValidateUniform1f(Context *context, GLint location, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005787{
5788 return ValidateUniform(context, GL_FLOAT, location, 1);
5789}
5790
Jamie Madill5b772312018-03-08 20:28:32 -05005791bool ValidateUniform1fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005792{
5793 return ValidateUniform(context, GL_FLOAT, location, count);
5794}
5795
Jamie Madill5b772312018-03-08 20:28:32 -05005796bool ValidateUniform1i(Context *context, GLint location, GLint x)
Jamie Madillbe849e42017-05-02 15:49:00 -04005797{
5798 return ValidateUniform1iv(context, location, 1, &x);
5799}
5800
Jamie Madill5b772312018-03-08 20:28:32 -05005801bool ValidateUniform2fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005802{
5803 return ValidateUniform(context, GL_FLOAT_VEC2, location, count);
5804}
5805
Jamie Madill5b772312018-03-08 20:28:32 -05005806bool ValidateUniform2i(Context *context, GLint location, GLint x, GLint y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005807{
5808 return ValidateUniform(context, GL_INT_VEC2, location, 1);
5809}
5810
Jamie Madill5b772312018-03-08 20:28:32 -05005811bool ValidateUniform2iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005812{
5813 return ValidateUniform(context, GL_INT_VEC2, location, count);
5814}
5815
Jamie Madill5b772312018-03-08 20:28:32 -05005816bool ValidateUniform3f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005817{
5818 return ValidateUniform(context, GL_FLOAT_VEC3, location, 1);
5819}
5820
Jamie Madill5b772312018-03-08 20:28:32 -05005821bool ValidateUniform3fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005822{
5823 return ValidateUniform(context, GL_FLOAT_VEC3, location, count);
5824}
5825
Jamie Madill5b772312018-03-08 20:28:32 -05005826bool ValidateUniform3i(Context *context, GLint location, GLint x, GLint y, GLint z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005827{
5828 return ValidateUniform(context, GL_INT_VEC3, location, 1);
5829}
5830
Jamie Madill5b772312018-03-08 20:28:32 -05005831bool ValidateUniform3iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005832{
5833 return ValidateUniform(context, GL_INT_VEC3, location, count);
5834}
5835
Jamie Madill5b772312018-03-08 20:28:32 -05005836bool ValidateUniform4f(Context *context, GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005837{
5838 return ValidateUniform(context, GL_FLOAT_VEC4, location, 1);
5839}
5840
Jamie Madill5b772312018-03-08 20:28:32 -05005841bool ValidateUniform4fv(Context *context, GLint location, GLsizei count, const GLfloat *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005842{
5843 return ValidateUniform(context, GL_FLOAT_VEC4, location, count);
5844}
5845
Jamie Madill5b772312018-03-08 20:28:32 -05005846bool ValidateUniform4i(Context *context, GLint location, GLint x, GLint y, GLint z, GLint w)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005847{
5848 return ValidateUniform(context, GL_INT_VEC4, location, 1);
5849}
5850
Jamie Madill5b772312018-03-08 20:28:32 -05005851bool ValidateUniform4iv(Context *context, GLint location, GLsizei count, const GLint *v)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005852{
5853 return ValidateUniform(context, GL_INT_VEC4, location, count);
5854}
5855
Jamie Madill5b772312018-03-08 20:28:32 -05005856bool ValidateUniformMatrix2fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005857 GLint location,
5858 GLsizei count,
5859 GLboolean transpose,
5860 const GLfloat *value)
5861{
5862 return ValidateUniformMatrix(context, GL_FLOAT_MAT2, location, count, transpose);
5863}
5864
Jamie Madill5b772312018-03-08 20:28:32 -05005865bool ValidateUniformMatrix3fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005866 GLint location,
5867 GLsizei count,
5868 GLboolean transpose,
5869 const GLfloat *value)
5870{
5871 return ValidateUniformMatrix(context, GL_FLOAT_MAT3, location, count, transpose);
5872}
5873
Jamie Madill5b772312018-03-08 20:28:32 -05005874bool ValidateUniformMatrix4fv(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005875 GLint location,
5876 GLsizei count,
5877 GLboolean transpose,
5878 const GLfloat *value)
5879{
5880 return ValidateUniformMatrix(context, GL_FLOAT_MAT4, location, count, transpose);
5881}
5882
Jamie Madill5b772312018-03-08 20:28:32 -05005883bool ValidateValidateProgram(Context *context, GLuint program)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005884{
5885 Program *programObject = GetValidProgram(context, program);
5886
5887 if (!programObject)
5888 {
5889 return false;
5890 }
5891
5892 return true;
5893}
5894
Jamie Madill5b772312018-03-08 20:28:32 -05005895bool ValidateVertexAttrib1f(Context *context, GLuint index, GLfloat x)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005896{
5897 return ValidateVertexAttribIndex(context, index);
5898}
5899
Jamie Madill5b772312018-03-08 20:28:32 -05005900bool ValidateVertexAttrib1fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005901{
5902 return ValidateVertexAttribIndex(context, index);
5903}
5904
Jamie Madill5b772312018-03-08 20:28:32 -05005905bool ValidateVertexAttrib2f(Context *context, GLuint index, GLfloat x, GLfloat y)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005906{
5907 return ValidateVertexAttribIndex(context, index);
5908}
5909
Jamie Madill5b772312018-03-08 20:28:32 -05005910bool ValidateVertexAttrib2fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005911{
5912 return ValidateVertexAttribIndex(context, index);
5913}
5914
Jamie Madill5b772312018-03-08 20:28:32 -05005915bool ValidateVertexAttrib3f(Context *context, GLuint index, GLfloat x, GLfloat y, GLfloat z)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005916{
5917 return ValidateVertexAttribIndex(context, index);
5918}
5919
Jamie Madill5b772312018-03-08 20:28:32 -05005920bool ValidateVertexAttrib3fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005921{
5922 return ValidateVertexAttribIndex(context, index);
5923}
5924
Jamie Madill5b772312018-03-08 20:28:32 -05005925bool ValidateVertexAttrib4f(Context *context,
Jamie Madillc1d770e2017-04-13 17:31:24 -04005926 GLuint index,
5927 GLfloat x,
5928 GLfloat y,
5929 GLfloat z,
5930 GLfloat w)
5931{
5932 return ValidateVertexAttribIndex(context, index);
5933}
5934
Jamie Madill5b772312018-03-08 20:28:32 -05005935bool ValidateVertexAttrib4fv(Context *context, GLuint index, const GLfloat *values)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005936{
5937 return ValidateVertexAttribIndex(context, index);
5938}
5939
Jamie Madill5b772312018-03-08 20:28:32 -05005940bool ValidateViewport(Context *context, GLint x, GLint y, GLsizei width, GLsizei height)
Jamie Madillc1d770e2017-04-13 17:31:24 -04005941{
5942 if (width < 0 || height < 0)
5943 {
Jamie Madille0472f32018-11-27 16:32:45 -05005944 context->validationError(GL_INVALID_VALUE, kViewportNegativeSize);
Jamie Madillc1d770e2017-04-13 17:31:24 -04005945 return false;
5946 }
5947
5948 return true;
5949}
5950
Bryan Bernhart (Intel Americas Inc)2eeb1b32017-11-29 16:06:43 -08005951bool ValidateGetFramebufferAttachmentParameteriv(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04005952 GLenum target,
5953 GLenum attachment,
5954 GLenum pname,
5955 GLint *params)
5956{
5957 return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
5958 nullptr);
5959}
5960
Jamie Madill5b772312018-03-08 20:28:32 -05005961bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04005962{
5963 return ValidateGetProgramivBase(context, program, pname, nullptr);
5964}
5965
Jamie Madill5b772312018-03-08 20:28:32 -05005966bool ValidateCopyTexImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005967 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005968 GLint level,
5969 GLenum internalformat,
5970 GLint x,
5971 GLint y,
5972 GLsizei width,
5973 GLsizei height,
5974 GLint border)
5975{
5976 if (context->getClientMajorVersion() < 3)
5977 {
5978 return ValidateES2CopyTexImageParameters(context, target, level, internalformat, false, 0,
5979 0, x, y, width, height, border);
5980 }
5981
5982 ASSERT(context->getClientMajorVersion() == 3);
5983 return ValidateES3CopyTexImage2DParameters(context, target, level, internalformat, false, 0, 0,
5984 0, x, y, width, height, border);
5985}
5986
5987bool ValidateCopyTexSubImage2D(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08005988 TextureTarget target,
Jamie Madillbe849e42017-05-02 15:49:00 -04005989 GLint level,
5990 GLint xoffset,
5991 GLint yoffset,
5992 GLint x,
5993 GLint y,
5994 GLsizei width,
5995 GLsizei height)
5996{
5997 if (context->getClientMajorVersion() < 3)
5998 {
5999 return ValidateES2CopyTexImageParameters(context, target, level, GL_NONE, true, xoffset,
6000 yoffset, x, y, width, height, 0);
6001 }
6002
6003 return ValidateES3CopyTexImage2DParameters(context, target, level, GL_NONE, true, xoffset,
6004 yoffset, 0, x, y, width, height, 0);
6005}
6006
6007bool ValidateDeleteBuffers(Context *context, GLint n, const GLuint *)
6008{
6009 return ValidateGenOrDelete(context, n);
6010}
6011
6012bool ValidateDeleteFramebuffers(Context *context, GLint n, const GLuint *)
6013{
6014 return ValidateGenOrDelete(context, n);
6015}
6016
6017bool ValidateDeleteRenderbuffers(Context *context, GLint n, const GLuint *)
6018{
6019 return ValidateGenOrDelete(context, n);
6020}
6021
6022bool ValidateDeleteTextures(Context *context, GLint n, const GLuint *)
6023{
6024 return ValidateGenOrDelete(context, n);
6025}
6026
6027bool ValidateDisable(Context *context, GLenum cap)
6028{
6029 if (!ValidCap(context, cap, false))
6030 {
Jamie Madille0472f32018-11-27 16:32:45 -05006031 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006032 return false;
6033 }
6034
6035 return true;
6036}
6037
6038bool ValidateEnable(Context *context, GLenum cap)
6039{
6040 if (!ValidCap(context, cap, false))
6041 {
Jamie Madille0472f32018-11-27 16:32:45 -05006042 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006043 return false;
6044 }
6045
6046 if (context->getLimitations().noSampleAlphaToCoverageSupport &&
6047 cap == GL_SAMPLE_ALPHA_TO_COVERAGE)
6048 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006049 context->validationError(GL_INVALID_OPERATION, kNoSampleAlphaToCoveragesLimitation);
Jamie Madillbe849e42017-05-02 15:49:00 -04006050
6051 // We also output an error message to the debugger window if tracing is active, so that
6052 // developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006053 ERR() << kNoSampleAlphaToCoveragesLimitation;
Jamie Madillbe849e42017-05-02 15:49:00 -04006054 return false;
6055 }
6056
6057 return true;
6058}
6059
6060bool ValidateFramebufferRenderbuffer(Context *context,
6061 GLenum target,
6062 GLenum attachment,
6063 GLenum renderbuffertarget,
6064 GLuint renderbuffer)
6065{
Geoff Lange8afa902017-09-27 15:00:43 -04006066 if (!ValidFramebufferTarget(context, target))
Jamie Madillbe849e42017-05-02 15:49:00 -04006067 {
Jamie Madille0472f32018-11-27 16:32:45 -05006068 context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
Brandon Jones6cad5662017-06-14 13:25:13 -07006069 return false;
6070 }
6071
6072 if (renderbuffertarget != GL_RENDERBUFFER && renderbuffer != 0)
6073 {
Jamie Madille0472f32018-11-27 16:32:45 -05006074 context->validationError(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006075 return false;
6076 }
6077
6078 return ValidateFramebufferRenderbufferParameters(context, target, attachment,
6079 renderbuffertarget, renderbuffer);
6080}
6081
6082bool ValidateFramebufferTexture2D(Context *context,
6083 GLenum target,
6084 GLenum attachment,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006085 TextureTarget textarget,
Jamie Madillbe849e42017-05-02 15:49:00 -04006086 GLuint texture,
6087 GLint level)
6088{
6089 // Attachments are required to be bound to level 0 without ES3 or the GL_OES_fbo_render_mipmap
6090 // extension
6091 if (context->getClientMajorVersion() < 3 && !context->getExtensions().fboRenderMipmap &&
6092 level != 0)
6093 {
Jamie Madille0472f32018-11-27 16:32:45 -05006094 context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006095 return false;
6096 }
6097
6098 if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
6099 {
6100 return false;
6101 }
6102
6103 if (texture != 0)
6104 {
6105 gl::Texture *tex = context->getTexture(texture);
6106 ASSERT(tex);
6107
6108 const gl::Caps &caps = context->getCaps();
6109
6110 switch (textarget)
6111 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006112 case TextureTarget::_2D:
Jamie Madillbe849e42017-05-02 15:49:00 -04006113 {
6114 if (level > gl::log2(caps.max2DTextureSize))
6115 {
Jamie Madille0472f32018-11-27 16:32:45 -05006116 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006117 return false;
6118 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006119 if (tex->getType() != TextureType::_2D)
Jamie Madillbe849e42017-05-02 15:49:00 -04006120 {
Jamie Madille0472f32018-11-27 16:32:45 -05006121 context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006122 return false;
6123 }
6124 }
6125 break;
6126
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006127 case TextureTarget::Rectangle:
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006128 {
6129 if (level != 0)
6130 {
Jamie Madille0472f32018-11-27 16:32:45 -05006131 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006132 return false;
6133 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006134 if (tex->getType() != TextureType::Rectangle)
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006135 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006136 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Corentin Wallez13c0dd42017-07-04 18:27:01 -04006137 return false;
6138 }
6139 }
6140 break;
6141
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006142 case TextureTarget::CubeMapNegativeX:
6143 case TextureTarget::CubeMapNegativeY:
6144 case TextureTarget::CubeMapNegativeZ:
6145 case TextureTarget::CubeMapPositiveX:
6146 case TextureTarget::CubeMapPositiveY:
6147 case TextureTarget::CubeMapPositiveZ:
Jamie Madillbe849e42017-05-02 15:49:00 -04006148 {
6149 if (level > gl::log2(caps.maxCubeMapTextureSize))
6150 {
Jamie Madille0472f32018-11-27 16:32:45 -05006151 context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
Jamie Madillbe849e42017-05-02 15:49:00 -04006152 return false;
6153 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006154 if (tex->getType() != TextureType::CubeMap)
Jamie Madillbe849e42017-05-02 15:49:00 -04006155 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006156 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006157 return false;
6158 }
6159 }
6160 break;
6161
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006162 case TextureTarget::_2DMultisample:
Jamie Madillbe849e42017-05-02 15:49:00 -04006163 {
Yizhou Jiang7818a852018-09-06 15:02:04 +08006164 if (context->getClientVersion() < ES_3_1 &&
6165 !context->getExtensions().textureMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006166 {
Jamie Madill610640f2018-11-21 17:28:41 -05006167 context->validationError(GL_INVALID_OPERATION,
Jamie Madille0472f32018-11-27 16:32:45 -05006168 kMultisampleTextureExtensionOrES31Required);
Jamie Madillbe849e42017-05-02 15:49:00 -04006169 return false;
6170 }
6171
6172 if (level != 0)
6173 {
Jamie Madille0472f32018-11-27 16:32:45 -05006174 context->validationError(GL_INVALID_VALUE, kLevelNotZero);
Jamie Madillbe849e42017-05-02 15:49:00 -04006175 return false;
6176 }
Corentin Wallez99d492c2018-02-27 15:17:10 -05006177 if (tex->getType() != TextureType::_2DMultisample)
Jamie Madillbe849e42017-05-02 15:49:00 -04006178 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006179 context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
Jamie Madillbe849e42017-05-02 15:49:00 -04006180 return false;
6181 }
6182 }
6183 break;
6184
6185 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006186 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006187 return false;
6188 }
Jamie Madillbe849e42017-05-02 15:49:00 -04006189 }
6190
6191 return true;
6192}
6193
6194bool ValidateGenBuffers(Context *context, GLint n, GLuint *)
6195{
6196 return ValidateGenOrDelete(context, n);
6197}
6198
6199bool ValidateGenFramebuffers(Context *context, GLint n, GLuint *)
6200{
6201 return ValidateGenOrDelete(context, n);
6202}
6203
6204bool ValidateGenRenderbuffers(Context *context, GLint n, GLuint *)
6205{
6206 return ValidateGenOrDelete(context, n);
6207}
6208
6209bool ValidateGenTextures(Context *context, GLint n, GLuint *)
6210{
6211 return ValidateGenOrDelete(context, n);
6212}
6213
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006214bool ValidateGenerateMipmap(Context *context, TextureType target)
Jamie Madillbe849e42017-05-02 15:49:00 -04006215{
6216 if (!ValidTextureTarget(context, target))
6217 {
Jamie Madille0472f32018-11-27 16:32:45 -05006218 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
Jamie Madillbe849e42017-05-02 15:49:00 -04006219 return false;
6220 }
6221
6222 Texture *texture = context->getTargetTexture(target);
6223
6224 if (texture == nullptr)
6225 {
Jamie Madille0472f32018-11-27 16:32:45 -05006226 context->validationError(GL_INVALID_OPERATION, kTextureNotBound);
Jamie Madillbe849e42017-05-02 15:49:00 -04006227 return false;
6228 }
6229
6230 const GLuint effectiveBaseLevel = texture->getTextureState().getEffectiveBaseLevel();
6231
6232 // This error isn't spelled out in the spec in a very explicit way, but we interpret the spec so
6233 // that out-of-range base level has a non-color-renderable / non-texture-filterable format.
6234 if (effectiveBaseLevel >= gl::IMPLEMENTATION_MAX_TEXTURE_LEVELS)
6235 {
Jamie Madille0472f32018-11-27 16:32:45 -05006236 context->validationError(GL_INVALID_OPERATION, kBaseLevelOutOfRange);
Jamie Madillbe849e42017-05-02 15:49:00 -04006237 return false;
6238 }
6239
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006240 TextureTarget baseTarget = (target == TextureType::CubeMap)
6241 ? TextureTarget::CubeMapPositiveX
6242 : NonCubeTextureTypeToTarget(target);
Geoff Lang536eca12017-09-13 11:23:35 -04006243 const auto &format = *(texture->getFormat(baseTarget, effectiveBaseLevel).info);
6244 if (format.sizedInternalFormat == GL_NONE || format.compressed || format.depthBits > 0 ||
6245 format.stencilBits > 0)
Brandon Jones6cad5662017-06-14 13:25:13 -07006246 {
Jamie Madille0472f32018-11-27 16:32:45 -05006247 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Brandon Jones6cad5662017-06-14 13:25:13 -07006248 return false;
6249 }
6250
Geoff Lang536eca12017-09-13 11:23:35 -04006251 // GenerateMipmap accepts formats that are unsized or both color renderable and filterable.
6252 bool formatUnsized = !format.sized;
6253 bool formatColorRenderableAndFilterable =
6254 format.filterSupport(context->getClientVersion(), context->getExtensions()) &&
Yuly Novikovf15f8862018-06-04 18:59:41 -04006255 format.textureAttachmentSupport(context->getClientVersion(), context->getExtensions());
Geoff Lang536eca12017-09-13 11:23:35 -04006256 if (!formatUnsized && !formatColorRenderableAndFilterable)
Jamie Madillbe849e42017-05-02 15:49:00 -04006257 {
Jamie Madille0472f32018-11-27 16:32:45 -05006258 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006259 return false;
6260 }
6261
Geoff Lang536eca12017-09-13 11:23:35 -04006262 // GL_EXT_sRGB adds an unsized SRGB (no alpha) format which has explicitly disabled mipmap
6263 // generation
6264 if (format.colorEncoding == GL_SRGB && format.format == GL_RGB)
6265 {
Jamie Madille0472f32018-11-27 16:32:45 -05006266 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Geoff Lang536eca12017-09-13 11:23:35 -04006267 return false;
6268 }
6269
Jiange2c00842018-07-13 16:50:49 +08006270 // According to the OpenGL extension spec EXT_sRGB.txt, EXT_SRGB is based on ES 2.0 and
6271 // generateMipmap is not allowed if texture format is SRGB_EXT or SRGB_ALPHA_EXT.
6272 if (context->getClientVersion() < Version(3, 0) && format.colorEncoding == GL_SRGB)
Jamie Madillbe849e42017-05-02 15:49:00 -04006273 {
Jamie Madille0472f32018-11-27 16:32:45 -05006274 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapNotAllowed);
Jamie Madillbe849e42017-05-02 15:49:00 -04006275 return false;
6276 }
6277
6278 // Non-power of 2 ES2 check
6279 if (context->getClientVersion() < Version(3, 0) && !context->getExtensions().textureNPOT &&
6280 (!isPow2(static_cast<int>(texture->getWidth(baseTarget, 0))) ||
6281 !isPow2(static_cast<int>(texture->getHeight(baseTarget, 0)))))
6282 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006283 ASSERT(target == TextureType::_2D || target == TextureType::Rectangle ||
6284 target == TextureType::CubeMap);
Jamie Madille0472f32018-11-27 16:32:45 -05006285 context->validationError(GL_INVALID_OPERATION, kTextureNotPow2);
Jamie Madillbe849e42017-05-02 15:49:00 -04006286 return false;
6287 }
6288
6289 // Cube completeness check
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006290 if (target == TextureType::CubeMap && !texture->getTextureState().isCubeComplete())
Jamie Madillbe849e42017-05-02 15:49:00 -04006291 {
Jamie Madille0472f32018-11-27 16:32:45 -05006292 context->validationError(GL_INVALID_OPERATION, kCubemapIncomplete);
Jamie Madillbe849e42017-05-02 15:49:00 -04006293 return false;
6294 }
6295
James Darpinian83b2f0e2018-11-27 15:56:01 -08006296 if (context->getExtensions().webglCompatibility &&
6297 (texture->getWidth(baseTarget, effectiveBaseLevel) == 0 ||
6298 texture->getHeight(baseTarget, effectiveBaseLevel) == 0))
6299 {
6300 context->validationError(GL_INVALID_OPERATION, kGenerateMipmapZeroSize);
6301 return false;
6302 }
6303
Jamie Madillbe849e42017-05-02 15:49:00 -04006304 return true;
6305}
6306
Jamie Madill5b772312018-03-08 20:28:32 -05006307bool ValidateGetBufferParameteriv(Context *context,
Corentin Wallez336129f2017-10-17 15:55:40 -04006308 BufferBinding target,
Jamie Madillbe849e42017-05-02 15:49:00 -04006309 GLenum pname,
6310 GLint *params)
6311{
6312 return ValidateGetBufferParameterBase(context, target, pname, false, nullptr);
6313}
6314
6315bool ValidateGetRenderbufferParameteriv(Context *context,
6316 GLenum target,
6317 GLenum pname,
6318 GLint *params)
6319{
6320 return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
6321}
6322
6323bool ValidateGetShaderiv(Context *context, GLuint shader, GLenum pname, GLint *params)
6324{
6325 return ValidateGetShaderivBase(context, shader, pname, nullptr);
6326}
6327
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006328bool ValidateGetTexParameterfv(Context *context, TextureType target, GLenum pname, GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006329{
6330 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6331}
6332
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006333bool ValidateGetTexParameteriv(Context *context, TextureType target, GLenum pname, GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006334{
6335 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6336}
6337
Till Rathmannb8543632018-10-02 19:46:14 +02006338bool ValidateGetTexParameterIivOES(Context *context,
6339 TextureType target,
6340 GLenum pname,
6341 GLint *params)
6342{
6343 if (context->getClientMajorVersion() < 3)
6344 {
Jamie Madille0472f32018-11-27 16:32:45 -05006345 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006346 return false;
6347 }
6348 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6349}
6350
6351bool ValidateGetTexParameterIuivOES(Context *context,
6352 TextureType target,
6353 GLenum pname,
6354 GLuint *params)
6355{
6356 if (context->getClientMajorVersion() < 3)
6357 {
Jamie Madille0472f32018-11-27 16:32:45 -05006358 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006359 return false;
6360 }
6361 return ValidateGetTexParameterBase(context, target, pname, nullptr);
6362}
6363
Jamie Madillbe849e42017-05-02 15:49:00 -04006364bool ValidateGetUniformfv(Context *context, GLuint program, GLint location, GLfloat *params)
6365{
6366 return ValidateGetUniformBase(context, program, location);
6367}
6368
6369bool ValidateGetUniformiv(Context *context, GLuint program, GLint location, GLint *params)
6370{
6371 return ValidateGetUniformBase(context, program, location);
6372}
6373
6374bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
6375{
6376 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6377}
6378
6379bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
6380{
6381 return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
6382}
6383
6384bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
6385{
6386 return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
6387}
6388
6389bool ValidateIsEnabled(Context *context, GLenum cap)
6390{
6391 if (!ValidCap(context, cap, true))
6392 {
Jamie Madille0472f32018-11-27 16:32:45 -05006393 context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
Jamie Madillbe849e42017-05-02 15:49:00 -04006394 return false;
6395 }
6396
6397 return true;
6398}
6399
6400bool ValidateLinkProgram(Context *context, GLuint program)
6401{
6402 if (context->hasActiveTransformFeedback(program))
6403 {
6404 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006405 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackActiveDuringLink);
Jamie Madillbe849e42017-05-02 15:49:00 -04006406 return false;
6407 }
6408
6409 Program *programObject = GetValidProgram(context, program);
6410 if (!programObject)
6411 {
6412 return false;
6413 }
6414
6415 return true;
6416}
6417
Jamie Madill4928b7c2017-06-20 12:57:39 -04006418bool ValidateReadPixels(Context *context,
Jamie Madillbe849e42017-05-02 15:49:00 -04006419 GLint x,
6420 GLint y,
6421 GLsizei width,
6422 GLsizei height,
6423 GLenum format,
6424 GLenum type,
6425 void *pixels)
6426{
6427 return ValidateReadPixelsBase(context, x, y, width, height, format, type, -1, nullptr, nullptr,
6428 nullptr, pixels);
6429}
6430
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006431bool ValidateTexParameterf(Context *context, TextureType target, GLenum pname, GLfloat param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006432{
Till Rathmannb8543632018-10-02 19:46:14 +02006433 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006434}
6435
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006436bool ValidateTexParameterfv(Context *context,
6437 TextureType target,
6438 GLenum pname,
6439 const GLfloat *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006440{
Till Rathmannb8543632018-10-02 19:46:14 +02006441 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006442}
6443
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006444bool ValidateTexParameteri(Context *context, TextureType target, GLenum pname, GLint param)
Jamie Madillbe849e42017-05-02 15:49:00 -04006445{
Till Rathmannb8543632018-10-02 19:46:14 +02006446 return ValidateTexParameterBase(context, target, pname, -1, false, &param);
Jamie Madillbe849e42017-05-02 15:49:00 -04006447}
6448
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006449bool ValidateTexParameteriv(Context *context, TextureType target, GLenum pname, const GLint *params)
Jamie Madillbe849e42017-05-02 15:49:00 -04006450{
Till Rathmannb8543632018-10-02 19:46:14 +02006451 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6452}
6453
6454bool ValidateTexParameterIivOES(Context *context,
6455 TextureType target,
6456 GLenum pname,
6457 const GLint *params)
6458{
6459 if (context->getClientMajorVersion() < 3)
6460 {
Jamie Madille0472f32018-11-27 16:32:45 -05006461 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006462 return false;
6463 }
6464 return ValidateTexParameterBase(context, target, pname, -1, true, params);
6465}
6466
6467bool ValidateTexParameterIuivOES(Context *context,
6468 TextureType target,
6469 GLenum pname,
6470 const GLuint *params)
6471{
6472 if (context->getClientMajorVersion() < 3)
6473 {
Jamie Madille0472f32018-11-27 16:32:45 -05006474 context->validationError(GL_INVALID_OPERATION, kES3Required);
Till Rathmannb8543632018-10-02 19:46:14 +02006475 return false;
6476 }
6477 return ValidateTexParameterBase(context, target, pname, -1, true, params);
Jamie Madillbe849e42017-05-02 15:49:00 -04006478}
6479
6480bool ValidateUseProgram(Context *context, GLuint program)
6481{
6482 if (program != 0)
6483 {
Jamie Madill44a6fbf2018-10-02 13:38:56 -04006484 Program *programObject = context->getProgramResolveLink(program);
Jamie Madillbe849e42017-05-02 15:49:00 -04006485 if (!programObject)
6486 {
6487 // ES 3.1.0 section 7.3 page 72
6488 if (context->getShader(program))
6489 {
Jamie Madille0472f32018-11-27 16:32:45 -05006490 context->validationError(GL_INVALID_OPERATION, kExpectedProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006491 return false;
6492 }
6493 else
6494 {
Jamie Madille0472f32018-11-27 16:32:45 -05006495 context->validationError(GL_INVALID_VALUE, kInvalidProgramName);
Jamie Madillbe849e42017-05-02 15:49:00 -04006496 return false;
6497 }
6498 }
6499 if (!programObject->isLinked())
6500 {
Jamie Madille0472f32018-11-27 16:32:45 -05006501 context->validationError(GL_INVALID_OPERATION, kProgramNotLinked);
Jamie Madillbe849e42017-05-02 15:49:00 -04006502 return false;
6503 }
6504 }
Jamie Madillc3dc5d42018-12-30 12:12:04 -05006505 if (context->getState().isTransformFeedbackActiveUnpaused())
Jamie Madillbe849e42017-05-02 15:49:00 -04006506 {
6507 // ES 3.0.4 section 2.15 page 91
Jamie Madillc3e37312018-11-30 15:25:39 -05006508 context->validationError(GL_INVALID_OPERATION, kTransformFeedbackUseProgram);
Jamie Madillbe849e42017-05-02 15:49:00 -04006509 return false;
6510 }
6511
6512 return true;
6513}
6514
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006515bool ValidateDeleteFencesNV(Context *context, GLsizei n, const GLuint *fences)
6516{
6517 if (!context->getExtensions().fence)
6518 {
Jamie Madille0472f32018-11-27 16:32:45 -05006519 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006520 return false;
6521 }
6522
6523 if (n < 0)
6524 {
Jamie Madille0472f32018-11-27 16:32:45 -05006525 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006526 return false;
6527 }
6528
6529 return true;
6530}
6531
6532bool ValidateFinishFenceNV(Context *context, GLuint fence)
6533{
6534 if (!context->getExtensions().fence)
6535 {
Jamie Madille0472f32018-11-27 16:32:45 -05006536 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006537 return false;
6538 }
6539
6540 FenceNV *fenceObject = context->getFenceNV(fence);
6541
6542 if (fenceObject == nullptr)
6543 {
Jamie Madille0472f32018-11-27 16:32:45 -05006544 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006545 return false;
6546 }
6547
6548 if (!fenceObject->isSet())
6549 {
Jamie Madille0472f32018-11-27 16:32:45 -05006550 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006551 return false;
6552 }
6553
6554 return true;
6555}
6556
6557bool ValidateGenFencesNV(Context *context, GLsizei n, GLuint *fences)
6558{
6559 if (!context->getExtensions().fence)
6560 {
Jamie Madille0472f32018-11-27 16:32:45 -05006561 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006562 return false;
6563 }
6564
6565 if (n < 0)
6566 {
Jamie Madille0472f32018-11-27 16:32:45 -05006567 context->validationError(GL_INVALID_VALUE, kNegativeCount);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006568 return false;
6569 }
6570
6571 return true;
6572}
6573
6574bool ValidateGetFenceivNV(Context *context, GLuint fence, GLenum pname, GLint *params)
6575{
6576 if (!context->getExtensions().fence)
6577 {
Jamie Madille0472f32018-11-27 16:32:45 -05006578 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006579 return false;
6580 }
6581
6582 FenceNV *fenceObject = context->getFenceNV(fence);
6583
6584 if (fenceObject == nullptr)
6585 {
Jamie Madille0472f32018-11-27 16:32:45 -05006586 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006587 return false;
6588 }
6589
6590 if (!fenceObject->isSet())
6591 {
Jamie Madille0472f32018-11-27 16:32:45 -05006592 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006593 return false;
6594 }
6595
6596 switch (pname)
6597 {
6598 case GL_FENCE_STATUS_NV:
6599 case GL_FENCE_CONDITION_NV:
6600 break;
6601
6602 default:
Jamie Madille0472f32018-11-27 16:32:45 -05006603 context->validationError(GL_INVALID_ENUM, kInvalidPname);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006604 return false;
6605 }
6606
6607 return true;
6608}
6609
6610bool ValidateGetGraphicsResetStatusEXT(Context *context)
6611{
6612 if (!context->getExtensions().robustness)
6613 {
Jamie Madille0472f32018-11-27 16:32:45 -05006614 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006615 return false;
6616 }
6617
6618 return true;
6619}
6620
6621bool ValidateGetTranslatedShaderSourceANGLE(Context *context,
6622 GLuint shader,
6623 GLsizei bufsize,
6624 GLsizei *length,
6625 GLchar *source)
6626{
6627 if (!context->getExtensions().translatedShaderSource)
6628 {
Jamie Madille0472f32018-11-27 16:32:45 -05006629 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006630 return false;
6631 }
6632
6633 if (bufsize < 0)
6634 {
Jamie Madille0472f32018-11-27 16:32:45 -05006635 context->validationError(GL_INVALID_VALUE, kNegativeBufferSize);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006636 return false;
6637 }
6638
6639 Shader *shaderObject = context->getShader(shader);
6640
6641 if (!shaderObject)
6642 {
Jamie Madille0472f32018-11-27 16:32:45 -05006643 context->validationError(GL_INVALID_OPERATION, kInvalidShaderName);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006644 return false;
6645 }
6646
6647 return true;
6648}
6649
6650bool ValidateIsFenceNV(Context *context, GLuint fence)
6651{
6652 if (!context->getExtensions().fence)
6653 {
Jamie Madille0472f32018-11-27 16:32:45 -05006654 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill2b7bbc22017-12-21 17:30:38 -05006655 return false;
6656 }
6657
6658 return true;
6659}
6660
Jamie Madill007530e2017-12-28 14:27:04 -05006661bool ValidateSetFenceNV(Context *context, GLuint fence, GLenum condition)
6662{
6663 if (!context->getExtensions().fence)
6664 {
Jamie Madille0472f32018-11-27 16:32:45 -05006665 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006666 return false;
6667 }
6668
6669 if (condition != GL_ALL_COMPLETED_NV)
6670 {
Jamie Madille0472f32018-11-27 16:32:45 -05006671 context->validationError(GL_INVALID_ENUM, kInvalidFenceCondition);
Jamie Madill007530e2017-12-28 14:27:04 -05006672 return false;
6673 }
6674
6675 FenceNV *fenceObject = context->getFenceNV(fence);
6676
6677 if (fenceObject == nullptr)
6678 {
Jamie Madille0472f32018-11-27 16:32:45 -05006679 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006680 return false;
6681 }
6682
6683 return true;
6684}
6685
6686bool ValidateTestFenceNV(Context *context, GLuint fence)
6687{
6688 if (!context->getExtensions().fence)
6689 {
Jamie Madille0472f32018-11-27 16:32:45 -05006690 context->validationError(GL_INVALID_OPERATION, kNVFenceNotSupported);
Jamie Madill007530e2017-12-28 14:27:04 -05006691 return false;
6692 }
6693
6694 FenceNV *fenceObject = context->getFenceNV(fence);
6695
6696 if (fenceObject == nullptr)
6697 {
Jamie Madille0472f32018-11-27 16:32:45 -05006698 context->validationError(GL_INVALID_OPERATION, kInvalidFence);
Jamie Madill007530e2017-12-28 14:27:04 -05006699 return false;
6700 }
6701
6702 if (fenceObject->isSet() != GL_TRUE)
6703 {
Jamie Madille0472f32018-11-27 16:32:45 -05006704 context->validationError(GL_INVALID_OPERATION, kInvalidFenceState);
Jamie Madill007530e2017-12-28 14:27:04 -05006705 return false;
6706 }
6707
6708 return true;
6709}
6710
6711bool ValidateTexStorage2DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006712 TextureType type,
Jamie Madill007530e2017-12-28 14:27:04 -05006713 GLsizei levels,
6714 GLenum internalformat,
6715 GLsizei width,
6716 GLsizei height)
6717{
6718 if (!context->getExtensions().textureStorage)
6719 {
Jamie Madille0472f32018-11-27 16:32:45 -05006720 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006721 return false;
6722 }
6723
6724 if (context->getClientMajorVersion() < 3)
6725 {
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006726 return ValidateES2TexStorageParameters(context, type, levels, internalformat, width,
Jamie Madill007530e2017-12-28 14:27:04 -05006727 height);
6728 }
6729
6730 ASSERT(context->getClientMajorVersion() >= 3);
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006731 return ValidateES3TexStorage2DParameters(context, type, levels, internalformat, width, height,
Jamie Madill007530e2017-12-28 14:27:04 -05006732 1);
6733}
6734
6735bool ValidateVertexAttribDivisorANGLE(Context *context, GLuint index, GLuint divisor)
6736{
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006737 if (!context->getExtensions().instancedArraysANGLE)
Jamie Madill007530e2017-12-28 14:27:04 -05006738 {
Jamie Madille0472f32018-11-27 16:32:45 -05006739 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006740 return false;
6741 }
6742
6743 if (index >= MAX_VERTEX_ATTRIBS)
6744 {
Jamie Madille0472f32018-11-27 16:32:45 -05006745 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
Jamie Madill007530e2017-12-28 14:27:04 -05006746 return false;
6747 }
6748
6749 if (context->getLimitations().attributeZeroRequiresZeroDivisorInEXT)
6750 {
6751 if (index == 0 && divisor != 0)
6752 {
Jamie Madillc3e37312018-11-30 15:25:39 -05006753 context->validationError(GL_INVALID_OPERATION, kAttributeZeroRequiresDivisorLimitation);
Jamie Madill007530e2017-12-28 14:27:04 -05006754
6755 // We also output an error message to the debugger window if tracing is active, so
6756 // that developers can see the error message.
Jamie Madillc3e37312018-11-30 15:25:39 -05006757 ERR() << kAttributeZeroRequiresDivisorLimitation;
Jamie Madill007530e2017-12-28 14:27:04 -05006758 return false;
6759 }
6760 }
6761
6762 return true;
6763}
6764
Jonah Ryan-Davis2b0553c2019-02-08 10:07:21 -05006765bool ValidateVertexAttribDivisorEXT(Context *context, GLuint index, GLuint divisor)
6766{
6767 if (!context->getExtensions().instancedArraysEXT)
6768 {
6769 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6770 return false;
6771 }
6772
6773 if (index >= MAX_VERTEX_ATTRIBS)
6774 {
6775 context->validationError(GL_INVALID_VALUE, kIndexExceedsMaxVertexAttribute);
6776 return false;
6777 }
6778
6779 return true;
6780}
6781
Jamie Madill007530e2017-12-28 14:27:04 -05006782bool ValidateTexImage3DOES(Context *context,
6783 GLenum target,
6784 GLint level,
6785 GLenum internalformat,
6786 GLsizei width,
6787 GLsizei height,
6788 GLsizei depth,
6789 GLint border,
6790 GLenum format,
6791 GLenum type,
6792 const void *pixels)
6793{
6794 UNIMPLEMENTED(); // FIXME
6795 return false;
6796}
6797
6798bool ValidatePopGroupMarkerEXT(Context *context)
6799{
6800 if (!context->getExtensions().debugMarker)
6801 {
6802 // The debug marker calls should not set error state
6803 // However, it seems reasonable to set an error state if the extension is not enabled
Jamie Madille0472f32018-11-27 16:32:45 -05006804 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madill007530e2017-12-28 14:27:04 -05006805 return false;
6806 }
6807
6808 return true;
6809}
6810
Jamie Madillfa920eb2018-01-04 11:45:50 -05006811bool ValidateTexStorage1DEXT(Context *context,
6812 GLenum target,
6813 GLsizei levels,
6814 GLenum internalformat,
6815 GLsizei width)
6816{
6817 UNIMPLEMENTED();
Jamie Madille0472f32018-11-27 16:32:45 -05006818 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006819 return false;
6820}
6821
6822bool ValidateTexStorage3DEXT(Context *context,
Corentin Wallezf0e89be2017-11-08 14:00:32 -08006823 TextureType target,
Jamie Madillfa920eb2018-01-04 11:45:50 -05006824 GLsizei levels,
6825 GLenum internalformat,
6826 GLsizei width,
6827 GLsizei height,
6828 GLsizei depth)
6829{
6830 if (!context->getExtensions().textureStorage)
6831 {
Jamie Madille0472f32018-11-27 16:32:45 -05006832 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006833 return false;
6834 }
6835
6836 if (context->getClientMajorVersion() < 3)
6837 {
Jamie Madille0472f32018-11-27 16:32:45 -05006838 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Jamie Madillfa920eb2018-01-04 11:45:50 -05006839 return false;
6840 }
6841
6842 return ValidateES3TexStorage3DParameters(context, target, levels, internalformat, width, height,
6843 depth);
6844}
6845
jchen1082af6202018-06-22 10:59:52 +08006846bool ValidateMaxShaderCompilerThreadsKHR(Context *context, GLuint count)
6847{
6848 if (!context->getExtensions().parallelShaderCompile)
6849 {
Jamie Madille0472f32018-11-27 16:32:45 -05006850 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
jchen1082af6202018-06-22 10:59:52 +08006851 return false;
6852 }
6853 return true;
6854}
6855
Austin Eng1bf18ce2018-10-19 15:34:02 -07006856bool ValidateMultiDrawArraysANGLE(Context *context,
6857 PrimitiveMode mode,
6858 const GLint *firsts,
6859 const GLsizei *counts,
6860 GLsizei drawcount)
6861{
6862 if (!context->getExtensions().multiDraw)
6863 {
Jamie Madille0472f32018-11-27 16:32:45 -05006864 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006865 return false;
6866 }
6867 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6868 {
6869 if (!ValidateDrawArrays(context, mode, firsts[drawID], counts[drawID]))
6870 {
6871 return false;
6872 }
6873 }
6874 return true;
6875}
6876
6877bool ValidateMultiDrawElementsANGLE(Context *context,
6878 PrimitiveMode mode,
6879 const GLsizei *counts,
Jamie Madill8dc27f92018-11-29 11:45:44 -05006880 DrawElementsType type,
Austin Eng3b7c9d02018-11-21 18:09:05 -08006881 const GLvoid *const *indices,
Austin Eng1bf18ce2018-10-19 15:34:02 -07006882 GLsizei drawcount)
6883{
6884 if (!context->getExtensions().multiDraw)
6885 {
Jamie Madille0472f32018-11-27 16:32:45 -05006886 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
Austin Eng1bf18ce2018-10-19 15:34:02 -07006887 return false;
6888 }
6889 for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
6890 {
Austin Eng3b7c9d02018-11-21 18:09:05 -08006891 if (!ValidateDrawElements(context, mode, counts[drawID], type, indices[drawID]))
Austin Eng1bf18ce2018-10-19 15:34:02 -07006892 {
6893 return false;
6894 }
6895 }
6896 return true;
6897}
6898
Jeff Gilbert465d6092019-01-02 16:21:18 -08006899bool ValidateProvokingVertexANGLE(Context *context, ProvokingVertex modePacked)
6900{
6901 if (!context->getExtensions().provokingVertex)
6902 {
6903 context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
6904 return false;
6905 }
6906
6907 switch (modePacked)
6908 {
6909 case ProvokingVertex::FirstVertexConvention:
6910 case ProvokingVertex::LastVertexConvention:
6911 break;
6912 default:
6913 context->validationError(GL_INVALID_ENUM, kInvalidProvokingVertex);
6914 return false;
6915 }
6916
6917 return true;
6918}
6919
Jamie Madilla5410482019-01-31 19:55:55 -05006920void RecordBindTextureTypeError(Context *context, TextureType target)
6921{
6922 ASSERT(!context->getStateCache().isValidBindTextureType(target));
6923
6924 switch (target)
6925 {
6926 case TextureType::Rectangle:
6927 ASSERT(!context->getExtensions().textureRectangle);
6928 context->validationError(GL_INVALID_ENUM, kTextureRectangleNotSupported);
6929 break;
6930
6931 case TextureType::_3D:
6932 case TextureType::_2DArray:
6933 ASSERT(context->getClientMajorVersion() < 3);
6934 context->validationError(GL_INVALID_ENUM, kES3Required);
6935 break;
6936
6937 case TextureType::_2DMultisample:
6938 ASSERT(context->getClientVersion() < Version(3, 1) &&
6939 !context->getExtensions().textureMultisample);
6940 context->validationError(GL_INVALID_ENUM, kMultisampleTextureExtensionOrES31Required);
6941 break;
6942
6943 case TextureType::_2DMultisampleArray:
6944 ASSERT(!context->getExtensions().textureStorageMultisample2DArray);
6945 context->validationError(GL_INVALID_ENUM, kMultisampleArrayExtensionRequired);
6946 break;
6947
6948 case TextureType::External:
6949 ASSERT(!context->getExtensions().eglImageExternal &&
6950 !context->getExtensions().eglStreamConsumerExternal);
6951 context->validationError(GL_INVALID_ENUM, kExternalTextureNotSupported);
6952 break;
6953
6954 default:
6955 context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
6956 }
6957}
6958
Jamie Madillc29968b2016-01-20 11:17:23 -05006959} // namespace gl