1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2013 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker // validationES3.cpp: Validation functions for OpenGL ES 3.0 entry point parameters
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES3_autogen.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "anglebase/numerics/safe_conversions.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "common/utilities.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ErrorStrings.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Framebuffer.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/FramebufferAttachment.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/PixelLocalStorage.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Renderbuffer.h"
20*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Texture.h"
21*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexArray.h"
22*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/formatutils.h"
23*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES.h"
24*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES3.h"
25*8975f5c5SAndroid Build Coastguard Worker
26*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker namespace gl
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker using namespace err;
31*8975f5c5SAndroid Build Coastguard Worker
32*8975f5c5SAndroid Build Coastguard Worker namespace
33*8975f5c5SAndroid Build Coastguard Worker {
ValidateFramebufferTextureMultiviewBaseANGLE(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum attachment,TextureID texture,GLint level,GLsizei numViews)34*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferTextureMultiviewBaseANGLE(const Context *context,
35*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
36*8975f5c5SAndroid Build Coastguard Worker GLenum target,
37*8975f5c5SAndroid Build Coastguard Worker GLenum attachment,
38*8975f5c5SAndroid Build Coastguard Worker TextureID texture,
39*8975f5c5SAndroid Build Coastguard Worker GLint level,
40*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews)
41*8975f5c5SAndroid Build Coastguard Worker {
42*8975f5c5SAndroid Build Coastguard Worker if (!(context->getExtensions().multiviewOVR || context->getExtensions().multiview2OVR))
43*8975f5c5SAndroid Build Coastguard Worker {
44*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMultiviewNotAvailable);
45*8975f5c5SAndroid Build Coastguard Worker return false;
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker
48*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferTextureBase(context, entryPoint, target, attachment, texture, level))
49*8975f5c5SAndroid Build Coastguard Worker {
50*8975f5c5SAndroid Build Coastguard Worker return false;
51*8975f5c5SAndroid Build Coastguard Worker }
52*8975f5c5SAndroid Build Coastguard Worker
53*8975f5c5SAndroid Build Coastguard Worker if (texture.value != 0 && numViews < 1)
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kMultiviewViewsTooSmall);
56*8975f5c5SAndroid Build Coastguard Worker return false;
57*8975f5c5SAndroid Build Coastguard Worker }
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker if (static_cast<GLuint>(numViews) > context->getCaps().maxViews)
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kMultiviewViewsTooLarge);
62*8975f5c5SAndroid Build Coastguard Worker return false;
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker return true;
66*8975f5c5SAndroid Build Coastguard Worker }
67*8975f5c5SAndroid Build Coastguard Worker
ValidateFramebufferTextureMultiviewLevelAndFormat(const Context * context,angle::EntryPoint entryPoint,const Texture * texture,GLint level)68*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferTextureMultiviewLevelAndFormat(const Context *context,
69*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
70*8975f5c5SAndroid Build Coastguard Worker const Texture *texture,
71*8975f5c5SAndroid Build Coastguard Worker GLint level)
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker TextureType type = texture->getType();
74*8975f5c5SAndroid Build Coastguard Worker if (!ValidMipLevel(context, type, level))
75*8975f5c5SAndroid Build Coastguard Worker {
76*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevel);
77*8975f5c5SAndroid Build Coastguard Worker return false;
78*8975f5c5SAndroid Build Coastguard Worker }
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker const auto &format = texture->getFormat(NonCubeTextureTypeToTarget(type), level);
81*8975f5c5SAndroid Build Coastguard Worker if (format.info->compressed)
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kCompressedTexturesNotAttachable);
84*8975f5c5SAndroid Build Coastguard Worker return false;
85*8975f5c5SAndroid Build Coastguard Worker }
86*8975f5c5SAndroid Build Coastguard Worker return true;
87*8975f5c5SAndroid Build Coastguard Worker }
88*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformES3(const Context * context,angle::EntryPoint entryPoint,GLenum uniformType,UniformLocation location,GLint count)89*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformES3(const Context *context,
90*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
91*8975f5c5SAndroid Build Coastguard Worker GLenum uniformType,
92*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
93*8975f5c5SAndroid Build Coastguard Worker GLint count)
94*8975f5c5SAndroid Build Coastguard Worker {
95*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
98*8975f5c5SAndroid Build Coastguard Worker return false;
99*8975f5c5SAndroid Build Coastguard Worker }
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker return ValidateUniform(context, entryPoint, uniformType, location, count);
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrixES3(const Context * context,angle::EntryPoint entryPoint,GLenum valueType,UniformLocation location,GLsizei count,GLboolean transpose)104*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrixES3(const Context *context,
105*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
106*8975f5c5SAndroid Build Coastguard Worker GLenum valueType,
107*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
108*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
109*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose)
110*8975f5c5SAndroid Build Coastguard Worker {
111*8975f5c5SAndroid Build Coastguard Worker // Check for ES3 uniform entry points
112*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
113*8975f5c5SAndroid Build Coastguard Worker {
114*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
115*8975f5c5SAndroid Build Coastguard Worker return false;
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrix(context, entryPoint, valueType, location, count, transpose);
119*8975f5c5SAndroid Build Coastguard Worker }
120*8975f5c5SAndroid Build Coastguard Worker
ValidateGenOrDeleteES3(const Context * context,angle::EntryPoint entryPoint,GLint n)121*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenOrDeleteES3(const Context *context, angle::EntryPoint entryPoint, GLint n)
122*8975f5c5SAndroid Build Coastguard Worker {
123*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
124*8975f5c5SAndroid Build Coastguard Worker {
125*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
126*8975f5c5SAndroid Build Coastguard Worker return false;
127*8975f5c5SAndroid Build Coastguard Worker }
128*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDelete(context, entryPoint, n);
129*8975f5c5SAndroid Build Coastguard Worker }
130*8975f5c5SAndroid Build Coastguard Worker
ValidateGenOrDeleteCountES3(const Context * context,angle::EntryPoint entryPoint,GLint count)131*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenOrDeleteCountES3(const Context *context, angle::EntryPoint entryPoint, GLint count)
132*8975f5c5SAndroid Build Coastguard Worker {
133*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
134*8975f5c5SAndroid Build Coastguard Worker {
135*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
136*8975f5c5SAndroid Build Coastguard Worker return false;
137*8975f5c5SAndroid Build Coastguard Worker }
138*8975f5c5SAndroid Build Coastguard Worker if (count < 0)
139*8975f5c5SAndroid Build Coastguard Worker {
140*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeCount);
141*8975f5c5SAndroid Build Coastguard Worker return false;
142*8975f5c5SAndroid Build Coastguard Worker }
143*8975f5c5SAndroid Build Coastguard Worker return true;
144*8975f5c5SAndroid Build Coastguard Worker }
145*8975f5c5SAndroid Build Coastguard Worker
ValidateCopyTexture3DCommon(const Context * context,angle::EntryPoint entryPoint,const Texture * source,GLint sourceLevel,GLint srcInternalFormat,const Texture * dest,GLint destLevel,GLint internalFormat,TextureTarget destTarget)146*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyTexture3DCommon(const Context *context,
147*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
148*8975f5c5SAndroid Build Coastguard Worker const Texture *source,
149*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel,
150*8975f5c5SAndroid Build Coastguard Worker GLint srcInternalFormat,
151*8975f5c5SAndroid Build Coastguard Worker const Texture *dest,
152*8975f5c5SAndroid Build Coastguard Worker GLint destLevel,
153*8975f5c5SAndroid Build Coastguard Worker GLint internalFormat,
154*8975f5c5SAndroid Build Coastguard Worker TextureTarget destTarget)
155*8975f5c5SAndroid Build Coastguard Worker {
156*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
157*8975f5c5SAndroid Build Coastguard Worker {
158*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
159*8975f5c5SAndroid Build Coastguard Worker return false;
160*8975f5c5SAndroid Build Coastguard Worker }
161*8975f5c5SAndroid Build Coastguard Worker
162*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().copyTexture3dANGLE)
163*8975f5c5SAndroid Build Coastguard Worker {
164*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kANGLECopyTexture3DUnavailable);
165*8975f5c5SAndroid Build Coastguard Worker return false;
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker
168*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture3DTarget(context, source->getType()))
169*8975f5c5SAndroid Build Coastguard Worker {
170*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
171*8975f5c5SAndroid Build Coastguard Worker return false;
172*8975f5c5SAndroid Build Coastguard Worker }
173*8975f5c5SAndroid Build Coastguard Worker
174*8975f5c5SAndroid Build Coastguard Worker // Table 1.1 from the ANGLE_copy_texture_3d spec
175*8975f5c5SAndroid Build Coastguard Worker switch (GetUnsizedFormat(srcInternalFormat))
176*8975f5c5SAndroid Build Coastguard Worker {
177*8975f5c5SAndroid Build Coastguard Worker case GL_ALPHA:
178*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE:
179*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
180*8975f5c5SAndroid Build Coastguard Worker case GL_RED:
181*8975f5c5SAndroid Build Coastguard Worker case GL_RED_INTEGER:
182*8975f5c5SAndroid Build Coastguard Worker case GL_RG:
183*8975f5c5SAndroid Build Coastguard Worker case GL_RG_INTEGER:
184*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
185*8975f5c5SAndroid Build Coastguard Worker case GL_RGB_INTEGER:
186*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
187*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA_INTEGER:
188*8975f5c5SAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT:
189*8975f5c5SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL:
190*8975f5c5SAndroid Build Coastguard Worker break;
191*8975f5c5SAndroid Build Coastguard Worker default:
192*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_OPERATION, kInvalidInternalFormat,
193*8975f5c5SAndroid Build Coastguard Worker srcInternalFormat);
194*8975f5c5SAndroid Build Coastguard Worker return false;
195*8975f5c5SAndroid Build Coastguard Worker }
196*8975f5c5SAndroid Build Coastguard Worker
197*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture3DTarget(context, TextureTargetToType(destTarget)))
198*8975f5c5SAndroid Build Coastguard Worker {
199*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
200*8975f5c5SAndroid Build Coastguard Worker return false;
201*8975f5c5SAndroid Build Coastguard Worker }
202*8975f5c5SAndroid Build Coastguard Worker
203*8975f5c5SAndroid Build Coastguard Worker // Table 1.0 from the ANGLE_copy_texture_3d spec
204*8975f5c5SAndroid Build Coastguard Worker switch (internalFormat)
205*8975f5c5SAndroid Build Coastguard Worker {
206*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
207*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
208*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE:
209*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
210*8975f5c5SAndroid Build Coastguard Worker case GL_ALPHA:
211*8975f5c5SAndroid Build Coastguard Worker case GL_R8:
212*8975f5c5SAndroid Build Coastguard Worker case GL_R8_SNORM:
213*8975f5c5SAndroid Build Coastguard Worker case GL_R16F:
214*8975f5c5SAndroid Build Coastguard Worker case GL_R32F:
215*8975f5c5SAndroid Build Coastguard Worker case GL_R8UI:
216*8975f5c5SAndroid Build Coastguard Worker case GL_R8I:
217*8975f5c5SAndroid Build Coastguard Worker case GL_R16UI:
218*8975f5c5SAndroid Build Coastguard Worker case GL_R16I:
219*8975f5c5SAndroid Build Coastguard Worker case GL_R32UI:
220*8975f5c5SAndroid Build Coastguard Worker case GL_R32I:
221*8975f5c5SAndroid Build Coastguard Worker case GL_RG:
222*8975f5c5SAndroid Build Coastguard Worker case GL_RG8:
223*8975f5c5SAndroid Build Coastguard Worker case GL_RG8_SNORM:
224*8975f5c5SAndroid Build Coastguard Worker case GL_RG16F:
225*8975f5c5SAndroid Build Coastguard Worker case GL_RG32F:
226*8975f5c5SAndroid Build Coastguard Worker case GL_RG8UI:
227*8975f5c5SAndroid Build Coastguard Worker case GL_RG8I:
228*8975f5c5SAndroid Build Coastguard Worker case GL_RG16UI:
229*8975f5c5SAndroid Build Coastguard Worker case GL_RG16I:
230*8975f5c5SAndroid Build Coastguard Worker case GL_RG32UI:
231*8975f5c5SAndroid Build Coastguard Worker case GL_RG32I:
232*8975f5c5SAndroid Build Coastguard Worker case GL_RGB8:
233*8975f5c5SAndroid Build Coastguard Worker case GL_RGBX8_ANGLE:
234*8975f5c5SAndroid Build Coastguard Worker case GL_SRGB8:
235*8975f5c5SAndroid Build Coastguard Worker case GL_RGB565:
236*8975f5c5SAndroid Build Coastguard Worker case GL_RGB8_SNORM:
237*8975f5c5SAndroid Build Coastguard Worker case GL_R11F_G11F_B10F:
238*8975f5c5SAndroid Build Coastguard Worker case GL_RGB9_E5:
239*8975f5c5SAndroid Build Coastguard Worker case GL_RGB16F:
240*8975f5c5SAndroid Build Coastguard Worker case GL_RGB32F:
241*8975f5c5SAndroid Build Coastguard Worker case GL_RGB8UI:
242*8975f5c5SAndroid Build Coastguard Worker case GL_RGB8I:
243*8975f5c5SAndroid Build Coastguard Worker case GL_RGB16UI:
244*8975f5c5SAndroid Build Coastguard Worker case GL_RGB16I:
245*8975f5c5SAndroid Build Coastguard Worker case GL_RGB32UI:
246*8975f5c5SAndroid Build Coastguard Worker case GL_RGB32I:
247*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA8:
248*8975f5c5SAndroid Build Coastguard Worker case GL_SRGB8_ALPHA8:
249*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA8_SNORM:
250*8975f5c5SAndroid Build Coastguard Worker case GL_RGB5_A1:
251*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA4:
252*8975f5c5SAndroid Build Coastguard Worker case GL_RGB10_A2:
253*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA16F:
254*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA32F:
255*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA8UI:
256*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA8I:
257*8975f5c5SAndroid Build Coastguard Worker case GL_RGB10_A2UI:
258*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA16UI:
259*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA16I:
260*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA32I:
261*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA32UI:
262*8975f5c5SAndroid Build Coastguard Worker break;
263*8975f5c5SAndroid Build Coastguard Worker default:
264*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_OPERATION, kInvalidInternalFormat, internalFormat);
265*8975f5c5SAndroid Build Coastguard Worker return false;
266*8975f5c5SAndroid Build Coastguard Worker }
267*8975f5c5SAndroid Build Coastguard Worker
268*8975f5c5SAndroid Build Coastguard Worker return true;
269*8975f5c5SAndroid Build Coastguard Worker }
270*8975f5c5SAndroid Build Coastguard Worker
ValidateColorMaskForSharedExponentColorBuffer(const Context * context,angle::EntryPoint entryPoint,GLint drawbuffer)271*8975f5c5SAndroid Build Coastguard Worker bool ValidateColorMaskForSharedExponentColorBuffer(const Context *context,
272*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
273*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer)
274*8975f5c5SAndroid Build Coastguard Worker {
275*8975f5c5SAndroid Build Coastguard Worker const State &state = context->getState();
276*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *attachment = state.getDrawFramebuffer()->getDrawBuffer(drawbuffer);
277*8975f5c5SAndroid Build Coastguard Worker if (attachment && attachment->getFormat().info->internalFormat == GL_RGB9_E5)
278*8975f5c5SAndroid Build Coastguard Worker {
279*8975f5c5SAndroid Build Coastguard Worker bool r, g, b, a;
280*8975f5c5SAndroid Build Coastguard Worker state.getBlendStateExt().getColorMaskIndexed(drawbuffer, &r, &g, &b, &a);
281*8975f5c5SAndroid Build Coastguard Worker if (r != g || g != b)
282*8975f5c5SAndroid Build Coastguard Worker {
283*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION,
284*8975f5c5SAndroid Build Coastguard Worker kUnsupportedColorMaskForSharedExponentColorBuffer);
285*8975f5c5SAndroid Build Coastguard Worker return false;
286*8975f5c5SAndroid Build Coastguard Worker }
287*8975f5c5SAndroid Build Coastguard Worker }
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker return true;
290*8975f5c5SAndroid Build Coastguard Worker }
291*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
292*8975f5c5SAndroid Build Coastguard Worker
ValidateTexImageFormatCombination(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLenum internalFormat,GLenum format,GLenum type)293*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexImageFormatCombination(const Context *context,
294*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
295*8975f5c5SAndroid Build Coastguard Worker TextureType target,
296*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat,
297*8975f5c5SAndroid Build Coastguard Worker GLenum format,
298*8975f5c5SAndroid Build Coastguard Worker GLenum type)
299*8975f5c5SAndroid Build Coastguard Worker {
300*8975f5c5SAndroid Build Coastguard Worker // The type and format are valid if any supported internal format has that type and format.
301*8975f5c5SAndroid Build Coastguard Worker // ANGLE_texture_external_yuv_sampling extension adds support for YUV formats
302*8975f5c5SAndroid Build Coastguard Worker if (gl::IsYuvFormat(format))
303*8975f5c5SAndroid Build Coastguard Worker {
304*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().yuvInternalFormatANGLE)
305*8975f5c5SAndroid Build Coastguard Worker {
306*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFormat);
307*8975f5c5SAndroid Build Coastguard Worker return false;
308*8975f5c5SAndroid Build Coastguard Worker }
309*8975f5c5SAndroid Build Coastguard Worker }
310*8975f5c5SAndroid Build Coastguard Worker else
311*8975f5c5SAndroid Build Coastguard Worker {
312*8975f5c5SAndroid Build Coastguard Worker if (!ValidES3Format(format))
313*8975f5c5SAndroid Build Coastguard Worker {
314*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFormat);
315*8975f5c5SAndroid Build Coastguard Worker return false;
316*8975f5c5SAndroid Build Coastguard Worker }
317*8975f5c5SAndroid Build Coastguard Worker }
318*8975f5c5SAndroid Build Coastguard Worker
319*8975f5c5SAndroid Build Coastguard Worker if (!ValidES3Type(type) || (type == GL_HALF_FLOAT_OES && context->isWebGL()))
320*8975f5c5SAndroid Build Coastguard Worker {
321*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
322*8975f5c5SAndroid Build Coastguard Worker return false;
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker
325*8975f5c5SAndroid Build Coastguard Worker // For historical reasons, glTexImage2D and glTexImage3D pass in their internal format as a
326*8975f5c5SAndroid Build Coastguard Worker // GLint instead of a GLenum. Therefor an invalid internal format gives a GL_INVALID_VALUE
327*8975f5c5SAndroid Build Coastguard Worker // error instead of a GL_INVALID_ENUM error. As this validation function is only called in
328*8975f5c5SAndroid Build Coastguard Worker // the validation codepaths for glTexImage2D/3D, we record a GL_INVALID_VALUE error.
329*8975f5c5SAndroid Build Coastguard Worker if (!ValidES3InternalFormat(internalFormat))
330*8975f5c5SAndroid Build Coastguard Worker {
331*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_VALUE, kInvalidInternalFormat, internalFormat);
332*8975f5c5SAndroid Build Coastguard Worker return false;
333*8975f5c5SAndroid Build Coastguard Worker }
334*8975f5c5SAndroid Build Coastguard Worker
335*8975f5c5SAndroid Build Coastguard Worker // From the ES 3.0 spec section 3.8.3:
336*8975f5c5SAndroid Build Coastguard Worker // Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL are supported by
337*8975f5c5SAndroid Build Coastguard Worker // texture image specification commands only if target is TEXTURE_2D, TEXTURE_2D_ARRAY, or
338*8975f5c5SAndroid Build Coastguard Worker // TEXTURE_CUBE_MAP.Using these formats in conjunction with any other target will result in an
339*8975f5c5SAndroid Build Coastguard Worker // INVALID_OPERATION error.
340*8975f5c5SAndroid Build Coastguard Worker //
341*8975f5c5SAndroid Build Coastguard Worker // Similar language exists in OES_texture_stencil8.
342*8975f5c5SAndroid Build Coastguard Worker if (target == TextureType::_3D &&
343*8975f5c5SAndroid Build Coastguard Worker (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL || format == GL_STENCIL_INDEX))
344*8975f5c5SAndroid Build Coastguard Worker {
345*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, k3DDepthStencil);
346*8975f5c5SAndroid Build Coastguard Worker return false;
347*8975f5c5SAndroid Build Coastguard Worker }
348*8975f5c5SAndroid Build Coastguard Worker
349*8975f5c5SAndroid Build Coastguard Worker // Check if this is a valid format combination to load texture data
350*8975f5c5SAndroid Build Coastguard Worker // ANGLE_texture_external_yuv_sampling extension adds support for YUV formats
351*8975f5c5SAndroid Build Coastguard Worker if (gl::IsYuvFormat(format))
352*8975f5c5SAndroid Build Coastguard Worker {
353*8975f5c5SAndroid Build Coastguard Worker if (type != GL_UNSIGNED_BYTE)
354*8975f5c5SAndroid Build Coastguard Worker {
355*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidFormatCombination);
356*8975f5c5SAndroid Build Coastguard Worker return false;
357*8975f5c5SAndroid Build Coastguard Worker }
358*8975f5c5SAndroid Build Coastguard Worker }
359*8975f5c5SAndroid Build Coastguard Worker else
360*8975f5c5SAndroid Build Coastguard Worker {
361*8975f5c5SAndroid Build Coastguard Worker if (!ValidES3FormatCombination(format, type, internalFormat))
362*8975f5c5SAndroid Build Coastguard Worker {
363*8975f5c5SAndroid Build Coastguard Worker bool extensionFormatsAllowed = false;
364*8975f5c5SAndroid Build Coastguard Worker switch (internalFormat)
365*8975f5c5SAndroid Build Coastguard Worker {
366*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE4_ALPHA4_OES:
367*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().requiredInternalformatOES &&
368*8975f5c5SAndroid Build Coastguard Worker type == GL_UNSIGNED_BYTE && format == GL_LUMINANCE_ALPHA)
369*8975f5c5SAndroid Build Coastguard Worker {
370*8975f5c5SAndroid Build Coastguard Worker extensionFormatsAllowed = true;
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker break;
373*8975f5c5SAndroid Build Coastguard Worker case GL_DEPTH_COMPONENT32_OES:
374*8975f5c5SAndroid Build Coastguard Worker if ((context->getExtensions().requiredInternalformatOES &&
375*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().depth32OES) &&
376*8975f5c5SAndroid Build Coastguard Worker type == GL_UNSIGNED_INT && format == GL_DEPTH_COMPONENT)
377*8975f5c5SAndroid Build Coastguard Worker {
378*8975f5c5SAndroid Build Coastguard Worker extensionFormatsAllowed = true;
379*8975f5c5SAndroid Build Coastguard Worker }
380*8975f5c5SAndroid Build Coastguard Worker break;
381*8975f5c5SAndroid Build Coastguard Worker case GL_RGB10_EXT:
382*8975f5c5SAndroid Build Coastguard Worker case GL_RGB8_OES:
383*8975f5c5SAndroid Build Coastguard Worker case GL_RGB565_OES:
384*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().requiredInternalformatOES &&
385*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().textureType2101010REVEXT &&
386*8975f5c5SAndroid Build Coastguard Worker type == GL_UNSIGNED_INT_2_10_10_10_REV_EXT && format == GL_RGB)
387*8975f5c5SAndroid Build Coastguard Worker {
388*8975f5c5SAndroid Build Coastguard Worker extensionFormatsAllowed = true;
389*8975f5c5SAndroid Build Coastguard Worker }
390*8975f5c5SAndroid Build Coastguard Worker break;
391*8975f5c5SAndroid Build Coastguard Worker default:
392*8975f5c5SAndroid Build Coastguard Worker break;
393*8975f5c5SAndroid Build Coastguard Worker }
394*8975f5c5SAndroid Build Coastguard Worker if (!extensionFormatsAllowed)
395*8975f5c5SAndroid Build Coastguard Worker {
396*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidFormatCombination);
397*8975f5c5SAndroid Build Coastguard Worker return false;
398*8975f5c5SAndroid Build Coastguard Worker }
399*8975f5c5SAndroid Build Coastguard Worker }
400*8975f5c5SAndroid Build Coastguard Worker }
401*8975f5c5SAndroid Build Coastguard Worker
402*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &formatInfo = GetInternalFormatInfo(internalFormat, type);
403*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
404*8975f5c5SAndroid Build Coastguard Worker {
405*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_OPERATION, kInvalidInternalFormat, internalFormat);
406*8975f5c5SAndroid Build Coastguard Worker return false;
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker return true;
410*8975f5c5SAndroid Build Coastguard Worker }
411*8975f5c5SAndroid Build Coastguard Worker
ValidateES3CompressedFormatForTexture2DArray(const Context * context,angle::EntryPoint entryPoint,GLenum format)412*8975f5c5SAndroid Build Coastguard Worker static bool ValidateES3CompressedFormatForTexture2DArray(const Context *context,
413*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
414*8975f5c5SAndroid Build Coastguard Worker GLenum format)
415*8975f5c5SAndroid Build Coastguard Worker {
416*8975f5c5SAndroid Build Coastguard Worker if ((IsETC1Format(format) && !context->getExtensions().compressedETC1RGB8SubTextureEXT) ||
417*8975f5c5SAndroid Build Coastguard Worker IsPVRTC1Format(format))
418*8975f5c5SAndroid Build Coastguard Worker {
419*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2D);
420*8975f5c5SAndroid Build Coastguard Worker return false;
421*8975f5c5SAndroid Build Coastguard Worker }
422*8975f5c5SAndroid Build Coastguard Worker
423*8975f5c5SAndroid Build Coastguard Worker return true;
424*8975f5c5SAndroid Build Coastguard Worker }
425*8975f5c5SAndroid Build Coastguard Worker
ValidateES3CompressedFormatForTexture3D(const Context * context,angle::EntryPoint entryPoint,GLenum format)426*8975f5c5SAndroid Build Coastguard Worker static bool ValidateES3CompressedFormatForTexture3D(const Context *context,
427*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
428*8975f5c5SAndroid Build Coastguard Worker GLenum format)
429*8975f5c5SAndroid Build Coastguard Worker {
430*8975f5c5SAndroid Build Coastguard Worker if (IsETC1Format(format) || IsPVRTC1Format(format))
431*8975f5c5SAndroid Build Coastguard Worker {
432*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2D);
433*8975f5c5SAndroid Build Coastguard Worker return false;
434*8975f5c5SAndroid Build Coastguard Worker }
435*8975f5c5SAndroid Build Coastguard Worker
436*8975f5c5SAndroid Build Coastguard Worker if (IsETC2EACFormat(format))
437*8975f5c5SAndroid Build Coastguard Worker {
438*8975f5c5SAndroid Build Coastguard Worker // ES 3.1, Section 8.7, page 169.
439*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArray);
440*8975f5c5SAndroid Build Coastguard Worker return false;
441*8975f5c5SAndroid Build Coastguard Worker }
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker if (IsASTC2DFormat(format) && !(context->getExtensions().textureCompressionAstcHdrKHR ||
444*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().textureCompressionAstcSliced3dKHR))
445*8975f5c5SAndroid Build Coastguard Worker {
446*8975f5c5SAndroid Build Coastguard Worker // GL_KHR_texture_compression_astc_hdr, TEXTURE_3D is not supported without HDR profile
447*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayASTC);
448*8975f5c5SAndroid Build Coastguard Worker return false;
449*8975f5c5SAndroid Build Coastguard Worker }
450*8975f5c5SAndroid Build Coastguard Worker
451*8975f5c5SAndroid Build Coastguard Worker if (IsS3TCFormat(format))
452*8975f5c5SAndroid Build Coastguard Worker {
453*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_texture_compression_s3tc
454*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayS3TC);
455*8975f5c5SAndroid Build Coastguard Worker return false;
456*8975f5c5SAndroid Build Coastguard Worker }
457*8975f5c5SAndroid Build Coastguard Worker
458*8975f5c5SAndroid Build Coastguard Worker if (IsRGTCFormat(format))
459*8975f5c5SAndroid Build Coastguard Worker {
460*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_texture_compression_rgtc
461*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayRGTC);
462*8975f5c5SAndroid Build Coastguard Worker return false;
463*8975f5c5SAndroid Build Coastguard Worker }
464*8975f5c5SAndroid Build Coastguard Worker
465*8975f5c5SAndroid Build Coastguard Worker if (IsBPTCFormat(format) && (context->getLimitations().noCompressedTexture3D))
466*8975f5c5SAndroid Build Coastguard Worker {
467*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_texture_compression_bptc
468*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInternalFormatRequiresTexture2DArrayBPTC);
469*8975f5c5SAndroid Build Coastguard Worker return false;
470*8975f5c5SAndroid Build Coastguard Worker }
471*8975f5c5SAndroid Build Coastguard Worker
472*8975f5c5SAndroid Build Coastguard Worker return true;
473*8975f5c5SAndroid Build Coastguard Worker }
474*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexImageParametersBase(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isCompressed,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,GLsizei imageSize,const void * pixels)475*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexImageParametersBase(const Context *context,
476*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
477*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
478*8975f5c5SAndroid Build Coastguard Worker GLint level,
479*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
480*8975f5c5SAndroid Build Coastguard Worker bool isCompressed,
481*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
482*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
483*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
484*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
485*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
486*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
487*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
488*8975f5c5SAndroid Build Coastguard Worker GLint border,
489*8975f5c5SAndroid Build Coastguard Worker GLenum format,
490*8975f5c5SAndroid Build Coastguard Worker GLenum type,
491*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
492*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
493*8975f5c5SAndroid Build Coastguard Worker {
494*8975f5c5SAndroid Build Coastguard Worker TextureType texType = TextureTargetToType(target);
495*8975f5c5SAndroid Build Coastguard Worker
496*8975f5c5SAndroid Build Coastguard Worker if (gl::IsYuvFormat(format))
497*8975f5c5SAndroid Build Coastguard Worker {
498*8975f5c5SAndroid Build Coastguard Worker // According to ANGLE_yuv_internal_format, the texture needs to be an immutable
499*8975f5c5SAndroid Build Coastguard Worker // texture, texture target can only be TEXTURE_2D and there is no mipmap support
500*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().yuvInternalFormatANGLE || !isSubImage)
501*8975f5c5SAndroid Build Coastguard Worker {
502*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFormat);
503*8975f5c5SAndroid Build Coastguard Worker return false;
504*8975f5c5SAndroid Build Coastguard Worker }
505*8975f5c5SAndroid Build Coastguard Worker
506*8975f5c5SAndroid Build Coastguard Worker if (target != TextureTarget::_2D)
507*8975f5c5SAndroid Build Coastguard Worker {
508*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
509*8975f5c5SAndroid Build Coastguard Worker return false;
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker
512*8975f5c5SAndroid Build Coastguard Worker if (level != 0)
513*8975f5c5SAndroid Build Coastguard Worker {
514*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevel);
515*8975f5c5SAndroid Build Coastguard Worker return false;
516*8975f5c5SAndroid Build Coastguard Worker }
517*8975f5c5SAndroid Build Coastguard Worker }
518*8975f5c5SAndroid Build Coastguard Worker
519*8975f5c5SAndroid Build Coastguard Worker // Validate image size
520*8975f5c5SAndroid Build Coastguard Worker if (!ValidImageSizeParameters(context, entryPoint, texType, level, width, height, depth,
521*8975f5c5SAndroid Build Coastguard Worker isSubImage))
522*8975f5c5SAndroid Build Coastguard Worker {
523*8975f5c5SAndroid Build Coastguard Worker // Error already processed.
524*8975f5c5SAndroid Build Coastguard Worker return false;
525*8975f5c5SAndroid Build Coastguard Worker }
526*8975f5c5SAndroid Build Coastguard Worker
527*8975f5c5SAndroid Build Coastguard Worker // Verify zero border
528*8975f5c5SAndroid Build Coastguard Worker if (border != 0)
529*8975f5c5SAndroid Build Coastguard Worker {
530*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBorder);
531*8975f5c5SAndroid Build Coastguard Worker return false;
532*8975f5c5SAndroid Build Coastguard Worker }
533*8975f5c5SAndroid Build Coastguard Worker
534*8975f5c5SAndroid Build Coastguard Worker if (xoffset < 0 || yoffset < 0 || zoffset < 0)
535*8975f5c5SAndroid Build Coastguard Worker {
536*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeOffset);
537*8975f5c5SAndroid Build Coastguard Worker return false;
538*8975f5c5SAndroid Build Coastguard Worker }
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker if (std::numeric_limits<GLsizei>::max() - xoffset < width ||
541*8975f5c5SAndroid Build Coastguard Worker std::numeric_limits<GLsizei>::max() - yoffset < height ||
542*8975f5c5SAndroid Build Coastguard Worker std::numeric_limits<GLsizei>::max() - zoffset < depth)
543*8975f5c5SAndroid Build Coastguard Worker {
544*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kOffsetOverflow);
545*8975f5c5SAndroid Build Coastguard Worker return false;
546*8975f5c5SAndroid Build Coastguard Worker }
547*8975f5c5SAndroid Build Coastguard Worker
548*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
549*8975f5c5SAndroid Build Coastguard Worker
550*8975f5c5SAndroid Build Coastguard Worker switch (texType)
551*8975f5c5SAndroid Build Coastguard Worker {
552*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2D:
553*8975f5c5SAndroid Build Coastguard Worker case TextureType::External:
554*8975f5c5SAndroid Build Coastguard Worker case TextureType::VideoImage:
555*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.max2DTextureSize >> level) ||
556*8975f5c5SAndroid Build Coastguard Worker height > (caps.max2DTextureSize >> level))
557*8975f5c5SAndroid Build Coastguard Worker {
558*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
559*8975f5c5SAndroid Build Coastguard Worker return false;
560*8975f5c5SAndroid Build Coastguard Worker }
561*8975f5c5SAndroid Build Coastguard Worker break;
562*8975f5c5SAndroid Build Coastguard Worker
563*8975f5c5SAndroid Build Coastguard Worker case TextureType::Rectangle:
564*8975f5c5SAndroid Build Coastguard Worker ASSERT(level == 0);
565*8975f5c5SAndroid Build Coastguard Worker if (width > caps.maxRectangleTextureSize || height > caps.maxRectangleTextureSize)
566*8975f5c5SAndroid Build Coastguard Worker {
567*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
568*8975f5c5SAndroid Build Coastguard Worker return false;
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker if (isCompressed)
571*8975f5c5SAndroid Build Coastguard Worker {
572*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kRectangleTextureCompressed);
573*8975f5c5SAndroid Build Coastguard Worker return false;
574*8975f5c5SAndroid Build Coastguard Worker }
575*8975f5c5SAndroid Build Coastguard Worker break;
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMap:
578*8975f5c5SAndroid Build Coastguard Worker if (!isSubImage && width != height)
579*8975f5c5SAndroid Build Coastguard Worker {
580*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
581*8975f5c5SAndroid Build Coastguard Worker return false;
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker
584*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.maxCubeMapTextureSize >> level))
585*8975f5c5SAndroid Build Coastguard Worker {
586*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
587*8975f5c5SAndroid Build Coastguard Worker return false;
588*8975f5c5SAndroid Build Coastguard Worker }
589*8975f5c5SAndroid Build Coastguard Worker break;
590*8975f5c5SAndroid Build Coastguard Worker
591*8975f5c5SAndroid Build Coastguard Worker case TextureType::_3D:
592*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.max3DTextureSize >> level) ||
593*8975f5c5SAndroid Build Coastguard Worker height > (caps.max3DTextureSize >> level) ||
594*8975f5c5SAndroid Build Coastguard Worker depth > (caps.max3DTextureSize >> level))
595*8975f5c5SAndroid Build Coastguard Worker {
596*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
597*8975f5c5SAndroid Build Coastguard Worker return false;
598*8975f5c5SAndroid Build Coastguard Worker }
599*8975f5c5SAndroid Build Coastguard Worker break;
600*8975f5c5SAndroid Build Coastguard Worker
601*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DArray:
602*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.max2DTextureSize >> level) ||
603*8975f5c5SAndroid Build Coastguard Worker height > (caps.max2DTextureSize >> level) || depth > caps.maxArrayTextureLayers)
604*8975f5c5SAndroid Build Coastguard Worker {
605*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
606*8975f5c5SAndroid Build Coastguard Worker return false;
607*8975f5c5SAndroid Build Coastguard Worker }
608*8975f5c5SAndroid Build Coastguard Worker break;
609*8975f5c5SAndroid Build Coastguard Worker
610*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMapArray:
611*8975f5c5SAndroid Build Coastguard Worker if (!isSubImage && width != height)
612*8975f5c5SAndroid Build Coastguard Worker {
613*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
614*8975f5c5SAndroid Build Coastguard Worker return false;
615*8975f5c5SAndroid Build Coastguard Worker }
616*8975f5c5SAndroid Build Coastguard Worker
617*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.maxCubeMapTextureSize >> level) ||
618*8975f5c5SAndroid Build Coastguard Worker height > (caps.maxCubeMapTextureSize >> level))
619*8975f5c5SAndroid Build Coastguard Worker {
620*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
621*8975f5c5SAndroid Build Coastguard Worker return false;
622*8975f5c5SAndroid Build Coastguard Worker }
623*8975f5c5SAndroid Build Coastguard Worker
624*8975f5c5SAndroid Build Coastguard Worker if (width > (caps.max3DTextureSize >> level) ||
625*8975f5c5SAndroid Build Coastguard Worker height > (caps.max3DTextureSize >> level) || depth > caps.max3DTextureSize)
626*8975f5c5SAndroid Build Coastguard Worker {
627*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
628*8975f5c5SAndroid Build Coastguard Worker return false;
629*8975f5c5SAndroid Build Coastguard Worker }
630*8975f5c5SAndroid Build Coastguard Worker
631*8975f5c5SAndroid Build Coastguard Worker if (!isSubImage && depth % 6 != 0)
632*8975f5c5SAndroid Build Coastguard Worker {
633*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapInvalidDepth);
634*8975f5c5SAndroid Build Coastguard Worker return false;
635*8975f5c5SAndroid Build Coastguard Worker }
636*8975f5c5SAndroid Build Coastguard Worker break;
637*8975f5c5SAndroid Build Coastguard Worker
638*8975f5c5SAndroid Build Coastguard Worker case TextureType::InvalidEnum:
639*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kEnumInvalid);
640*8975f5c5SAndroid Build Coastguard Worker return false;
641*8975f5c5SAndroid Build Coastguard Worker default:
642*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, ToGLenum(texType));
643*8975f5c5SAndroid Build Coastguard Worker return false;
644*8975f5c5SAndroid Build Coastguard Worker }
645*8975f5c5SAndroid Build Coastguard Worker
646*8975f5c5SAndroid Build Coastguard Worker Texture *texture = context->getTextureByType(texType);
647*8975f5c5SAndroid Build Coastguard Worker if (!texture)
648*8975f5c5SAndroid Build Coastguard Worker {
649*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMissingTexture);
650*8975f5c5SAndroid Build Coastguard Worker return false;
651*8975f5c5SAndroid Build Coastguard Worker }
652*8975f5c5SAndroid Build Coastguard Worker
653*8975f5c5SAndroid Build Coastguard Worker if (texture->getImmutableFormat() && !isSubImage)
654*8975f5c5SAndroid Build Coastguard Worker {
655*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTextureIsImmutable);
656*8975f5c5SAndroid Build Coastguard Worker return false;
657*8975f5c5SAndroid Build Coastguard Worker }
658*8975f5c5SAndroid Build Coastguard Worker
659*8975f5c5SAndroid Build Coastguard Worker // Validate texture formats
660*8975f5c5SAndroid Build Coastguard Worker GLenum actualInternalFormat =
661*8975f5c5SAndroid Build Coastguard Worker isSubImage ? texture->getFormat(target, level).info->internalFormat : internalformat;
662*8975f5c5SAndroid Build Coastguard Worker if (isSubImage && actualInternalFormat == GL_NONE)
663*8975f5c5SAndroid Build Coastguard Worker {
664*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidMipLevel);
665*8975f5c5SAndroid Build Coastguard Worker return false;
666*8975f5c5SAndroid Build Coastguard Worker }
667*8975f5c5SAndroid Build Coastguard Worker
668*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &actualFormatInfo = isSubImage
669*8975f5c5SAndroid Build Coastguard Worker ? *texture->getFormat(target, level).info
670*8975f5c5SAndroid Build Coastguard Worker : GetInternalFormatInfo(internalformat, type);
671*8975f5c5SAndroid Build Coastguard Worker if (isCompressed)
672*8975f5c5SAndroid Build Coastguard Worker {
673*8975f5c5SAndroid Build Coastguard Worker // compressedTexSubImage does not generate GL_INVALID_ENUM when format is unknown or invalid
674*8975f5c5SAndroid Build Coastguard Worker if (!isSubImage)
675*8975f5c5SAndroid Build Coastguard Worker {
676*8975f5c5SAndroid Build Coastguard Worker if (!actualFormatInfo.compressed && !actualFormatInfo.paletted)
677*8975f5c5SAndroid Build Coastguard Worker {
678*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kCompressedMismatch);
679*8975f5c5SAndroid Build Coastguard Worker return false;
680*8975f5c5SAndroid Build Coastguard Worker }
681*8975f5c5SAndroid Build Coastguard Worker
682*8975f5c5SAndroid Build Coastguard Worker if (!actualFormatInfo.textureSupport(context->getClientVersion(),
683*8975f5c5SAndroid Build Coastguard Worker context->getExtensions()))
684*8975f5c5SAndroid Build Coastguard Worker {
685*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFormat);
686*8975f5c5SAndroid Build Coastguard Worker return false;
687*8975f5c5SAndroid Build Coastguard Worker }
688*8975f5c5SAndroid Build Coastguard Worker }
689*8975f5c5SAndroid Build Coastguard Worker
690*8975f5c5SAndroid Build Coastguard Worker if (texType == TextureType::_2DArray)
691*8975f5c5SAndroid Build Coastguard Worker {
692*8975f5c5SAndroid Build Coastguard Worker GLenum compressedDataFormat = isSubImage ? format : internalformat;
693*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3CompressedFormatForTexture2DArray(context, entryPoint,
694*8975f5c5SAndroid Build Coastguard Worker compressedDataFormat))
695*8975f5c5SAndroid Build Coastguard Worker {
696*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
697*8975f5c5SAndroid Build Coastguard Worker return false;
698*8975f5c5SAndroid Build Coastguard Worker }
699*8975f5c5SAndroid Build Coastguard Worker }
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker if (texType == TextureType::_3D)
702*8975f5c5SAndroid Build Coastguard Worker {
703*8975f5c5SAndroid Build Coastguard Worker GLenum compressedDataFormat = isSubImage ? format : internalformat;
704*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3CompressedFormatForTexture3D(context, entryPoint, compressedDataFormat))
705*8975f5c5SAndroid Build Coastguard Worker {
706*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
707*8975f5c5SAndroid Build Coastguard Worker return false;
708*8975f5c5SAndroid Build Coastguard Worker }
709*8975f5c5SAndroid Build Coastguard Worker }
710*8975f5c5SAndroid Build Coastguard Worker
711*8975f5c5SAndroid Build Coastguard Worker if (isSubImage)
712*8975f5c5SAndroid Build Coastguard Worker {
713*8975f5c5SAndroid Build Coastguard Worker if (!ValidCompressedSubImageSize(
714*8975f5c5SAndroid Build Coastguard Worker context, actualFormatInfo.internalFormat, xoffset, yoffset, zoffset, width,
715*8975f5c5SAndroid Build Coastguard Worker height, depth, texture->getWidth(target, level),
716*8975f5c5SAndroid Build Coastguard Worker texture->getHeight(target, level), texture->getDepth(target, level)))
717*8975f5c5SAndroid Build Coastguard Worker {
718*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
719*8975f5c5SAndroid Build Coastguard Worker return false;
720*8975f5c5SAndroid Build Coastguard Worker }
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker if (format != actualInternalFormat)
723*8975f5c5SAndroid Build Coastguard Worker {
724*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMismatchedFormat);
725*8975f5c5SAndroid Build Coastguard Worker return false;
726*8975f5c5SAndroid Build Coastguard Worker }
727*8975f5c5SAndroid Build Coastguard Worker
728*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_compressed_ETC1_RGB8_sub_texture allows this format
729*8975f5c5SAndroid Build Coastguard Worker if (IsETC1Format(actualInternalFormat) &&
730*8975f5c5SAndroid Build Coastguard Worker !context->getExtensions().compressedETC1RGB8SubTextureEXT)
731*8975f5c5SAndroid Build Coastguard Worker {
732*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_OPERATION, kInvalidInternalFormat,
733*8975f5c5SAndroid Build Coastguard Worker internalformat);
734*8975f5c5SAndroid Build Coastguard Worker return false;
735*8975f5c5SAndroid Build Coastguard Worker }
736*8975f5c5SAndroid Build Coastguard Worker }
737*8975f5c5SAndroid Build Coastguard Worker else
738*8975f5c5SAndroid Build Coastguard Worker {
739*8975f5c5SAndroid Build Coastguard Worker if (!ValidCompressedImageSize(context, actualInternalFormat, level, width, height,
740*8975f5c5SAndroid Build Coastguard Worker depth))
741*8975f5c5SAndroid Build Coastguard Worker {
742*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
743*8975f5c5SAndroid Build Coastguard Worker return false;
744*8975f5c5SAndroid Build Coastguard Worker }
745*8975f5c5SAndroid Build Coastguard Worker }
746*8975f5c5SAndroid Build Coastguard Worker
747*8975f5c5SAndroid Build Coastguard Worker // Disallow 3D-only compressed formats from being set on 2D textures
748*8975f5c5SAndroid Build Coastguard Worker if (actualFormatInfo.compressedBlockDepth > 1 && texType != TextureType::_3D)
749*8975f5c5SAndroid Build Coastguard Worker {
750*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureTarget);
751*8975f5c5SAndroid Build Coastguard Worker return false;
752*8975f5c5SAndroid Build Coastguard Worker }
753*8975f5c5SAndroid Build Coastguard Worker }
754*8975f5c5SAndroid Build Coastguard Worker else
755*8975f5c5SAndroid Build Coastguard Worker {
756*8975f5c5SAndroid Build Coastguard Worker // Compressed formats are not valid internal formats for glTexImage*D
757*8975f5c5SAndroid Build Coastguard Worker if (!isSubImage)
758*8975f5c5SAndroid Build Coastguard Worker {
759*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(internalformat);
760*8975f5c5SAndroid Build Coastguard Worker if (internalFormatInfo.compressed)
761*8975f5c5SAndroid Build Coastguard Worker {
762*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_VALUE, kInvalidInternalFormat, internalformat);
763*8975f5c5SAndroid Build Coastguard Worker return false;
764*8975f5c5SAndroid Build Coastguard Worker }
765*8975f5c5SAndroid Build Coastguard Worker }
766*8975f5c5SAndroid Build Coastguard Worker
767*8975f5c5SAndroid Build Coastguard Worker if (!ValidateTexImageFormatCombination(context, entryPoint, texType, actualInternalFormat,
768*8975f5c5SAndroid Build Coastguard Worker format, type))
769*8975f5c5SAndroid Build Coastguard Worker {
770*8975f5c5SAndroid Build Coastguard Worker return false;
771*8975f5c5SAndroid Build Coastguard Worker }
772*8975f5c5SAndroid Build Coastguard Worker }
773*8975f5c5SAndroid Build Coastguard Worker
774*8975f5c5SAndroid Build Coastguard Worker // Validate sub image parameters
775*8975f5c5SAndroid Build Coastguard Worker if (isSubImage)
776*8975f5c5SAndroid Build Coastguard Worker {
777*8975f5c5SAndroid Build Coastguard Worker if (isCompressed != actualFormatInfo.compressed)
778*8975f5c5SAndroid Build Coastguard Worker {
779*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kCompressedMismatch);
780*8975f5c5SAndroid Build Coastguard Worker return false;
781*8975f5c5SAndroid Build Coastguard Worker }
782*8975f5c5SAndroid Build Coastguard Worker
783*8975f5c5SAndroid Build Coastguard Worker // Already validated above
784*8975f5c5SAndroid Build Coastguard Worker ASSERT(xoffset >= 0 && yoffset >= 0 && zoffset >= 0);
785*8975f5c5SAndroid Build Coastguard Worker ASSERT(std::numeric_limits<GLsizei>::max() - xoffset >= width &&
786*8975f5c5SAndroid Build Coastguard Worker std::numeric_limits<GLsizei>::max() - yoffset >= height &&
787*8975f5c5SAndroid Build Coastguard Worker std::numeric_limits<GLsizei>::max() - zoffset >= depth);
788*8975f5c5SAndroid Build Coastguard Worker
789*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(xoffset + width) > texture->getWidth(target, level) ||
790*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(yoffset + height) > texture->getHeight(target, level) ||
791*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(zoffset + depth) > texture->getDepth(target, level))
792*8975f5c5SAndroid Build Coastguard Worker {
793*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kOffsetOverflow);
794*8975f5c5SAndroid Build Coastguard Worker return false;
795*8975f5c5SAndroid Build Coastguard Worker }
796*8975f5c5SAndroid Build Coastguard Worker
797*8975f5c5SAndroid Build Coastguard Worker if (width > 0 && height > 0 && depth > 0 && pixels == nullptr &&
798*8975f5c5SAndroid Build Coastguard Worker context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
799*8975f5c5SAndroid Build Coastguard Worker {
800*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPixelDataNull);
801*8975f5c5SAndroid Build Coastguard Worker return false;
802*8975f5c5SAndroid Build Coastguard Worker }
803*8975f5c5SAndroid Build Coastguard Worker }
804*8975f5c5SAndroid Build Coastguard Worker
805*8975f5c5SAndroid Build Coastguard Worker GLenum sizeCheckFormat = isSubImage ? format : internalformat;
806*8975f5c5SAndroid Build Coastguard Worker if (!ValidImageDataSize(context, entryPoint, texType, width, height, depth, sizeCheckFormat,
807*8975f5c5SAndroid Build Coastguard Worker type, pixels, imageSize))
808*8975f5c5SAndroid Build Coastguard Worker {
809*8975f5c5SAndroid Build Coastguard Worker return false;
810*8975f5c5SAndroid Build Coastguard Worker }
811*8975f5c5SAndroid Build Coastguard Worker
812*8975f5c5SAndroid Build Coastguard Worker // Check for pixel unpack buffer related API errors
813*8975f5c5SAndroid Build Coastguard Worker Buffer *pixelUnpackBuffer = context->getState().getTargetBuffer(BufferBinding::PixelUnpack);
814*8975f5c5SAndroid Build Coastguard Worker if (pixelUnpackBuffer != nullptr)
815*8975f5c5SAndroid Build Coastguard Worker {
816*8975f5c5SAndroid Build Coastguard Worker // ...data is not evenly divisible into the number of bytes needed to store in memory a
817*8975f5c5SAndroid Build Coastguard Worker // datum
818*8975f5c5SAndroid Build Coastguard Worker // indicated by type.
819*8975f5c5SAndroid Build Coastguard Worker if (!isCompressed)
820*8975f5c5SAndroid Build Coastguard Worker {
821*8975f5c5SAndroid Build Coastguard Worker size_t offset = reinterpret_cast<size_t>(pixels);
822*8975f5c5SAndroid Build Coastguard Worker size_t dataBytesPerPixel = static_cast<size_t>(GetTypeInfo(type).bytes);
823*8975f5c5SAndroid Build Coastguard Worker
824*8975f5c5SAndroid Build Coastguard Worker if ((offset % dataBytesPerPixel) != 0)
825*8975f5c5SAndroid Build Coastguard Worker {
826*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDataTypeNotAligned);
827*8975f5c5SAndroid Build Coastguard Worker return false;
828*8975f5c5SAndroid Build Coastguard Worker }
829*8975f5c5SAndroid Build Coastguard Worker }
830*8975f5c5SAndroid Build Coastguard Worker
831*8975f5c5SAndroid Build Coastguard Worker // ...the buffer object's data store is currently mapped but not persistently.
832*8975f5c5SAndroid Build Coastguard Worker if (pixelUnpackBuffer->isMapped() && !pixelUnpackBuffer->isPersistentlyMapped())
833*8975f5c5SAndroid Build Coastguard Worker {
834*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferMapped);
835*8975f5c5SAndroid Build Coastguard Worker return false;
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker }
838*8975f5c5SAndroid Build Coastguard Worker
839*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
840*8975f5c5SAndroid Build Coastguard Worker {
841*8975f5c5SAndroid Build Coastguard Worker // Define:
842*8975f5c5SAndroid Build Coastguard Worker // DataStoreWidth = (GL_UNPACK_ROW_LENGTH ? GL_UNPACK_ROW_LENGTH : width)
843*8975f5c5SAndroid Build Coastguard Worker // DataStoreHeight = (GL_UNPACK_IMAGE_HEIGHT ? GL_UNPACK_IMAGE_HEIGHT : height)
844*8975f5c5SAndroid Build Coastguard Worker //
845*8975f5c5SAndroid Build Coastguard Worker // WebGL 2.0 imposes the following additional constraints:
846*8975f5c5SAndroid Build Coastguard Worker //
847*8975f5c5SAndroid Build Coastguard Worker // 1) texImage2D and texSubImage2D generate INVALID_OPERATION if:
848*8975f5c5SAndroid Build Coastguard Worker // GL_UNPACK_SKIP_PIXELS + width > DataStoreWidth
849*8975f5c5SAndroid Build Coastguard Worker // except for texImage2D if no GL_PIXEL_UNPACK_BUFFER is
850*8975f5c5SAndroid Build Coastguard Worker // bound and _pixels_ is null.
851*8975f5c5SAndroid Build Coastguard Worker //
852*8975f5c5SAndroid Build Coastguard Worker // 2) texImage3D and texSubImage3D generate INVALID_OPERATION if:
853*8975f5c5SAndroid Build Coastguard Worker // GL_UNPACK_SKIP_PIXELS + width > DataStoreWidth
854*8975f5c5SAndroid Build Coastguard Worker // GL_UNPACK_SKIP_ROWS + height > DataStoreHeight
855*8975f5c5SAndroid Build Coastguard Worker // except for texImage3D if no GL_PIXEL_UNPACK_BUFFER is
856*8975f5c5SAndroid Build Coastguard Worker // bound and _pixels_ is null.
857*8975f5c5SAndroid Build Coastguard Worker if (!pixelUnpackBuffer && !pixels && !isSubImage)
858*8975f5c5SAndroid Build Coastguard Worker {
859*8975f5c5SAndroid Build Coastguard Worker // Exception case for texImage2D or texImage3D, above.
860*8975f5c5SAndroid Build Coastguard Worker }
861*8975f5c5SAndroid Build Coastguard Worker else
862*8975f5c5SAndroid Build Coastguard Worker {
863*8975f5c5SAndroid Build Coastguard Worker const auto &unpack = context->getState().getUnpackState();
864*8975f5c5SAndroid Build Coastguard Worker GLint dataStoreWidth = unpack.rowLength ? unpack.rowLength : width;
865*8975f5c5SAndroid Build Coastguard Worker if (unpack.skipPixels + width > dataStoreWidth)
866*8975f5c5SAndroid Build Coastguard Worker {
867*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidUnpackParametersForWebGL);
868*8975f5c5SAndroid Build Coastguard Worker return false;
869*8975f5c5SAndroid Build Coastguard Worker }
870*8975f5c5SAndroid Build Coastguard Worker if (target == TextureTarget::_3D || target == TextureTarget::_2DArray)
871*8975f5c5SAndroid Build Coastguard Worker {
872*8975f5c5SAndroid Build Coastguard Worker GLint dataStoreHeight = unpack.imageHeight ? unpack.imageHeight : height;
873*8975f5c5SAndroid Build Coastguard Worker if (unpack.skipRows + height > dataStoreHeight)
874*8975f5c5SAndroid Build Coastguard Worker {
875*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidUnpackParametersForWebGL);
876*8975f5c5SAndroid Build Coastguard Worker return false;
877*8975f5c5SAndroid Build Coastguard Worker }
878*8975f5c5SAndroid Build Coastguard Worker }
879*8975f5c5SAndroid Build Coastguard Worker }
880*8975f5c5SAndroid Build Coastguard Worker }
881*8975f5c5SAndroid Build Coastguard Worker
882*8975f5c5SAndroid Build Coastguard Worker return true;
883*8975f5c5SAndroid Build Coastguard Worker }
884*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexImage2DParameters(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isCompressed,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,GLsizei imageSize,const void * pixels)885*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexImage2DParameters(const Context *context,
886*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
887*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
888*8975f5c5SAndroid Build Coastguard Worker GLint level,
889*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
890*8975f5c5SAndroid Build Coastguard Worker bool isCompressed,
891*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
892*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
893*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
894*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
895*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
896*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
897*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
898*8975f5c5SAndroid Build Coastguard Worker GLint border,
899*8975f5c5SAndroid Build Coastguard Worker GLenum format,
900*8975f5c5SAndroid Build Coastguard Worker GLenum type,
901*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
902*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
903*8975f5c5SAndroid Build Coastguard Worker {
904*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture2DDestinationTarget(context, target))
905*8975f5c5SAndroid Build Coastguard Worker {
906*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
907*8975f5c5SAndroid Build Coastguard Worker return false;
908*8975f5c5SAndroid Build Coastguard Worker }
909*8975f5c5SAndroid Build Coastguard Worker
910*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImageParametersBase(
911*8975f5c5SAndroid Build Coastguard Worker context, entryPoint, target, level, internalformat, isCompressed, isSubImage, xoffset,
912*8975f5c5SAndroid Build Coastguard Worker yoffset, zoffset, width, height, depth, border, format, type, imageSize, pixels);
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexImage3DParameters(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isCompressed,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,GLsizei bufSize,const void * pixels)915*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexImage3DParameters(const Context *context,
916*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
917*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
918*8975f5c5SAndroid Build Coastguard Worker GLint level,
919*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
920*8975f5c5SAndroid Build Coastguard Worker bool isCompressed,
921*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
922*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
923*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
924*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
925*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
926*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
927*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
928*8975f5c5SAndroid Build Coastguard Worker GLint border,
929*8975f5c5SAndroid Build Coastguard Worker GLenum format,
930*8975f5c5SAndroid Build Coastguard Worker GLenum type,
931*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
932*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
933*8975f5c5SAndroid Build Coastguard Worker {
934*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture3DDestinationTarget(context, target))
935*8975f5c5SAndroid Build Coastguard Worker {
936*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
937*8975f5c5SAndroid Build Coastguard Worker return false;
938*8975f5c5SAndroid Build Coastguard Worker }
939*8975f5c5SAndroid Build Coastguard Worker
940*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImageParametersBase(
941*8975f5c5SAndroid Build Coastguard Worker context, entryPoint, target, level, internalformat, isCompressed, isSubImage, xoffset,
942*8975f5c5SAndroid Build Coastguard Worker yoffset, zoffset, width, height, depth, border, format, type, bufSize, pixels);
943*8975f5c5SAndroid Build Coastguard Worker }
944*8975f5c5SAndroid Build Coastguard Worker
945*8975f5c5SAndroid Build Coastguard Worker struct EffectiveInternalFormatInfo
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker GLenum effectiveFormat;
948*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat;
949*8975f5c5SAndroid Build Coastguard Worker GLuint minRedBits;
950*8975f5c5SAndroid Build Coastguard Worker GLuint maxRedBits;
951*8975f5c5SAndroid Build Coastguard Worker GLuint minGreenBits;
952*8975f5c5SAndroid Build Coastguard Worker GLuint maxGreenBits;
953*8975f5c5SAndroid Build Coastguard Worker GLuint minBlueBits;
954*8975f5c5SAndroid Build Coastguard Worker GLuint maxBlueBits;
955*8975f5c5SAndroid Build Coastguard Worker GLuint minAlphaBits;
956*8975f5c5SAndroid Build Coastguard Worker GLuint maxAlphaBits;
957*8975f5c5SAndroid Build Coastguard Worker };
958*8975f5c5SAndroid Build Coastguard Worker
QueryEffectiveFormatList(const InternalFormat & srcFormat,GLenum targetFormat,const EffectiveInternalFormatInfo * list,size_t size,GLenum * outEffectiveFormat)959*8975f5c5SAndroid Build Coastguard Worker static bool QueryEffectiveFormatList(const InternalFormat &srcFormat,
960*8975f5c5SAndroid Build Coastguard Worker GLenum targetFormat,
961*8975f5c5SAndroid Build Coastguard Worker const EffectiveInternalFormatInfo *list,
962*8975f5c5SAndroid Build Coastguard Worker size_t size,
963*8975f5c5SAndroid Build Coastguard Worker GLenum *outEffectiveFormat)
964*8975f5c5SAndroid Build Coastguard Worker {
965*8975f5c5SAndroid Build Coastguard Worker for (size_t curFormat = 0; curFormat < size; ++curFormat)
966*8975f5c5SAndroid Build Coastguard Worker {
967*8975f5c5SAndroid Build Coastguard Worker const EffectiveInternalFormatInfo &formatInfo = list[curFormat];
968*8975f5c5SAndroid Build Coastguard Worker if ((formatInfo.destFormat == targetFormat) &&
969*8975f5c5SAndroid Build Coastguard Worker (formatInfo.minRedBits <= srcFormat.redBits &&
970*8975f5c5SAndroid Build Coastguard Worker formatInfo.maxRedBits >= srcFormat.redBits) &&
971*8975f5c5SAndroid Build Coastguard Worker (formatInfo.minGreenBits <= srcFormat.greenBits &&
972*8975f5c5SAndroid Build Coastguard Worker formatInfo.maxGreenBits >= srcFormat.greenBits) &&
973*8975f5c5SAndroid Build Coastguard Worker (formatInfo.minBlueBits <= srcFormat.blueBits &&
974*8975f5c5SAndroid Build Coastguard Worker formatInfo.maxBlueBits >= srcFormat.blueBits) &&
975*8975f5c5SAndroid Build Coastguard Worker (formatInfo.minAlphaBits <= srcFormat.alphaBits &&
976*8975f5c5SAndroid Build Coastguard Worker formatInfo.maxAlphaBits >= srcFormat.alphaBits))
977*8975f5c5SAndroid Build Coastguard Worker {
978*8975f5c5SAndroid Build Coastguard Worker *outEffectiveFormat = formatInfo.effectiveFormat;
979*8975f5c5SAndroid Build Coastguard Worker return true;
980*8975f5c5SAndroid Build Coastguard Worker }
981*8975f5c5SAndroid Build Coastguard Worker }
982*8975f5c5SAndroid Build Coastguard Worker
983*8975f5c5SAndroid Build Coastguard Worker *outEffectiveFormat = GL_NONE;
984*8975f5c5SAndroid Build Coastguard Worker return false;
985*8975f5c5SAndroid Build Coastguard Worker }
986*8975f5c5SAndroid Build Coastguard Worker
GetSizedEffectiveInternalFormatInfo(const InternalFormat & srcFormat,GLenum * outEffectiveFormat)987*8975f5c5SAndroid Build Coastguard Worker bool GetSizedEffectiveInternalFormatInfo(const InternalFormat &srcFormat,
988*8975f5c5SAndroid Build Coastguard Worker GLenum *outEffectiveFormat)
989*8975f5c5SAndroid Build Coastguard Worker {
990*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0.3 Specification, Table 3.17, pg 141:
991*8975f5c5SAndroid Build Coastguard Worker // Effective internal format coresponding to destination internal format and linear source
992*8975f5c5SAndroid Build Coastguard Worker // buffer component sizes.
993*8975f5c5SAndroid Build Coastguard Worker // | Source channel min/max sizes |
994*8975f5c5SAndroid Build Coastguard Worker // Effective Internal Format | N/A | R | G | B | A |
995*8975f5c5SAndroid Build Coastguard Worker // clang-format off
996*8975f5c5SAndroid Build Coastguard Worker constexpr EffectiveInternalFormatInfo list[] = {
997*8975f5c5SAndroid Build Coastguard Worker { GL_ALPHA8_EXT, GL_NONE, 0, 0, 0, 0, 0, 0, 1, 8 },
998*8975f5c5SAndroid Build Coastguard Worker { GL_R8, GL_NONE, 1, 8, 0, 0, 0, 0, 0, 0 },
999*8975f5c5SAndroid Build Coastguard Worker { GL_RG8, GL_NONE, 1, 8, 1, 8, 0, 0, 0, 0 },
1000*8975f5c5SAndroid Build Coastguard Worker { GL_RGB565, GL_NONE, 1, 5, 1, 6, 1, 5, 0, 0 },
1001*8975f5c5SAndroid Build Coastguard Worker { GL_RGB8, GL_NONE, 6, 8, 7, 8, 6, 8, 0, 0 },
1002*8975f5c5SAndroid Build Coastguard Worker { GL_RGBA4, GL_NONE, 1, 4, 1, 4, 1, 4, 1, 4 },
1003*8975f5c5SAndroid Build Coastguard Worker { GL_RGB5_A1, GL_NONE, 5, 5, 5, 5, 5, 5, 1, 1 },
1004*8975f5c5SAndroid Build Coastguard Worker { GL_RGBA8, GL_NONE, 5, 8, 5, 8, 5, 8, 2, 8 },
1005*8975f5c5SAndroid Build Coastguard Worker { GL_RGB10_A2, GL_NONE, 9, 10, 9, 10, 9, 10, 2, 2 },
1006*8975f5c5SAndroid Build Coastguard Worker };
1007*8975f5c5SAndroid Build Coastguard Worker // clang-format on
1008*8975f5c5SAndroid Build Coastguard Worker
1009*8975f5c5SAndroid Build Coastguard Worker return QueryEffectiveFormatList(srcFormat, GL_NONE, list, ArraySize(list), outEffectiveFormat);
1010*8975f5c5SAndroid Build Coastguard Worker }
1011*8975f5c5SAndroid Build Coastguard Worker
GetUnsizedEffectiveInternalFormatInfo(const InternalFormat & srcFormat,const InternalFormat & destFormat,GLenum * outEffectiveFormat)1012*8975f5c5SAndroid Build Coastguard Worker bool GetUnsizedEffectiveInternalFormatInfo(const InternalFormat &srcFormat,
1013*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &destFormat,
1014*8975f5c5SAndroid Build Coastguard Worker GLenum *outEffectiveFormat)
1015*8975f5c5SAndroid Build Coastguard Worker {
1016*8975f5c5SAndroid Build Coastguard Worker constexpr GLuint umax = UINT_MAX;
1017*8975f5c5SAndroid Build Coastguard Worker
1018*8975f5c5SAndroid Build Coastguard Worker // OpenGL ES 3.0.3 Specification, Table 3.17, pg 141:
1019*8975f5c5SAndroid Build Coastguard Worker // Effective internal format coresponding to destination internal format andlinear source buffer
1020*8975f5c5SAndroid Build Coastguard Worker // component sizes.
1021*8975f5c5SAndroid Build Coastguard Worker // | Source channel min/max sizes |
1022*8975f5c5SAndroid Build Coastguard Worker // Effective Internal Format | Dest Format | R | G | B | A |
1023*8975f5c5SAndroid Build Coastguard Worker // clang-format off
1024*8975f5c5SAndroid Build Coastguard Worker constexpr EffectiveInternalFormatInfo list[] = {
1025*8975f5c5SAndroid Build Coastguard Worker { GL_ALPHA8_EXT, GL_ALPHA, 0, umax, 0, umax, 0, umax, 1, 8 },
1026*8975f5c5SAndroid Build Coastguard Worker { GL_LUMINANCE8_EXT, GL_LUMINANCE, 1, 8, 0, umax, 0, umax, 0, umax },
1027*8975f5c5SAndroid Build Coastguard Worker { GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE_ALPHA, 1, 8, 0, umax, 0, umax, 1, 8 },
1028*8975f5c5SAndroid Build Coastguard Worker { GL_RGB565, GL_RGB, 1, 5, 1, 6, 1, 5, 0, umax },
1029*8975f5c5SAndroid Build Coastguard Worker { GL_RGB8, GL_RGB, 6, 8, 7, 8, 6, 8, 0, umax },
1030*8975f5c5SAndroid Build Coastguard Worker { GL_RGBA4, GL_RGBA, 1, 4, 1, 4, 1, 4, 1, 4 },
1031*8975f5c5SAndroid Build Coastguard Worker { GL_RGB5_A1, GL_RGBA, 5, 5, 5, 5, 5, 5, 1, 1 },
1032*8975f5c5SAndroid Build Coastguard Worker { GL_RGBA8, GL_RGBA, 5, 8, 5, 8, 5, 8, 5, 8 },
1033*8975f5c5SAndroid Build Coastguard Worker };
1034*8975f5c5SAndroid Build Coastguard Worker // clang-format on
1035*8975f5c5SAndroid Build Coastguard Worker
1036*8975f5c5SAndroid Build Coastguard Worker return QueryEffectiveFormatList(srcFormat, destFormat.format, list, ArraySize(list),
1037*8975f5c5SAndroid Build Coastguard Worker outEffectiveFormat);
1038*8975f5c5SAndroid Build Coastguard Worker }
1039*8975f5c5SAndroid Build Coastguard Worker
GetEffectiveInternalFormat(const InternalFormat & srcFormat,const InternalFormat & destFormat,GLenum * outEffectiveFormat)1040*8975f5c5SAndroid Build Coastguard Worker static bool GetEffectiveInternalFormat(const InternalFormat &srcFormat,
1041*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &destFormat,
1042*8975f5c5SAndroid Build Coastguard Worker GLenum *outEffectiveFormat)
1043*8975f5c5SAndroid Build Coastguard Worker {
1044*8975f5c5SAndroid Build Coastguard Worker if (destFormat.sized)
1045*8975f5c5SAndroid Build Coastguard Worker {
1046*8975f5c5SAndroid Build Coastguard Worker return GetSizedEffectiveInternalFormatInfo(srcFormat, outEffectiveFormat);
1047*8975f5c5SAndroid Build Coastguard Worker }
1048*8975f5c5SAndroid Build Coastguard Worker else
1049*8975f5c5SAndroid Build Coastguard Worker {
1050*8975f5c5SAndroid Build Coastguard Worker return GetUnsizedEffectiveInternalFormatInfo(srcFormat, destFormat, outEffectiveFormat);
1051*8975f5c5SAndroid Build Coastguard Worker }
1052*8975f5c5SAndroid Build Coastguard Worker }
1053*8975f5c5SAndroid Build Coastguard Worker
EqualOrFirstZero(GLuint first,GLuint second)1054*8975f5c5SAndroid Build Coastguard Worker static bool EqualOrFirstZero(GLuint first, GLuint second)
1055*8975f5c5SAndroid Build Coastguard Worker {
1056*8975f5c5SAndroid Build Coastguard Worker return first == 0 || first == second;
1057*8975f5c5SAndroid Build Coastguard Worker }
1058*8975f5c5SAndroid Build Coastguard Worker
IsValidES3CopyTexImageCombination(const InternalFormat & textureFormatInfo,const InternalFormat & framebufferFormatInfo,FramebufferID readBufferHandle)1059*8975f5c5SAndroid Build Coastguard Worker static bool IsValidES3CopyTexImageCombination(const InternalFormat &textureFormatInfo,
1060*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &framebufferFormatInfo,
1061*8975f5c5SAndroid Build Coastguard Worker FramebufferID readBufferHandle)
1062*8975f5c5SAndroid Build Coastguard Worker {
1063*8975f5c5SAndroid Build Coastguard Worker if (!ValidES3CopyConversion(textureFormatInfo.format, framebufferFormatInfo.format))
1064*8975f5c5SAndroid Build Coastguard Worker {
1065*8975f5c5SAndroid Build Coastguard Worker return false;
1066*8975f5c5SAndroid Build Coastguard Worker }
1067*8975f5c5SAndroid Build Coastguard Worker
1068*8975f5c5SAndroid Build Coastguard Worker // Section 3.8.5 of the GLES 3.0.3 spec states that source and destination formats
1069*8975f5c5SAndroid Build Coastguard Worker // must both be signed, unsigned, or fixed point and both source and destinations
1070*8975f5c5SAndroid Build Coastguard Worker // must be either both SRGB or both not SRGB. EXT_color_buffer_float adds allowed
1071*8975f5c5SAndroid Build Coastguard Worker // conversion between fixed and floating point.
1072*8975f5c5SAndroid Build Coastguard Worker
1073*8975f5c5SAndroid Build Coastguard Worker if ((textureFormatInfo.colorEncoding == GL_SRGB) !=
1074*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.colorEncoding == GL_SRGB))
1075*8975f5c5SAndroid Build Coastguard Worker {
1076*8975f5c5SAndroid Build Coastguard Worker return false;
1077*8975f5c5SAndroid Build Coastguard Worker }
1078*8975f5c5SAndroid Build Coastguard Worker
1079*8975f5c5SAndroid Build Coastguard Worker if (((textureFormatInfo.componentType == GL_INT) !=
1080*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.componentType == GL_INT)) ||
1081*8975f5c5SAndroid Build Coastguard Worker ((textureFormatInfo.componentType == GL_UNSIGNED_INT) !=
1082*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.componentType == GL_UNSIGNED_INT)))
1083*8975f5c5SAndroid Build Coastguard Worker {
1084*8975f5c5SAndroid Build Coastguard Worker return false;
1085*8975f5c5SAndroid Build Coastguard Worker }
1086*8975f5c5SAndroid Build Coastguard Worker
1087*8975f5c5SAndroid Build Coastguard Worker if ((textureFormatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
1088*8975f5c5SAndroid Build Coastguard Worker textureFormatInfo.componentType == GL_SIGNED_NORMALIZED) &&
1089*8975f5c5SAndroid Build Coastguard Worker !(framebufferFormatInfo.componentType == GL_UNSIGNED_NORMALIZED ||
1090*8975f5c5SAndroid Build Coastguard Worker framebufferFormatInfo.componentType == GL_SIGNED_NORMALIZED))
1091*8975f5c5SAndroid Build Coastguard Worker {
1092*8975f5c5SAndroid Build Coastguard Worker return false;
1093*8975f5c5SAndroid Build Coastguard Worker }
1094*8975f5c5SAndroid Build Coastguard Worker
1095*8975f5c5SAndroid Build Coastguard Worker if ((textureFormatInfo.componentType == GL_SIGNED_NORMALIZED) !=
1096*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.componentType == GL_SIGNED_NORMALIZED))
1097*8975f5c5SAndroid Build Coastguard Worker {
1098*8975f5c5SAndroid Build Coastguard Worker return false;
1099*8975f5c5SAndroid Build Coastguard Worker }
1100*8975f5c5SAndroid Build Coastguard Worker
1101*8975f5c5SAndroid Build Coastguard Worker // Section 3.8.5 of the GLES 3.0.3 (and section 8.6 of the GLES 3.2) spec has a caveat, that
1102*8975f5c5SAndroid Build Coastguard Worker // the KHR dEQP tests enforce:
1103*8975f5c5SAndroid Build Coastguard Worker //
1104*8975f5c5SAndroid Build Coastguard Worker // Note that the above rules disallow matches where some components sizes are smaller and
1105*8975f5c5SAndroid Build Coastguard Worker // others are larger (such as RGB10_A2).
1106*8975f5c5SAndroid Build Coastguard Worker if (!textureFormatInfo.sized && (framebufferFormatInfo.internalFormat == GL_RGB10_A2))
1107*8975f5c5SAndroid Build Coastguard Worker {
1108*8975f5c5SAndroid Build Coastguard Worker return false;
1109*8975f5c5SAndroid Build Coastguard Worker }
1110*8975f5c5SAndroid Build Coastguard Worker
1111*8975f5c5SAndroid Build Coastguard Worker // GLES specification 3.0.3, sec 3.8.5, pg 139-140:
1112*8975f5c5SAndroid Build Coastguard Worker // The effective internal format of the source buffer is determined with the following rules
1113*8975f5c5SAndroid Build Coastguard Worker // applied in order:
1114*8975f5c5SAndroid Build Coastguard Worker // * If the source buffer is a texture or renderbuffer that was created with a sized internal
1115*8975f5c5SAndroid Build Coastguard Worker // format then the effective internal format is the source buffer's sized internal format.
1116*8975f5c5SAndroid Build Coastguard Worker // * If the source buffer is a texture that was created with an unsized base internal format,
1117*8975f5c5SAndroid Build Coastguard Worker // then the effective internal format is the source image array's effective internal
1118*8975f5c5SAndroid Build Coastguard Worker // format, as specified by table 3.12, which is determined from the <format> and <type>
1119*8975f5c5SAndroid Build Coastguard Worker // that were used when the source image array was specified by TexImage*.
1120*8975f5c5SAndroid Build Coastguard Worker // * Otherwise the effective internal format is determined by the row in table 3.17 or 3.18
1121*8975f5c5SAndroid Build Coastguard Worker // where Destination Internal Format matches internalformat and where the [source channel
1122*8975f5c5SAndroid Build Coastguard Worker // sizes] are consistent with the values of the source buffer's [channel sizes]. Table 3.17
1123*8975f5c5SAndroid Build Coastguard Worker // is used if the FRAMEBUFFER_ATTACHMENT_ENCODING is LINEAR and table 3.18 is used if the
1124*8975f5c5SAndroid Build Coastguard Worker // FRAMEBUFFER_ATTACHMENT_ENCODING is SRGB.
1125*8975f5c5SAndroid Build Coastguard Worker const InternalFormat *sourceEffectiveFormat = nullptr;
1126*8975f5c5SAndroid Build Coastguard Worker if (readBufferHandle.value != 0)
1127*8975f5c5SAndroid Build Coastguard Worker {
1128*8975f5c5SAndroid Build Coastguard Worker // Not the default framebuffer, therefore the read buffer must be a user-created texture or
1129*8975f5c5SAndroid Build Coastguard Worker // renderbuffer
1130*8975f5c5SAndroid Build Coastguard Worker if (framebufferFormatInfo.sized)
1131*8975f5c5SAndroid Build Coastguard Worker {
1132*8975f5c5SAndroid Build Coastguard Worker sourceEffectiveFormat = &framebufferFormatInfo;
1133*8975f5c5SAndroid Build Coastguard Worker }
1134*8975f5c5SAndroid Build Coastguard Worker else
1135*8975f5c5SAndroid Build Coastguard Worker {
1136*8975f5c5SAndroid Build Coastguard Worker // Renderbuffers cannot be created with an unsized internal format, so this must be an
1137*8975f5c5SAndroid Build Coastguard Worker // unsized-format texture. We can use the same table we use when creating textures to
1138*8975f5c5SAndroid Build Coastguard Worker // get its effective sized format.
1139*8975f5c5SAndroid Build Coastguard Worker sourceEffectiveFormat =
1140*8975f5c5SAndroid Build Coastguard Worker &GetSizedInternalFormatInfo(framebufferFormatInfo.sizedInternalFormat);
1141*8975f5c5SAndroid Build Coastguard Worker }
1142*8975f5c5SAndroid Build Coastguard Worker }
1143*8975f5c5SAndroid Build Coastguard Worker else
1144*8975f5c5SAndroid Build Coastguard Worker {
1145*8975f5c5SAndroid Build Coastguard Worker // The effective internal format must be derived from the source framebuffer's channel
1146*8975f5c5SAndroid Build Coastguard Worker // sizes. This is done in GetEffectiveInternalFormat for linear buffers (table 3.17)
1147*8975f5c5SAndroid Build Coastguard Worker if (framebufferFormatInfo.colorEncoding == GL_LINEAR)
1148*8975f5c5SAndroid Build Coastguard Worker {
1149*8975f5c5SAndroid Build Coastguard Worker GLenum effectiveFormat;
1150*8975f5c5SAndroid Build Coastguard Worker if (GetEffectiveInternalFormat(framebufferFormatInfo, textureFormatInfo,
1151*8975f5c5SAndroid Build Coastguard Worker &effectiveFormat))
1152*8975f5c5SAndroid Build Coastguard Worker {
1153*8975f5c5SAndroid Build Coastguard Worker sourceEffectiveFormat = &GetSizedInternalFormatInfo(effectiveFormat);
1154*8975f5c5SAndroid Build Coastguard Worker }
1155*8975f5c5SAndroid Build Coastguard Worker else
1156*8975f5c5SAndroid Build Coastguard Worker {
1157*8975f5c5SAndroid Build Coastguard Worker return false;
1158*8975f5c5SAndroid Build Coastguard Worker }
1159*8975f5c5SAndroid Build Coastguard Worker }
1160*8975f5c5SAndroid Build Coastguard Worker else if (framebufferFormatInfo.colorEncoding == GL_SRGB)
1161*8975f5c5SAndroid Build Coastguard Worker {
1162*8975f5c5SAndroid Build Coastguard Worker // SRGB buffers can only be copied to sized format destinations according to table 3.18
1163*8975f5c5SAndroid Build Coastguard Worker if (textureFormatInfo.sized &&
1164*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.redBits >= 1 && framebufferFormatInfo.redBits <= 8) &&
1165*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.greenBits >= 1 && framebufferFormatInfo.greenBits <= 8) &&
1166*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.blueBits >= 1 && framebufferFormatInfo.blueBits <= 8) &&
1167*8975f5c5SAndroid Build Coastguard Worker (framebufferFormatInfo.alphaBits >= 1 && framebufferFormatInfo.alphaBits <= 8))
1168*8975f5c5SAndroid Build Coastguard Worker {
1169*8975f5c5SAndroid Build Coastguard Worker sourceEffectiveFormat = &GetSizedInternalFormatInfo(GL_SRGB8_ALPHA8);
1170*8975f5c5SAndroid Build Coastguard Worker }
1171*8975f5c5SAndroid Build Coastguard Worker else
1172*8975f5c5SAndroid Build Coastguard Worker {
1173*8975f5c5SAndroid Build Coastguard Worker return false;
1174*8975f5c5SAndroid Build Coastguard Worker }
1175*8975f5c5SAndroid Build Coastguard Worker }
1176*8975f5c5SAndroid Build Coastguard Worker else
1177*8975f5c5SAndroid Build Coastguard Worker {
1178*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
1179*8975f5c5SAndroid Build Coastguard Worker return false;
1180*8975f5c5SAndroid Build Coastguard Worker }
1181*8975f5c5SAndroid Build Coastguard Worker }
1182*8975f5c5SAndroid Build Coastguard Worker
1183*8975f5c5SAndroid Build Coastguard Worker if (textureFormatInfo.sized)
1184*8975f5c5SAndroid Build Coastguard Worker {
1185*8975f5c5SAndroid Build Coastguard Worker // Section 3.8.5 of the GLES 3.0.3 spec, pg 139, requires that, if the destination format is
1186*8975f5c5SAndroid Build Coastguard Worker // sized, component sizes of the source and destination formats must exactly match if the
1187*8975f5c5SAndroid Build Coastguard Worker // destination format exists.
1188*8975f5c5SAndroid Build Coastguard Worker if (!EqualOrFirstZero(textureFormatInfo.redBits, sourceEffectiveFormat->redBits) ||
1189*8975f5c5SAndroid Build Coastguard Worker !EqualOrFirstZero(textureFormatInfo.greenBits, sourceEffectiveFormat->greenBits) ||
1190*8975f5c5SAndroid Build Coastguard Worker !EqualOrFirstZero(textureFormatInfo.blueBits, sourceEffectiveFormat->blueBits) ||
1191*8975f5c5SAndroid Build Coastguard Worker !EqualOrFirstZero(textureFormatInfo.alphaBits, sourceEffectiveFormat->alphaBits))
1192*8975f5c5SAndroid Build Coastguard Worker {
1193*8975f5c5SAndroid Build Coastguard Worker return false;
1194*8975f5c5SAndroid Build Coastguard Worker }
1195*8975f5c5SAndroid Build Coastguard Worker }
1196*8975f5c5SAndroid Build Coastguard Worker
1197*8975f5c5SAndroid Build Coastguard Worker return true; // A conversion function exists, and no rule in the specification has precluded
1198*8975f5c5SAndroid Build Coastguard Worker // conversion between these formats.
1199*8975f5c5SAndroid Build Coastguard Worker }
1200*8975f5c5SAndroid Build Coastguard Worker
ValidateES3CopyTexImageParametersBase(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLint x,GLint y,GLsizei width,GLsizei height,GLint border)1201*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3CopyTexImageParametersBase(const Context *context,
1202*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1203*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
1204*8975f5c5SAndroid Build Coastguard Worker GLint level,
1205*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1206*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
1207*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
1208*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
1209*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
1210*8975f5c5SAndroid Build Coastguard Worker GLint x,
1211*8975f5c5SAndroid Build Coastguard Worker GLint y,
1212*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1213*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1214*8975f5c5SAndroid Build Coastguard Worker GLint border)
1215*8975f5c5SAndroid Build Coastguard Worker {
1216*8975f5c5SAndroid Build Coastguard Worker Format textureFormat = Format::Invalid();
1217*8975f5c5SAndroid Build Coastguard Worker if (!ValidateCopyTexImageParametersBase(context, entryPoint, target, level, internalformat,
1218*8975f5c5SAndroid Build Coastguard Worker isSubImage, xoffset, yoffset, zoffset, x, y, width,
1219*8975f5c5SAndroid Build Coastguard Worker height, border, &textureFormat))
1220*8975f5c5SAndroid Build Coastguard Worker {
1221*8975f5c5SAndroid Build Coastguard Worker return false;
1222*8975f5c5SAndroid Build Coastguard Worker }
1223*8975f5c5SAndroid Build Coastguard Worker ASSERT(textureFormat.valid() || !isSubImage);
1224*8975f5c5SAndroid Build Coastguard Worker
1225*8975f5c5SAndroid Build Coastguard Worker const auto &state = context->getState();
1226*8975f5c5SAndroid Build Coastguard Worker Framebuffer *framebuffer = state.getReadFramebuffer();
1227*8975f5c5SAndroid Build Coastguard Worker FramebufferID readFramebufferID = framebuffer->id();
1228*8975f5c5SAndroid Build Coastguard Worker
1229*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferComplete(context, entryPoint, framebuffer))
1230*8975f5c5SAndroid Build Coastguard Worker {
1231*8975f5c5SAndroid Build Coastguard Worker return false;
1232*8975f5c5SAndroid Build Coastguard Worker }
1233*8975f5c5SAndroid Build Coastguard Worker
1234*8975f5c5SAndroid Build Coastguard Worker // needIntrinsic = true. Treat renderToTexture textures as single sample since they will be
1235*8975f5c5SAndroid Build Coastguard Worker // resolved before copying
1236*8975f5c5SAndroid Build Coastguard Worker if (!framebuffer->isDefault() &&
1237*8975f5c5SAndroid Build Coastguard Worker !ValidateFramebufferNotMultisampled(context, entryPoint, framebuffer, true))
1238*8975f5c5SAndroid Build Coastguard Worker {
1239*8975f5c5SAndroid Build Coastguard Worker return false;
1240*8975f5c5SAndroid Build Coastguard Worker }
1241*8975f5c5SAndroid Build Coastguard Worker
1242*8975f5c5SAndroid Build Coastguard Worker const FramebufferAttachment *source = framebuffer->getReadColorAttachment();
1243*8975f5c5SAndroid Build Coastguard Worker
1244*8975f5c5SAndroid Build Coastguard Worker // According to ES 3.x spec, if the internalformat of the texture
1245*8975f5c5SAndroid Build Coastguard Worker // is RGB9_E5 and copy to such a texture, generate INVALID_OPERATION.
1246*8975f5c5SAndroid Build Coastguard Worker if (textureFormat.info->internalFormat == GL_RGB9_E5)
1247*8975f5c5SAndroid Build Coastguard Worker {
1248*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidFormat);
1249*8975f5c5SAndroid Build Coastguard Worker return false;
1250*8975f5c5SAndroid Build Coastguard Worker }
1251*8975f5c5SAndroid Build Coastguard Worker
1252*8975f5c5SAndroid Build Coastguard Worker if (isSubImage)
1253*8975f5c5SAndroid Build Coastguard Worker {
1254*8975f5c5SAndroid Build Coastguard Worker if (!IsValidES3CopyTexImageCombination(*textureFormat.info, *source->getFormat().info,
1255*8975f5c5SAndroid Build Coastguard Worker readFramebufferID))
1256*8975f5c5SAndroid Build Coastguard Worker {
1257*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidCopyCombination);
1258*8975f5c5SAndroid Build Coastguard Worker return false;
1259*8975f5c5SAndroid Build Coastguard Worker }
1260*8975f5c5SAndroid Build Coastguard Worker }
1261*8975f5c5SAndroid Build Coastguard Worker else
1262*8975f5c5SAndroid Build Coastguard Worker {
1263*8975f5c5SAndroid Build Coastguard Worker // Use format/type from the source FBO. (Might not be perfect for all cases?)
1264*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &framebufferFormat = *source->getFormat().info;
1265*8975f5c5SAndroid Build Coastguard Worker const InternalFormat ©Format = GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE);
1266*8975f5c5SAndroid Build Coastguard Worker if (!IsValidES3CopyTexImageCombination(copyFormat, framebufferFormat, readFramebufferID))
1267*8975f5c5SAndroid Build Coastguard Worker {
1268*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidCopyCombination);
1269*8975f5c5SAndroid Build Coastguard Worker return false;
1270*8975f5c5SAndroid Build Coastguard Worker }
1271*8975f5c5SAndroid Build Coastguard Worker }
1272*8975f5c5SAndroid Build Coastguard Worker
1273*8975f5c5SAndroid Build Coastguard Worker // If width or height is zero, it is a no-op. Return false without setting an error.
1274*8975f5c5SAndroid Build Coastguard Worker return (width > 0 && height > 0);
1275*8975f5c5SAndroid Build Coastguard Worker }
1276*8975f5c5SAndroid Build Coastguard Worker
ValidateES3CopyTexImage2DParameters(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLint x,GLint y,GLsizei width,GLsizei height,GLint border)1277*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3CopyTexImage2DParameters(const Context *context,
1278*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1279*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
1280*8975f5c5SAndroid Build Coastguard Worker GLint level,
1281*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1282*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
1283*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
1284*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
1285*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
1286*8975f5c5SAndroid Build Coastguard Worker GLint x,
1287*8975f5c5SAndroid Build Coastguard Worker GLint y,
1288*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1289*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1290*8975f5c5SAndroid Build Coastguard Worker GLint border)
1291*8975f5c5SAndroid Build Coastguard Worker {
1292*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture2DDestinationTarget(context, target))
1293*8975f5c5SAndroid Build Coastguard Worker {
1294*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
1295*8975f5c5SAndroid Build Coastguard Worker return false;
1296*8975f5c5SAndroid Build Coastguard Worker }
1297*8975f5c5SAndroid Build Coastguard Worker
1298*8975f5c5SAndroid Build Coastguard Worker return ValidateES3CopyTexImageParametersBase(context, entryPoint, target, level, internalformat,
1299*8975f5c5SAndroid Build Coastguard Worker isSubImage, xoffset, yoffset, zoffset, x, y, width,
1300*8975f5c5SAndroid Build Coastguard Worker height, border);
1301*8975f5c5SAndroid Build Coastguard Worker }
1302*8975f5c5SAndroid Build Coastguard Worker
ValidateES3CopyTexImage3DParameters(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,bool isSubImage,GLint xoffset,GLint yoffset,GLint zoffset,GLint x,GLint y,GLsizei width,GLsizei height,GLint border)1303*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3CopyTexImage3DParameters(const Context *context,
1304*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1305*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
1306*8975f5c5SAndroid Build Coastguard Worker GLint level,
1307*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1308*8975f5c5SAndroid Build Coastguard Worker bool isSubImage,
1309*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
1310*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
1311*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
1312*8975f5c5SAndroid Build Coastguard Worker GLint x,
1313*8975f5c5SAndroid Build Coastguard Worker GLint y,
1314*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1315*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1316*8975f5c5SAndroid Build Coastguard Worker GLint border)
1317*8975f5c5SAndroid Build Coastguard Worker {
1318*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture3DDestinationTarget(context, target))
1319*8975f5c5SAndroid Build Coastguard Worker {
1320*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
1321*8975f5c5SAndroid Build Coastguard Worker return false;
1322*8975f5c5SAndroid Build Coastguard Worker }
1323*8975f5c5SAndroid Build Coastguard Worker
1324*8975f5c5SAndroid Build Coastguard Worker return ValidateES3CopyTexImageParametersBase(context, entryPoint, target, level, internalformat,
1325*8975f5c5SAndroid Build Coastguard Worker isSubImage, xoffset, yoffset, zoffset, x, y, width,
1326*8975f5c5SAndroid Build Coastguard Worker height, border);
1327*8975f5c5SAndroid Build Coastguard Worker }
1328*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorageParametersLevel(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLsizei width,GLsizei height,GLsizei depth)1329*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorageParametersLevel(const Context *context,
1330*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1331*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1332*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1333*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1334*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1335*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1336*8975f5c5SAndroid Build Coastguard Worker {
1337*8975f5c5SAndroid Build Coastguard Worker GLsizei maxDim = std::max(width, height);
1338*8975f5c5SAndroid Build Coastguard Worker if (target != TextureType::_2DArray)
1339*8975f5c5SAndroid Build Coastguard Worker {
1340*8975f5c5SAndroid Build Coastguard Worker maxDim = std::max(maxDim, depth);
1341*8975f5c5SAndroid Build Coastguard Worker }
1342*8975f5c5SAndroid Build Coastguard Worker
1343*8975f5c5SAndroid Build Coastguard Worker if (levels > log2(maxDim) + 1)
1344*8975f5c5SAndroid Build Coastguard Worker {
1345*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidMipLevels);
1346*8975f5c5SAndroid Build Coastguard Worker return false;
1347*8975f5c5SAndroid Build Coastguard Worker }
1348*8975f5c5SAndroid Build Coastguard Worker
1349*8975f5c5SAndroid Build Coastguard Worker return true;
1350*8975f5c5SAndroid Build Coastguard Worker }
1351*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorageParametersExtent(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLsizei width,GLsizei height,GLsizei depth)1352*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorageParametersExtent(const Context *context,
1353*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1354*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1355*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1356*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1357*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1358*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1359*8975f5c5SAndroid Build Coastguard Worker {
1360*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
1361*8975f5c5SAndroid Build Coastguard Worker
1362*8975f5c5SAndroid Build Coastguard Worker switch (target)
1363*8975f5c5SAndroid Build Coastguard Worker {
1364*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2D:
1365*8975f5c5SAndroid Build Coastguard Worker {
1366*8975f5c5SAndroid Build Coastguard Worker if (width > caps.max2DTextureSize || height > caps.max2DTextureSize)
1367*8975f5c5SAndroid Build Coastguard Worker {
1368*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1369*8975f5c5SAndroid Build Coastguard Worker return false;
1370*8975f5c5SAndroid Build Coastguard Worker }
1371*8975f5c5SAndroid Build Coastguard Worker }
1372*8975f5c5SAndroid Build Coastguard Worker break;
1373*8975f5c5SAndroid Build Coastguard Worker
1374*8975f5c5SAndroid Build Coastguard Worker case TextureType::Rectangle:
1375*8975f5c5SAndroid Build Coastguard Worker {
1376*8975f5c5SAndroid Build Coastguard Worker if (levels != 1)
1377*8975f5c5SAndroid Build Coastguard Worker {
1378*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevels);
1379*8975f5c5SAndroid Build Coastguard Worker return false;
1380*8975f5c5SAndroid Build Coastguard Worker }
1381*8975f5c5SAndroid Build Coastguard Worker
1382*8975f5c5SAndroid Build Coastguard Worker if (width > caps.maxRectangleTextureSize || height > caps.maxRectangleTextureSize)
1383*8975f5c5SAndroid Build Coastguard Worker {
1384*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1385*8975f5c5SAndroid Build Coastguard Worker return false;
1386*8975f5c5SAndroid Build Coastguard Worker }
1387*8975f5c5SAndroid Build Coastguard Worker }
1388*8975f5c5SAndroid Build Coastguard Worker break;
1389*8975f5c5SAndroid Build Coastguard Worker
1390*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMap:
1391*8975f5c5SAndroid Build Coastguard Worker {
1392*8975f5c5SAndroid Build Coastguard Worker if (width != height)
1393*8975f5c5SAndroid Build Coastguard Worker {
1394*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
1395*8975f5c5SAndroid Build Coastguard Worker return false;
1396*8975f5c5SAndroid Build Coastguard Worker }
1397*8975f5c5SAndroid Build Coastguard Worker
1398*8975f5c5SAndroid Build Coastguard Worker if (width > caps.maxCubeMapTextureSize)
1399*8975f5c5SAndroid Build Coastguard Worker {
1400*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1401*8975f5c5SAndroid Build Coastguard Worker return false;
1402*8975f5c5SAndroid Build Coastguard Worker }
1403*8975f5c5SAndroid Build Coastguard Worker }
1404*8975f5c5SAndroid Build Coastguard Worker break;
1405*8975f5c5SAndroid Build Coastguard Worker
1406*8975f5c5SAndroid Build Coastguard Worker case TextureType::_3D:
1407*8975f5c5SAndroid Build Coastguard Worker {
1408*8975f5c5SAndroid Build Coastguard Worker if (width > caps.max3DTextureSize || height > caps.max3DTextureSize ||
1409*8975f5c5SAndroid Build Coastguard Worker depth > caps.max3DTextureSize)
1410*8975f5c5SAndroid Build Coastguard Worker {
1411*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1412*8975f5c5SAndroid Build Coastguard Worker return false;
1413*8975f5c5SAndroid Build Coastguard Worker }
1414*8975f5c5SAndroid Build Coastguard Worker }
1415*8975f5c5SAndroid Build Coastguard Worker break;
1416*8975f5c5SAndroid Build Coastguard Worker
1417*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DArray:
1418*8975f5c5SAndroid Build Coastguard Worker {
1419*8975f5c5SAndroid Build Coastguard Worker if (width > caps.max2DTextureSize || height > caps.max2DTextureSize ||
1420*8975f5c5SAndroid Build Coastguard Worker depth > caps.maxArrayTextureLayers)
1421*8975f5c5SAndroid Build Coastguard Worker {
1422*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1423*8975f5c5SAndroid Build Coastguard Worker return false;
1424*8975f5c5SAndroid Build Coastguard Worker }
1425*8975f5c5SAndroid Build Coastguard Worker }
1426*8975f5c5SAndroid Build Coastguard Worker break;
1427*8975f5c5SAndroid Build Coastguard Worker
1428*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMapArray:
1429*8975f5c5SAndroid Build Coastguard Worker {
1430*8975f5c5SAndroid Build Coastguard Worker if (width != height)
1431*8975f5c5SAndroid Build Coastguard Worker {
1432*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapFacesEqualDimensions);
1433*8975f5c5SAndroid Build Coastguard Worker return false;
1434*8975f5c5SAndroid Build Coastguard Worker }
1435*8975f5c5SAndroid Build Coastguard Worker
1436*8975f5c5SAndroid Build Coastguard Worker if (width > caps.maxCubeMapTextureSize)
1437*8975f5c5SAndroid Build Coastguard Worker {
1438*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1439*8975f5c5SAndroid Build Coastguard Worker return false;
1440*8975f5c5SAndroid Build Coastguard Worker }
1441*8975f5c5SAndroid Build Coastguard Worker
1442*8975f5c5SAndroid Build Coastguard Worker if (width > caps.max3DTextureSize || height > caps.max3DTextureSize ||
1443*8975f5c5SAndroid Build Coastguard Worker depth > caps.max3DTextureSize)
1444*8975f5c5SAndroid Build Coastguard Worker {
1445*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
1446*8975f5c5SAndroid Build Coastguard Worker return false;
1447*8975f5c5SAndroid Build Coastguard Worker }
1448*8975f5c5SAndroid Build Coastguard Worker
1449*8975f5c5SAndroid Build Coastguard Worker if (depth % 6 != 0)
1450*8975f5c5SAndroid Build Coastguard Worker {
1451*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCubemapInvalidDepth);
1452*8975f5c5SAndroid Build Coastguard Worker return false;
1453*8975f5c5SAndroid Build Coastguard Worker }
1454*8975f5c5SAndroid Build Coastguard Worker }
1455*8975f5c5SAndroid Build Coastguard Worker break;
1456*8975f5c5SAndroid Build Coastguard Worker
1457*8975f5c5SAndroid Build Coastguard Worker default:
1458*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
1459*8975f5c5SAndroid Build Coastguard Worker return false;
1460*8975f5c5SAndroid Build Coastguard Worker }
1461*8975f5c5SAndroid Build Coastguard Worker
1462*8975f5c5SAndroid Build Coastguard Worker return true;
1463*8975f5c5SAndroid Build Coastguard Worker }
1464*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorageParametersTexObject(const Context * context,angle::EntryPoint entryPoint,TextureType target)1465*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorageParametersTexObject(const Context *context,
1466*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1467*8975f5c5SAndroid Build Coastguard Worker TextureType target)
1468*8975f5c5SAndroid Build Coastguard Worker {
1469*8975f5c5SAndroid Build Coastguard Worker Texture *texture = context->getTextureByType(target);
1470*8975f5c5SAndroid Build Coastguard Worker if (!texture || texture->id().value == 0)
1471*8975f5c5SAndroid Build Coastguard Worker {
1472*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMissingTexture);
1473*8975f5c5SAndroid Build Coastguard Worker return false;
1474*8975f5c5SAndroid Build Coastguard Worker }
1475*8975f5c5SAndroid Build Coastguard Worker
1476*8975f5c5SAndroid Build Coastguard Worker if (texture->getImmutableFormat())
1477*8975f5c5SAndroid Build Coastguard Worker {
1478*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTextureIsImmutable);
1479*8975f5c5SAndroid Build Coastguard Worker return false;
1480*8975f5c5SAndroid Build Coastguard Worker }
1481*8975f5c5SAndroid Build Coastguard Worker
1482*8975f5c5SAndroid Build Coastguard Worker return true;
1483*8975f5c5SAndroid Build Coastguard Worker }
1484*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorageParametersFormat(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth)1485*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorageParametersFormat(const Context *context,
1486*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1487*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1488*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1489*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1490*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1491*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1492*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1493*8975f5c5SAndroid Build Coastguard Worker {
1494*8975f5c5SAndroid Build Coastguard Worker // From ANGLE_texture_external_yuv_sampling:
1495*8975f5c5SAndroid Build Coastguard Worker // Texture target can only be TEXTURE_2D, there is no mipmap support
1496*8975f5c5SAndroid Build Coastguard Worker if (gl::IsYuvFormat(internalformat))
1497*8975f5c5SAndroid Build Coastguard Worker {
1498*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().yuvInternalFormatANGLE)
1499*8975f5c5SAndroid Build Coastguard Worker {
1500*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kInvalidInternalFormat, internalformat);
1501*8975f5c5SAndroid Build Coastguard Worker return false;
1502*8975f5c5SAndroid Build Coastguard Worker }
1503*8975f5c5SAndroid Build Coastguard Worker
1504*8975f5c5SAndroid Build Coastguard Worker if (target != TextureType::_2D)
1505*8975f5c5SAndroid Build Coastguard Worker {
1506*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
1507*8975f5c5SAndroid Build Coastguard Worker return false;
1508*8975f5c5SAndroid Build Coastguard Worker }
1509*8975f5c5SAndroid Build Coastguard Worker
1510*8975f5c5SAndroid Build Coastguard Worker if (levels != 1)
1511*8975f5c5SAndroid Build Coastguard Worker {
1512*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevel);
1513*8975f5c5SAndroid Build Coastguard Worker return false;
1514*8975f5c5SAndroid Build Coastguard Worker }
1515*8975f5c5SAndroid Build Coastguard Worker }
1516*8975f5c5SAndroid Build Coastguard Worker
1517*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
1518*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.textureSupport(context->getClientVersion(), context->getExtensions()))
1519*8975f5c5SAndroid Build Coastguard Worker {
1520*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kInvalidInternalFormat, internalformat);
1521*8975f5c5SAndroid Build Coastguard Worker return false;
1522*8975f5c5SAndroid Build Coastguard Worker }
1523*8975f5c5SAndroid Build Coastguard Worker
1524*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.sized)
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kInvalidInternalFormat, internalformat);
1527*8975f5c5SAndroid Build Coastguard Worker return false;
1528*8975f5c5SAndroid Build Coastguard Worker }
1529*8975f5c5SAndroid Build Coastguard Worker
1530*8975f5c5SAndroid Build Coastguard Worker if (formatInfo.compressed)
1531*8975f5c5SAndroid Build Coastguard Worker {
1532*8975f5c5SAndroid Build Coastguard Worker if (target == TextureType::Rectangle)
1533*8975f5c5SAndroid Build Coastguard Worker {
1534*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kRectangleTextureCompressed);
1535*8975f5c5SAndroid Build Coastguard Worker return false;
1536*8975f5c5SAndroid Build Coastguard Worker }
1537*8975f5c5SAndroid Build Coastguard Worker
1538*8975f5c5SAndroid Build Coastguard Worker if (target == TextureType::_2DArray)
1539*8975f5c5SAndroid Build Coastguard Worker {
1540*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3CompressedFormatForTexture2DArray(context, entryPoint,
1541*8975f5c5SAndroid Build Coastguard Worker formatInfo.internalFormat))
1542*8975f5c5SAndroid Build Coastguard Worker {
1543*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1544*8975f5c5SAndroid Build Coastguard Worker return false;
1545*8975f5c5SAndroid Build Coastguard Worker }
1546*8975f5c5SAndroid Build Coastguard Worker }
1547*8975f5c5SAndroid Build Coastguard Worker
1548*8975f5c5SAndroid Build Coastguard Worker if (target == TextureType::_3D)
1549*8975f5c5SAndroid Build Coastguard Worker {
1550*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3CompressedFormatForTexture3D(context, entryPoint,
1551*8975f5c5SAndroid Build Coastguard Worker formatInfo.internalFormat))
1552*8975f5c5SAndroid Build Coastguard Worker {
1553*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1554*8975f5c5SAndroid Build Coastguard Worker return false;
1555*8975f5c5SAndroid Build Coastguard Worker }
1556*8975f5c5SAndroid Build Coastguard Worker }
1557*8975f5c5SAndroid Build Coastguard Worker
1558*8975f5c5SAndroid Build Coastguard Worker if (!ValidCompressedImageSize(context, formatInfo.internalFormat, 0, width, height, depth))
1559*8975f5c5SAndroid Build Coastguard Worker {
1560*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidCompressedImageSize);
1561*8975f5c5SAndroid Build Coastguard Worker return false;
1562*8975f5c5SAndroid Build Coastguard Worker }
1563*8975f5c5SAndroid Build Coastguard Worker }
1564*8975f5c5SAndroid Build Coastguard Worker
1565*8975f5c5SAndroid Build Coastguard Worker // From the ES 3.0 spec section 3.8.3:
1566*8975f5c5SAndroid Build Coastguard Worker // Textures with a base internal format of DEPTH_COMPONENT or DEPTH_STENCIL are supported by
1567*8975f5c5SAndroid Build Coastguard Worker // texture image specification commands only if target is TEXTURE_2D, TEXTURE_2D_ARRAY, or
1568*8975f5c5SAndroid Build Coastguard Worker // TEXTURE_CUBE_MAP.Using these formats in conjunction with any other target will result in an
1569*8975f5c5SAndroid Build Coastguard Worker // INVALID_OPERATION error.
1570*8975f5c5SAndroid Build Coastguard Worker //
1571*8975f5c5SAndroid Build Coastguard Worker // Similar language exists in OES_texture_stencil8.
1572*8975f5c5SAndroid Build Coastguard Worker if (target == TextureType::_3D && formatInfo.isDepthOrStencil())
1573*8975f5c5SAndroid Build Coastguard Worker {
1574*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, k3DDepthStencil);
1575*8975f5c5SAndroid Build Coastguard Worker return false;
1576*8975f5c5SAndroid Build Coastguard Worker }
1577*8975f5c5SAndroid Build Coastguard Worker
1578*8975f5c5SAndroid Build Coastguard Worker return true;
1579*8975f5c5SAndroid Build Coastguard Worker }
1580*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorageParametersBase(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth)1581*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorageParametersBase(const Context *context,
1582*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1583*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1584*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1585*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1586*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1587*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1588*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1589*8975f5c5SAndroid Build Coastguard Worker {
1590*8975f5c5SAndroid Build Coastguard Worker if (width < 1 || height < 1 || depth < 1 || levels < 1)
1591*8975f5c5SAndroid Build Coastguard Worker {
1592*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTextureSizeTooSmall);
1593*8975f5c5SAndroid Build Coastguard Worker return false;
1594*8975f5c5SAndroid Build Coastguard Worker }
1595*8975f5c5SAndroid Build Coastguard Worker
1596*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorageParametersLevel(context, entryPoint, target, levels, width, height,
1597*8975f5c5SAndroid Build Coastguard Worker depth))
1598*8975f5c5SAndroid Build Coastguard Worker {
1599*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1600*8975f5c5SAndroid Build Coastguard Worker return false;
1601*8975f5c5SAndroid Build Coastguard Worker }
1602*8975f5c5SAndroid Build Coastguard Worker
1603*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorageParametersExtent(context, entryPoint, target, levels, width, height,
1604*8975f5c5SAndroid Build Coastguard Worker depth))
1605*8975f5c5SAndroid Build Coastguard Worker {
1606*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1607*8975f5c5SAndroid Build Coastguard Worker return false;
1608*8975f5c5SAndroid Build Coastguard Worker }
1609*8975f5c5SAndroid Build Coastguard Worker
1610*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorageParametersTexObject(context, entryPoint, target))
1611*8975f5c5SAndroid Build Coastguard Worker {
1612*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1613*8975f5c5SAndroid Build Coastguard Worker return false;
1614*8975f5c5SAndroid Build Coastguard Worker }
1615*8975f5c5SAndroid Build Coastguard Worker
1616*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorageParametersFormat(context, entryPoint, target, levels, internalformat,
1617*8975f5c5SAndroid Build Coastguard Worker width, height, depth))
1618*8975f5c5SAndroid Build Coastguard Worker {
1619*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
1620*8975f5c5SAndroid Build Coastguard Worker return false;
1621*8975f5c5SAndroid Build Coastguard Worker }
1622*8975f5c5SAndroid Build Coastguard Worker
1623*8975f5c5SAndroid Build Coastguard Worker return true;
1624*8975f5c5SAndroid Build Coastguard Worker }
1625*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorage2DParameters(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth)1626*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorage2DParameters(const Context *context,
1627*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1628*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1629*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1630*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1631*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1632*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1633*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1634*8975f5c5SAndroid Build Coastguard Worker {
1635*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture2DTarget(context, target))
1636*8975f5c5SAndroid Build Coastguard Worker {
1637*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
1638*8975f5c5SAndroid Build Coastguard Worker return false;
1639*8975f5c5SAndroid Build Coastguard Worker }
1640*8975f5c5SAndroid Build Coastguard Worker
1641*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexStorageParametersBase(context, entryPoint, target, levels, internalformat,
1642*8975f5c5SAndroid Build Coastguard Worker width, height, depth);
1643*8975f5c5SAndroid Build Coastguard Worker }
1644*8975f5c5SAndroid Build Coastguard Worker
ValidateES3TexStorage3DParameters(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth)1645*8975f5c5SAndroid Build Coastguard Worker bool ValidateES3TexStorage3DParameters(const Context *context,
1646*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1647*8975f5c5SAndroid Build Coastguard Worker TextureType target,
1648*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
1649*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
1650*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1651*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
1652*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
1653*8975f5c5SAndroid Build Coastguard Worker {
1654*8975f5c5SAndroid Build Coastguard Worker if (!ValidTexture3DTarget(context, target))
1655*8975f5c5SAndroid Build Coastguard Worker {
1656*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
1657*8975f5c5SAndroid Build Coastguard Worker return false;
1658*8975f5c5SAndroid Build Coastguard Worker }
1659*8975f5c5SAndroid Build Coastguard Worker
1660*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexStorageParametersBase(context, entryPoint, target, levels, internalformat,
1661*8975f5c5SAndroid Build Coastguard Worker width, height, depth);
1662*8975f5c5SAndroid Build Coastguard Worker }
1663*8975f5c5SAndroid Build Coastguard Worker
ValidateBeginQuery(const Context * context,angle::EntryPoint entryPoint,QueryType target,QueryID id)1664*8975f5c5SAndroid Build Coastguard Worker bool ValidateBeginQuery(const Context *context,
1665*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1666*8975f5c5SAndroid Build Coastguard Worker QueryType target,
1667*8975f5c5SAndroid Build Coastguard Worker QueryID id)
1668*8975f5c5SAndroid Build Coastguard Worker {
1669*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1670*8975f5c5SAndroid Build Coastguard Worker {
1671*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1672*8975f5c5SAndroid Build Coastguard Worker return false;
1673*8975f5c5SAndroid Build Coastguard Worker }
1674*8975f5c5SAndroid Build Coastguard Worker
1675*8975f5c5SAndroid Build Coastguard Worker return ValidateBeginQueryBase(context, entryPoint, target, id);
1676*8975f5c5SAndroid Build Coastguard Worker }
1677*8975f5c5SAndroid Build Coastguard Worker
ValidateEndQuery(const Context * context,angle::EntryPoint entryPoint,QueryType target)1678*8975f5c5SAndroid Build Coastguard Worker bool ValidateEndQuery(const Context *context, angle::EntryPoint entryPoint, QueryType target)
1679*8975f5c5SAndroid Build Coastguard Worker {
1680*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1681*8975f5c5SAndroid Build Coastguard Worker {
1682*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1683*8975f5c5SAndroid Build Coastguard Worker return false;
1684*8975f5c5SAndroid Build Coastguard Worker }
1685*8975f5c5SAndroid Build Coastguard Worker
1686*8975f5c5SAndroid Build Coastguard Worker return ValidateEndQueryBase(context, entryPoint, target);
1687*8975f5c5SAndroid Build Coastguard Worker }
1688*8975f5c5SAndroid Build Coastguard Worker
ValidateGetQueryiv(const Context * context,angle::EntryPoint entryPoint,QueryType target,GLenum pname,const GLint * params)1689*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetQueryiv(const Context *context,
1690*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1691*8975f5c5SAndroid Build Coastguard Worker QueryType target,
1692*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
1693*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
1694*8975f5c5SAndroid Build Coastguard Worker {
1695*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1696*8975f5c5SAndroid Build Coastguard Worker {
1697*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1698*8975f5c5SAndroid Build Coastguard Worker return false;
1699*8975f5c5SAndroid Build Coastguard Worker }
1700*8975f5c5SAndroid Build Coastguard Worker
1701*8975f5c5SAndroid Build Coastguard Worker return ValidateGetQueryivBase(context, entryPoint, target, pname, nullptr);
1702*8975f5c5SAndroid Build Coastguard Worker }
1703*8975f5c5SAndroid Build Coastguard Worker
ValidateGetQueryObjectuiv(const Context * context,angle::EntryPoint entryPoint,QueryID id,GLenum pname,const GLuint * params)1704*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetQueryObjectuiv(const Context *context,
1705*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1706*8975f5c5SAndroid Build Coastguard Worker QueryID id,
1707*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
1708*8975f5c5SAndroid Build Coastguard Worker const GLuint *params)
1709*8975f5c5SAndroid Build Coastguard Worker {
1710*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1711*8975f5c5SAndroid Build Coastguard Worker {
1712*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1713*8975f5c5SAndroid Build Coastguard Worker return false;
1714*8975f5c5SAndroid Build Coastguard Worker }
1715*8975f5c5SAndroid Build Coastguard Worker
1716*8975f5c5SAndroid Build Coastguard Worker return ValidateGetQueryObjectValueBase(context, entryPoint, id, pname, nullptr);
1717*8975f5c5SAndroid Build Coastguard Worker }
1718*8975f5c5SAndroid Build Coastguard Worker
ValidateFramebufferTextureLayer(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum attachment,TextureID texture,GLint level,GLint layer)1719*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferTextureLayer(const Context *context,
1720*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1721*8975f5c5SAndroid Build Coastguard Worker GLenum target,
1722*8975f5c5SAndroid Build Coastguard Worker GLenum attachment,
1723*8975f5c5SAndroid Build Coastguard Worker TextureID texture,
1724*8975f5c5SAndroid Build Coastguard Worker GLint level,
1725*8975f5c5SAndroid Build Coastguard Worker GLint layer)
1726*8975f5c5SAndroid Build Coastguard Worker {
1727*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1728*8975f5c5SAndroid Build Coastguard Worker {
1729*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1730*8975f5c5SAndroid Build Coastguard Worker return false;
1731*8975f5c5SAndroid Build Coastguard Worker }
1732*8975f5c5SAndroid Build Coastguard Worker
1733*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferTextureBase(context, entryPoint, target, attachment, texture, level))
1734*8975f5c5SAndroid Build Coastguard Worker {
1735*8975f5c5SAndroid Build Coastguard Worker return false;
1736*8975f5c5SAndroid Build Coastguard Worker }
1737*8975f5c5SAndroid Build Coastguard Worker
1738*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
1739*8975f5c5SAndroid Build Coastguard Worker if (texture.value != 0)
1740*8975f5c5SAndroid Build Coastguard Worker {
1741*8975f5c5SAndroid Build Coastguard Worker if (layer < 0)
1742*8975f5c5SAndroid Build Coastguard Worker {
1743*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeLayer);
1744*8975f5c5SAndroid Build Coastguard Worker return false;
1745*8975f5c5SAndroid Build Coastguard Worker }
1746*8975f5c5SAndroid Build Coastguard Worker
1747*8975f5c5SAndroid Build Coastguard Worker Texture *tex = context->getTexture(texture);
1748*8975f5c5SAndroid Build Coastguard Worker ASSERT(tex);
1749*8975f5c5SAndroid Build Coastguard Worker
1750*8975f5c5SAndroid Build Coastguard Worker switch (tex->getType())
1751*8975f5c5SAndroid Build Coastguard Worker {
1752*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DArray:
1753*8975f5c5SAndroid Build Coastguard Worker {
1754*8975f5c5SAndroid Build Coastguard Worker if (level > log2(caps.max2DTextureSize))
1755*8975f5c5SAndroid Build Coastguard Worker {
1756*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidMipLevel);
1757*8975f5c5SAndroid Build Coastguard Worker return false;
1758*8975f5c5SAndroid Build Coastguard Worker }
1759*8975f5c5SAndroid Build Coastguard Worker
1760*8975f5c5SAndroid Build Coastguard Worker if (layer >= caps.maxArrayTextureLayers)
1761*8975f5c5SAndroid Build Coastguard Worker {
1762*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidLayer);
1763*8975f5c5SAndroid Build Coastguard Worker return false;
1764*8975f5c5SAndroid Build Coastguard Worker }
1765*8975f5c5SAndroid Build Coastguard Worker }
1766*8975f5c5SAndroid Build Coastguard Worker break;
1767*8975f5c5SAndroid Build Coastguard Worker
1768*8975f5c5SAndroid Build Coastguard Worker case TextureType::_3D:
1769*8975f5c5SAndroid Build Coastguard Worker {
1770*8975f5c5SAndroid Build Coastguard Worker if (level > log2(caps.max3DTextureSize))
1771*8975f5c5SAndroid Build Coastguard Worker {
1772*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidMipLevel);
1773*8975f5c5SAndroid Build Coastguard Worker return false;
1774*8975f5c5SAndroid Build Coastguard Worker }
1775*8975f5c5SAndroid Build Coastguard Worker
1776*8975f5c5SAndroid Build Coastguard Worker if (layer >= caps.max3DTextureSize)
1777*8975f5c5SAndroid Build Coastguard Worker {
1778*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidLayer);
1779*8975f5c5SAndroid Build Coastguard Worker return false;
1780*8975f5c5SAndroid Build Coastguard Worker }
1781*8975f5c5SAndroid Build Coastguard Worker }
1782*8975f5c5SAndroid Build Coastguard Worker break;
1783*8975f5c5SAndroid Build Coastguard Worker
1784*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DMultisampleArray:
1785*8975f5c5SAndroid Build Coastguard Worker {
1786*8975f5c5SAndroid Build Coastguard Worker if (level != 0)
1787*8975f5c5SAndroid Build Coastguard Worker {
1788*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidMipLevel);
1789*8975f5c5SAndroid Build Coastguard Worker return false;
1790*8975f5c5SAndroid Build Coastguard Worker }
1791*8975f5c5SAndroid Build Coastguard Worker
1792*8975f5c5SAndroid Build Coastguard Worker if (layer >= caps.maxArrayTextureLayers)
1793*8975f5c5SAndroid Build Coastguard Worker {
1794*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidLayer);
1795*8975f5c5SAndroid Build Coastguard Worker return false;
1796*8975f5c5SAndroid Build Coastguard Worker }
1797*8975f5c5SAndroid Build Coastguard Worker }
1798*8975f5c5SAndroid Build Coastguard Worker break;
1799*8975f5c5SAndroid Build Coastguard Worker
1800*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMap:
1801*8975f5c5SAndroid Build Coastguard Worker {
1802*8975f5c5SAndroid Build Coastguard Worker if (level > log2(caps.maxCubeMapTextureSize))
1803*8975f5c5SAndroid Build Coastguard Worker {
1804*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidMipLevel);
1805*8975f5c5SAndroid Build Coastguard Worker return false;
1806*8975f5c5SAndroid Build Coastguard Worker }
1807*8975f5c5SAndroid Build Coastguard Worker
1808*8975f5c5SAndroid Build Coastguard Worker if (layer >= static_cast<GLint>(kCubeFaceCount))
1809*8975f5c5SAndroid Build Coastguard Worker {
1810*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidLayer);
1811*8975f5c5SAndroid Build Coastguard Worker return false;
1812*8975f5c5SAndroid Build Coastguard Worker }
1813*8975f5c5SAndroid Build Coastguard Worker }
1814*8975f5c5SAndroid Build Coastguard Worker break;
1815*8975f5c5SAndroid Build Coastguard Worker
1816*8975f5c5SAndroid Build Coastguard Worker case TextureType::CubeMapArray:
1817*8975f5c5SAndroid Build Coastguard Worker {
1818*8975f5c5SAndroid Build Coastguard Worker if (level > log2(caps.maxCubeMapTextureSize))
1819*8975f5c5SAndroid Build Coastguard Worker {
1820*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidMipLevel);
1821*8975f5c5SAndroid Build Coastguard Worker return false;
1822*8975f5c5SAndroid Build Coastguard Worker }
1823*8975f5c5SAndroid Build Coastguard Worker
1824*8975f5c5SAndroid Build Coastguard Worker if (layer >= caps.maxArrayTextureLayers)
1825*8975f5c5SAndroid Build Coastguard Worker {
1826*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferTextureInvalidLayer);
1827*8975f5c5SAndroid Build Coastguard Worker return false;
1828*8975f5c5SAndroid Build Coastguard Worker }
1829*8975f5c5SAndroid Build Coastguard Worker }
1830*8975f5c5SAndroid Build Coastguard Worker break;
1831*8975f5c5SAndroid Build Coastguard Worker
1832*8975f5c5SAndroid Build Coastguard Worker default:
1833*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION,
1834*8975f5c5SAndroid Build Coastguard Worker kFramebufferTextureLayerIncorrectTextureType);
1835*8975f5c5SAndroid Build Coastguard Worker return false;
1836*8975f5c5SAndroid Build Coastguard Worker }
1837*8975f5c5SAndroid Build Coastguard Worker
1838*8975f5c5SAndroid Build Coastguard Worker const auto &format = tex->getFormat(TextureTypeToTarget(tex->getType(), layer), level);
1839*8975f5c5SAndroid Build Coastguard Worker if (format.info->compressed)
1840*8975f5c5SAndroid Build Coastguard Worker {
1841*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kCompressedTexturesNotAttachable);
1842*8975f5c5SAndroid Build Coastguard Worker return false;
1843*8975f5c5SAndroid Build Coastguard Worker }
1844*8975f5c5SAndroid Build Coastguard Worker }
1845*8975f5c5SAndroid Build Coastguard Worker
1846*8975f5c5SAndroid Build Coastguard Worker return true;
1847*8975f5c5SAndroid Build Coastguard Worker }
1848*8975f5c5SAndroid Build Coastguard Worker
ValidateInvalidateFramebuffer(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLsizei numAttachments,const GLenum * attachments)1849*8975f5c5SAndroid Build Coastguard Worker bool ValidateInvalidateFramebuffer(const Context *context,
1850*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1851*8975f5c5SAndroid Build Coastguard Worker GLenum target,
1852*8975f5c5SAndroid Build Coastguard Worker GLsizei numAttachments,
1853*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments)
1854*8975f5c5SAndroid Build Coastguard Worker {
1855*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1856*8975f5c5SAndroid Build Coastguard Worker {
1857*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1858*8975f5c5SAndroid Build Coastguard Worker return false;
1859*8975f5c5SAndroid Build Coastguard Worker }
1860*8975f5c5SAndroid Build Coastguard Worker
1861*8975f5c5SAndroid Build Coastguard Worker bool defaultFramebuffer = false;
1862*8975f5c5SAndroid Build Coastguard Worker
1863*8975f5c5SAndroid Build Coastguard Worker switch (target)
1864*8975f5c5SAndroid Build Coastguard Worker {
1865*8975f5c5SAndroid Build Coastguard Worker case GL_DRAW_FRAMEBUFFER:
1866*8975f5c5SAndroid Build Coastguard Worker case GL_FRAMEBUFFER:
1867*8975f5c5SAndroid Build Coastguard Worker defaultFramebuffer = context->getState().getDrawFramebuffer()->isDefault();
1868*8975f5c5SAndroid Build Coastguard Worker break;
1869*8975f5c5SAndroid Build Coastguard Worker case GL_READ_FRAMEBUFFER:
1870*8975f5c5SAndroid Build Coastguard Worker defaultFramebuffer = context->getState().getReadFramebuffer()->isDefault();
1871*8975f5c5SAndroid Build Coastguard Worker break;
1872*8975f5c5SAndroid Build Coastguard Worker default:
1873*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFramebufferTarget);
1874*8975f5c5SAndroid Build Coastguard Worker return false;
1875*8975f5c5SAndroid Build Coastguard Worker }
1876*8975f5c5SAndroid Build Coastguard Worker
1877*8975f5c5SAndroid Build Coastguard Worker return ValidateDiscardFramebufferBase(context, entryPoint, target, numAttachments, attachments,
1878*8975f5c5SAndroid Build Coastguard Worker defaultFramebuffer);
1879*8975f5c5SAndroid Build Coastguard Worker }
1880*8975f5c5SAndroid Build Coastguard Worker
ValidateInvalidateSubFramebuffer(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLsizei numAttachments,const GLenum * attachments,GLint x,GLint y,GLsizei width,GLsizei height)1881*8975f5c5SAndroid Build Coastguard Worker bool ValidateInvalidateSubFramebuffer(const Context *context,
1882*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1883*8975f5c5SAndroid Build Coastguard Worker GLenum target,
1884*8975f5c5SAndroid Build Coastguard Worker GLsizei numAttachments,
1885*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments,
1886*8975f5c5SAndroid Build Coastguard Worker GLint x,
1887*8975f5c5SAndroid Build Coastguard Worker GLint y,
1888*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
1889*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
1890*8975f5c5SAndroid Build Coastguard Worker {
1891*8975f5c5SAndroid Build Coastguard Worker if (width < 0 || height < 0)
1892*8975f5c5SAndroid Build Coastguard Worker {
1893*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeSize);
1894*8975f5c5SAndroid Build Coastguard Worker return false;
1895*8975f5c5SAndroid Build Coastguard Worker }
1896*8975f5c5SAndroid Build Coastguard Worker
1897*8975f5c5SAndroid Build Coastguard Worker return ValidateInvalidateFramebuffer(context, entryPoint, target, numAttachments, attachments);
1898*8975f5c5SAndroid Build Coastguard Worker }
1899*8975f5c5SAndroid Build Coastguard Worker
ValidateClearBuffer(const Context * context,angle::EntryPoint entryPoint)1900*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearBuffer(const Context *context, angle::EntryPoint entryPoint)
1901*8975f5c5SAndroid Build Coastguard Worker {
1902*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1903*8975f5c5SAndroid Build Coastguard Worker {
1904*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1905*8975f5c5SAndroid Build Coastguard Worker return false;
1906*8975f5c5SAndroid Build Coastguard Worker }
1907*8975f5c5SAndroid Build Coastguard Worker
1908*8975f5c5SAndroid Build Coastguard Worker Framebuffer *drawFramebuffer = context->getState().getDrawFramebuffer();
1909*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferComplete(context, entryPoint, drawFramebuffer))
1910*8975f5c5SAndroid Build Coastguard Worker {
1911*8975f5c5SAndroid Build Coastguard Worker return false;
1912*8975f5c5SAndroid Build Coastguard Worker }
1913*8975f5c5SAndroid Build Coastguard Worker
1914*8975f5c5SAndroid Build Coastguard Worker // The QCOM_framebuffer_foveated spec:
1915*8975f5c5SAndroid Build Coastguard Worker if (drawFramebuffer->isFoveationEnabled())
1916*8975f5c5SAndroid Build Coastguard Worker {
1917*8975f5c5SAndroid Build Coastguard Worker // INVALID_OPERATION is generated by any API call which causes a framebuffer
1918*8975f5c5SAndroid Build Coastguard Worker // attachment to be written to if the framebuffer attachments have changed for
1919*8975f5c5SAndroid Build Coastguard Worker // a foveated fbo.
1920*8975f5c5SAndroid Build Coastguard Worker if (drawFramebuffer->hasAnyAttachmentChanged())
1921*8975f5c5SAndroid Build Coastguard Worker {
1922*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kFramebufferFoveationAttachmentChanged);
1923*8975f5c5SAndroid Build Coastguard Worker return false;
1924*8975f5c5SAndroid Build Coastguard Worker }
1925*8975f5c5SAndroid Build Coastguard Worker }
1926*8975f5c5SAndroid Build Coastguard Worker
1927*8975f5c5SAndroid Build Coastguard Worker return true;
1928*8975f5c5SAndroid Build Coastguard Worker }
1929*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawRangeElements(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,DrawElementsType type,const void * indices)1930*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawRangeElements(const Context *context,
1931*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1932*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
1933*8975f5c5SAndroid Build Coastguard Worker GLuint start,
1934*8975f5c5SAndroid Build Coastguard Worker GLuint end,
1935*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
1936*8975f5c5SAndroid Build Coastguard Worker DrawElementsType type,
1937*8975f5c5SAndroid Build Coastguard Worker const void *indices)
1938*8975f5c5SAndroid Build Coastguard Worker {
1939*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1940*8975f5c5SAndroid Build Coastguard Worker {
1941*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1942*8975f5c5SAndroid Build Coastguard Worker return false;
1943*8975f5c5SAndroid Build Coastguard Worker }
1944*8975f5c5SAndroid Build Coastguard Worker
1945*8975f5c5SAndroid Build Coastguard Worker if (end < start)
1946*8975f5c5SAndroid Build Coastguard Worker {
1947*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidElementRange);
1948*8975f5c5SAndroid Build Coastguard Worker return false;
1949*8975f5c5SAndroid Build Coastguard Worker }
1950*8975f5c5SAndroid Build Coastguard Worker
1951*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1))
1952*8975f5c5SAndroid Build Coastguard Worker {
1953*8975f5c5SAndroid Build Coastguard Worker return false;
1954*8975f5c5SAndroid Build Coastguard Worker }
1955*8975f5c5SAndroid Build Coastguard Worker
1956*8975f5c5SAndroid Build Coastguard Worker // Skip range checks for no-op calls.
1957*8975f5c5SAndroid Build Coastguard Worker if (count <= 0)
1958*8975f5c5SAndroid Build Coastguard Worker {
1959*8975f5c5SAndroid Build Coastguard Worker return true;
1960*8975f5c5SAndroid Build Coastguard Worker }
1961*8975f5c5SAndroid Build Coastguard Worker
1962*8975f5c5SAndroid Build Coastguard Worker return true;
1963*8975f5c5SAndroid Build Coastguard Worker }
1964*8975f5c5SAndroid Build Coastguard Worker
ValidateGetUniformuiv(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,UniformLocation location,const GLuint * params)1965*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetUniformuiv(const Context *context,
1966*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
1967*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
1968*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
1969*8975f5c5SAndroid Build Coastguard Worker const GLuint *params)
1970*8975f5c5SAndroid Build Coastguard Worker {
1971*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1972*8975f5c5SAndroid Build Coastguard Worker {
1973*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1974*8975f5c5SAndroid Build Coastguard Worker return false;
1975*8975f5c5SAndroid Build Coastguard Worker }
1976*8975f5c5SAndroid Build Coastguard Worker
1977*8975f5c5SAndroid Build Coastguard Worker return ValidateGetUniformBase(context, entryPoint, program, location);
1978*8975f5c5SAndroid Build Coastguard Worker }
1979*8975f5c5SAndroid Build Coastguard Worker
ValidateReadBuffer(const Context * context,angle::EntryPoint entryPoint,GLenum src)1980*8975f5c5SAndroid Build Coastguard Worker bool ValidateReadBuffer(const Context *context, angle::EntryPoint entryPoint, GLenum src)
1981*8975f5c5SAndroid Build Coastguard Worker {
1982*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
1983*8975f5c5SAndroid Build Coastguard Worker {
1984*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1985*8975f5c5SAndroid Build Coastguard Worker return false;
1986*8975f5c5SAndroid Build Coastguard Worker }
1987*8975f5c5SAndroid Build Coastguard Worker
1988*8975f5c5SAndroid Build Coastguard Worker const Framebuffer *readFBO = context->getState().getReadFramebuffer();
1989*8975f5c5SAndroid Build Coastguard Worker
1990*8975f5c5SAndroid Build Coastguard Worker if (readFBO == nullptr)
1991*8975f5c5SAndroid Build Coastguard Worker {
1992*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNoReadFramebuffer);
1993*8975f5c5SAndroid Build Coastguard Worker return false;
1994*8975f5c5SAndroid Build Coastguard Worker }
1995*8975f5c5SAndroid Build Coastguard Worker
1996*8975f5c5SAndroid Build Coastguard Worker if (src == GL_NONE)
1997*8975f5c5SAndroid Build Coastguard Worker {
1998*8975f5c5SAndroid Build Coastguard Worker return true;
1999*8975f5c5SAndroid Build Coastguard Worker }
2000*8975f5c5SAndroid Build Coastguard Worker
2001*8975f5c5SAndroid Build Coastguard Worker if (src != GL_BACK && (src < GL_COLOR_ATTACHMENT0 || src > GL_COLOR_ATTACHMENT31))
2002*8975f5c5SAndroid Build Coastguard Worker {
2003*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidReadBuffer);
2004*8975f5c5SAndroid Build Coastguard Worker return false;
2005*8975f5c5SAndroid Build Coastguard Worker }
2006*8975f5c5SAndroid Build Coastguard Worker
2007*8975f5c5SAndroid Build Coastguard Worker if (readFBO->isDefault())
2008*8975f5c5SAndroid Build Coastguard Worker {
2009*8975f5c5SAndroid Build Coastguard Worker if (src != GL_BACK)
2010*8975f5c5SAndroid Build Coastguard Worker {
2011*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidDefaultReadBuffer);
2012*8975f5c5SAndroid Build Coastguard Worker return false;
2013*8975f5c5SAndroid Build Coastguard Worker }
2014*8975f5c5SAndroid Build Coastguard Worker }
2015*8975f5c5SAndroid Build Coastguard Worker else
2016*8975f5c5SAndroid Build Coastguard Worker {
2017*8975f5c5SAndroid Build Coastguard Worker GLuint drawBuffer = static_cast<GLuint>(src - GL_COLOR_ATTACHMENT0);
2018*8975f5c5SAndroid Build Coastguard Worker
2019*8975f5c5SAndroid Build Coastguard Worker if (drawBuffer >= static_cast<GLuint>(context->getCaps().maxColorAttachments))
2020*8975f5c5SAndroid Build Coastguard Worker {
2021*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExceedsMaxColorAttachments);
2022*8975f5c5SAndroid Build Coastguard Worker return false;
2023*8975f5c5SAndroid Build Coastguard Worker }
2024*8975f5c5SAndroid Build Coastguard Worker }
2025*8975f5c5SAndroid Build Coastguard Worker
2026*8975f5c5SAndroid Build Coastguard Worker return true;
2027*8975f5c5SAndroid Build Coastguard Worker }
2028*8975f5c5SAndroid Build Coastguard Worker
ValidateCompressedTexImage3D(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLsizei imageSize,const void * data)2029*8975f5c5SAndroid Build Coastguard Worker bool ValidateCompressedTexImage3D(const Context *context,
2030*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2031*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2032*8975f5c5SAndroid Build Coastguard Worker GLint level,
2033*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
2034*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2035*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2036*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2037*8975f5c5SAndroid Build Coastguard Worker GLint border,
2038*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
2039*8975f5c5SAndroid Build Coastguard Worker const void *data)
2040*8975f5c5SAndroid Build Coastguard Worker {
2041*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().texture3DOES)
2042*8975f5c5SAndroid Build Coastguard Worker {
2043*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2044*8975f5c5SAndroid Build Coastguard Worker return false;
2045*8975f5c5SAndroid Build Coastguard Worker }
2046*8975f5c5SAndroid Build Coastguard Worker
2047*8975f5c5SAndroid Build Coastguard Worker if (!ValidTextureTarget(context, TextureTargetToType(target)))
2048*8975f5c5SAndroid Build Coastguard Worker {
2049*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
2050*8975f5c5SAndroid Build Coastguard Worker return false;
2051*8975f5c5SAndroid Build Coastguard Worker }
2052*8975f5c5SAndroid Build Coastguard Worker
2053*8975f5c5SAndroid Build Coastguard Worker // Validate image size
2054*8975f5c5SAndroid Build Coastguard Worker if (!ValidImageSizeParameters(context, entryPoint, TextureTargetToType(target), level, width,
2055*8975f5c5SAndroid Build Coastguard Worker height, depth, false))
2056*8975f5c5SAndroid Build Coastguard Worker {
2057*8975f5c5SAndroid Build Coastguard Worker // Error already generated.
2058*8975f5c5SAndroid Build Coastguard Worker return false;
2059*8975f5c5SAndroid Build Coastguard Worker }
2060*8975f5c5SAndroid Build Coastguard Worker
2061*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
2062*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.compressed)
2063*8975f5c5SAndroid Build Coastguard Worker {
2064*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidCompressedFormat);
2065*8975f5c5SAndroid Build Coastguard Worker return false;
2066*8975f5c5SAndroid Build Coastguard Worker }
2067*8975f5c5SAndroid Build Coastguard Worker
2068*8975f5c5SAndroid Build Coastguard Worker GLuint blockSize = 0;
2069*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.computeCompressedImageSize(Extents(width, height, depth), &blockSize))
2070*8975f5c5SAndroid Build Coastguard Worker {
2071*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIntegerOverflow);
2072*8975f5c5SAndroid Build Coastguard Worker return false;
2073*8975f5c5SAndroid Build Coastguard Worker }
2074*8975f5c5SAndroid Build Coastguard Worker
2075*8975f5c5SAndroid Build Coastguard Worker if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
2076*8975f5c5SAndroid Build Coastguard Worker {
2077*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidCompressedImageSize);
2078*8975f5c5SAndroid Build Coastguard Worker return false;
2079*8975f5c5SAndroid Build Coastguard Worker }
2080*8975f5c5SAndroid Build Coastguard Worker
2081*8975f5c5SAndroid Build Coastguard Worker // 3D texture target validation
2082*8975f5c5SAndroid Build Coastguard Worker if (target != TextureTarget::_3D && target != TextureTarget::_2DArray)
2083*8975f5c5SAndroid Build Coastguard Worker {
2084*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_2 || target != TextureTarget::CubeMapArray)
2085*8975f5c5SAndroid Build Coastguard Worker {
2086*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
2087*8975f5c5SAndroid Build Coastguard Worker return false;
2088*8975f5c5SAndroid Build Coastguard Worker }
2089*8975f5c5SAndroid Build Coastguard Worker }
2090*8975f5c5SAndroid Build Coastguard Worker
2091*8975f5c5SAndroid Build Coastguard Worker // validateES3TexImageFormat sets the error code if there is an error
2092*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexImage3DParameters(context, entryPoint, target, level, internalformat, true,
2093*8975f5c5SAndroid Build Coastguard Worker false, 0, 0, 0, width, height, depth, border, GL_NONE,
2094*8975f5c5SAndroid Build Coastguard Worker GL_NONE, -1, data))
2095*8975f5c5SAndroid Build Coastguard Worker {
2096*8975f5c5SAndroid Build Coastguard Worker return false;
2097*8975f5c5SAndroid Build Coastguard Worker }
2098*8975f5c5SAndroid Build Coastguard Worker
2099*8975f5c5SAndroid Build Coastguard Worker return true;
2100*8975f5c5SAndroid Build Coastguard Worker }
2101*8975f5c5SAndroid Build Coastguard Worker
ValidateCompressedTexImage3DRobustANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLsizei imageSize,GLsizei dataSize,const void * data)2102*8975f5c5SAndroid Build Coastguard Worker bool ValidateCompressedTexImage3DRobustANGLE(const Context *context,
2103*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2104*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2105*8975f5c5SAndroid Build Coastguard Worker GLint level,
2106*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
2107*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2108*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2109*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2110*8975f5c5SAndroid Build Coastguard Worker GLint border,
2111*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
2112*8975f5c5SAndroid Build Coastguard Worker GLsizei dataSize,
2113*8975f5c5SAndroid Build Coastguard Worker const void *data)
2114*8975f5c5SAndroid Build Coastguard Worker {
2115*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustCompressedTexImageBase(context, entryPoint, imageSize, dataSize))
2116*8975f5c5SAndroid Build Coastguard Worker {
2117*8975f5c5SAndroid Build Coastguard Worker return false;
2118*8975f5c5SAndroid Build Coastguard Worker }
2119*8975f5c5SAndroid Build Coastguard Worker
2120*8975f5c5SAndroid Build Coastguard Worker return ValidateCompressedTexImage3D(context, entryPoint, target, level, internalformat, width,
2121*8975f5c5SAndroid Build Coastguard Worker height, depth, border, imageSize, data);
2122*8975f5c5SAndroid Build Coastguard Worker }
2123*8975f5c5SAndroid Build Coastguard Worker
ValidateBindVertexArray(const Context * context,angle::EntryPoint entryPoint,VertexArrayID array)2124*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindVertexArray(const Context *context,
2125*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2126*8975f5c5SAndroid Build Coastguard Worker VertexArrayID array)
2127*8975f5c5SAndroid Build Coastguard Worker {
2128*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2129*8975f5c5SAndroid Build Coastguard Worker {
2130*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2131*8975f5c5SAndroid Build Coastguard Worker return false;
2132*8975f5c5SAndroid Build Coastguard Worker }
2133*8975f5c5SAndroid Build Coastguard Worker
2134*8975f5c5SAndroid Build Coastguard Worker return ValidateBindVertexArrayBase(context, entryPoint, array);
2135*8975f5c5SAndroid Build Coastguard Worker }
2136*8975f5c5SAndroid Build Coastguard Worker
ValidateIsVertexArray(const Context * context,angle::EntryPoint entryPoint,VertexArrayID array)2137*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsVertexArray(const Context *context,
2138*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2139*8975f5c5SAndroid Build Coastguard Worker VertexArrayID array)
2140*8975f5c5SAndroid Build Coastguard Worker {
2141*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2142*8975f5c5SAndroid Build Coastguard Worker {
2143*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2144*8975f5c5SAndroid Build Coastguard Worker return false;
2145*8975f5c5SAndroid Build Coastguard Worker }
2146*8975f5c5SAndroid Build Coastguard Worker
2147*8975f5c5SAndroid Build Coastguard Worker return true;
2148*8975f5c5SAndroid Build Coastguard Worker }
2149*8975f5c5SAndroid Build Coastguard Worker
ValidateBindBufferCommon(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLuint index,BufferID buffer,GLintptr offset,GLsizeiptr size)2150*8975f5c5SAndroid Build Coastguard Worker static bool ValidateBindBufferCommon(const Context *context,
2151*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2152*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
2153*8975f5c5SAndroid Build Coastguard Worker GLuint index,
2154*8975f5c5SAndroid Build Coastguard Worker BufferID buffer,
2155*8975f5c5SAndroid Build Coastguard Worker GLintptr offset,
2156*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr size)
2157*8975f5c5SAndroid Build Coastguard Worker {
2158*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2159*8975f5c5SAndroid Build Coastguard Worker {
2160*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2161*8975f5c5SAndroid Build Coastguard Worker return false;
2162*8975f5c5SAndroid Build Coastguard Worker }
2163*8975f5c5SAndroid Build Coastguard Worker
2164*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && offset < 0)
2165*8975f5c5SAndroid Build Coastguard Worker {
2166*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeOffset);
2167*8975f5c5SAndroid Build Coastguard Worker return false;
2168*8975f5c5SAndroid Build Coastguard Worker }
2169*8975f5c5SAndroid Build Coastguard Worker
2170*8975f5c5SAndroid Build Coastguard Worker if (!context->getState().isBindGeneratesResourceEnabled() &&
2171*8975f5c5SAndroid Build Coastguard Worker !context->isBufferGenerated(buffer))
2172*8975f5c5SAndroid Build Coastguard Worker {
2173*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kObjectNotGenerated);
2174*8975f5c5SAndroid Build Coastguard Worker return false;
2175*8975f5c5SAndroid Build Coastguard Worker }
2176*8975f5c5SAndroid Build Coastguard Worker
2177*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
2178*8975f5c5SAndroid Build Coastguard Worker switch (target)
2179*8975f5c5SAndroid Build Coastguard Worker {
2180*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::TransformFeedback:
2181*8975f5c5SAndroid Build Coastguard Worker {
2182*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxTransformFeedbackSeparateAttributes))
2183*8975f5c5SAndroid Build Coastguard Worker {
2184*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE,
2185*8975f5c5SAndroid Build Coastguard Worker kIndexExceedsTransformFeedbackBufferBindings);
2186*8975f5c5SAndroid Build Coastguard Worker return false;
2187*8975f5c5SAndroid Build Coastguard Worker }
2188*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && ((offset % 4) != 0 || (size % 4) != 0))
2189*8975f5c5SAndroid Build Coastguard Worker {
2190*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kOffsetAndSizeAlignment);
2191*8975f5c5SAndroid Build Coastguard Worker return false;
2192*8975f5c5SAndroid Build Coastguard Worker }
2193*8975f5c5SAndroid Build Coastguard Worker
2194*8975f5c5SAndroid Build Coastguard Worker if (context->getState().isTransformFeedbackActive())
2195*8975f5c5SAndroid Build Coastguard Worker {
2196*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackTargetActive);
2197*8975f5c5SAndroid Build Coastguard Worker return false;
2198*8975f5c5SAndroid Build Coastguard Worker }
2199*8975f5c5SAndroid Build Coastguard Worker break;
2200*8975f5c5SAndroid Build Coastguard Worker }
2201*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::Uniform:
2202*8975f5c5SAndroid Build Coastguard Worker {
2203*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxUniformBufferBindings))
2204*8975f5c5SAndroid Build Coastguard Worker {
2205*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxUniformBufferBindings);
2206*8975f5c5SAndroid Build Coastguard Worker return false;
2207*8975f5c5SAndroid Build Coastguard Worker }
2208*8975f5c5SAndroid Build Coastguard Worker
2209*8975f5c5SAndroid Build Coastguard Worker ASSERT(caps.uniformBufferOffsetAlignment);
2210*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && (offset % caps.uniformBufferOffsetAlignment) != 0)
2211*8975f5c5SAndroid Build Coastguard Worker {
2212*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kUniformBufferOffsetAlignment);
2213*8975f5c5SAndroid Build Coastguard Worker return false;
2214*8975f5c5SAndroid Build Coastguard Worker }
2215*8975f5c5SAndroid Build Coastguard Worker break;
2216*8975f5c5SAndroid Build Coastguard Worker }
2217*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::AtomicCounter:
2218*8975f5c5SAndroid Build Coastguard Worker {
2219*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_1)
2220*8975f5c5SAndroid Build Coastguard Worker {
2221*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kEnumRequiresGLES31);
2222*8975f5c5SAndroid Build Coastguard Worker return false;
2223*8975f5c5SAndroid Build Coastguard Worker }
2224*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxAtomicCounterBufferBindings))
2225*8975f5c5SAndroid Build Coastguard Worker {
2226*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE,
2227*8975f5c5SAndroid Build Coastguard Worker kIndexExceedsMaxAtomicCounterBufferBindings);
2228*8975f5c5SAndroid Build Coastguard Worker return false;
2229*8975f5c5SAndroid Build Coastguard Worker }
2230*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && (offset % 4) != 0)
2231*8975f5c5SAndroid Build Coastguard Worker {
2232*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kOffsetAlignment);
2233*8975f5c5SAndroid Build Coastguard Worker return false;
2234*8975f5c5SAndroid Build Coastguard Worker }
2235*8975f5c5SAndroid Build Coastguard Worker break;
2236*8975f5c5SAndroid Build Coastguard Worker }
2237*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::ShaderStorage:
2238*8975f5c5SAndroid Build Coastguard Worker {
2239*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_1)
2240*8975f5c5SAndroid Build Coastguard Worker {
2241*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kEnumRequiresGLES31);
2242*8975f5c5SAndroid Build Coastguard Worker return false;
2243*8975f5c5SAndroid Build Coastguard Worker }
2244*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxShaderStorageBufferBindings))
2245*8975f5c5SAndroid Build Coastguard Worker {
2246*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxShaderStorageBufferBindings);
2247*8975f5c5SAndroid Build Coastguard Worker return false;
2248*8975f5c5SAndroid Build Coastguard Worker }
2249*8975f5c5SAndroid Build Coastguard Worker ASSERT(caps.shaderStorageBufferOffsetAlignment);
2250*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && (offset % caps.shaderStorageBufferOffsetAlignment) != 0)
2251*8975f5c5SAndroid Build Coastguard Worker {
2252*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kShaderStorageBufferOffsetAlignment);
2253*8975f5c5SAndroid Build Coastguard Worker return false;
2254*8975f5c5SAndroid Build Coastguard Worker }
2255*8975f5c5SAndroid Build Coastguard Worker break;
2256*8975f5c5SAndroid Build Coastguard Worker }
2257*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::Texture:
2258*8975f5c5SAndroid Build Coastguard Worker {
2259*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().textureBufferAny())
2260*8975f5c5SAndroid Build Coastguard Worker {
2261*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kTextureBufferExtensionNotAvailable);
2262*8975f5c5SAndroid Build Coastguard Worker return false;
2263*8975f5c5SAndroid Build Coastguard Worker }
2264*8975f5c5SAndroid Build Coastguard Worker if (index != 0)
2265*8975f5c5SAndroid Build Coastguard Worker {
2266*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxUniformBufferBindings);
2267*8975f5c5SAndroid Build Coastguard Worker return false;
2268*8975f5c5SAndroid Build Coastguard Worker }
2269*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && (offset % caps.textureBufferOffsetAlignment) != 0)
2270*8975f5c5SAndroid Build Coastguard Worker {
2271*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTextureBufferOffsetAlignment);
2272*8975f5c5SAndroid Build Coastguard Worker return false;
2273*8975f5c5SAndroid Build Coastguard Worker }
2274*8975f5c5SAndroid Build Coastguard Worker break;
2275*8975f5c5SAndroid Build Coastguard Worker }
2276*8975f5c5SAndroid Build Coastguard Worker case BufferBinding::InvalidEnum:
2277*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kEnumInvalid);
2278*8975f5c5SAndroid Build Coastguard Worker return false;
2279*8975f5c5SAndroid Build Coastguard Worker default:
2280*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, ToGLenum(target));
2281*8975f5c5SAndroid Build Coastguard Worker return false;
2282*8975f5c5SAndroid Build Coastguard Worker }
2283*8975f5c5SAndroid Build Coastguard Worker
2284*8975f5c5SAndroid Build Coastguard Worker return true;
2285*8975f5c5SAndroid Build Coastguard Worker }
2286*8975f5c5SAndroid Build Coastguard Worker
ValidateBindBufferBase(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLuint index,BufferID buffer)2287*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindBufferBase(const Context *context,
2288*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2289*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
2290*8975f5c5SAndroid Build Coastguard Worker GLuint index,
2291*8975f5c5SAndroid Build Coastguard Worker BufferID buffer)
2292*8975f5c5SAndroid Build Coastguard Worker {
2293*8975f5c5SAndroid Build Coastguard Worker return ValidateBindBufferCommon(context, entryPoint, target, index, buffer, 0, 0);
2294*8975f5c5SAndroid Build Coastguard Worker }
2295*8975f5c5SAndroid Build Coastguard Worker
ValidateBindBufferRange(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLuint index,BufferID buffer,GLintptr offset,GLsizeiptr size)2296*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindBufferRange(const Context *context,
2297*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2298*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
2299*8975f5c5SAndroid Build Coastguard Worker GLuint index,
2300*8975f5c5SAndroid Build Coastguard Worker BufferID buffer,
2301*8975f5c5SAndroid Build Coastguard Worker GLintptr offset,
2302*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr size)
2303*8975f5c5SAndroid Build Coastguard Worker {
2304*8975f5c5SAndroid Build Coastguard Worker if (buffer.value != 0 && size <= 0)
2305*8975f5c5SAndroid Build Coastguard Worker {
2306*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBindBufferSize);
2307*8975f5c5SAndroid Build Coastguard Worker return false;
2308*8975f5c5SAndroid Build Coastguard Worker }
2309*8975f5c5SAndroid Build Coastguard Worker return ValidateBindBufferCommon(context, entryPoint, target, index, buffer, offset, size);
2310*8975f5c5SAndroid Build Coastguard Worker }
2311*8975f5c5SAndroid Build Coastguard Worker
ValidateProgramBinary(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLenum binaryFormat,const void * binary,GLsizei length)2312*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramBinary(const Context *context,
2313*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2314*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
2315*8975f5c5SAndroid Build Coastguard Worker GLenum binaryFormat,
2316*8975f5c5SAndroid Build Coastguard Worker const void *binary,
2317*8975f5c5SAndroid Build Coastguard Worker GLsizei length)
2318*8975f5c5SAndroid Build Coastguard Worker {
2319*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2320*8975f5c5SAndroid Build Coastguard Worker {
2321*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2322*8975f5c5SAndroid Build Coastguard Worker return false;
2323*8975f5c5SAndroid Build Coastguard Worker }
2324*8975f5c5SAndroid Build Coastguard Worker
2325*8975f5c5SAndroid Build Coastguard Worker return ValidateProgramBinaryBase(context, entryPoint, program, binaryFormat, binary, length);
2326*8975f5c5SAndroid Build Coastguard Worker }
2327*8975f5c5SAndroid Build Coastguard Worker
ValidateGetProgramBinary(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLsizei bufSize,const GLsizei * length,const GLenum * binaryFormat,const void * binary)2328*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetProgramBinary(const Context *context,
2329*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2330*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
2331*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
2332*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
2333*8975f5c5SAndroid Build Coastguard Worker const GLenum *binaryFormat,
2334*8975f5c5SAndroid Build Coastguard Worker const void *binary)
2335*8975f5c5SAndroid Build Coastguard Worker {
2336*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2337*8975f5c5SAndroid Build Coastguard Worker {
2338*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2339*8975f5c5SAndroid Build Coastguard Worker return false;
2340*8975f5c5SAndroid Build Coastguard Worker }
2341*8975f5c5SAndroid Build Coastguard Worker
2342*8975f5c5SAndroid Build Coastguard Worker return ValidateGetProgramBinaryBase(context, entryPoint, program, bufSize, length, binaryFormat,
2343*8975f5c5SAndroid Build Coastguard Worker binary);
2344*8975f5c5SAndroid Build Coastguard Worker }
2345*8975f5c5SAndroid Build Coastguard Worker
ValidateProgramParameteriBase(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLenum pname,GLint value)2346*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramParameteriBase(const Context *context,
2347*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2348*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
2349*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
2350*8975f5c5SAndroid Build Coastguard Worker GLint value)
2351*8975f5c5SAndroid Build Coastguard Worker {
2352*8975f5c5SAndroid Build Coastguard Worker if (GetValidProgram(context, entryPoint, program) == nullptr)
2353*8975f5c5SAndroid Build Coastguard Worker {
2354*8975f5c5SAndroid Build Coastguard Worker return false;
2355*8975f5c5SAndroid Build Coastguard Worker }
2356*8975f5c5SAndroid Build Coastguard Worker
2357*8975f5c5SAndroid Build Coastguard Worker switch (pname)
2358*8975f5c5SAndroid Build Coastguard Worker {
2359*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
2360*8975f5c5SAndroid Build Coastguard Worker if (value != GL_FALSE && value != GL_TRUE)
2361*8975f5c5SAndroid Build Coastguard Worker {
2362*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBooleanValue);
2363*8975f5c5SAndroid Build Coastguard Worker return false;
2364*8975f5c5SAndroid Build Coastguard Worker }
2365*8975f5c5SAndroid Build Coastguard Worker break;
2366*8975f5c5SAndroid Build Coastguard Worker
2367*8975f5c5SAndroid Build Coastguard Worker case GL_PROGRAM_SEPARABLE:
2368*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_1)
2369*8975f5c5SAndroid Build Coastguard Worker {
2370*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kES31Required);
2371*8975f5c5SAndroid Build Coastguard Worker return false;
2372*8975f5c5SAndroid Build Coastguard Worker }
2373*8975f5c5SAndroid Build Coastguard Worker
2374*8975f5c5SAndroid Build Coastguard Worker if (value != GL_FALSE && value != GL_TRUE)
2375*8975f5c5SAndroid Build Coastguard Worker {
2376*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBooleanValue);
2377*8975f5c5SAndroid Build Coastguard Worker return false;
2378*8975f5c5SAndroid Build Coastguard Worker }
2379*8975f5c5SAndroid Build Coastguard Worker break;
2380*8975f5c5SAndroid Build Coastguard Worker
2381*8975f5c5SAndroid Build Coastguard Worker default:
2382*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
2383*8975f5c5SAndroid Build Coastguard Worker return false;
2384*8975f5c5SAndroid Build Coastguard Worker }
2385*8975f5c5SAndroid Build Coastguard Worker
2386*8975f5c5SAndroid Build Coastguard Worker return true;
2387*8975f5c5SAndroid Build Coastguard Worker }
2388*8975f5c5SAndroid Build Coastguard Worker
ValidateProgramParameteri(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLenum pname,GLint value)2389*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramParameteri(const Context *context,
2390*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2391*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
2392*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
2393*8975f5c5SAndroid Build Coastguard Worker GLint value)
2394*8975f5c5SAndroid Build Coastguard Worker {
2395*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2396*8975f5c5SAndroid Build Coastguard Worker {
2397*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2398*8975f5c5SAndroid Build Coastguard Worker return false;
2399*8975f5c5SAndroid Build Coastguard Worker }
2400*8975f5c5SAndroid Build Coastguard Worker
2401*8975f5c5SAndroid Build Coastguard Worker return ValidateProgramParameteriBase(context, entryPoint, program, pname, value);
2402*8975f5c5SAndroid Build Coastguard Worker }
2403*8975f5c5SAndroid Build Coastguard Worker
ValidateBlitFramebuffer(const Context * context,angle::EntryPoint entryPoint,GLint srcX0,GLint srcY0,GLint srcX1,GLint srcY1,GLint dstX0,GLint dstY0,GLint dstX1,GLint dstY1,GLbitfield mask,GLenum filter)2404*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlitFramebuffer(const Context *context,
2405*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2406*8975f5c5SAndroid Build Coastguard Worker GLint srcX0,
2407*8975f5c5SAndroid Build Coastguard Worker GLint srcY0,
2408*8975f5c5SAndroid Build Coastguard Worker GLint srcX1,
2409*8975f5c5SAndroid Build Coastguard Worker GLint srcY1,
2410*8975f5c5SAndroid Build Coastguard Worker GLint dstX0,
2411*8975f5c5SAndroid Build Coastguard Worker GLint dstY0,
2412*8975f5c5SAndroid Build Coastguard Worker GLint dstX1,
2413*8975f5c5SAndroid Build Coastguard Worker GLint dstY1,
2414*8975f5c5SAndroid Build Coastguard Worker GLbitfield mask,
2415*8975f5c5SAndroid Build Coastguard Worker GLenum filter)
2416*8975f5c5SAndroid Build Coastguard Worker {
2417*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3 && !context->getExtensions().framebufferBlitNV)
2418*8975f5c5SAndroid Build Coastguard Worker {
2419*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2420*8975f5c5SAndroid Build Coastguard Worker return false;
2421*8975f5c5SAndroid Build Coastguard Worker }
2422*8975f5c5SAndroid Build Coastguard Worker
2423*8975f5c5SAndroid Build Coastguard Worker return ValidateBlitFramebufferParameters(context, entryPoint, srcX0, srcY0, srcX1, srcY1, dstX0,
2424*8975f5c5SAndroid Build Coastguard Worker dstY0, dstX1, dstY1, mask, filter);
2425*8975f5c5SAndroid Build Coastguard Worker }
2426*8975f5c5SAndroid Build Coastguard Worker
ValidateClearBufferiv(const Context * context,angle::EntryPoint entryPoint,GLenum buffer,GLint drawbuffer,const GLint * value)2427*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearBufferiv(const Context *context,
2428*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2429*8975f5c5SAndroid Build Coastguard Worker GLenum buffer,
2430*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer,
2431*8975f5c5SAndroid Build Coastguard Worker const GLint *value)
2432*8975f5c5SAndroid Build Coastguard Worker {
2433*8975f5c5SAndroid Build Coastguard Worker switch (buffer)
2434*8975f5c5SAndroid Build Coastguard Worker {
2435*8975f5c5SAndroid Build Coastguard Worker case GL_COLOR:
2436*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer < 0 || drawbuffer >= context->getCaps().maxDrawBuffers)
2437*8975f5c5SAndroid Build Coastguard Worker {
2438*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxDrawBuffer);
2439*8975f5c5SAndroid Build Coastguard Worker return false;
2440*8975f5c5SAndroid Build Coastguard Worker }
2441*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(drawbuffer) >=
2442*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawbufferStateCount())
2443*8975f5c5SAndroid Build Coastguard Worker {
2444*8975f5c5SAndroid Build Coastguard Worker // Clearing a non-existent draw buffer is a no-op.
2445*8975f5c5SAndroid Build Coastguard Worker break;
2446*8975f5c5SAndroid Build Coastguard Worker }
2447*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
2448*8975f5c5SAndroid Build Coastguard Worker {
2449*8975f5c5SAndroid Build Coastguard Worker const gl::ComponentTypeMask mask =
2450*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawBufferTypeMask();
2451*8975f5c5SAndroid Build Coastguard Worker if (IsComponentTypeFloatOrUnsignedInt(mask, drawbuffer))
2452*8975f5c5SAndroid Build Coastguard Worker {
2453*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNoDefinedClearConversion);
2454*8975f5c5SAndroid Build Coastguard Worker return false;
2455*8975f5c5SAndroid Build Coastguard Worker }
2456*8975f5c5SAndroid Build Coastguard Worker }
2457*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().renderSharedExponentQCOM)
2458*8975f5c5SAndroid Build Coastguard Worker {
2459*8975f5c5SAndroid Build Coastguard Worker if (!ValidateColorMaskForSharedExponentColorBuffer(context, entryPoint, drawbuffer))
2460*8975f5c5SAndroid Build Coastguard Worker {
2461*8975f5c5SAndroid Build Coastguard Worker return false;
2462*8975f5c5SAndroid Build Coastguard Worker }
2463*8975f5c5SAndroid Build Coastguard Worker }
2464*8975f5c5SAndroid Build Coastguard Worker break;
2465*8975f5c5SAndroid Build Coastguard Worker
2466*8975f5c5SAndroid Build Coastguard Worker case GL_STENCIL:
2467*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer != 0)
2468*8975f5c5SAndroid Build Coastguard Worker {
2469*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDepthStencilDrawBuffer);
2470*8975f5c5SAndroid Build Coastguard Worker return false;
2471*8975f5c5SAndroid Build Coastguard Worker }
2472*8975f5c5SAndroid Build Coastguard Worker break;
2473*8975f5c5SAndroid Build Coastguard Worker
2474*8975f5c5SAndroid Build Coastguard Worker default:
2475*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, buffer);
2476*8975f5c5SAndroid Build Coastguard Worker return false;
2477*8975f5c5SAndroid Build Coastguard Worker }
2478*8975f5c5SAndroid Build Coastguard Worker
2479*8975f5c5SAndroid Build Coastguard Worker return ValidateClearBuffer(context, entryPoint);
2480*8975f5c5SAndroid Build Coastguard Worker }
2481*8975f5c5SAndroid Build Coastguard Worker
ValidateClearBufferuiv(const Context * context,angle::EntryPoint entryPoint,GLenum buffer,GLint drawbuffer,const GLuint * value)2482*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearBufferuiv(const Context *context,
2483*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2484*8975f5c5SAndroid Build Coastguard Worker GLenum buffer,
2485*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer,
2486*8975f5c5SAndroid Build Coastguard Worker const GLuint *value)
2487*8975f5c5SAndroid Build Coastguard Worker {
2488*8975f5c5SAndroid Build Coastguard Worker switch (buffer)
2489*8975f5c5SAndroid Build Coastguard Worker {
2490*8975f5c5SAndroid Build Coastguard Worker case GL_COLOR:
2491*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer < 0 || drawbuffer >= context->getCaps().maxDrawBuffers)
2492*8975f5c5SAndroid Build Coastguard Worker {
2493*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxDrawBuffer);
2494*8975f5c5SAndroid Build Coastguard Worker return false;
2495*8975f5c5SAndroid Build Coastguard Worker }
2496*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(drawbuffer) >=
2497*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawbufferStateCount())
2498*8975f5c5SAndroid Build Coastguard Worker {
2499*8975f5c5SAndroid Build Coastguard Worker // Clearing a non-existent draw buffer is a no-op.
2500*8975f5c5SAndroid Build Coastguard Worker break;
2501*8975f5c5SAndroid Build Coastguard Worker }
2502*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
2503*8975f5c5SAndroid Build Coastguard Worker {
2504*8975f5c5SAndroid Build Coastguard Worker const gl::ComponentTypeMask mask =
2505*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawBufferTypeMask();
2506*8975f5c5SAndroid Build Coastguard Worker if (IsComponentTypeFloatOrInt(mask, drawbuffer))
2507*8975f5c5SAndroid Build Coastguard Worker {
2508*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNoDefinedClearConversion);
2509*8975f5c5SAndroid Build Coastguard Worker return false;
2510*8975f5c5SAndroid Build Coastguard Worker }
2511*8975f5c5SAndroid Build Coastguard Worker }
2512*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().renderSharedExponentQCOM)
2513*8975f5c5SAndroid Build Coastguard Worker {
2514*8975f5c5SAndroid Build Coastguard Worker if (!ValidateColorMaskForSharedExponentColorBuffer(context, entryPoint, drawbuffer))
2515*8975f5c5SAndroid Build Coastguard Worker {
2516*8975f5c5SAndroid Build Coastguard Worker return false;
2517*8975f5c5SAndroid Build Coastguard Worker }
2518*8975f5c5SAndroid Build Coastguard Worker }
2519*8975f5c5SAndroid Build Coastguard Worker break;
2520*8975f5c5SAndroid Build Coastguard Worker
2521*8975f5c5SAndroid Build Coastguard Worker default:
2522*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, buffer);
2523*8975f5c5SAndroid Build Coastguard Worker return false;
2524*8975f5c5SAndroid Build Coastguard Worker }
2525*8975f5c5SAndroid Build Coastguard Worker
2526*8975f5c5SAndroid Build Coastguard Worker return ValidateClearBuffer(context, entryPoint);
2527*8975f5c5SAndroid Build Coastguard Worker }
2528*8975f5c5SAndroid Build Coastguard Worker
ValidateClearBufferfv(const Context * context,angle::EntryPoint entryPoint,GLenum buffer,GLint drawbuffer,const GLfloat * value)2529*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearBufferfv(const Context *context,
2530*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2531*8975f5c5SAndroid Build Coastguard Worker GLenum buffer,
2532*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer,
2533*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
2534*8975f5c5SAndroid Build Coastguard Worker {
2535*8975f5c5SAndroid Build Coastguard Worker switch (buffer)
2536*8975f5c5SAndroid Build Coastguard Worker {
2537*8975f5c5SAndroid Build Coastguard Worker case GL_COLOR:
2538*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer < 0 || drawbuffer >= context->getCaps().maxDrawBuffers)
2539*8975f5c5SAndroid Build Coastguard Worker {
2540*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxDrawBuffer);
2541*8975f5c5SAndroid Build Coastguard Worker return false;
2542*8975f5c5SAndroid Build Coastguard Worker }
2543*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(drawbuffer) >=
2544*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawbufferStateCount())
2545*8975f5c5SAndroid Build Coastguard Worker {
2546*8975f5c5SAndroid Build Coastguard Worker // Clearing a non-existent draw buffer is a no-op.
2547*8975f5c5SAndroid Build Coastguard Worker break;
2548*8975f5c5SAndroid Build Coastguard Worker }
2549*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
2550*8975f5c5SAndroid Build Coastguard Worker {
2551*8975f5c5SAndroid Build Coastguard Worker const gl::ComponentTypeMask mask =
2552*8975f5c5SAndroid Build Coastguard Worker context->getState().getDrawFramebuffer()->getDrawBufferTypeMask();
2553*8975f5c5SAndroid Build Coastguard Worker if (IsComponentTypeIntOrUnsignedInt(mask, drawbuffer))
2554*8975f5c5SAndroid Build Coastguard Worker {
2555*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNoDefinedClearConversion);
2556*8975f5c5SAndroid Build Coastguard Worker return false;
2557*8975f5c5SAndroid Build Coastguard Worker }
2558*8975f5c5SAndroid Build Coastguard Worker }
2559*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().renderSharedExponentQCOM)
2560*8975f5c5SAndroid Build Coastguard Worker {
2561*8975f5c5SAndroid Build Coastguard Worker if (!ValidateColorMaskForSharedExponentColorBuffer(context, entryPoint, drawbuffer))
2562*8975f5c5SAndroid Build Coastguard Worker {
2563*8975f5c5SAndroid Build Coastguard Worker return false;
2564*8975f5c5SAndroid Build Coastguard Worker }
2565*8975f5c5SAndroid Build Coastguard Worker }
2566*8975f5c5SAndroid Build Coastguard Worker break;
2567*8975f5c5SAndroid Build Coastguard Worker
2568*8975f5c5SAndroid Build Coastguard Worker case GL_DEPTH:
2569*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer != 0)
2570*8975f5c5SAndroid Build Coastguard Worker {
2571*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDepthStencilDrawBuffer);
2572*8975f5c5SAndroid Build Coastguard Worker return false;
2573*8975f5c5SAndroid Build Coastguard Worker }
2574*8975f5c5SAndroid Build Coastguard Worker break;
2575*8975f5c5SAndroid Build Coastguard Worker
2576*8975f5c5SAndroid Build Coastguard Worker default:
2577*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, buffer);
2578*8975f5c5SAndroid Build Coastguard Worker return false;
2579*8975f5c5SAndroid Build Coastguard Worker }
2580*8975f5c5SAndroid Build Coastguard Worker
2581*8975f5c5SAndroid Build Coastguard Worker return ValidateClearBuffer(context, entryPoint);
2582*8975f5c5SAndroid Build Coastguard Worker }
2583*8975f5c5SAndroid Build Coastguard Worker
ValidateClearBufferfi(const Context * context,angle::EntryPoint entryPoint,GLenum buffer,GLint drawbuffer,GLfloat depth,GLint stencil)2584*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearBufferfi(const Context *context,
2585*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2586*8975f5c5SAndroid Build Coastguard Worker GLenum buffer,
2587*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer,
2588*8975f5c5SAndroid Build Coastguard Worker GLfloat depth,
2589*8975f5c5SAndroid Build Coastguard Worker GLint stencil)
2590*8975f5c5SAndroid Build Coastguard Worker {
2591*8975f5c5SAndroid Build Coastguard Worker switch (buffer)
2592*8975f5c5SAndroid Build Coastguard Worker {
2593*8975f5c5SAndroid Build Coastguard Worker case GL_DEPTH_STENCIL:
2594*8975f5c5SAndroid Build Coastguard Worker if (drawbuffer != 0)
2595*8975f5c5SAndroid Build Coastguard Worker {
2596*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDepthStencilDrawBuffer);
2597*8975f5c5SAndroid Build Coastguard Worker return false;
2598*8975f5c5SAndroid Build Coastguard Worker }
2599*8975f5c5SAndroid Build Coastguard Worker break;
2600*8975f5c5SAndroid Build Coastguard Worker
2601*8975f5c5SAndroid Build Coastguard Worker default:
2602*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, buffer);
2603*8975f5c5SAndroid Build Coastguard Worker return false;
2604*8975f5c5SAndroid Build Coastguard Worker }
2605*8975f5c5SAndroid Build Coastguard Worker
2606*8975f5c5SAndroid Build Coastguard Worker return ValidateClearBuffer(context, entryPoint);
2607*8975f5c5SAndroid Build Coastguard Worker }
2608*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawBuffers(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const GLenum * bufs)2609*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawBuffers(const Context *context,
2610*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2611*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
2612*8975f5c5SAndroid Build Coastguard Worker const GLenum *bufs)
2613*8975f5c5SAndroid Build Coastguard Worker {
2614*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2615*8975f5c5SAndroid Build Coastguard Worker {
2616*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2617*8975f5c5SAndroid Build Coastguard Worker return false;
2618*8975f5c5SAndroid Build Coastguard Worker }
2619*8975f5c5SAndroid Build Coastguard Worker
2620*8975f5c5SAndroid Build Coastguard Worker return ValidateDrawBuffersBase(context, entryPoint, n, bufs);
2621*8975f5c5SAndroid Build Coastguard Worker }
2622*8975f5c5SAndroid Build Coastguard Worker
ValidateCopyTexSubImage3D(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLint x,GLint y,GLsizei width,GLsizei height)2623*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyTexSubImage3D(const Context *context,
2624*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2625*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2626*8975f5c5SAndroid Build Coastguard Worker GLint level,
2627*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2628*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2629*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2630*8975f5c5SAndroid Build Coastguard Worker GLint x,
2631*8975f5c5SAndroid Build Coastguard Worker GLint y,
2632*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2633*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
2634*8975f5c5SAndroid Build Coastguard Worker {
2635*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().texture3DOES)
2636*8975f5c5SAndroid Build Coastguard Worker {
2637*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2638*8975f5c5SAndroid Build Coastguard Worker return false;
2639*8975f5c5SAndroid Build Coastguard Worker }
2640*8975f5c5SAndroid Build Coastguard Worker
2641*8975f5c5SAndroid Build Coastguard Worker return ValidateES3CopyTexImage3DParameters(context, entryPoint, target, level, GL_NONE, true,
2642*8975f5c5SAndroid Build Coastguard Worker xoffset, yoffset, zoffset, x, y, width, height, 0);
2643*8975f5c5SAndroid Build Coastguard Worker }
2644*8975f5c5SAndroid Build Coastguard Worker
ValidateCopyTexture3DANGLE(const Context * context,angle::EntryPoint entryPoint,TextureID sourceId,GLint sourceLevel,TextureTarget destTarget,TextureID destId,GLint destLevel,GLint internalFormat,GLenum destType,GLboolean unpackFlipY,GLboolean unpackPremultiplyAlpha,GLboolean unpackUnmultiplyAlpha)2645*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyTexture3DANGLE(const Context *context,
2646*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2647*8975f5c5SAndroid Build Coastguard Worker TextureID sourceId,
2648*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel,
2649*8975f5c5SAndroid Build Coastguard Worker TextureTarget destTarget,
2650*8975f5c5SAndroid Build Coastguard Worker TextureID destId,
2651*8975f5c5SAndroid Build Coastguard Worker GLint destLevel,
2652*8975f5c5SAndroid Build Coastguard Worker GLint internalFormat,
2653*8975f5c5SAndroid Build Coastguard Worker GLenum destType,
2654*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackFlipY,
2655*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackPremultiplyAlpha,
2656*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackUnmultiplyAlpha)
2657*8975f5c5SAndroid Build Coastguard Worker {
2658*8975f5c5SAndroid Build Coastguard Worker const Texture *source = context->getTexture(sourceId);
2659*8975f5c5SAndroid Build Coastguard Worker if (source == nullptr)
2660*8975f5c5SAndroid Build Coastguard Worker {
2661*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidSourceTexture);
2662*8975f5c5SAndroid Build Coastguard Worker return false;
2663*8975f5c5SAndroid Build Coastguard Worker }
2664*8975f5c5SAndroid Build Coastguard Worker
2665*8975f5c5SAndroid Build Coastguard Worker TextureType sourceType = source->getType();
2666*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceType != TextureType::CubeMap);
2667*8975f5c5SAndroid Build Coastguard Worker TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
2668*8975f5c5SAndroid Build Coastguard Worker const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
2669*8975f5c5SAndroid Build Coastguard Worker
2670*8975f5c5SAndroid Build Coastguard Worker const Texture *dest = context->getTexture(destId);
2671*8975f5c5SAndroid Build Coastguard Worker if (dest == nullptr)
2672*8975f5c5SAndroid Build Coastguard Worker {
2673*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDestinationTexture);
2674*8975f5c5SAndroid Build Coastguard Worker return false;
2675*8975f5c5SAndroid Build Coastguard Worker }
2676*8975f5c5SAndroid Build Coastguard Worker
2677*8975f5c5SAndroid Build Coastguard Worker if (!ValidateCopyTexture3DCommon(context, entryPoint, source, sourceLevel,
2678*8975f5c5SAndroid Build Coastguard Worker sourceFormat.info->internalFormat, dest, destLevel,
2679*8975f5c5SAndroid Build Coastguard Worker internalFormat, destTarget))
2680*8975f5c5SAndroid Build Coastguard Worker {
2681*8975f5c5SAndroid Build Coastguard Worker return false;
2682*8975f5c5SAndroid Build Coastguard Worker }
2683*8975f5c5SAndroid Build Coastguard Worker
2684*8975f5c5SAndroid Build Coastguard Worker if (!ValidMipLevel(context, source->getType(), sourceLevel))
2685*8975f5c5SAndroid Build Coastguard Worker {
2686*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidSourceTextureLevel);
2687*8975f5c5SAndroid Build Coastguard Worker return false;
2688*8975f5c5SAndroid Build Coastguard Worker }
2689*8975f5c5SAndroid Build Coastguard Worker
2690*8975f5c5SAndroid Build Coastguard Worker GLsizei sourceWidth = static_cast<GLsizei>(source->getWidth(sourceTarget, sourceLevel));
2691*8975f5c5SAndroid Build Coastguard Worker GLsizei sourceHeight = static_cast<GLsizei>(source->getHeight(sourceTarget, sourceLevel));
2692*8975f5c5SAndroid Build Coastguard Worker if (sourceWidth == 0 || sourceHeight == 0)
2693*8975f5c5SAndroid Build Coastguard Worker {
2694*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidSourceTextureSize);
2695*8975f5c5SAndroid Build Coastguard Worker return false;
2696*8975f5c5SAndroid Build Coastguard Worker }
2697*8975f5c5SAndroid Build Coastguard Worker
2698*8975f5c5SAndroid Build Coastguard Worker if (dest->getImmutableFormat())
2699*8975f5c5SAndroid Build Coastguard Worker {
2700*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationImmutable);
2701*8975f5c5SAndroid Build Coastguard Worker return false;
2702*8975f5c5SAndroid Build Coastguard Worker }
2703*8975f5c5SAndroid Build Coastguard Worker
2704*8975f5c5SAndroid Build Coastguard Worker return true;
2705*8975f5c5SAndroid Build Coastguard Worker }
2706*8975f5c5SAndroid Build Coastguard Worker
ValidateCopySubTexture3DANGLE(const Context * context,angle::EntryPoint entryPoint,TextureID sourceId,GLint sourceLevel,TextureTarget destTarget,TextureID destId,GLint destLevel,GLint xoffset,GLint yoffset,GLint zoffset,GLint x,GLint y,GLint z,GLsizei width,GLsizei height,GLsizei depth,GLboolean unpackFlipY,GLboolean unpackPremultiplyAlpha,GLboolean unpackUnmultiplyAlpha)2707*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopySubTexture3DANGLE(const Context *context,
2708*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2709*8975f5c5SAndroid Build Coastguard Worker TextureID sourceId,
2710*8975f5c5SAndroid Build Coastguard Worker GLint sourceLevel,
2711*8975f5c5SAndroid Build Coastguard Worker TextureTarget destTarget,
2712*8975f5c5SAndroid Build Coastguard Worker TextureID destId,
2713*8975f5c5SAndroid Build Coastguard Worker GLint destLevel,
2714*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2715*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2716*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2717*8975f5c5SAndroid Build Coastguard Worker GLint x,
2718*8975f5c5SAndroid Build Coastguard Worker GLint y,
2719*8975f5c5SAndroid Build Coastguard Worker GLint z,
2720*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2721*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2722*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2723*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackFlipY,
2724*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackPremultiplyAlpha,
2725*8975f5c5SAndroid Build Coastguard Worker GLboolean unpackUnmultiplyAlpha)
2726*8975f5c5SAndroid Build Coastguard Worker {
2727*8975f5c5SAndroid Build Coastguard Worker const Texture *source = context->getTexture(sourceId);
2728*8975f5c5SAndroid Build Coastguard Worker if (source == nullptr)
2729*8975f5c5SAndroid Build Coastguard Worker {
2730*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidSourceTexture);
2731*8975f5c5SAndroid Build Coastguard Worker return false;
2732*8975f5c5SAndroid Build Coastguard Worker }
2733*8975f5c5SAndroid Build Coastguard Worker
2734*8975f5c5SAndroid Build Coastguard Worker TextureType sourceType = source->getType();
2735*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceType != TextureType::CubeMap);
2736*8975f5c5SAndroid Build Coastguard Worker TextureTarget sourceTarget = NonCubeTextureTypeToTarget(sourceType);
2737*8975f5c5SAndroid Build Coastguard Worker const Format &sourceFormat = source->getFormat(sourceTarget, sourceLevel);
2738*8975f5c5SAndroid Build Coastguard Worker
2739*8975f5c5SAndroid Build Coastguard Worker const Texture *dest = context->getTexture(destId);
2740*8975f5c5SAndroid Build Coastguard Worker if (dest == nullptr)
2741*8975f5c5SAndroid Build Coastguard Worker {
2742*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDestinationTexture);
2743*8975f5c5SAndroid Build Coastguard Worker return false;
2744*8975f5c5SAndroid Build Coastguard Worker }
2745*8975f5c5SAndroid Build Coastguard Worker
2746*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &destFormat = *dest->getFormat(destTarget, destLevel).info;
2747*8975f5c5SAndroid Build Coastguard Worker
2748*8975f5c5SAndroid Build Coastguard Worker if (!ValidateCopyTexture3DCommon(context, entryPoint, source, sourceLevel,
2749*8975f5c5SAndroid Build Coastguard Worker sourceFormat.info->internalFormat, dest, destLevel,
2750*8975f5c5SAndroid Build Coastguard Worker destFormat.internalFormat, destTarget))
2751*8975f5c5SAndroid Build Coastguard Worker {
2752*8975f5c5SAndroid Build Coastguard Worker return false;
2753*8975f5c5SAndroid Build Coastguard Worker }
2754*8975f5c5SAndroid Build Coastguard Worker
2755*8975f5c5SAndroid Build Coastguard Worker if (x < 0 || y < 0 || z < 0)
2756*8975f5c5SAndroid Build Coastguard Worker {
2757*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeXYZ);
2758*8975f5c5SAndroid Build Coastguard Worker return false;
2759*8975f5c5SAndroid Build Coastguard Worker }
2760*8975f5c5SAndroid Build Coastguard Worker
2761*8975f5c5SAndroid Build Coastguard Worker if (width < 0 || height < 0 || depth < 0)
2762*8975f5c5SAndroid Build Coastguard Worker {
2763*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeHeightWidthDepth);
2764*8975f5c5SAndroid Build Coastguard Worker return false;
2765*8975f5c5SAndroid Build Coastguard Worker }
2766*8975f5c5SAndroid Build Coastguard Worker
2767*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(x + width) > source->getWidth(sourceTarget, sourceLevel) ||
2768*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(y + height) > source->getHeight(sourceTarget, sourceLevel) ||
2769*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(z + depth) > source->getDepth(sourceTarget, sourceLevel))
2770*8975f5c5SAndroid Build Coastguard Worker {
2771*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kSourceTextureTooSmall);
2772*8975f5c5SAndroid Build Coastguard Worker return false;
2773*8975f5c5SAndroid Build Coastguard Worker }
2774*8975f5c5SAndroid Build Coastguard Worker
2775*8975f5c5SAndroid Build Coastguard Worker if (TextureTargetToType(destTarget) != dest->getType())
2776*8975f5c5SAndroid Build Coastguard Worker {
2777*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidDestinationTextureType);
2778*8975f5c5SAndroid Build Coastguard Worker return false;
2779*8975f5c5SAndroid Build Coastguard Worker }
2780*8975f5c5SAndroid Build Coastguard Worker
2781*8975f5c5SAndroid Build Coastguard Worker if (xoffset < 0 || yoffset < 0 || zoffset < 0)
2782*8975f5c5SAndroid Build Coastguard Worker {
2783*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeOffset);
2784*8975f5c5SAndroid Build Coastguard Worker return false;
2785*8975f5c5SAndroid Build Coastguard Worker }
2786*8975f5c5SAndroid Build Coastguard Worker
2787*8975f5c5SAndroid Build Coastguard Worker if (static_cast<size_t>(xoffset + width) > dest->getWidth(destTarget, destLevel) ||
2788*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(yoffset + height) > dest->getHeight(destTarget, destLevel) ||
2789*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(zoffset + depth) > dest->getDepth(destTarget, destLevel))
2790*8975f5c5SAndroid Build Coastguard Worker {
2791*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kDestinationTextureTooSmall);
2792*8975f5c5SAndroid Build Coastguard Worker return false;
2793*8975f5c5SAndroid Build Coastguard Worker }
2794*8975f5c5SAndroid Build Coastguard Worker
2795*8975f5c5SAndroid Build Coastguard Worker return true;
2796*8975f5c5SAndroid Build Coastguard Worker }
2797*8975f5c5SAndroid Build Coastguard Worker
ValidateTexImage3D(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,const void * pixels)2798*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexImage3D(const Context *context,
2799*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2800*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2801*8975f5c5SAndroid Build Coastguard Worker GLint level,
2802*8975f5c5SAndroid Build Coastguard Worker GLint internalformat,
2803*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2804*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2805*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2806*8975f5c5SAndroid Build Coastguard Worker GLint border,
2807*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2808*8975f5c5SAndroid Build Coastguard Worker GLenum type,
2809*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
2810*8975f5c5SAndroid Build Coastguard Worker {
2811*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().texture3DOES)
2812*8975f5c5SAndroid Build Coastguard Worker {
2813*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2814*8975f5c5SAndroid Build Coastguard Worker return false;
2815*8975f5c5SAndroid Build Coastguard Worker }
2816*8975f5c5SAndroid Build Coastguard Worker
2817*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImage3DParameters(context, entryPoint, target, level, internalformat,
2818*8975f5c5SAndroid Build Coastguard Worker false, false, 0, 0, 0, width, height, depth, border,
2819*8975f5c5SAndroid Build Coastguard Worker format, type, -1, pixels);
2820*8975f5c5SAndroid Build Coastguard Worker }
2821*8975f5c5SAndroid Build Coastguard Worker
ValidateTexImage3DRobustANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,GLsizei bufSize,const void * pixels)2822*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexImage3DRobustANGLE(const Context *context,
2823*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2824*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2825*8975f5c5SAndroid Build Coastguard Worker GLint level,
2826*8975f5c5SAndroid Build Coastguard Worker GLint internalformat,
2827*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2828*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2829*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2830*8975f5c5SAndroid Build Coastguard Worker GLint border,
2831*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2832*8975f5c5SAndroid Build Coastguard Worker GLenum type,
2833*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
2834*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
2835*8975f5c5SAndroid Build Coastguard Worker {
2836*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2837*8975f5c5SAndroid Build Coastguard Worker {
2838*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2839*8975f5c5SAndroid Build Coastguard Worker return false;
2840*8975f5c5SAndroid Build Coastguard Worker }
2841*8975f5c5SAndroid Build Coastguard Worker
2842*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustEntryPoint(context, entryPoint, bufSize))
2843*8975f5c5SAndroid Build Coastguard Worker {
2844*8975f5c5SAndroid Build Coastguard Worker return false;
2845*8975f5c5SAndroid Build Coastguard Worker }
2846*8975f5c5SAndroid Build Coastguard Worker
2847*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImage3DParameters(context, entryPoint, target, level, internalformat,
2848*8975f5c5SAndroid Build Coastguard Worker false, false, 0, 0, 0, width, height, depth, border,
2849*8975f5c5SAndroid Build Coastguard Worker format, type, bufSize, pixels);
2850*8975f5c5SAndroid Build Coastguard Worker }
2851*8975f5c5SAndroid Build Coastguard Worker
ValidateTexSubImage3D(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,const void * pixels)2852*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexSubImage3D(const Context *context,
2853*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2854*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2855*8975f5c5SAndroid Build Coastguard Worker GLint level,
2856*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2857*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2858*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2859*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2860*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2861*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2862*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2863*8975f5c5SAndroid Build Coastguard Worker GLenum type,
2864*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
2865*8975f5c5SAndroid Build Coastguard Worker {
2866*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().texture3DOES)
2867*8975f5c5SAndroid Build Coastguard Worker {
2868*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2869*8975f5c5SAndroid Build Coastguard Worker return false;
2870*8975f5c5SAndroid Build Coastguard Worker }
2871*8975f5c5SAndroid Build Coastguard Worker
2872*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImage3DParameters(context, entryPoint, target, level, GL_NONE, false, true,
2873*8975f5c5SAndroid Build Coastguard Worker xoffset, yoffset, zoffset, width, height, depth, 0,
2874*8975f5c5SAndroid Build Coastguard Worker format, type, -1, pixels);
2875*8975f5c5SAndroid Build Coastguard Worker }
2876*8975f5c5SAndroid Build Coastguard Worker
ValidateTexSubImage3DRobustANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,GLsizei bufSize,const void * pixels)2877*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexSubImage3DRobustANGLE(const Context *context,
2878*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2879*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2880*8975f5c5SAndroid Build Coastguard Worker GLint level,
2881*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2882*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2883*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2884*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2885*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2886*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2887*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2888*8975f5c5SAndroid Build Coastguard Worker GLenum type,
2889*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
2890*8975f5c5SAndroid Build Coastguard Worker const void *pixels)
2891*8975f5c5SAndroid Build Coastguard Worker {
2892*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
2893*8975f5c5SAndroid Build Coastguard Worker {
2894*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2895*8975f5c5SAndroid Build Coastguard Worker return false;
2896*8975f5c5SAndroid Build Coastguard Worker }
2897*8975f5c5SAndroid Build Coastguard Worker
2898*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustEntryPoint(context, entryPoint, bufSize))
2899*8975f5c5SAndroid Build Coastguard Worker {
2900*8975f5c5SAndroid Build Coastguard Worker return false;
2901*8975f5c5SAndroid Build Coastguard Worker }
2902*8975f5c5SAndroid Build Coastguard Worker
2903*8975f5c5SAndroid Build Coastguard Worker return ValidateES3TexImage3DParameters(context, entryPoint, target, level, GL_NONE, false, true,
2904*8975f5c5SAndroid Build Coastguard Worker xoffset, yoffset, zoffset, width, height, depth, 0,
2905*8975f5c5SAndroid Build Coastguard Worker format, type, bufSize, pixels);
2906*8975f5c5SAndroid Build Coastguard Worker }
2907*8975f5c5SAndroid Build Coastguard Worker
ValidateCompressedTexSubImage3D(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLsizei imageSize,const void * data)2908*8975f5c5SAndroid Build Coastguard Worker bool ValidateCompressedTexSubImage3D(const Context *context,
2909*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2910*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2911*8975f5c5SAndroid Build Coastguard Worker GLint level,
2912*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2913*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2914*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2915*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2916*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2917*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2918*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2919*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
2920*8975f5c5SAndroid Build Coastguard Worker const void *data)
2921*8975f5c5SAndroid Build Coastguard Worker {
2922*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().texture3DOES)
2923*8975f5c5SAndroid Build Coastguard Worker {
2924*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2925*8975f5c5SAndroid Build Coastguard Worker return false;
2926*8975f5c5SAndroid Build Coastguard Worker }
2927*8975f5c5SAndroid Build Coastguard Worker
2928*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexImage3DParameters(context, entryPoint, target, level, GL_NONE, true, true,
2929*8975f5c5SAndroid Build Coastguard Worker xoffset, yoffset, zoffset, width, height, depth, 0, format,
2930*8975f5c5SAndroid Build Coastguard Worker GL_NONE, -1, data))
2931*8975f5c5SAndroid Build Coastguard Worker {
2932*8975f5c5SAndroid Build Coastguard Worker return false;
2933*8975f5c5SAndroid Build Coastguard Worker }
2934*8975f5c5SAndroid Build Coastguard Worker
2935*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &formatInfo = GetSizedInternalFormatInfo(format);
2936*8975f5c5SAndroid Build Coastguard Worker
2937*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.compressed)
2938*8975f5c5SAndroid Build Coastguard Worker {
2939*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidCompressedFormat);
2940*8975f5c5SAndroid Build Coastguard Worker return false;
2941*8975f5c5SAndroid Build Coastguard Worker }
2942*8975f5c5SAndroid Build Coastguard Worker
2943*8975f5c5SAndroid Build Coastguard Worker GLuint blockSize = 0;
2944*8975f5c5SAndroid Build Coastguard Worker if (!formatInfo.computeCompressedImageSize(Extents(width, height, depth), &blockSize))
2945*8975f5c5SAndroid Build Coastguard Worker {
2946*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kIntegerOverflow);
2947*8975f5c5SAndroid Build Coastguard Worker return false;
2948*8975f5c5SAndroid Build Coastguard Worker }
2949*8975f5c5SAndroid Build Coastguard Worker
2950*8975f5c5SAndroid Build Coastguard Worker if (imageSize < 0 || static_cast<GLuint>(imageSize) != blockSize)
2951*8975f5c5SAndroid Build Coastguard Worker {
2952*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidCompressedImageSize);
2953*8975f5c5SAndroid Build Coastguard Worker return false;
2954*8975f5c5SAndroid Build Coastguard Worker }
2955*8975f5c5SAndroid Build Coastguard Worker
2956*8975f5c5SAndroid Build Coastguard Worker if (data == nullptr)
2957*8975f5c5SAndroid Build Coastguard Worker {
2958*8975f5c5SAndroid Build Coastguard Worker if (context->getState().getTargetBuffer(BufferBinding::PixelUnpack) == nullptr)
2959*8975f5c5SAndroid Build Coastguard Worker {
2960*8975f5c5SAndroid Build Coastguard Worker // If data is null, we need an unpack buffer to read from
2961*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPixelDataNull);
2962*8975f5c5SAndroid Build Coastguard Worker return false;
2963*8975f5c5SAndroid Build Coastguard Worker }
2964*8975f5c5SAndroid Build Coastguard Worker }
2965*8975f5c5SAndroid Build Coastguard Worker
2966*8975f5c5SAndroid Build Coastguard Worker return true;
2967*8975f5c5SAndroid Build Coastguard Worker }
2968*8975f5c5SAndroid Build Coastguard Worker
ValidateCompressedTexSubImage3DRobustANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLsizei imageSize,GLsizei dataSize,const void * data)2969*8975f5c5SAndroid Build Coastguard Worker bool ValidateCompressedTexSubImage3DRobustANGLE(const Context *context,
2970*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2971*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
2972*8975f5c5SAndroid Build Coastguard Worker GLint level,
2973*8975f5c5SAndroid Build Coastguard Worker GLint xoffset,
2974*8975f5c5SAndroid Build Coastguard Worker GLint yoffset,
2975*8975f5c5SAndroid Build Coastguard Worker GLint zoffset,
2976*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
2977*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
2978*8975f5c5SAndroid Build Coastguard Worker GLsizei depth,
2979*8975f5c5SAndroid Build Coastguard Worker GLenum format,
2980*8975f5c5SAndroid Build Coastguard Worker GLsizei imageSize,
2981*8975f5c5SAndroid Build Coastguard Worker GLsizei dataSize,
2982*8975f5c5SAndroid Build Coastguard Worker const void *data)
2983*8975f5c5SAndroid Build Coastguard Worker {
2984*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustCompressedTexImageBase(context, entryPoint, imageSize, dataSize))
2985*8975f5c5SAndroid Build Coastguard Worker {
2986*8975f5c5SAndroid Build Coastguard Worker return false;
2987*8975f5c5SAndroid Build Coastguard Worker }
2988*8975f5c5SAndroid Build Coastguard Worker
2989*8975f5c5SAndroid Build Coastguard Worker return ValidateCompressedTexSubImage3D(context, entryPoint, target, level, xoffset, yoffset,
2990*8975f5c5SAndroid Build Coastguard Worker zoffset, width, height, depth, format, imageSize, data);
2991*8975f5c5SAndroid Build Coastguard Worker }
2992*8975f5c5SAndroid Build Coastguard Worker
ValidateGenQueries(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const QueryID * queries)2993*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenQueries(const Context *context,
2994*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
2995*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
2996*8975f5c5SAndroid Build Coastguard Worker const QueryID *queries)
2997*8975f5c5SAndroid Build Coastguard Worker {
2998*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteES3(context, entryPoint, n);
2999*8975f5c5SAndroid Build Coastguard Worker }
3000*8975f5c5SAndroid Build Coastguard Worker
ValidateDeleteQueries(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const QueryID * queries)3001*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteQueries(const Context *context,
3002*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3003*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
3004*8975f5c5SAndroid Build Coastguard Worker const QueryID *queries)
3005*8975f5c5SAndroid Build Coastguard Worker {
3006*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteES3(context, entryPoint, n);
3007*8975f5c5SAndroid Build Coastguard Worker }
3008*8975f5c5SAndroid Build Coastguard Worker
ValidateGenSamplers(const Context * context,angle::EntryPoint entryPoint,GLsizei count,const SamplerID * samplers)3009*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenSamplers(const Context *context,
3010*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3011*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
3012*8975f5c5SAndroid Build Coastguard Worker const SamplerID *samplers)
3013*8975f5c5SAndroid Build Coastguard Worker {
3014*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteCountES3(context, entryPoint, count);
3015*8975f5c5SAndroid Build Coastguard Worker }
3016*8975f5c5SAndroid Build Coastguard Worker
ValidateDeleteSamplers(const Context * context,angle::EntryPoint entryPoint,GLsizei count,const SamplerID * samplers)3017*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteSamplers(const Context *context,
3018*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3019*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
3020*8975f5c5SAndroid Build Coastguard Worker const SamplerID *samplers)
3021*8975f5c5SAndroid Build Coastguard Worker {
3022*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteCountES3(context, entryPoint, count);
3023*8975f5c5SAndroid Build Coastguard Worker }
3024*8975f5c5SAndroid Build Coastguard Worker
ValidateGenTransformFeedbacks(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const TransformFeedbackID * ids)3025*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenTransformFeedbacks(const Context *context,
3026*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3027*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
3028*8975f5c5SAndroid Build Coastguard Worker const TransformFeedbackID *ids)
3029*8975f5c5SAndroid Build Coastguard Worker {
3030*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteES3(context, entryPoint, n);
3031*8975f5c5SAndroid Build Coastguard Worker }
3032*8975f5c5SAndroid Build Coastguard Worker
ValidateDeleteTransformFeedbacks(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const TransformFeedbackID * ids)3033*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteTransformFeedbacks(const Context *context,
3034*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3035*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
3036*8975f5c5SAndroid Build Coastguard Worker const TransformFeedbackID *ids)
3037*8975f5c5SAndroid Build Coastguard Worker {
3038*8975f5c5SAndroid Build Coastguard Worker if (!ValidateGenOrDeleteES3(context, entryPoint, n))
3039*8975f5c5SAndroid Build Coastguard Worker {
3040*8975f5c5SAndroid Build Coastguard Worker return false;
3041*8975f5c5SAndroid Build Coastguard Worker }
3042*8975f5c5SAndroid Build Coastguard Worker for (GLint i = 0; i < n; ++i)
3043*8975f5c5SAndroid Build Coastguard Worker {
3044*8975f5c5SAndroid Build Coastguard Worker auto *transformFeedback = context->getTransformFeedback(ids[i]);
3045*8975f5c5SAndroid Build Coastguard Worker if (transformFeedback != nullptr && transformFeedback->isActive())
3046*8975f5c5SAndroid Build Coastguard Worker {
3047*8975f5c5SAndroid Build Coastguard Worker // ES 3.0.4 section 2.15.1 page 86
3048*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackActiveDelete);
3049*8975f5c5SAndroid Build Coastguard Worker return false;
3050*8975f5c5SAndroid Build Coastguard Worker }
3051*8975f5c5SAndroid Build Coastguard Worker }
3052*8975f5c5SAndroid Build Coastguard Worker return true;
3053*8975f5c5SAndroid Build Coastguard Worker }
3054*8975f5c5SAndroid Build Coastguard Worker
ValidateGenVertexArrays(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const VertexArrayID * arrays)3055*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenVertexArrays(const Context *context,
3056*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3057*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
3058*8975f5c5SAndroid Build Coastguard Worker const VertexArrayID *arrays)
3059*8975f5c5SAndroid Build Coastguard Worker {
3060*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteES3(context, entryPoint, n);
3061*8975f5c5SAndroid Build Coastguard Worker }
3062*8975f5c5SAndroid Build Coastguard Worker
ValidateDeleteVertexArrays(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const VertexArrayID * arrays)3063*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteVertexArrays(const Context *context,
3064*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3065*8975f5c5SAndroid Build Coastguard Worker GLsizei n,
3066*8975f5c5SAndroid Build Coastguard Worker const VertexArrayID *arrays)
3067*8975f5c5SAndroid Build Coastguard Worker {
3068*8975f5c5SAndroid Build Coastguard Worker return ValidateGenOrDeleteES3(context, entryPoint, n);
3069*8975f5c5SAndroid Build Coastguard Worker }
3070*8975f5c5SAndroid Build Coastguard Worker
ValidateBeginTransformFeedback(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode primitiveMode)3071*8975f5c5SAndroid Build Coastguard Worker bool ValidateBeginTransformFeedback(const Context *context,
3072*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3073*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode primitiveMode)
3074*8975f5c5SAndroid Build Coastguard Worker {
3075*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3076*8975f5c5SAndroid Build Coastguard Worker {
3077*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3078*8975f5c5SAndroid Build Coastguard Worker return false;
3079*8975f5c5SAndroid Build Coastguard Worker }
3080*8975f5c5SAndroid Build Coastguard Worker switch (primitiveMode)
3081*8975f5c5SAndroid Build Coastguard Worker {
3082*8975f5c5SAndroid Build Coastguard Worker case PrimitiveMode::Triangles:
3083*8975f5c5SAndroid Build Coastguard Worker case PrimitiveMode::Lines:
3084*8975f5c5SAndroid Build Coastguard Worker case PrimitiveMode::Points:
3085*8975f5c5SAndroid Build Coastguard Worker break;
3086*8975f5c5SAndroid Build Coastguard Worker
3087*8975f5c5SAndroid Build Coastguard Worker default:
3088*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPrimitiveMode);
3089*8975f5c5SAndroid Build Coastguard Worker return false;
3090*8975f5c5SAndroid Build Coastguard Worker }
3091*8975f5c5SAndroid Build Coastguard Worker
3092*8975f5c5SAndroid Build Coastguard Worker TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
3093*8975f5c5SAndroid Build Coastguard Worker ASSERT(transformFeedback != nullptr);
3094*8975f5c5SAndroid Build Coastguard Worker
3095*8975f5c5SAndroid Build Coastguard Worker if (transformFeedback->isActive())
3096*8975f5c5SAndroid Build Coastguard Worker {
3097*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransfomFeedbackAlreadyActive);
3098*8975f5c5SAndroid Build Coastguard Worker return false;
3099*8975f5c5SAndroid Build Coastguard Worker }
3100*8975f5c5SAndroid Build Coastguard Worker
3101*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < transformFeedback->getIndexedBufferCount(); i++)
3102*8975f5c5SAndroid Build Coastguard Worker {
3103*8975f5c5SAndroid Build Coastguard Worker const OffsetBindingPointer<Buffer> &buffer = transformFeedback->getIndexedBuffer(i);
3104*8975f5c5SAndroid Build Coastguard Worker if (buffer.get())
3105*8975f5c5SAndroid Build Coastguard Worker {
3106*8975f5c5SAndroid Build Coastguard Worker if (buffer->isMapped())
3107*8975f5c5SAndroid Build Coastguard Worker {
3108*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferMapped);
3109*8975f5c5SAndroid Build Coastguard Worker return false;
3110*8975f5c5SAndroid Build Coastguard Worker }
3111*8975f5c5SAndroid Build Coastguard Worker if ((context->getLimitations().noDoubleBoundTransformFeedbackBuffers ||
3112*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().webglCompatibilityANGLE) &&
3113*8975f5c5SAndroid Build Coastguard Worker buffer->isDoubleBoundForTransformFeedback())
3114*8975f5c5SAndroid Build Coastguard Worker {
3115*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION,
3116*8975f5c5SAndroid Build Coastguard Worker kTransformFeedbackBufferMultipleOutputs);
3117*8975f5c5SAndroid Build Coastguard Worker return false;
3118*8975f5c5SAndroid Build Coastguard Worker }
3119*8975f5c5SAndroid Build Coastguard Worker }
3120*8975f5c5SAndroid Build Coastguard Worker }
3121*8975f5c5SAndroid Build Coastguard Worker
3122*8975f5c5SAndroid Build Coastguard Worker const ProgramExecutable *programExecutable =
3123*8975f5c5SAndroid Build Coastguard Worker context->getState().getLinkedProgramExecutable(context);
3124*8975f5c5SAndroid Build Coastguard Worker if (!programExecutable)
3125*8975f5c5SAndroid Build Coastguard Worker {
3126*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kProgramNotBound);
3127*8975f5c5SAndroid Build Coastguard Worker return false;
3128*8975f5c5SAndroid Build Coastguard Worker }
3129*8975f5c5SAndroid Build Coastguard Worker
3130*8975f5c5SAndroid Build Coastguard Worker if (programExecutable->getLinkedTransformFeedbackVaryings().empty())
3131*8975f5c5SAndroid Build Coastguard Worker {
3132*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNoTransformFeedbackOutputVariables);
3133*8975f5c5SAndroid Build Coastguard Worker return false;
3134*8975f5c5SAndroid Build Coastguard Worker }
3135*8975f5c5SAndroid Build Coastguard Worker
3136*8975f5c5SAndroid Build Coastguard Worker if (!ValidateProgramExecutableXFBBuffersPresent(context, programExecutable))
3137*8975f5c5SAndroid Build Coastguard Worker {
3138*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackBufferMissing);
3139*8975f5c5SAndroid Build Coastguard Worker return false;
3140*8975f5c5SAndroid Build Coastguard Worker }
3141*8975f5c5SAndroid Build Coastguard Worker
3142*8975f5c5SAndroid Build Coastguard Worker return true;
3143*8975f5c5SAndroid Build Coastguard Worker }
3144*8975f5c5SAndroid Build Coastguard Worker
ValidateGetBufferPointerv(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLenum pname,void * const * params)3145*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetBufferPointerv(const Context *context,
3146*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3147*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
3148*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
3149*8975f5c5SAndroid Build Coastguard Worker void *const *params)
3150*8975f5c5SAndroid Build Coastguard Worker {
3151*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3152*8975f5c5SAndroid Build Coastguard Worker {
3153*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3154*8975f5c5SAndroid Build Coastguard Worker return false;
3155*8975f5c5SAndroid Build Coastguard Worker }
3156*8975f5c5SAndroid Build Coastguard Worker
3157*8975f5c5SAndroid Build Coastguard Worker return ValidateGetBufferPointervBase(context, entryPoint, target, pname, nullptr, params);
3158*8975f5c5SAndroid Build Coastguard Worker }
3159*8975f5c5SAndroid Build Coastguard Worker
ValidateGetBufferPointervRobustANGLE(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLenum pname,GLsizei bufSize,const GLsizei * length,void * const * params)3160*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetBufferPointervRobustANGLE(const Context *context,
3161*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3162*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
3163*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
3164*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
3165*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
3166*8975f5c5SAndroid Build Coastguard Worker void *const *params)
3167*8975f5c5SAndroid Build Coastguard Worker {
3168*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustEntryPoint(context, entryPoint, bufSize))
3169*8975f5c5SAndroid Build Coastguard Worker {
3170*8975f5c5SAndroid Build Coastguard Worker return false;
3171*8975f5c5SAndroid Build Coastguard Worker }
3172*8975f5c5SAndroid Build Coastguard Worker
3173*8975f5c5SAndroid Build Coastguard Worker GLsizei numParams = 0;
3174*8975f5c5SAndroid Build Coastguard Worker
3175*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3 && !context->getExtensions().mapbufferOES)
3176*8975f5c5SAndroid Build Coastguard Worker {
3177*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3178*8975f5c5SAndroid Build Coastguard Worker return false;
3179*8975f5c5SAndroid Build Coastguard Worker }
3180*8975f5c5SAndroid Build Coastguard Worker
3181*8975f5c5SAndroid Build Coastguard Worker if (!ValidateGetBufferPointervBase(context, entryPoint, target, pname, &numParams, params))
3182*8975f5c5SAndroid Build Coastguard Worker {
3183*8975f5c5SAndroid Build Coastguard Worker return false;
3184*8975f5c5SAndroid Build Coastguard Worker }
3185*8975f5c5SAndroid Build Coastguard Worker
3186*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustBufferSize(context, entryPoint, bufSize, numParams))
3187*8975f5c5SAndroid Build Coastguard Worker {
3188*8975f5c5SAndroid Build Coastguard Worker return false;
3189*8975f5c5SAndroid Build Coastguard Worker }
3190*8975f5c5SAndroid Build Coastguard Worker
3191*8975f5c5SAndroid Build Coastguard Worker SetRobustLengthParam(length, numParams);
3192*8975f5c5SAndroid Build Coastguard Worker
3193*8975f5c5SAndroid Build Coastguard Worker return true;
3194*8975f5c5SAndroid Build Coastguard Worker }
3195*8975f5c5SAndroid Build Coastguard Worker
ValidateUnmapBuffer(const Context * context,angle::EntryPoint entryPoint,BufferBinding target)3196*8975f5c5SAndroid Build Coastguard Worker bool ValidateUnmapBuffer(const Context *context, angle::EntryPoint entryPoint, BufferBinding target)
3197*8975f5c5SAndroid Build Coastguard Worker {
3198*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3199*8975f5c5SAndroid Build Coastguard Worker {
3200*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3201*8975f5c5SAndroid Build Coastguard Worker return false;
3202*8975f5c5SAndroid Build Coastguard Worker }
3203*8975f5c5SAndroid Build Coastguard Worker
3204*8975f5c5SAndroid Build Coastguard Worker return ValidateUnmapBufferBase(context, entryPoint, target);
3205*8975f5c5SAndroid Build Coastguard Worker }
3206*8975f5c5SAndroid Build Coastguard Worker
ValidateMapBufferRange(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLintptr offset,GLsizeiptr length,GLbitfield access)3207*8975f5c5SAndroid Build Coastguard Worker bool ValidateMapBufferRange(const Context *context,
3208*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3209*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
3210*8975f5c5SAndroid Build Coastguard Worker GLintptr offset,
3211*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr length,
3212*8975f5c5SAndroid Build Coastguard Worker GLbitfield access)
3213*8975f5c5SAndroid Build Coastguard Worker {
3214*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3215*8975f5c5SAndroid Build Coastguard Worker {
3216*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3217*8975f5c5SAndroid Build Coastguard Worker return false;
3218*8975f5c5SAndroid Build Coastguard Worker }
3219*8975f5c5SAndroid Build Coastguard Worker
3220*8975f5c5SAndroid Build Coastguard Worker return ValidateMapBufferRangeBase(context, entryPoint, target, offset, length, access);
3221*8975f5c5SAndroid Build Coastguard Worker }
3222*8975f5c5SAndroid Build Coastguard Worker
ValidateFlushMappedBufferRange(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLintptr offset,GLsizeiptr length)3223*8975f5c5SAndroid Build Coastguard Worker bool ValidateFlushMappedBufferRange(const Context *context,
3224*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3225*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
3226*8975f5c5SAndroid Build Coastguard Worker GLintptr offset,
3227*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr length)
3228*8975f5c5SAndroid Build Coastguard Worker {
3229*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3230*8975f5c5SAndroid Build Coastguard Worker {
3231*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3232*8975f5c5SAndroid Build Coastguard Worker return false;
3233*8975f5c5SAndroid Build Coastguard Worker }
3234*8975f5c5SAndroid Build Coastguard Worker
3235*8975f5c5SAndroid Build Coastguard Worker return ValidateFlushMappedBufferRangeBase(context, entryPoint, target, offset, length);
3236*8975f5c5SAndroid Build Coastguard Worker }
3237*8975f5c5SAndroid Build Coastguard Worker
ValidateIndexedStateQuery(const Context * context,angle::EntryPoint entryPoint,GLenum pname,GLuint index,GLsizei * length)3238*8975f5c5SAndroid Build Coastguard Worker bool ValidateIndexedStateQuery(const Context *context,
3239*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3240*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
3241*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3242*8975f5c5SAndroid Build Coastguard Worker GLsizei *length)
3243*8975f5c5SAndroid Build Coastguard Worker {
3244*8975f5c5SAndroid Build Coastguard Worker if (length)
3245*8975f5c5SAndroid Build Coastguard Worker {
3246*8975f5c5SAndroid Build Coastguard Worker *length = 0;
3247*8975f5c5SAndroid Build Coastguard Worker }
3248*8975f5c5SAndroid Build Coastguard Worker
3249*8975f5c5SAndroid Build Coastguard Worker GLenum nativeType;
3250*8975f5c5SAndroid Build Coastguard Worker unsigned int numParams;
3251*8975f5c5SAndroid Build Coastguard Worker if (!context->getIndexedQueryParameterInfo(pname, &nativeType, &numParams))
3252*8975f5c5SAndroid Build Coastguard Worker {
3253*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
3254*8975f5c5SAndroid Build Coastguard Worker return false;
3255*8975f5c5SAndroid Build Coastguard Worker }
3256*8975f5c5SAndroid Build Coastguard Worker
3257*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
3258*8975f5c5SAndroid Build Coastguard Worker switch (pname)
3259*8975f5c5SAndroid Build Coastguard Worker {
3260*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_SRC_RGB:
3261*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_SRC_ALPHA:
3262*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_DST_RGB:
3263*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_DST_ALPHA:
3264*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_EQUATION_RGB:
3265*8975f5c5SAndroid Build Coastguard Worker case GL_BLEND_EQUATION_ALPHA:
3266*8975f5c5SAndroid Build Coastguard Worker case GL_COLOR_WRITEMASK:
3267*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_2 ||
3268*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().drawBuffersIndexedAny());
3269*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxDrawBuffers))
3270*8975f5c5SAndroid Build Coastguard Worker {
3271*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxDrawBuffer);
3272*8975f5c5SAndroid Build Coastguard Worker return false;
3273*8975f5c5SAndroid Build Coastguard Worker }
3274*8975f5c5SAndroid Build Coastguard Worker break;
3275*8975f5c5SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_START:
3276*8975f5c5SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE:
3277*8975f5c5SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING:
3278*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxTransformFeedbackSeparateAttributes))
3279*8975f5c5SAndroid Build Coastguard Worker {
3280*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxTransformFeedbackAttribs);
3281*8975f5c5SAndroid Build Coastguard Worker return false;
3282*8975f5c5SAndroid Build Coastguard Worker }
3283*8975f5c5SAndroid Build Coastguard Worker break;
3284*8975f5c5SAndroid Build Coastguard Worker
3285*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_START:
3286*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_SIZE:
3287*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_BUFFER_BINDING:
3288*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxUniformBufferBindings))
3289*8975f5c5SAndroid Build Coastguard Worker {
3290*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxUniformBufferBindings);
3291*8975f5c5SAndroid Build Coastguard Worker return false;
3292*8975f5c5SAndroid Build Coastguard Worker }
3293*8975f5c5SAndroid Build Coastguard Worker break;
3294*8975f5c5SAndroid Build Coastguard Worker
3295*8975f5c5SAndroid Build Coastguard Worker case GL_MAX_COMPUTE_WORK_GROUP_SIZE:
3296*8975f5c5SAndroid Build Coastguard Worker case GL_MAX_COMPUTE_WORK_GROUP_COUNT:
3297*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1);
3298*8975f5c5SAndroid Build Coastguard Worker if (index >= 3u)
3299*8975f5c5SAndroid Build Coastguard Worker {
3300*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxWorkgroupDimensions);
3301*8975f5c5SAndroid Build Coastguard Worker return false;
3302*8975f5c5SAndroid Build Coastguard Worker }
3303*8975f5c5SAndroid Build Coastguard Worker break;
3304*8975f5c5SAndroid Build Coastguard Worker
3305*8975f5c5SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_START:
3306*8975f5c5SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_SIZE:
3307*8975f5c5SAndroid Build Coastguard Worker case GL_ATOMIC_COUNTER_BUFFER_BINDING:
3308*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1);
3309*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxAtomicCounterBufferBindings))
3310*8975f5c5SAndroid Build Coastguard Worker {
3311*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE,
3312*8975f5c5SAndroid Build Coastguard Worker kIndexExceedsMaxAtomicCounterBufferBindings);
3313*8975f5c5SAndroid Build Coastguard Worker return false;
3314*8975f5c5SAndroid Build Coastguard Worker }
3315*8975f5c5SAndroid Build Coastguard Worker break;
3316*8975f5c5SAndroid Build Coastguard Worker
3317*8975f5c5SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_START:
3318*8975f5c5SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_SIZE:
3319*8975f5c5SAndroid Build Coastguard Worker case GL_SHADER_STORAGE_BUFFER_BINDING:
3320*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1);
3321*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxShaderStorageBufferBindings))
3322*8975f5c5SAndroid Build Coastguard Worker {
3323*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxShaderStorageBufferBindings);
3324*8975f5c5SAndroid Build Coastguard Worker return false;
3325*8975f5c5SAndroid Build Coastguard Worker }
3326*8975f5c5SAndroid Build Coastguard Worker break;
3327*8975f5c5SAndroid Build Coastguard Worker
3328*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_BUFFER:
3329*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_DIVISOR:
3330*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_OFFSET:
3331*8975f5c5SAndroid Build Coastguard Worker case GL_VERTEX_BINDING_STRIDE:
3332*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1);
3333*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxVertexAttribBindings))
3334*8975f5c5SAndroid Build Coastguard Worker {
3335*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxVertexAttribBindings);
3336*8975f5c5SAndroid Build Coastguard Worker return false;
3337*8975f5c5SAndroid Build Coastguard Worker }
3338*8975f5c5SAndroid Build Coastguard Worker break;
3339*8975f5c5SAndroid Build Coastguard Worker case GL_SAMPLE_MASK_VALUE:
3340*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1 ||
3341*8975f5c5SAndroid Build Coastguard Worker context->getExtensions().textureMultisampleANGLE);
3342*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxSampleMaskWords))
3343*8975f5c5SAndroid Build Coastguard Worker {
3344*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidSampleMaskNumber);
3345*8975f5c5SAndroid Build Coastguard Worker return false;
3346*8975f5c5SAndroid Build Coastguard Worker }
3347*8975f5c5SAndroid Build Coastguard Worker break;
3348*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_NAME:
3349*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LEVEL:
3350*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LAYERED:
3351*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_LAYER:
3352*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_ACCESS:
3353*8975f5c5SAndroid Build Coastguard Worker case GL_IMAGE_BINDING_FORMAT:
3354*8975f5c5SAndroid Build Coastguard Worker ASSERT(context->getClientVersion() >= ES_3_1);
3355*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxImageUnits))
3356*8975f5c5SAndroid Build Coastguard Worker {
3357*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxImageUnits);
3358*8975f5c5SAndroid Build Coastguard Worker return false;
3359*8975f5c5SAndroid Build Coastguard Worker }
3360*8975f5c5SAndroid Build Coastguard Worker break;
3361*8975f5c5SAndroid Build Coastguard Worker default:
3362*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
3363*8975f5c5SAndroid Build Coastguard Worker return false;
3364*8975f5c5SAndroid Build Coastguard Worker }
3365*8975f5c5SAndroid Build Coastguard Worker
3366*8975f5c5SAndroid Build Coastguard Worker if (length)
3367*8975f5c5SAndroid Build Coastguard Worker {
3368*8975f5c5SAndroid Build Coastguard Worker if (pname == GL_COLOR_WRITEMASK)
3369*8975f5c5SAndroid Build Coastguard Worker {
3370*8975f5c5SAndroid Build Coastguard Worker *length = 4;
3371*8975f5c5SAndroid Build Coastguard Worker }
3372*8975f5c5SAndroid Build Coastguard Worker else
3373*8975f5c5SAndroid Build Coastguard Worker {
3374*8975f5c5SAndroid Build Coastguard Worker *length = 1;
3375*8975f5c5SAndroid Build Coastguard Worker }
3376*8975f5c5SAndroid Build Coastguard Worker }
3377*8975f5c5SAndroid Build Coastguard Worker
3378*8975f5c5SAndroid Build Coastguard Worker return true;
3379*8975f5c5SAndroid Build Coastguard Worker }
3380*8975f5c5SAndroid Build Coastguard Worker
ValidateGetIntegeri_v(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLuint index,const GLint * data)3381*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetIntegeri_v(const Context *context,
3382*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3383*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3384*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3385*8975f5c5SAndroid Build Coastguard Worker const GLint *data)
3386*8975f5c5SAndroid Build Coastguard Worker {
3387*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_0)
3388*8975f5c5SAndroid Build Coastguard Worker {
3389*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3390*8975f5c5SAndroid Build Coastguard Worker return false;
3391*8975f5c5SAndroid Build Coastguard Worker }
3392*8975f5c5SAndroid Build Coastguard Worker return ValidateIndexedStateQuery(context, entryPoint, target, index, nullptr);
3393*8975f5c5SAndroid Build Coastguard Worker }
3394*8975f5c5SAndroid Build Coastguard Worker
ValidateGetIntegeri_vRobustANGLE(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLuint index,GLsizei bufSize,const GLsizei * length,const GLint * data)3395*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetIntegeri_vRobustANGLE(const Context *context,
3396*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3397*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3398*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3399*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
3400*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
3401*8975f5c5SAndroid Build Coastguard Worker const GLint *data)
3402*8975f5c5SAndroid Build Coastguard Worker {
3403*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_0)
3404*8975f5c5SAndroid Build Coastguard Worker {
3405*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3406*8975f5c5SAndroid Build Coastguard Worker return false;
3407*8975f5c5SAndroid Build Coastguard Worker }
3408*8975f5c5SAndroid Build Coastguard Worker
3409*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustEntryPoint(context, entryPoint, bufSize))
3410*8975f5c5SAndroid Build Coastguard Worker {
3411*8975f5c5SAndroid Build Coastguard Worker return false;
3412*8975f5c5SAndroid Build Coastguard Worker }
3413*8975f5c5SAndroid Build Coastguard Worker
3414*8975f5c5SAndroid Build Coastguard Worker GLsizei numParams = 0;
3415*8975f5c5SAndroid Build Coastguard Worker
3416*8975f5c5SAndroid Build Coastguard Worker if (!ValidateIndexedStateQuery(context, entryPoint, target, index, &numParams))
3417*8975f5c5SAndroid Build Coastguard Worker {
3418*8975f5c5SAndroid Build Coastguard Worker return false;
3419*8975f5c5SAndroid Build Coastguard Worker }
3420*8975f5c5SAndroid Build Coastguard Worker
3421*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustBufferSize(context, entryPoint, bufSize, numParams))
3422*8975f5c5SAndroid Build Coastguard Worker {
3423*8975f5c5SAndroid Build Coastguard Worker return false;
3424*8975f5c5SAndroid Build Coastguard Worker }
3425*8975f5c5SAndroid Build Coastguard Worker
3426*8975f5c5SAndroid Build Coastguard Worker SetRobustLengthParam(length, numParams);
3427*8975f5c5SAndroid Build Coastguard Worker
3428*8975f5c5SAndroid Build Coastguard Worker return true;
3429*8975f5c5SAndroid Build Coastguard Worker }
3430*8975f5c5SAndroid Build Coastguard Worker
ValidateGetInteger64i_v(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLuint index,const GLint64 * data)3431*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetInteger64i_v(const Context *context,
3432*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3433*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3434*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3435*8975f5c5SAndroid Build Coastguard Worker const GLint64 *data)
3436*8975f5c5SAndroid Build Coastguard Worker {
3437*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_0)
3438*8975f5c5SAndroid Build Coastguard Worker {
3439*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3440*8975f5c5SAndroid Build Coastguard Worker return false;
3441*8975f5c5SAndroid Build Coastguard Worker }
3442*8975f5c5SAndroid Build Coastguard Worker return ValidateIndexedStateQuery(context, entryPoint, target, index, nullptr);
3443*8975f5c5SAndroid Build Coastguard Worker }
3444*8975f5c5SAndroid Build Coastguard Worker
ValidateGetInteger64i_vRobustANGLE(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLuint index,GLsizei bufSize,const GLsizei * length,const GLint64 * data)3445*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetInteger64i_vRobustANGLE(const Context *context,
3446*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3447*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3448*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3449*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
3450*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
3451*8975f5c5SAndroid Build Coastguard Worker const GLint64 *data)
3452*8975f5c5SAndroid Build Coastguard Worker {
3453*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() < ES_3_0)
3454*8975f5c5SAndroid Build Coastguard Worker {
3455*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3456*8975f5c5SAndroid Build Coastguard Worker return false;
3457*8975f5c5SAndroid Build Coastguard Worker }
3458*8975f5c5SAndroid Build Coastguard Worker
3459*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustEntryPoint(context, entryPoint, bufSize))
3460*8975f5c5SAndroid Build Coastguard Worker {
3461*8975f5c5SAndroid Build Coastguard Worker return false;
3462*8975f5c5SAndroid Build Coastguard Worker }
3463*8975f5c5SAndroid Build Coastguard Worker
3464*8975f5c5SAndroid Build Coastguard Worker GLsizei numParams = 0;
3465*8975f5c5SAndroid Build Coastguard Worker
3466*8975f5c5SAndroid Build Coastguard Worker if (!ValidateIndexedStateQuery(context, entryPoint, target, index, &numParams))
3467*8975f5c5SAndroid Build Coastguard Worker {
3468*8975f5c5SAndroid Build Coastguard Worker return false;
3469*8975f5c5SAndroid Build Coastguard Worker }
3470*8975f5c5SAndroid Build Coastguard Worker
3471*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRobustBufferSize(context, entryPoint, bufSize, numParams))
3472*8975f5c5SAndroid Build Coastguard Worker {
3473*8975f5c5SAndroid Build Coastguard Worker return false;
3474*8975f5c5SAndroid Build Coastguard Worker }
3475*8975f5c5SAndroid Build Coastguard Worker
3476*8975f5c5SAndroid Build Coastguard Worker SetRobustLengthParam(length, numParams);
3477*8975f5c5SAndroid Build Coastguard Worker
3478*8975f5c5SAndroid Build Coastguard Worker return true;
3479*8975f5c5SAndroid Build Coastguard Worker }
3480*8975f5c5SAndroid Build Coastguard Worker
ValidateCopyBufferSubData(const Context * context,angle::EntryPoint entryPoint,BufferBinding readTarget,BufferBinding writeTarget,GLintptr readOffset,GLintptr writeOffset,GLsizeiptr size)3481*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyBufferSubData(const Context *context,
3482*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3483*8975f5c5SAndroid Build Coastguard Worker BufferBinding readTarget,
3484*8975f5c5SAndroid Build Coastguard Worker BufferBinding writeTarget,
3485*8975f5c5SAndroid Build Coastguard Worker GLintptr readOffset,
3486*8975f5c5SAndroid Build Coastguard Worker GLintptr writeOffset,
3487*8975f5c5SAndroid Build Coastguard Worker GLsizeiptr size)
3488*8975f5c5SAndroid Build Coastguard Worker {
3489*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3490*8975f5c5SAndroid Build Coastguard Worker {
3491*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3492*8975f5c5SAndroid Build Coastguard Worker return false;
3493*8975f5c5SAndroid Build Coastguard Worker }
3494*8975f5c5SAndroid Build Coastguard Worker
3495*8975f5c5SAndroid Build Coastguard Worker if (!context->isValidBufferBinding(readTarget) || !context->isValidBufferBinding(writeTarget))
3496*8975f5c5SAndroid Build Coastguard Worker {
3497*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidBufferTypes);
3498*8975f5c5SAndroid Build Coastguard Worker return false;
3499*8975f5c5SAndroid Build Coastguard Worker }
3500*8975f5c5SAndroid Build Coastguard Worker
3501*8975f5c5SAndroid Build Coastguard Worker Buffer *readBuffer = context->getState().getTargetBuffer(readTarget);
3502*8975f5c5SAndroid Build Coastguard Worker Buffer *writeBuffer = context->getState().getTargetBuffer(writeTarget);
3503*8975f5c5SAndroid Build Coastguard Worker
3504*8975f5c5SAndroid Build Coastguard Worker if (!readBuffer || !writeBuffer)
3505*8975f5c5SAndroid Build Coastguard Worker {
3506*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferNotBound);
3507*8975f5c5SAndroid Build Coastguard Worker return false;
3508*8975f5c5SAndroid Build Coastguard Worker }
3509*8975f5c5SAndroid Build Coastguard Worker
3510*8975f5c5SAndroid Build Coastguard Worker // EXT_buffer_storage allows persistently mapped buffers to be updated via glCopyBufferSubData
3511*8975f5c5SAndroid Build Coastguard Worker bool isReadPersistent = (readBuffer->getAccessFlags() & GL_MAP_PERSISTENT_BIT_EXT) != 0;
3512*8975f5c5SAndroid Build Coastguard Worker bool isWritePersistent = (writeBuffer->getAccessFlags() & GL_MAP_PERSISTENT_BIT_EXT) != 0;
3513*8975f5c5SAndroid Build Coastguard Worker
3514*8975f5c5SAndroid Build Coastguard Worker // Verify that readBuffer and writeBuffer are not currently mapped unless persistent
3515*8975f5c5SAndroid Build Coastguard Worker if ((readBuffer->isMapped() && !isReadPersistent) ||
3516*8975f5c5SAndroid Build Coastguard Worker (writeBuffer->isMapped() && !isWritePersistent))
3517*8975f5c5SAndroid Build Coastguard Worker {
3518*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferMapped);
3519*8975f5c5SAndroid Build Coastguard Worker return false;
3520*8975f5c5SAndroid Build Coastguard Worker }
3521*8975f5c5SAndroid Build Coastguard Worker
3522*8975f5c5SAndroid Build Coastguard Worker if (readBuffer->hasWebGLXFBBindingConflict(context->isWebGL()) ||
3523*8975f5c5SAndroid Build Coastguard Worker writeBuffer->hasWebGLXFBBindingConflict(context->isWebGL()))
3524*8975f5c5SAndroid Build Coastguard Worker {
3525*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferBoundForTransformFeedback);
3526*8975f5c5SAndroid Build Coastguard Worker return false;
3527*8975f5c5SAndroid Build Coastguard Worker }
3528*8975f5c5SAndroid Build Coastguard Worker
3529*8975f5c5SAndroid Build Coastguard Worker CheckedNumeric<GLintptr> checkedReadOffset(readOffset);
3530*8975f5c5SAndroid Build Coastguard Worker CheckedNumeric<GLintptr> checkedWriteOffset(writeOffset);
3531*8975f5c5SAndroid Build Coastguard Worker CheckedNumeric<GLintptr> checkedSize(size);
3532*8975f5c5SAndroid Build Coastguard Worker
3533*8975f5c5SAndroid Build Coastguard Worker auto checkedReadSum = checkedReadOffset + checkedSize;
3534*8975f5c5SAndroid Build Coastguard Worker auto checkedWriteSum = checkedWriteOffset + checkedSize;
3535*8975f5c5SAndroid Build Coastguard Worker
3536*8975f5c5SAndroid Build Coastguard Worker if (!checkedReadSum.IsValid() || !checkedWriteSum.IsValid() ||
3537*8975f5c5SAndroid Build Coastguard Worker !IsValueInRangeForNumericType<GLintptr>(readBuffer->getSize()) ||
3538*8975f5c5SAndroid Build Coastguard Worker !IsValueInRangeForNumericType<GLintptr>(writeBuffer->getSize()))
3539*8975f5c5SAndroid Build Coastguard Worker {
3540*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIntegerOverflow);
3541*8975f5c5SAndroid Build Coastguard Worker return false;
3542*8975f5c5SAndroid Build Coastguard Worker }
3543*8975f5c5SAndroid Build Coastguard Worker
3544*8975f5c5SAndroid Build Coastguard Worker if (readOffset < 0 || writeOffset < 0)
3545*8975f5c5SAndroid Build Coastguard Worker {
3546*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeOffset);
3547*8975f5c5SAndroid Build Coastguard Worker return false;
3548*8975f5c5SAndroid Build Coastguard Worker }
3549*8975f5c5SAndroid Build Coastguard Worker
3550*8975f5c5SAndroid Build Coastguard Worker if (size < 0)
3551*8975f5c5SAndroid Build Coastguard Worker {
3552*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeSize);
3553*8975f5c5SAndroid Build Coastguard Worker return false;
3554*8975f5c5SAndroid Build Coastguard Worker }
3555*8975f5c5SAndroid Build Coastguard Worker
3556*8975f5c5SAndroid Build Coastguard Worker if (checkedReadSum.ValueOrDie() > readBuffer->getSize() ||
3557*8975f5c5SAndroid Build Coastguard Worker checkedWriteSum.ValueOrDie() > writeBuffer->getSize())
3558*8975f5c5SAndroid Build Coastguard Worker {
3559*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kBufferOffsetOverflow);
3560*8975f5c5SAndroid Build Coastguard Worker return false;
3561*8975f5c5SAndroid Build Coastguard Worker }
3562*8975f5c5SAndroid Build Coastguard Worker
3563*8975f5c5SAndroid Build Coastguard Worker if (readBuffer == writeBuffer)
3564*8975f5c5SAndroid Build Coastguard Worker {
3565*8975f5c5SAndroid Build Coastguard Worker auto checkedOffsetDiff = (checkedReadOffset - checkedWriteOffset).Abs();
3566*8975f5c5SAndroid Build Coastguard Worker if (!checkedOffsetDiff.IsValid())
3567*8975f5c5SAndroid Build Coastguard Worker {
3568*8975f5c5SAndroid Build Coastguard Worker // This shold not be possible.
3569*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE();
3570*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIntegerOverflow);
3571*8975f5c5SAndroid Build Coastguard Worker return false;
3572*8975f5c5SAndroid Build Coastguard Worker }
3573*8975f5c5SAndroid Build Coastguard Worker
3574*8975f5c5SAndroid Build Coastguard Worker if (checkedOffsetDiff.ValueOrDie() < size)
3575*8975f5c5SAndroid Build Coastguard Worker {
3576*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kCopyAlias);
3577*8975f5c5SAndroid Build Coastguard Worker return false;
3578*8975f5c5SAndroid Build Coastguard Worker }
3579*8975f5c5SAndroid Build Coastguard Worker }
3580*8975f5c5SAndroid Build Coastguard Worker
3581*8975f5c5SAndroid Build Coastguard Worker return true;
3582*8975f5c5SAndroid Build Coastguard Worker }
3583*8975f5c5SAndroid Build Coastguard Worker
ValidateGetStringi(const Context * context,angle::EntryPoint entryPoint,GLenum name,GLuint index)3584*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetStringi(const Context *context,
3585*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3586*8975f5c5SAndroid Build Coastguard Worker GLenum name,
3587*8975f5c5SAndroid Build Coastguard Worker GLuint index)
3588*8975f5c5SAndroid Build Coastguard Worker {
3589*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3590*8975f5c5SAndroid Build Coastguard Worker {
3591*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3592*8975f5c5SAndroid Build Coastguard Worker return false;
3593*8975f5c5SAndroid Build Coastguard Worker }
3594*8975f5c5SAndroid Build Coastguard Worker
3595*8975f5c5SAndroid Build Coastguard Worker switch (name)
3596*8975f5c5SAndroid Build Coastguard Worker {
3597*8975f5c5SAndroid Build Coastguard Worker case GL_EXTENSIONS:
3598*8975f5c5SAndroid Build Coastguard Worker if (index >= context->getExtensionStringCount())
3599*8975f5c5SAndroid Build Coastguard Worker {
3600*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsNumExtensions);
3601*8975f5c5SAndroid Build Coastguard Worker return false;
3602*8975f5c5SAndroid Build Coastguard Worker }
3603*8975f5c5SAndroid Build Coastguard Worker break;
3604*8975f5c5SAndroid Build Coastguard Worker
3605*8975f5c5SAndroid Build Coastguard Worker case GL_REQUESTABLE_EXTENSIONS_ANGLE:
3606*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().requestExtensionANGLE)
3607*8975f5c5SAndroid Build Coastguard Worker {
3608*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidName);
3609*8975f5c5SAndroid Build Coastguard Worker return false;
3610*8975f5c5SAndroid Build Coastguard Worker }
3611*8975f5c5SAndroid Build Coastguard Worker if (index >= context->getRequestableExtensionStringCount())
3612*8975f5c5SAndroid Build Coastguard Worker {
3613*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsNumRequestableExtensions);
3614*8975f5c5SAndroid Build Coastguard Worker return false;
3615*8975f5c5SAndroid Build Coastguard Worker }
3616*8975f5c5SAndroid Build Coastguard Worker break;
3617*8975f5c5SAndroid Build Coastguard Worker
3618*8975f5c5SAndroid Build Coastguard Worker default:
3619*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidName);
3620*8975f5c5SAndroid Build Coastguard Worker return false;
3621*8975f5c5SAndroid Build Coastguard Worker }
3622*8975f5c5SAndroid Build Coastguard Worker
3623*8975f5c5SAndroid Build Coastguard Worker return true;
3624*8975f5c5SAndroid Build Coastguard Worker }
3625*8975f5c5SAndroid Build Coastguard Worker
ValidateRenderbufferStorageMultisample(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height)3626*8975f5c5SAndroid Build Coastguard Worker bool ValidateRenderbufferStorageMultisample(const Context *context,
3627*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3628*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3629*8975f5c5SAndroid Build Coastguard Worker GLsizei samples,
3630*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
3631*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
3632*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
3633*8975f5c5SAndroid Build Coastguard Worker {
3634*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3635*8975f5c5SAndroid Build Coastguard Worker {
3636*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3637*8975f5c5SAndroid Build Coastguard Worker return false;
3638*8975f5c5SAndroid Build Coastguard Worker }
3639*8975f5c5SAndroid Build Coastguard Worker
3640*8975f5c5SAndroid Build Coastguard Worker if (!ValidateRenderbufferStorageParametersBase(context, entryPoint, target, samples,
3641*8975f5c5SAndroid Build Coastguard Worker internalformat, width, height))
3642*8975f5c5SAndroid Build Coastguard Worker {
3643*8975f5c5SAndroid Build Coastguard Worker return false;
3644*8975f5c5SAndroid Build Coastguard Worker }
3645*8975f5c5SAndroid Build Coastguard Worker
3646*8975f5c5SAndroid Build Coastguard Worker // The ES3 spec(section 4.4.2) states that the internal format must be sized and not an integer
3647*8975f5c5SAndroid Build Coastguard Worker // format if samples is greater than zero. In ES3.1(section 9.2.5), it can support integer
3648*8975f5c5SAndroid Build Coastguard Worker // multisample renderbuffer, but the samples should not be greater than MAX_INTEGER_SAMPLES.
3649*8975f5c5SAndroid Build Coastguard Worker const InternalFormat &formatInfo = GetSizedInternalFormatInfo(internalformat);
3650*8975f5c5SAndroid Build Coastguard Worker if (formatInfo.isInt())
3651*8975f5c5SAndroid Build Coastguard Worker {
3652*8975f5c5SAndroid Build Coastguard Worker if ((samples > 0 && context->getClientVersion() == ES_3_0) ||
3653*8975f5c5SAndroid Build Coastguard Worker samples > context->getCaps().maxIntegerSamples)
3654*8975f5c5SAndroid Build Coastguard Worker {
3655*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kSamplesOutOfRange);
3656*8975f5c5SAndroid Build Coastguard Worker return false;
3657*8975f5c5SAndroid Build Coastguard Worker }
3658*8975f5c5SAndroid Build Coastguard Worker }
3659*8975f5c5SAndroid Build Coastguard Worker
3660*8975f5c5SAndroid Build Coastguard Worker // The behavior is different than the ANGLE version, which would generate a GL_OUT_OF_MEMORY.
3661*8975f5c5SAndroid Build Coastguard Worker const TextureCaps &formatCaps = context->getTextureCaps().get(internalformat);
3662*8975f5c5SAndroid Build Coastguard Worker if (static_cast<GLuint>(samples) > formatCaps.getMaxSamples())
3663*8975f5c5SAndroid Build Coastguard Worker {
3664*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kSamplesOutOfRange);
3665*8975f5c5SAndroid Build Coastguard Worker return false;
3666*8975f5c5SAndroid Build Coastguard Worker }
3667*8975f5c5SAndroid Build Coastguard Worker
3668*8975f5c5SAndroid Build Coastguard Worker return true;
3669*8975f5c5SAndroid Build Coastguard Worker }
3670*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribIPointer(const Context * context,angle::EntryPoint entryPoint,GLuint index,GLint size,VertexAttribType type,GLsizei stride,const void * pointer)3671*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribIPointer(const Context *context,
3672*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3673*8975f5c5SAndroid Build Coastguard Worker GLuint index,
3674*8975f5c5SAndroid Build Coastguard Worker GLint size,
3675*8975f5c5SAndroid Build Coastguard Worker VertexAttribType type,
3676*8975f5c5SAndroid Build Coastguard Worker GLsizei stride,
3677*8975f5c5SAndroid Build Coastguard Worker const void *pointer)
3678*8975f5c5SAndroid Build Coastguard Worker {
3679*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3680*8975f5c5SAndroid Build Coastguard Worker {
3681*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3682*8975f5c5SAndroid Build Coastguard Worker return false;
3683*8975f5c5SAndroid Build Coastguard Worker }
3684*8975f5c5SAndroid Build Coastguard Worker
3685*8975f5c5SAndroid Build Coastguard Worker if (!ValidateIntegerVertexFormat(context, entryPoint, index, size, type))
3686*8975f5c5SAndroid Build Coastguard Worker {
3687*8975f5c5SAndroid Build Coastguard Worker return false;
3688*8975f5c5SAndroid Build Coastguard Worker }
3689*8975f5c5SAndroid Build Coastguard Worker
3690*8975f5c5SAndroid Build Coastguard Worker if (stride < 0)
3691*8975f5c5SAndroid Build Coastguard Worker {
3692*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeStride);
3693*8975f5c5SAndroid Build Coastguard Worker return false;
3694*8975f5c5SAndroid Build Coastguard Worker }
3695*8975f5c5SAndroid Build Coastguard Worker
3696*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
3697*8975f5c5SAndroid Build Coastguard Worker if (context->getClientVersion() >= ES_3_1)
3698*8975f5c5SAndroid Build Coastguard Worker {
3699*8975f5c5SAndroid Build Coastguard Worker if (stride > caps.maxVertexAttribStride)
3700*8975f5c5SAndroid Build Coastguard Worker {
3701*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxVertexAttribStride);
3702*8975f5c5SAndroid Build Coastguard Worker return false;
3703*8975f5c5SAndroid Build Coastguard Worker }
3704*8975f5c5SAndroid Build Coastguard Worker
3705*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 3.1] Section 10.3.1 page 245:
3706*8975f5c5SAndroid Build Coastguard Worker // glVertexAttribBinding is part of the equivalent code of VertexAttribIPointer, so its
3707*8975f5c5SAndroid Build Coastguard Worker // validation should be inherited.
3708*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(caps.maxVertexAttribBindings))
3709*8975f5c5SAndroid Build Coastguard Worker {
3710*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExceedsMaxVertexAttribBindings);
3711*8975f5c5SAndroid Build Coastguard Worker return false;
3712*8975f5c5SAndroid Build Coastguard Worker }
3713*8975f5c5SAndroid Build Coastguard Worker }
3714*8975f5c5SAndroid Build Coastguard Worker
3715*8975f5c5SAndroid Build Coastguard Worker // [OpenGL ES 3.0.2] Section 2.8 page 24:
3716*8975f5c5SAndroid Build Coastguard Worker // An INVALID_OPERATION error is generated when a non-zero vertex array object
3717*8975f5c5SAndroid Build Coastguard Worker // is bound, zero is bound to the ARRAY_BUFFER buffer object binding point,
3718*8975f5c5SAndroid Build Coastguard Worker // and the pointer argument is not NULL.
3719*8975f5c5SAndroid Build Coastguard Worker if (context->getState().getVertexArrayId().value != 0 &&
3720*8975f5c5SAndroid Build Coastguard Worker context->getState().getTargetBuffer(BufferBinding::Array) == 0 && pointer != nullptr)
3721*8975f5c5SAndroid Build Coastguard Worker {
3722*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kClientDataInVertexArray);
3723*8975f5c5SAndroid Build Coastguard Worker return false;
3724*8975f5c5SAndroid Build Coastguard Worker }
3725*8975f5c5SAndroid Build Coastguard Worker
3726*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
3727*8975f5c5SAndroid Build Coastguard Worker {
3728*8975f5c5SAndroid Build Coastguard Worker if (!ValidateWebGLVertexAttribPointer(context, entryPoint, type, false, stride, pointer,
3729*8975f5c5SAndroid Build Coastguard Worker true))
3730*8975f5c5SAndroid Build Coastguard Worker {
3731*8975f5c5SAndroid Build Coastguard Worker return false;
3732*8975f5c5SAndroid Build Coastguard Worker }
3733*8975f5c5SAndroid Build Coastguard Worker }
3734*8975f5c5SAndroid Build Coastguard Worker
3735*8975f5c5SAndroid Build Coastguard Worker return true;
3736*8975f5c5SAndroid Build Coastguard Worker }
3737*8975f5c5SAndroid Build Coastguard Worker
ValidateGetSynciv(const Context * context,angle::EntryPoint entryPoint,SyncID syncPacked,GLenum pname,GLsizei bufSize,const GLsizei * length,const GLint * values)3738*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSynciv(const Context *context,
3739*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3740*8975f5c5SAndroid Build Coastguard Worker SyncID syncPacked,
3741*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
3742*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
3743*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
3744*8975f5c5SAndroid Build Coastguard Worker const GLint *values)
3745*8975f5c5SAndroid Build Coastguard Worker {
3746*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
3747*8975f5c5SAndroid Build Coastguard Worker {
3748*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3749*8975f5c5SAndroid Build Coastguard Worker return false;
3750*8975f5c5SAndroid Build Coastguard Worker }
3751*8975f5c5SAndroid Build Coastguard Worker
3752*8975f5c5SAndroid Build Coastguard Worker if (bufSize < 0)
3753*8975f5c5SAndroid Build Coastguard Worker {
3754*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeBufferSize);
3755*8975f5c5SAndroid Build Coastguard Worker return false;
3756*8975f5c5SAndroid Build Coastguard Worker }
3757*8975f5c5SAndroid Build Coastguard Worker
3758*8975f5c5SAndroid Build Coastguard Worker if (context->isContextLost())
3759*8975f5c5SAndroid Build Coastguard Worker {
3760*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_CONTEXT_LOST, kContextLost);
3761*8975f5c5SAndroid Build Coastguard Worker
3762*8975f5c5SAndroid Build Coastguard Worker if (pname == GL_SYNC_STATUS)
3763*8975f5c5SAndroid Build Coastguard Worker {
3764*8975f5c5SAndroid Build Coastguard Worker // Generate an error but still return true, the context still needs to return a
3765*8975f5c5SAndroid Build Coastguard Worker // value in this case.
3766*8975f5c5SAndroid Build Coastguard Worker return true;
3767*8975f5c5SAndroid Build Coastguard Worker }
3768*8975f5c5SAndroid Build Coastguard Worker else
3769*8975f5c5SAndroid Build Coastguard Worker {
3770*8975f5c5SAndroid Build Coastguard Worker return false;
3771*8975f5c5SAndroid Build Coastguard Worker }
3772*8975f5c5SAndroid Build Coastguard Worker }
3773*8975f5c5SAndroid Build Coastguard Worker
3774*8975f5c5SAndroid Build Coastguard Worker Sync *syncObject = context->getSync(syncPacked);
3775*8975f5c5SAndroid Build Coastguard Worker if (!syncObject)
3776*8975f5c5SAndroid Build Coastguard Worker {
3777*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kSyncMissing);
3778*8975f5c5SAndroid Build Coastguard Worker return false;
3779*8975f5c5SAndroid Build Coastguard Worker }
3780*8975f5c5SAndroid Build Coastguard Worker
3781*8975f5c5SAndroid Build Coastguard Worker switch (pname)
3782*8975f5c5SAndroid Build Coastguard Worker {
3783*8975f5c5SAndroid Build Coastguard Worker case GL_OBJECT_TYPE:
3784*8975f5c5SAndroid Build Coastguard Worker case GL_SYNC_CONDITION:
3785*8975f5c5SAndroid Build Coastguard Worker case GL_SYNC_FLAGS:
3786*8975f5c5SAndroid Build Coastguard Worker case GL_SYNC_STATUS:
3787*8975f5c5SAndroid Build Coastguard Worker break;
3788*8975f5c5SAndroid Build Coastguard Worker
3789*8975f5c5SAndroid Build Coastguard Worker default:
3790*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
3791*8975f5c5SAndroid Build Coastguard Worker return false;
3792*8975f5c5SAndroid Build Coastguard Worker }
3793*8975f5c5SAndroid Build Coastguard Worker
3794*8975f5c5SAndroid Build Coastguard Worker return true;
3795*8975f5c5SAndroid Build Coastguard Worker }
3796*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawElementsInstanced(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const void * indices,GLsizei instanceCount)3797*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstanced(const Context *context,
3798*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3799*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
3800*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
3801*8975f5c5SAndroid Build Coastguard Worker DrawElementsType type,
3802*8975f5c5SAndroid Build Coastguard Worker const void *indices,
3803*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount)
3804*8975f5c5SAndroid Build Coastguard Worker {
3805*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3806*8975f5c5SAndroid Build Coastguard Worker {
3807*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
3808*8975f5c5SAndroid Build Coastguard Worker return false;
3809*8975f5c5SAndroid Build Coastguard Worker }
3810*8975f5c5SAndroid Build Coastguard Worker
3811*8975f5c5SAndroid Build Coastguard Worker return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, type, indices,
3812*8975f5c5SAndroid Build Coastguard Worker instanceCount, 0);
3813*8975f5c5SAndroid Build Coastguard Worker }
3814*8975f5c5SAndroid Build Coastguard Worker
ValidateMultiDrawArraysInstancedANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,GLsizei drawcount)3815*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawArraysInstancedANGLE(const Context *context,
3816*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3817*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
3818*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts,
3819*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
3820*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
3821*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount)
3822*8975f5c5SAndroid Build Coastguard Worker {
3823*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().multiDrawANGLE)
3824*8975f5c5SAndroid Build Coastguard Worker {
3825*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3826*8975f5c5SAndroid Build Coastguard Worker return false;
3827*8975f5c5SAndroid Build Coastguard Worker }
3828*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3829*8975f5c5SAndroid Build Coastguard Worker {
3830*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().instancedArraysAny())
3831*8975f5c5SAndroid Build Coastguard Worker {
3832*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3833*8975f5c5SAndroid Build Coastguard Worker return false;
3834*8975f5c5SAndroid Build Coastguard Worker }
3835*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawInstancedANGLE(context, entryPoint))
3836*8975f5c5SAndroid Build Coastguard Worker {
3837*8975f5c5SAndroid Build Coastguard Worker return false;
3838*8975f5c5SAndroid Build Coastguard Worker }
3839*8975f5c5SAndroid Build Coastguard Worker }
3840*8975f5c5SAndroid Build Coastguard Worker for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
3841*8975f5c5SAndroid Build Coastguard Worker {
3842*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawArraysInstancedBase(context, entryPoint, mode, firsts[drawID],
3843*8975f5c5SAndroid Build Coastguard Worker counts[drawID], instanceCounts[drawID], 0))
3844*8975f5c5SAndroid Build Coastguard Worker {
3845*8975f5c5SAndroid Build Coastguard Worker return false;
3846*8975f5c5SAndroid Build Coastguard Worker }
3847*8975f5c5SAndroid Build Coastguard Worker }
3848*8975f5c5SAndroid Build Coastguard Worker return true;
3849*8975f5c5SAndroid Build Coastguard Worker }
3850*8975f5c5SAndroid Build Coastguard Worker
ValidateMultiDrawElementsInstancedANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,const GLsizei * counts,DrawElementsType type,const GLvoid * const * indices,const GLsizei * instanceCounts,GLsizei drawcount)3851*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawElementsInstancedANGLE(const Context *context,
3852*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3853*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
3854*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
3855*8975f5c5SAndroid Build Coastguard Worker DrawElementsType type,
3856*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices,
3857*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
3858*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount)
3859*8975f5c5SAndroid Build Coastguard Worker {
3860*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().multiDrawANGLE)
3861*8975f5c5SAndroid Build Coastguard Worker {
3862*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3863*8975f5c5SAndroid Build Coastguard Worker return false;
3864*8975f5c5SAndroid Build Coastguard Worker }
3865*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
3866*8975f5c5SAndroid Build Coastguard Worker {
3867*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().instancedArraysAny())
3868*8975f5c5SAndroid Build Coastguard Worker {
3869*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3870*8975f5c5SAndroid Build Coastguard Worker return false;
3871*8975f5c5SAndroid Build Coastguard Worker }
3872*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawInstancedANGLE(context, entryPoint))
3873*8975f5c5SAndroid Build Coastguard Worker {
3874*8975f5c5SAndroid Build Coastguard Worker return false;
3875*8975f5c5SAndroid Build Coastguard Worker }
3876*8975f5c5SAndroid Build Coastguard Worker }
3877*8975f5c5SAndroid Build Coastguard Worker for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
3878*8975f5c5SAndroid Build Coastguard Worker {
3879*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawElementsInstancedBase(context, entryPoint, mode, counts[drawID], type,
3880*8975f5c5SAndroid Build Coastguard Worker indices[drawID], instanceCounts[drawID], 0))
3881*8975f5c5SAndroid Build Coastguard Worker {
3882*8975f5c5SAndroid Build Coastguard Worker return false;
3883*8975f5c5SAndroid Build Coastguard Worker }
3884*8975f5c5SAndroid Build Coastguard Worker }
3885*8975f5c5SAndroid Build Coastguard Worker return true;
3886*8975f5c5SAndroid Build Coastguard Worker }
3887*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawArraysInstancedBaseInstanceANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)3888*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawArraysInstancedBaseInstanceANGLE(const Context *context,
3889*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3890*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
3891*8975f5c5SAndroid Build Coastguard Worker GLint first,
3892*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
3893*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount,
3894*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance)
3895*8975f5c5SAndroid Build Coastguard Worker {
3896*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().baseVertexBaseInstanceANGLE)
3897*8975f5c5SAndroid Build Coastguard Worker {
3898*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3899*8975f5c5SAndroid Build Coastguard Worker return false;
3900*8975f5c5SAndroid Build Coastguard Worker }
3901*8975f5c5SAndroid Build Coastguard Worker
3902*8975f5c5SAndroid Build Coastguard Worker return ValidateDrawArraysInstancedBase(context, entryPoint, mode, first, count, instanceCount,
3903*8975f5c5SAndroid Build Coastguard Worker baseInstance);
3904*8975f5c5SAndroid Build Coastguard Worker }
3905*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawElementsInstancedBaseVertexBaseInstanceANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const GLvoid * indices,GLsizei instanceCount,GLint baseVertex,GLuint baseInstance)3906*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstancedBaseVertexBaseInstanceANGLE(const Context *context,
3907*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3908*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
3909*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
3910*8975f5c5SAndroid Build Coastguard Worker DrawElementsType type,
3911*8975f5c5SAndroid Build Coastguard Worker const GLvoid *indices,
3912*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount,
3913*8975f5c5SAndroid Build Coastguard Worker GLint baseVertex,
3914*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance)
3915*8975f5c5SAndroid Build Coastguard Worker {
3916*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().baseVertexBaseInstanceANGLE)
3917*8975f5c5SAndroid Build Coastguard Worker {
3918*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3919*8975f5c5SAndroid Build Coastguard Worker return false;
3920*8975f5c5SAndroid Build Coastguard Worker }
3921*8975f5c5SAndroid Build Coastguard Worker
3922*8975f5c5SAndroid Build Coastguard Worker return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, type, indices,
3923*8975f5c5SAndroid Build Coastguard Worker instanceCount, baseInstance);
3924*8975f5c5SAndroid Build Coastguard Worker }
3925*8975f5c5SAndroid Build Coastguard Worker
ValidateMultiDrawArraysInstancedBaseInstanceANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode modePacked,const GLint * firsts,const GLsizei * counts,const GLsizei * instanceCounts,const GLuint * baseInstances,GLsizei drawcount)3926*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawArraysInstancedBaseInstanceANGLE(const Context *context,
3927*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3928*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode modePacked,
3929*8975f5c5SAndroid Build Coastguard Worker const GLint *firsts,
3930*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
3931*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
3932*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances,
3933*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount)
3934*8975f5c5SAndroid Build Coastguard Worker {
3935*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().multiDrawANGLE)
3936*8975f5c5SAndroid Build Coastguard Worker {
3937*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3938*8975f5c5SAndroid Build Coastguard Worker return false;
3939*8975f5c5SAndroid Build Coastguard Worker }
3940*8975f5c5SAndroid Build Coastguard Worker if (drawcount < 0)
3941*8975f5c5SAndroid Build Coastguard Worker {
3942*8975f5c5SAndroid Build Coastguard Worker return false;
3943*8975f5c5SAndroid Build Coastguard Worker }
3944*8975f5c5SAndroid Build Coastguard Worker for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
3945*8975f5c5SAndroid Build Coastguard Worker {
3946*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawArraysInstancedBase(context, entryPoint, modePacked, firsts[drawID],
3947*8975f5c5SAndroid Build Coastguard Worker counts[drawID], instanceCounts[drawID],
3948*8975f5c5SAndroid Build Coastguard Worker baseInstances[drawID]))
3949*8975f5c5SAndroid Build Coastguard Worker {
3950*8975f5c5SAndroid Build Coastguard Worker return false;
3951*8975f5c5SAndroid Build Coastguard Worker }
3952*8975f5c5SAndroid Build Coastguard Worker }
3953*8975f5c5SAndroid Build Coastguard Worker return true;
3954*8975f5c5SAndroid Build Coastguard Worker }
3955*8975f5c5SAndroid Build Coastguard Worker
ValidateMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode modePacked,const GLsizei * counts,DrawElementsType typePacked,const GLvoid * const * indices,const GLsizei * instanceCounts,const GLint * baseVertices,const GLuint * baseInstances,GLsizei drawcount)3956*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(const Context *context,
3957*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3958*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode modePacked,
3959*8975f5c5SAndroid Build Coastguard Worker const GLsizei *counts,
3960*8975f5c5SAndroid Build Coastguard Worker DrawElementsType typePacked,
3961*8975f5c5SAndroid Build Coastguard Worker const GLvoid *const *indices,
3962*8975f5c5SAndroid Build Coastguard Worker const GLsizei *instanceCounts,
3963*8975f5c5SAndroid Build Coastguard Worker const GLint *baseVertices,
3964*8975f5c5SAndroid Build Coastguard Worker const GLuint *baseInstances,
3965*8975f5c5SAndroid Build Coastguard Worker GLsizei drawcount)
3966*8975f5c5SAndroid Build Coastguard Worker {
3967*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().multiDrawANGLE)
3968*8975f5c5SAndroid Build Coastguard Worker {
3969*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3970*8975f5c5SAndroid Build Coastguard Worker return false;
3971*8975f5c5SAndroid Build Coastguard Worker }
3972*8975f5c5SAndroid Build Coastguard Worker if (drawcount < 0)
3973*8975f5c5SAndroid Build Coastguard Worker {
3974*8975f5c5SAndroid Build Coastguard Worker return false;
3975*8975f5c5SAndroid Build Coastguard Worker }
3976*8975f5c5SAndroid Build Coastguard Worker for (GLsizei drawID = 0; drawID < drawcount; ++drawID)
3977*8975f5c5SAndroid Build Coastguard Worker {
3978*8975f5c5SAndroid Build Coastguard Worker if (!ValidateDrawElementsInstancedBase(context, entryPoint, modePacked, counts[drawID],
3979*8975f5c5SAndroid Build Coastguard Worker typePacked, indices[drawID], instanceCounts[drawID],
3980*8975f5c5SAndroid Build Coastguard Worker baseInstances[drawID]))
3981*8975f5c5SAndroid Build Coastguard Worker {
3982*8975f5c5SAndroid Build Coastguard Worker return false;
3983*8975f5c5SAndroid Build Coastguard Worker }
3984*8975f5c5SAndroid Build Coastguard Worker }
3985*8975f5c5SAndroid Build Coastguard Worker return true;
3986*8975f5c5SAndroid Build Coastguard Worker }
3987*8975f5c5SAndroid Build Coastguard Worker
ValidateFramebufferTextureMultiviewOVR(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum attachment,TextureID texture,GLint level,GLint baseViewIndex,GLsizei numViews)3988*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferTextureMultiviewOVR(const Context *context,
3989*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
3990*8975f5c5SAndroid Build Coastguard Worker GLenum target,
3991*8975f5c5SAndroid Build Coastguard Worker GLenum attachment,
3992*8975f5c5SAndroid Build Coastguard Worker TextureID texture,
3993*8975f5c5SAndroid Build Coastguard Worker GLint level,
3994*8975f5c5SAndroid Build Coastguard Worker GLint baseViewIndex,
3995*8975f5c5SAndroid Build Coastguard Worker GLsizei numViews)
3996*8975f5c5SAndroid Build Coastguard Worker {
3997*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferTextureMultiviewBaseANGLE(context, entryPoint, target, attachment,
3998*8975f5c5SAndroid Build Coastguard Worker texture, level, numViews))
3999*8975f5c5SAndroid Build Coastguard Worker {
4000*8975f5c5SAndroid Build Coastguard Worker return false;
4001*8975f5c5SAndroid Build Coastguard Worker }
4002*8975f5c5SAndroid Build Coastguard Worker
4003*8975f5c5SAndroid Build Coastguard Worker if (texture.value != 0)
4004*8975f5c5SAndroid Build Coastguard Worker {
4005*8975f5c5SAndroid Build Coastguard Worker if (baseViewIndex < 0)
4006*8975f5c5SAndroid Build Coastguard Worker {
4007*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeBaseViewIndex);
4008*8975f5c5SAndroid Build Coastguard Worker return false;
4009*8975f5c5SAndroid Build Coastguard Worker }
4010*8975f5c5SAndroid Build Coastguard Worker
4011*8975f5c5SAndroid Build Coastguard Worker Texture *tex = context->getTexture(texture);
4012*8975f5c5SAndroid Build Coastguard Worker ASSERT(tex);
4013*8975f5c5SAndroid Build Coastguard Worker
4014*8975f5c5SAndroid Build Coastguard Worker switch (tex->getType())
4015*8975f5c5SAndroid Build Coastguard Worker {
4016*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DArray:
4017*8975f5c5SAndroid Build Coastguard Worker case TextureType::_2DMultisampleArray:
4018*8975f5c5SAndroid Build Coastguard Worker {
4019*8975f5c5SAndroid Build Coastguard Worker if (tex->getType() == TextureType::_2DMultisampleArray)
4020*8975f5c5SAndroid Build Coastguard Worker {
4021*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().multiviewMultisampleANGLE)
4022*8975f5c5SAndroid Build Coastguard Worker {
4023*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureType);
4024*8975f5c5SAndroid Build Coastguard Worker return false;
4025*8975f5c5SAndroid Build Coastguard Worker }
4026*8975f5c5SAndroid Build Coastguard Worker }
4027*8975f5c5SAndroid Build Coastguard Worker
4028*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
4029*8975f5c5SAndroid Build Coastguard Worker if (baseViewIndex + numViews > caps.maxArrayTextureLayers)
4030*8975f5c5SAndroid Build Coastguard Worker {
4031*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kViewsExceedMaxArrayLayers);
4032*8975f5c5SAndroid Build Coastguard Worker return false;
4033*8975f5c5SAndroid Build Coastguard Worker }
4034*8975f5c5SAndroid Build Coastguard Worker
4035*8975f5c5SAndroid Build Coastguard Worker break;
4036*8975f5c5SAndroid Build Coastguard Worker }
4037*8975f5c5SAndroid Build Coastguard Worker default:
4038*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureType);
4039*8975f5c5SAndroid Build Coastguard Worker return false;
4040*8975f5c5SAndroid Build Coastguard Worker }
4041*8975f5c5SAndroid Build Coastguard Worker
4042*8975f5c5SAndroid Build Coastguard Worker if (!ValidateFramebufferTextureMultiviewLevelAndFormat(context, entryPoint, tex, level))
4043*8975f5c5SAndroid Build Coastguard Worker {
4044*8975f5c5SAndroid Build Coastguard Worker return false;
4045*8975f5c5SAndroid Build Coastguard Worker }
4046*8975f5c5SAndroid Build Coastguard Worker }
4047*8975f5c5SAndroid Build Coastguard Worker
4048*8975f5c5SAndroid Build Coastguard Worker return true;
4049*8975f5c5SAndroid Build Coastguard Worker }
4050*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform1ui(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLuint v0)4051*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform1ui(const Context *context,
4052*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4053*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4054*8975f5c5SAndroid Build Coastguard Worker GLuint v0)
4055*8975f5c5SAndroid Build Coastguard Worker {
4056*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT, location, 1);
4057*8975f5c5SAndroid Build Coastguard Worker }
4058*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform2ui(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLuint v0,GLuint v1)4059*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform2ui(const Context *context,
4060*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4061*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4062*8975f5c5SAndroid Build Coastguard Worker GLuint v0,
4063*8975f5c5SAndroid Build Coastguard Worker GLuint v1)
4064*8975f5c5SAndroid Build Coastguard Worker {
4065*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC2, location, 1);
4066*8975f5c5SAndroid Build Coastguard Worker }
4067*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform3ui(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLuint v0,GLuint v1,GLuint v2)4068*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform3ui(const Context *context,
4069*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4070*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4071*8975f5c5SAndroid Build Coastguard Worker GLuint v0,
4072*8975f5c5SAndroid Build Coastguard Worker GLuint v1,
4073*8975f5c5SAndroid Build Coastguard Worker GLuint v2)
4074*8975f5c5SAndroid Build Coastguard Worker {
4075*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC3, location, 1);
4076*8975f5c5SAndroid Build Coastguard Worker }
4077*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform4ui(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLuint v0,GLuint v1,GLuint v2,GLuint v3)4078*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform4ui(const Context *context,
4079*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4080*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4081*8975f5c5SAndroid Build Coastguard Worker GLuint v0,
4082*8975f5c5SAndroid Build Coastguard Worker GLuint v1,
4083*8975f5c5SAndroid Build Coastguard Worker GLuint v2,
4084*8975f5c5SAndroid Build Coastguard Worker GLuint v3)
4085*8975f5c5SAndroid Build Coastguard Worker {
4086*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC4, location, 1);
4087*8975f5c5SAndroid Build Coastguard Worker }
4088*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform1uiv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,const GLuint * value)4089*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform1uiv(const Context *context,
4090*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4091*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4092*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4093*8975f5c5SAndroid Build Coastguard Worker const GLuint *value)
4094*8975f5c5SAndroid Build Coastguard Worker {
4095*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT, location, count);
4096*8975f5c5SAndroid Build Coastguard Worker }
4097*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform2uiv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,const GLuint * value)4098*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform2uiv(const Context *context,
4099*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4100*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4101*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4102*8975f5c5SAndroid Build Coastguard Worker const GLuint *value)
4103*8975f5c5SAndroid Build Coastguard Worker {
4104*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC2, location, count);
4105*8975f5c5SAndroid Build Coastguard Worker }
4106*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform3uiv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,const GLuint * value)4107*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform3uiv(const Context *context,
4108*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4109*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4110*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4111*8975f5c5SAndroid Build Coastguard Worker const GLuint *value)
4112*8975f5c5SAndroid Build Coastguard Worker {
4113*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC3, location, count);
4114*8975f5c5SAndroid Build Coastguard Worker }
4115*8975f5c5SAndroid Build Coastguard Worker
ValidateUniform4uiv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,const GLuint * value)4116*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniform4uiv(const Context *context,
4117*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4118*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4119*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4120*8975f5c5SAndroid Build Coastguard Worker const GLuint *value)
4121*8975f5c5SAndroid Build Coastguard Worker {
4122*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformES3(context, entryPoint, GL_UNSIGNED_INT_VEC4, location, count);
4123*8975f5c5SAndroid Build Coastguard Worker }
4124*8975f5c5SAndroid Build Coastguard Worker
ValidateIsQuery(const Context * context,angle::EntryPoint entryPoint,QueryID id)4125*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsQuery(const Context *context, angle::EntryPoint entryPoint, QueryID id)
4126*8975f5c5SAndroid Build Coastguard Worker {
4127*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4128*8975f5c5SAndroid Build Coastguard Worker {
4129*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4130*8975f5c5SAndroid Build Coastguard Worker return false;
4131*8975f5c5SAndroid Build Coastguard Worker }
4132*8975f5c5SAndroid Build Coastguard Worker
4133*8975f5c5SAndroid Build Coastguard Worker return true;
4134*8975f5c5SAndroid Build Coastguard Worker }
4135*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix2x3fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4136*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix2x3fv(const Context *context,
4137*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4138*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4139*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4140*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4141*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4142*8975f5c5SAndroid Build Coastguard Worker {
4143*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT2x3, location, count,
4144*8975f5c5SAndroid Build Coastguard Worker transpose);
4145*8975f5c5SAndroid Build Coastguard Worker }
4146*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix3x2fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4147*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix3x2fv(const Context *context,
4148*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4149*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4150*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4151*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4152*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4153*8975f5c5SAndroid Build Coastguard Worker {
4154*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT3x2, location, count,
4155*8975f5c5SAndroid Build Coastguard Worker transpose);
4156*8975f5c5SAndroid Build Coastguard Worker }
4157*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix2x4fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4158*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix2x4fv(const Context *context,
4159*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4160*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4161*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4162*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4163*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4164*8975f5c5SAndroid Build Coastguard Worker {
4165*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT2x4, location, count,
4166*8975f5c5SAndroid Build Coastguard Worker transpose);
4167*8975f5c5SAndroid Build Coastguard Worker }
4168*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix4x2fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4169*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix4x2fv(const Context *context,
4170*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4171*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4172*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4173*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4174*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4175*8975f5c5SAndroid Build Coastguard Worker {
4176*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT4x2, location, count,
4177*8975f5c5SAndroid Build Coastguard Worker transpose);
4178*8975f5c5SAndroid Build Coastguard Worker }
4179*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix3x4fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4180*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix3x4fv(const Context *context,
4181*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4182*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4183*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4184*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4185*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4186*8975f5c5SAndroid Build Coastguard Worker {
4187*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT3x4, location, count,
4188*8975f5c5SAndroid Build Coastguard Worker transpose);
4189*8975f5c5SAndroid Build Coastguard Worker }
4190*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformMatrix4x3fv(const Context * context,angle::EntryPoint entryPoint,UniformLocation location,GLsizei count,GLboolean transpose,const GLfloat * value)4191*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformMatrix4x3fv(const Context *context,
4192*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4193*8975f5c5SAndroid Build Coastguard Worker UniformLocation location,
4194*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4195*8975f5c5SAndroid Build Coastguard Worker GLboolean transpose,
4196*8975f5c5SAndroid Build Coastguard Worker const GLfloat *value)
4197*8975f5c5SAndroid Build Coastguard Worker {
4198*8975f5c5SAndroid Build Coastguard Worker return ValidateUniformMatrixES3(context, entryPoint, GL_FLOAT_MAT4x3, location, count,
4199*8975f5c5SAndroid Build Coastguard Worker transpose);
4200*8975f5c5SAndroid Build Coastguard Worker }
4201*8975f5c5SAndroid Build Coastguard Worker
ValidateEndTransformFeedback(const Context * context,angle::EntryPoint entryPoint)4202*8975f5c5SAndroid Build Coastguard Worker bool ValidateEndTransformFeedback(const Context *context, angle::EntryPoint entryPoint)
4203*8975f5c5SAndroid Build Coastguard Worker {
4204*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4205*8975f5c5SAndroid Build Coastguard Worker {
4206*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4207*8975f5c5SAndroid Build Coastguard Worker return false;
4208*8975f5c5SAndroid Build Coastguard Worker }
4209*8975f5c5SAndroid Build Coastguard Worker
4210*8975f5c5SAndroid Build Coastguard Worker TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
4211*8975f5c5SAndroid Build Coastguard Worker ASSERT(transformFeedback != nullptr);
4212*8975f5c5SAndroid Build Coastguard Worker
4213*8975f5c5SAndroid Build Coastguard Worker if (!transformFeedback->isActive())
4214*8975f5c5SAndroid Build Coastguard Worker {
4215*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackNotActive);
4216*8975f5c5SAndroid Build Coastguard Worker return false;
4217*8975f5c5SAndroid Build Coastguard Worker }
4218*8975f5c5SAndroid Build Coastguard Worker
4219*8975f5c5SAndroid Build Coastguard Worker return true;
4220*8975f5c5SAndroid Build Coastguard Worker }
4221*8975f5c5SAndroid Build Coastguard Worker
ValidateTransformFeedbackVaryings(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLsizei count,const GLchar * const * varyings,GLenum bufferMode)4222*8975f5c5SAndroid Build Coastguard Worker bool ValidateTransformFeedbackVaryings(const Context *context,
4223*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4224*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4225*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4226*8975f5c5SAndroid Build Coastguard Worker const GLchar *const *varyings,
4227*8975f5c5SAndroid Build Coastguard Worker GLenum bufferMode)
4228*8975f5c5SAndroid Build Coastguard Worker {
4229*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4230*8975f5c5SAndroid Build Coastguard Worker {
4231*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4232*8975f5c5SAndroid Build Coastguard Worker return false;
4233*8975f5c5SAndroid Build Coastguard Worker }
4234*8975f5c5SAndroid Build Coastguard Worker
4235*8975f5c5SAndroid Build Coastguard Worker if (count < 0)
4236*8975f5c5SAndroid Build Coastguard Worker {
4237*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeCount);
4238*8975f5c5SAndroid Build Coastguard Worker return false;
4239*8975f5c5SAndroid Build Coastguard Worker }
4240*8975f5c5SAndroid Build Coastguard Worker
4241*8975f5c5SAndroid Build Coastguard Worker switch (bufferMode)
4242*8975f5c5SAndroid Build Coastguard Worker {
4243*8975f5c5SAndroid Build Coastguard Worker case GL_INTERLEAVED_ATTRIBS:
4244*8975f5c5SAndroid Build Coastguard Worker break;
4245*8975f5c5SAndroid Build Coastguard Worker case GL_SEPARATE_ATTRIBS:
4246*8975f5c5SAndroid Build Coastguard Worker {
4247*8975f5c5SAndroid Build Coastguard Worker const Caps &caps = context->getCaps();
4248*8975f5c5SAndroid Build Coastguard Worker if (count > caps.maxTransformFeedbackSeparateAttributes)
4249*8975f5c5SAndroid Build Coastguard Worker {
4250*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidTransformFeedbackAttribsCount);
4251*8975f5c5SAndroid Build Coastguard Worker return false;
4252*8975f5c5SAndroid Build Coastguard Worker }
4253*8975f5c5SAndroid Build Coastguard Worker break;
4254*8975f5c5SAndroid Build Coastguard Worker }
4255*8975f5c5SAndroid Build Coastguard Worker default:
4256*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, bufferMode);
4257*8975f5c5SAndroid Build Coastguard Worker return false;
4258*8975f5c5SAndroid Build Coastguard Worker }
4259*8975f5c5SAndroid Build Coastguard Worker
4260*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4261*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4262*8975f5c5SAndroid Build Coastguard Worker {
4263*8975f5c5SAndroid Build Coastguard Worker return false;
4264*8975f5c5SAndroid Build Coastguard Worker }
4265*8975f5c5SAndroid Build Coastguard Worker
4266*8975f5c5SAndroid Build Coastguard Worker return true;
4267*8975f5c5SAndroid Build Coastguard Worker }
4268*8975f5c5SAndroid Build Coastguard Worker
ValidateGetTransformFeedbackVarying(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLuint index,GLsizei bufSize,const GLsizei * length,const GLsizei * size,const GLenum * type,const GLchar * name)4269*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTransformFeedbackVarying(const Context *context,
4270*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4271*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4272*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4273*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
4274*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
4275*8975f5c5SAndroid Build Coastguard Worker const GLsizei *size,
4276*8975f5c5SAndroid Build Coastguard Worker const GLenum *type,
4277*8975f5c5SAndroid Build Coastguard Worker const GLchar *name)
4278*8975f5c5SAndroid Build Coastguard Worker {
4279*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4280*8975f5c5SAndroid Build Coastguard Worker {
4281*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4282*8975f5c5SAndroid Build Coastguard Worker return false;
4283*8975f5c5SAndroid Build Coastguard Worker }
4284*8975f5c5SAndroid Build Coastguard Worker
4285*8975f5c5SAndroid Build Coastguard Worker if (bufSize < 0)
4286*8975f5c5SAndroid Build Coastguard Worker {
4287*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeBufferSize);
4288*8975f5c5SAndroid Build Coastguard Worker return false;
4289*8975f5c5SAndroid Build Coastguard Worker }
4290*8975f5c5SAndroid Build Coastguard Worker
4291*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4292*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4293*8975f5c5SAndroid Build Coastguard Worker {
4294*8975f5c5SAndroid Build Coastguard Worker return false;
4295*8975f5c5SAndroid Build Coastguard Worker }
4296*8975f5c5SAndroid Build Coastguard Worker
4297*8975f5c5SAndroid Build Coastguard Worker if (index >= static_cast<GLuint>(
4298*8975f5c5SAndroid Build Coastguard Worker programObject->getExecutable().getLinkedTransformFeedbackVaryings().size()))
4299*8975f5c5SAndroid Build Coastguard Worker {
4300*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTransformFeedbackVaryingIndexOutOfRange);
4301*8975f5c5SAndroid Build Coastguard Worker return false;
4302*8975f5c5SAndroid Build Coastguard Worker }
4303*8975f5c5SAndroid Build Coastguard Worker
4304*8975f5c5SAndroid Build Coastguard Worker return true;
4305*8975f5c5SAndroid Build Coastguard Worker }
4306*8975f5c5SAndroid Build Coastguard Worker
ValidateBindTransformFeedback(const Context * context,angle::EntryPoint entryPoint,GLenum target,TransformFeedbackID id)4307*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindTransformFeedback(const Context *context,
4308*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4309*8975f5c5SAndroid Build Coastguard Worker GLenum target,
4310*8975f5c5SAndroid Build Coastguard Worker TransformFeedbackID id)
4311*8975f5c5SAndroid Build Coastguard Worker {
4312*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4313*8975f5c5SAndroid Build Coastguard Worker {
4314*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4315*8975f5c5SAndroid Build Coastguard Worker return false;
4316*8975f5c5SAndroid Build Coastguard Worker }
4317*8975f5c5SAndroid Build Coastguard Worker
4318*8975f5c5SAndroid Build Coastguard Worker switch (target)
4319*8975f5c5SAndroid Build Coastguard Worker {
4320*8975f5c5SAndroid Build Coastguard Worker case GL_TRANSFORM_FEEDBACK:
4321*8975f5c5SAndroid Build Coastguard Worker {
4322*8975f5c5SAndroid Build Coastguard Worker // Cannot bind a transform feedback object if the current one is started and not
4323*8975f5c5SAndroid Build Coastguard Worker // paused (3.0.2 pg 85 section 2.14.1)
4324*8975f5c5SAndroid Build Coastguard Worker if (context->getState().isTransformFeedbackActiveUnpaused())
4325*8975f5c5SAndroid Build Coastguard Worker {
4326*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackNotPaused);
4327*8975f5c5SAndroid Build Coastguard Worker return false;
4328*8975f5c5SAndroid Build Coastguard Worker }
4329*8975f5c5SAndroid Build Coastguard Worker
4330*8975f5c5SAndroid Build Coastguard Worker // Cannot bind a transform feedback object that does not exist (3.0.2 pg 85 section
4331*8975f5c5SAndroid Build Coastguard Worker // 2.14.1)
4332*8975f5c5SAndroid Build Coastguard Worker if (!context->isTransformFeedbackGenerated(id))
4333*8975f5c5SAndroid Build Coastguard Worker {
4334*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackDoesNotExist);
4335*8975f5c5SAndroid Build Coastguard Worker return false;
4336*8975f5c5SAndroid Build Coastguard Worker }
4337*8975f5c5SAndroid Build Coastguard Worker }
4338*8975f5c5SAndroid Build Coastguard Worker break;
4339*8975f5c5SAndroid Build Coastguard Worker
4340*8975f5c5SAndroid Build Coastguard Worker default:
4341*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, target);
4342*8975f5c5SAndroid Build Coastguard Worker return false;
4343*8975f5c5SAndroid Build Coastguard Worker }
4344*8975f5c5SAndroid Build Coastguard Worker
4345*8975f5c5SAndroid Build Coastguard Worker return true;
4346*8975f5c5SAndroid Build Coastguard Worker }
4347*8975f5c5SAndroid Build Coastguard Worker
ValidateIsTransformFeedback(const Context * context,angle::EntryPoint entryPoint,TransformFeedbackID id)4348*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsTransformFeedback(const Context *context,
4349*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4350*8975f5c5SAndroid Build Coastguard Worker TransformFeedbackID id)
4351*8975f5c5SAndroid Build Coastguard Worker {
4352*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4353*8975f5c5SAndroid Build Coastguard Worker {
4354*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4355*8975f5c5SAndroid Build Coastguard Worker return false;
4356*8975f5c5SAndroid Build Coastguard Worker }
4357*8975f5c5SAndroid Build Coastguard Worker
4358*8975f5c5SAndroid Build Coastguard Worker return true;
4359*8975f5c5SAndroid Build Coastguard Worker }
4360*8975f5c5SAndroid Build Coastguard Worker
ValidatePauseTransformFeedback(const Context * context,angle::EntryPoint entryPoint)4361*8975f5c5SAndroid Build Coastguard Worker bool ValidatePauseTransformFeedback(const Context *context, angle::EntryPoint entryPoint)
4362*8975f5c5SAndroid Build Coastguard Worker {
4363*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4364*8975f5c5SAndroid Build Coastguard Worker {
4365*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4366*8975f5c5SAndroid Build Coastguard Worker return false;
4367*8975f5c5SAndroid Build Coastguard Worker }
4368*8975f5c5SAndroid Build Coastguard Worker
4369*8975f5c5SAndroid Build Coastguard Worker TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
4370*8975f5c5SAndroid Build Coastguard Worker ASSERT(transformFeedback != nullptr);
4371*8975f5c5SAndroid Build Coastguard Worker
4372*8975f5c5SAndroid Build Coastguard Worker // Current transform feedback must be active and not paused in order to pause (3.0.2 pg 86)
4373*8975f5c5SAndroid Build Coastguard Worker if (!transformFeedback->isActive())
4374*8975f5c5SAndroid Build Coastguard Worker {
4375*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackNotActive);
4376*8975f5c5SAndroid Build Coastguard Worker return false;
4377*8975f5c5SAndroid Build Coastguard Worker }
4378*8975f5c5SAndroid Build Coastguard Worker
4379*8975f5c5SAndroid Build Coastguard Worker if (transformFeedback->isPaused())
4380*8975f5c5SAndroid Build Coastguard Worker {
4381*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackPaused);
4382*8975f5c5SAndroid Build Coastguard Worker return false;
4383*8975f5c5SAndroid Build Coastguard Worker }
4384*8975f5c5SAndroid Build Coastguard Worker
4385*8975f5c5SAndroid Build Coastguard Worker return true;
4386*8975f5c5SAndroid Build Coastguard Worker }
4387*8975f5c5SAndroid Build Coastguard Worker
ValidateResumeTransformFeedback(const Context * context,angle::EntryPoint entryPoint)4388*8975f5c5SAndroid Build Coastguard Worker bool ValidateResumeTransformFeedback(const Context *context, angle::EntryPoint entryPoint)
4389*8975f5c5SAndroid Build Coastguard Worker {
4390*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4391*8975f5c5SAndroid Build Coastguard Worker {
4392*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4393*8975f5c5SAndroid Build Coastguard Worker return false;
4394*8975f5c5SAndroid Build Coastguard Worker }
4395*8975f5c5SAndroid Build Coastguard Worker
4396*8975f5c5SAndroid Build Coastguard Worker TransformFeedback *transformFeedback = context->getState().getCurrentTransformFeedback();
4397*8975f5c5SAndroid Build Coastguard Worker ASSERT(transformFeedback != nullptr);
4398*8975f5c5SAndroid Build Coastguard Worker
4399*8975f5c5SAndroid Build Coastguard Worker // Current transform feedback must be active and paused in order to resume (3.0.2 pg 86)
4400*8975f5c5SAndroid Build Coastguard Worker if (!transformFeedback->isActive())
4401*8975f5c5SAndroid Build Coastguard Worker {
4402*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackNotActive);
4403*8975f5c5SAndroid Build Coastguard Worker return false;
4404*8975f5c5SAndroid Build Coastguard Worker }
4405*8975f5c5SAndroid Build Coastguard Worker
4406*8975f5c5SAndroid Build Coastguard Worker if (!transformFeedback->isPaused())
4407*8975f5c5SAndroid Build Coastguard Worker {
4408*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackNotPaused);
4409*8975f5c5SAndroid Build Coastguard Worker return false;
4410*8975f5c5SAndroid Build Coastguard Worker }
4411*8975f5c5SAndroid Build Coastguard Worker
4412*8975f5c5SAndroid Build Coastguard Worker if (!ValidateProgramExecutableXFBBuffersPresent(
4413*8975f5c5SAndroid Build Coastguard Worker context, context->getState().getLinkedProgramExecutable(context)))
4414*8975f5c5SAndroid Build Coastguard Worker {
4415*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTransformFeedbackBufferMissing);
4416*8975f5c5SAndroid Build Coastguard Worker return false;
4417*8975f5c5SAndroid Build Coastguard Worker }
4418*8975f5c5SAndroid Build Coastguard Worker
4419*8975f5c5SAndroid Build Coastguard Worker return true;
4420*8975f5c5SAndroid Build Coastguard Worker }
4421*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribI4i(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,GLint x,GLint y,GLint z,GLint w)4422*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribI4i(const PrivateState &state,
4423*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors,
4424*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4425*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4426*8975f5c5SAndroid Build Coastguard Worker GLint x,
4427*8975f5c5SAndroid Build Coastguard Worker GLint y,
4428*8975f5c5SAndroid Build Coastguard Worker GLint z,
4429*8975f5c5SAndroid Build Coastguard Worker GLint w)
4430*8975f5c5SAndroid Build Coastguard Worker {
4431*8975f5c5SAndroid Build Coastguard Worker if (state.getClientMajorVersion() < 3)
4432*8975f5c5SAndroid Build Coastguard Worker {
4433*8975f5c5SAndroid Build Coastguard Worker errors->validationError(entryPoint, GL_INVALID_OPERATION, kES3Required);
4434*8975f5c5SAndroid Build Coastguard Worker return false;
4435*8975f5c5SAndroid Build Coastguard Worker }
4436*8975f5c5SAndroid Build Coastguard Worker
4437*8975f5c5SAndroid Build Coastguard Worker return ValidateVertexAttribIndex(state, errors, entryPoint, index);
4438*8975f5c5SAndroid Build Coastguard Worker }
4439*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribI4ui(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,GLuint x,GLuint y,GLuint z,GLuint w)4440*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribI4ui(const PrivateState &state,
4441*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors,
4442*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4443*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4444*8975f5c5SAndroid Build Coastguard Worker GLuint x,
4445*8975f5c5SAndroid Build Coastguard Worker GLuint y,
4446*8975f5c5SAndroid Build Coastguard Worker GLuint z,
4447*8975f5c5SAndroid Build Coastguard Worker GLuint w)
4448*8975f5c5SAndroid Build Coastguard Worker {
4449*8975f5c5SAndroid Build Coastguard Worker if (state.getClientMajorVersion() < 3)
4450*8975f5c5SAndroid Build Coastguard Worker {
4451*8975f5c5SAndroid Build Coastguard Worker errors->validationError(entryPoint, GL_INVALID_OPERATION, kES3Required);
4452*8975f5c5SAndroid Build Coastguard Worker return false;
4453*8975f5c5SAndroid Build Coastguard Worker }
4454*8975f5c5SAndroid Build Coastguard Worker
4455*8975f5c5SAndroid Build Coastguard Worker return ValidateVertexAttribIndex(state, errors, entryPoint, index);
4456*8975f5c5SAndroid Build Coastguard Worker }
4457*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribI4iv(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,const GLint * v)4458*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribI4iv(const PrivateState &state,
4459*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors,
4460*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4461*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4462*8975f5c5SAndroid Build Coastguard Worker const GLint *v)
4463*8975f5c5SAndroid Build Coastguard Worker {
4464*8975f5c5SAndroid Build Coastguard Worker if (state.getClientMajorVersion() < 3)
4465*8975f5c5SAndroid Build Coastguard Worker {
4466*8975f5c5SAndroid Build Coastguard Worker errors->validationError(entryPoint, GL_INVALID_OPERATION, kES3Required);
4467*8975f5c5SAndroid Build Coastguard Worker return false;
4468*8975f5c5SAndroid Build Coastguard Worker }
4469*8975f5c5SAndroid Build Coastguard Worker
4470*8975f5c5SAndroid Build Coastguard Worker return ValidateVertexAttribIndex(state, errors, entryPoint, index);
4471*8975f5c5SAndroid Build Coastguard Worker }
4472*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribI4uiv(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,const GLuint * v)4473*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribI4uiv(const PrivateState &state,
4474*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors,
4475*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4476*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4477*8975f5c5SAndroid Build Coastguard Worker const GLuint *v)
4478*8975f5c5SAndroid Build Coastguard Worker {
4479*8975f5c5SAndroid Build Coastguard Worker if (state.getClientMajorVersion() < 3)
4480*8975f5c5SAndroid Build Coastguard Worker {
4481*8975f5c5SAndroid Build Coastguard Worker errors->validationError(entryPoint, GL_INVALID_OPERATION, kES3Required);
4482*8975f5c5SAndroid Build Coastguard Worker return false;
4483*8975f5c5SAndroid Build Coastguard Worker }
4484*8975f5c5SAndroid Build Coastguard Worker
4485*8975f5c5SAndroid Build Coastguard Worker return ValidateVertexAttribIndex(state, errors, entryPoint, index);
4486*8975f5c5SAndroid Build Coastguard Worker }
4487*8975f5c5SAndroid Build Coastguard Worker
ValidateGetFragDataLocation(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,const GLchar * name)4488*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFragDataLocation(const Context *context,
4489*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4490*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4491*8975f5c5SAndroid Build Coastguard Worker const GLchar *name)
4492*8975f5c5SAndroid Build Coastguard Worker {
4493*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4494*8975f5c5SAndroid Build Coastguard Worker {
4495*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4496*8975f5c5SAndroid Build Coastguard Worker return false;
4497*8975f5c5SAndroid Build Coastguard Worker }
4498*8975f5c5SAndroid Build Coastguard Worker
4499*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4500*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4501*8975f5c5SAndroid Build Coastguard Worker {
4502*8975f5c5SAndroid Build Coastguard Worker return false;
4503*8975f5c5SAndroid Build Coastguard Worker }
4504*8975f5c5SAndroid Build Coastguard Worker
4505*8975f5c5SAndroid Build Coastguard Worker if (!programObject->isLinked())
4506*8975f5c5SAndroid Build Coastguard Worker {
4507*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kProgramNotLinked);
4508*8975f5c5SAndroid Build Coastguard Worker return false;
4509*8975f5c5SAndroid Build Coastguard Worker }
4510*8975f5c5SAndroid Build Coastguard Worker
4511*8975f5c5SAndroid Build Coastguard Worker return true;
4512*8975f5c5SAndroid Build Coastguard Worker }
4513*8975f5c5SAndroid Build Coastguard Worker
ValidateGetUniformIndices(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLsizei uniformCount,const GLchar * const * uniformNames,const GLuint * uniformIndices)4514*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetUniformIndices(const Context *context,
4515*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4516*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4517*8975f5c5SAndroid Build Coastguard Worker GLsizei uniformCount,
4518*8975f5c5SAndroid Build Coastguard Worker const GLchar *const *uniformNames,
4519*8975f5c5SAndroid Build Coastguard Worker const GLuint *uniformIndices)
4520*8975f5c5SAndroid Build Coastguard Worker {
4521*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4522*8975f5c5SAndroid Build Coastguard Worker {
4523*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4524*8975f5c5SAndroid Build Coastguard Worker return false;
4525*8975f5c5SAndroid Build Coastguard Worker }
4526*8975f5c5SAndroid Build Coastguard Worker
4527*8975f5c5SAndroid Build Coastguard Worker if (uniformCount < 0)
4528*8975f5c5SAndroid Build Coastguard Worker {
4529*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeCount);
4530*8975f5c5SAndroid Build Coastguard Worker return false;
4531*8975f5c5SAndroid Build Coastguard Worker }
4532*8975f5c5SAndroid Build Coastguard Worker
4533*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4534*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4535*8975f5c5SAndroid Build Coastguard Worker {
4536*8975f5c5SAndroid Build Coastguard Worker return false;
4537*8975f5c5SAndroid Build Coastguard Worker }
4538*8975f5c5SAndroid Build Coastguard Worker
4539*8975f5c5SAndroid Build Coastguard Worker return true;
4540*8975f5c5SAndroid Build Coastguard Worker }
4541*8975f5c5SAndroid Build Coastguard Worker
ValidateGetActiveUniformsiv(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLsizei uniformCount,const GLuint * uniformIndices,GLenum pname,const GLint * params)4542*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetActiveUniformsiv(const Context *context,
4543*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4544*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4545*8975f5c5SAndroid Build Coastguard Worker GLsizei uniformCount,
4546*8975f5c5SAndroid Build Coastguard Worker const GLuint *uniformIndices,
4547*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4548*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
4549*8975f5c5SAndroid Build Coastguard Worker {
4550*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4551*8975f5c5SAndroid Build Coastguard Worker {
4552*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4553*8975f5c5SAndroid Build Coastguard Worker return false;
4554*8975f5c5SAndroid Build Coastguard Worker }
4555*8975f5c5SAndroid Build Coastguard Worker
4556*8975f5c5SAndroid Build Coastguard Worker if (uniformCount < 0)
4557*8975f5c5SAndroid Build Coastguard Worker {
4558*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeCount);
4559*8975f5c5SAndroid Build Coastguard Worker return false;
4560*8975f5c5SAndroid Build Coastguard Worker }
4561*8975f5c5SAndroid Build Coastguard Worker
4562*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4563*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4564*8975f5c5SAndroid Build Coastguard Worker {
4565*8975f5c5SAndroid Build Coastguard Worker return false;
4566*8975f5c5SAndroid Build Coastguard Worker }
4567*8975f5c5SAndroid Build Coastguard Worker
4568*8975f5c5SAndroid Build Coastguard Worker switch (pname)
4569*8975f5c5SAndroid Build Coastguard Worker {
4570*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_TYPE:
4571*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_SIZE:
4572*8975f5c5SAndroid Build Coastguard Worker break;
4573*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_NAME_LENGTH:
4574*8975f5c5SAndroid Build Coastguard Worker if (context->getExtensions().webglCompatibilityANGLE)
4575*8975f5c5SAndroid Build Coastguard Worker {
4576*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, pname);
4577*8975f5c5SAndroid Build Coastguard Worker return false;
4578*8975f5c5SAndroid Build Coastguard Worker }
4579*8975f5c5SAndroid Build Coastguard Worker break;
4580*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_BLOCK_INDEX:
4581*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_OFFSET:
4582*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_ARRAY_STRIDE:
4583*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_MATRIX_STRIDE:
4584*8975f5c5SAndroid Build Coastguard Worker case GL_UNIFORM_IS_ROW_MAJOR:
4585*8975f5c5SAndroid Build Coastguard Worker break;
4586*8975f5c5SAndroid Build Coastguard Worker
4587*8975f5c5SAndroid Build Coastguard Worker default:
4588*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, pname);
4589*8975f5c5SAndroid Build Coastguard Worker return false;
4590*8975f5c5SAndroid Build Coastguard Worker }
4591*8975f5c5SAndroid Build Coastguard Worker
4592*8975f5c5SAndroid Build Coastguard Worker const size_t programUniformCount = programObject->getExecutable().getUniforms().size();
4593*8975f5c5SAndroid Build Coastguard Worker if (uniformCount > static_cast<GLsizei>(programUniformCount))
4594*8975f5c5SAndroid Build Coastguard Worker {
4595*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
4596*8975f5c5SAndroid Build Coastguard Worker return false;
4597*8975f5c5SAndroid Build Coastguard Worker }
4598*8975f5c5SAndroid Build Coastguard Worker
4599*8975f5c5SAndroid Build Coastguard Worker for (int uniformId = 0; uniformId < uniformCount; uniformId++)
4600*8975f5c5SAndroid Build Coastguard Worker {
4601*8975f5c5SAndroid Build Coastguard Worker const GLuint index = uniformIndices[uniformId];
4602*8975f5c5SAndroid Build Coastguard Worker
4603*8975f5c5SAndroid Build Coastguard Worker if (index >= programUniformCount)
4604*8975f5c5SAndroid Build Coastguard Worker {
4605*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniform);
4606*8975f5c5SAndroid Build Coastguard Worker return false;
4607*8975f5c5SAndroid Build Coastguard Worker }
4608*8975f5c5SAndroid Build Coastguard Worker }
4609*8975f5c5SAndroid Build Coastguard Worker
4610*8975f5c5SAndroid Build Coastguard Worker return true;
4611*8975f5c5SAndroid Build Coastguard Worker }
4612*8975f5c5SAndroid Build Coastguard Worker
ValidateGetUniformBlockIndex(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,const GLchar * uniformBlockName)4613*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetUniformBlockIndex(const Context *context,
4614*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4615*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4616*8975f5c5SAndroid Build Coastguard Worker const GLchar *uniformBlockName)
4617*8975f5c5SAndroid Build Coastguard Worker {
4618*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4619*8975f5c5SAndroid Build Coastguard Worker {
4620*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4621*8975f5c5SAndroid Build Coastguard Worker return false;
4622*8975f5c5SAndroid Build Coastguard Worker }
4623*8975f5c5SAndroid Build Coastguard Worker
4624*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4625*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4626*8975f5c5SAndroid Build Coastguard Worker {
4627*8975f5c5SAndroid Build Coastguard Worker return false;
4628*8975f5c5SAndroid Build Coastguard Worker }
4629*8975f5c5SAndroid Build Coastguard Worker
4630*8975f5c5SAndroid Build Coastguard Worker return true;
4631*8975f5c5SAndroid Build Coastguard Worker }
4632*8975f5c5SAndroid Build Coastguard Worker
ValidateGetActiveUniformBlockiv(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,UniformBlockIndex uniformBlockIndex,GLenum pname,const GLint * params)4633*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetActiveUniformBlockiv(const Context *context,
4634*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4635*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4636*8975f5c5SAndroid Build Coastguard Worker UniformBlockIndex uniformBlockIndex,
4637*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4638*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
4639*8975f5c5SAndroid Build Coastguard Worker {
4640*8975f5c5SAndroid Build Coastguard Worker return ValidateGetActiveUniformBlockivBase(context, entryPoint, program, uniformBlockIndex,
4641*8975f5c5SAndroid Build Coastguard Worker pname, nullptr);
4642*8975f5c5SAndroid Build Coastguard Worker }
4643*8975f5c5SAndroid Build Coastguard Worker
ValidateGetActiveUniformBlockName(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,UniformBlockIndex uniformBlockIndex,GLsizei bufSize,const GLsizei * length,const GLchar * uniformBlockName)4644*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetActiveUniformBlockName(const Context *context,
4645*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4646*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4647*8975f5c5SAndroid Build Coastguard Worker UniformBlockIndex uniformBlockIndex,
4648*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
4649*8975f5c5SAndroid Build Coastguard Worker const GLsizei *length,
4650*8975f5c5SAndroid Build Coastguard Worker const GLchar *uniformBlockName)
4651*8975f5c5SAndroid Build Coastguard Worker {
4652*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4653*8975f5c5SAndroid Build Coastguard Worker {
4654*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4655*8975f5c5SAndroid Build Coastguard Worker return false;
4656*8975f5c5SAndroid Build Coastguard Worker }
4657*8975f5c5SAndroid Build Coastguard Worker
4658*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4659*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4660*8975f5c5SAndroid Build Coastguard Worker {
4661*8975f5c5SAndroid Build Coastguard Worker return false;
4662*8975f5c5SAndroid Build Coastguard Worker }
4663*8975f5c5SAndroid Build Coastguard Worker
4664*8975f5c5SAndroid Build Coastguard Worker if (uniformBlockIndex.value >= programObject->getExecutable().getUniformBlocks().size())
4665*8975f5c5SAndroid Build Coastguard Worker {
4666*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxActiveUniformBlock);
4667*8975f5c5SAndroid Build Coastguard Worker return false;
4668*8975f5c5SAndroid Build Coastguard Worker }
4669*8975f5c5SAndroid Build Coastguard Worker
4670*8975f5c5SAndroid Build Coastguard Worker return true;
4671*8975f5c5SAndroid Build Coastguard Worker }
4672*8975f5c5SAndroid Build Coastguard Worker
ValidateUniformBlockBinding(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,UniformBlockIndex uniformBlockIndex,GLuint uniformBlockBinding)4673*8975f5c5SAndroid Build Coastguard Worker bool ValidateUniformBlockBinding(const Context *context,
4674*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4675*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
4676*8975f5c5SAndroid Build Coastguard Worker UniformBlockIndex uniformBlockIndex,
4677*8975f5c5SAndroid Build Coastguard Worker GLuint uniformBlockBinding)
4678*8975f5c5SAndroid Build Coastguard Worker {
4679*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4680*8975f5c5SAndroid Build Coastguard Worker {
4681*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4682*8975f5c5SAndroid Build Coastguard Worker return false;
4683*8975f5c5SAndroid Build Coastguard Worker }
4684*8975f5c5SAndroid Build Coastguard Worker
4685*8975f5c5SAndroid Build Coastguard Worker if (uniformBlockBinding >= static_cast<GLuint>(context->getCaps().maxUniformBufferBindings))
4686*8975f5c5SAndroid Build Coastguard Worker {
4687*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxUniformBufferBindings);
4688*8975f5c5SAndroid Build Coastguard Worker return false;
4689*8975f5c5SAndroid Build Coastguard Worker }
4690*8975f5c5SAndroid Build Coastguard Worker
4691*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
4692*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
4693*8975f5c5SAndroid Build Coastguard Worker {
4694*8975f5c5SAndroid Build Coastguard Worker return false;
4695*8975f5c5SAndroid Build Coastguard Worker }
4696*8975f5c5SAndroid Build Coastguard Worker
4697*8975f5c5SAndroid Build Coastguard Worker // if never linked, there won't be any uniform blocks
4698*8975f5c5SAndroid Build Coastguard Worker if (uniformBlockIndex.value >= programObject->getExecutable().getUniformBlocks().size())
4699*8975f5c5SAndroid Build Coastguard Worker {
4700*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kIndexExceedsMaxUniformBufferBindings);
4701*8975f5c5SAndroid Build Coastguard Worker return false;
4702*8975f5c5SAndroid Build Coastguard Worker }
4703*8975f5c5SAndroid Build Coastguard Worker
4704*8975f5c5SAndroid Build Coastguard Worker return true;
4705*8975f5c5SAndroid Build Coastguard Worker }
4706*8975f5c5SAndroid Build Coastguard Worker
ValidateDrawArraysInstanced(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLint first,GLsizei count,GLsizei primcount)4707*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawArraysInstanced(const Context *context,
4708*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4709*8975f5c5SAndroid Build Coastguard Worker PrimitiveMode mode,
4710*8975f5c5SAndroid Build Coastguard Worker GLint first,
4711*8975f5c5SAndroid Build Coastguard Worker GLsizei count,
4712*8975f5c5SAndroid Build Coastguard Worker GLsizei primcount)
4713*8975f5c5SAndroid Build Coastguard Worker {
4714*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4715*8975f5c5SAndroid Build Coastguard Worker {
4716*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4717*8975f5c5SAndroid Build Coastguard Worker return false;
4718*8975f5c5SAndroid Build Coastguard Worker }
4719*8975f5c5SAndroid Build Coastguard Worker
4720*8975f5c5SAndroid Build Coastguard Worker return ValidateDrawArraysInstancedBase(context, entryPoint, mode, first, count, primcount, 0);
4721*8975f5c5SAndroid Build Coastguard Worker }
4722*8975f5c5SAndroid Build Coastguard Worker
ValidateFenceSync(const Context * context,angle::EntryPoint entryPoint,GLenum condition,GLbitfield flags)4723*8975f5c5SAndroid Build Coastguard Worker bool ValidateFenceSync(const Context *context,
4724*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4725*8975f5c5SAndroid Build Coastguard Worker GLenum condition,
4726*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags)
4727*8975f5c5SAndroid Build Coastguard Worker {
4728*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4729*8975f5c5SAndroid Build Coastguard Worker {
4730*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4731*8975f5c5SAndroid Build Coastguard Worker return false;
4732*8975f5c5SAndroid Build Coastguard Worker }
4733*8975f5c5SAndroid Build Coastguard Worker
4734*8975f5c5SAndroid Build Coastguard Worker if (condition != GL_SYNC_GPU_COMMANDS_COMPLETE)
4735*8975f5c5SAndroid Build Coastguard Worker {
4736*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFenceCondition);
4737*8975f5c5SAndroid Build Coastguard Worker return false;
4738*8975f5c5SAndroid Build Coastguard Worker }
4739*8975f5c5SAndroid Build Coastguard Worker
4740*8975f5c5SAndroid Build Coastguard Worker if (flags != 0)
4741*8975f5c5SAndroid Build Coastguard Worker {
4742*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidFlags);
4743*8975f5c5SAndroid Build Coastguard Worker return false;
4744*8975f5c5SAndroid Build Coastguard Worker }
4745*8975f5c5SAndroid Build Coastguard Worker
4746*8975f5c5SAndroid Build Coastguard Worker return true;
4747*8975f5c5SAndroid Build Coastguard Worker }
4748*8975f5c5SAndroid Build Coastguard Worker
ValidateIsSync(const Context * context,angle::EntryPoint entryPoint,SyncID syncPacked)4749*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsSync(const Context *context, angle::EntryPoint entryPoint, SyncID syncPacked)
4750*8975f5c5SAndroid Build Coastguard Worker {
4751*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4752*8975f5c5SAndroid Build Coastguard Worker {
4753*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4754*8975f5c5SAndroid Build Coastguard Worker return false;
4755*8975f5c5SAndroid Build Coastguard Worker }
4756*8975f5c5SAndroid Build Coastguard Worker
4757*8975f5c5SAndroid Build Coastguard Worker return true;
4758*8975f5c5SAndroid Build Coastguard Worker }
4759*8975f5c5SAndroid Build Coastguard Worker
ValidateDeleteSync(const Context * context,angle::EntryPoint entryPoint,SyncID syncPacked)4760*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteSync(const Context *context, angle::EntryPoint entryPoint, SyncID syncPacked)
4761*8975f5c5SAndroid Build Coastguard Worker {
4762*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4763*8975f5c5SAndroid Build Coastguard Worker {
4764*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4765*8975f5c5SAndroid Build Coastguard Worker return false;
4766*8975f5c5SAndroid Build Coastguard Worker }
4767*8975f5c5SAndroid Build Coastguard Worker
4768*8975f5c5SAndroid Build Coastguard Worker if (syncPacked.value != 0 && !context->getSync(syncPacked))
4769*8975f5c5SAndroid Build Coastguard Worker {
4770*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kSyncMissing);
4771*8975f5c5SAndroid Build Coastguard Worker return false;
4772*8975f5c5SAndroid Build Coastguard Worker }
4773*8975f5c5SAndroid Build Coastguard Worker
4774*8975f5c5SAndroid Build Coastguard Worker return true;
4775*8975f5c5SAndroid Build Coastguard Worker }
4776*8975f5c5SAndroid Build Coastguard Worker
ValidateClientWaitSync(const Context * context,angle::EntryPoint entryPoint,SyncID syncPacked,GLbitfield flags,GLuint64 timeout)4777*8975f5c5SAndroid Build Coastguard Worker bool ValidateClientWaitSync(const Context *context,
4778*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4779*8975f5c5SAndroid Build Coastguard Worker SyncID syncPacked,
4780*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags,
4781*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout)
4782*8975f5c5SAndroid Build Coastguard Worker {
4783*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4784*8975f5c5SAndroid Build Coastguard Worker {
4785*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4786*8975f5c5SAndroid Build Coastguard Worker return false;
4787*8975f5c5SAndroid Build Coastguard Worker }
4788*8975f5c5SAndroid Build Coastguard Worker
4789*8975f5c5SAndroid Build Coastguard Worker if ((flags & ~(GL_SYNC_FLUSH_COMMANDS_BIT)) != 0)
4790*8975f5c5SAndroid Build Coastguard Worker {
4791*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidFlags);
4792*8975f5c5SAndroid Build Coastguard Worker return false;
4793*8975f5c5SAndroid Build Coastguard Worker }
4794*8975f5c5SAndroid Build Coastguard Worker
4795*8975f5c5SAndroid Build Coastguard Worker Sync *clientWaitSync = context->getSync(syncPacked);
4796*8975f5c5SAndroid Build Coastguard Worker if (!clientWaitSync)
4797*8975f5c5SAndroid Build Coastguard Worker {
4798*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kSyncMissing);
4799*8975f5c5SAndroid Build Coastguard Worker return false;
4800*8975f5c5SAndroid Build Coastguard Worker }
4801*8975f5c5SAndroid Build Coastguard Worker
4802*8975f5c5SAndroid Build Coastguard Worker return true;
4803*8975f5c5SAndroid Build Coastguard Worker }
4804*8975f5c5SAndroid Build Coastguard Worker
ValidateWaitSync(const Context * context,angle::EntryPoint entryPoint,SyncID syncPacked,GLbitfield flags,GLuint64 timeout)4805*8975f5c5SAndroid Build Coastguard Worker bool ValidateWaitSync(const Context *context,
4806*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4807*8975f5c5SAndroid Build Coastguard Worker SyncID syncPacked,
4808*8975f5c5SAndroid Build Coastguard Worker GLbitfield flags,
4809*8975f5c5SAndroid Build Coastguard Worker GLuint64 timeout)
4810*8975f5c5SAndroid Build Coastguard Worker {
4811*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4812*8975f5c5SAndroid Build Coastguard Worker {
4813*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4814*8975f5c5SAndroid Build Coastguard Worker return false;
4815*8975f5c5SAndroid Build Coastguard Worker }
4816*8975f5c5SAndroid Build Coastguard Worker
4817*8975f5c5SAndroid Build Coastguard Worker if (flags != 0)
4818*8975f5c5SAndroid Build Coastguard Worker {
4819*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidFlags);
4820*8975f5c5SAndroid Build Coastguard Worker return false;
4821*8975f5c5SAndroid Build Coastguard Worker }
4822*8975f5c5SAndroid Build Coastguard Worker
4823*8975f5c5SAndroid Build Coastguard Worker if (timeout != GL_TIMEOUT_IGNORED)
4824*8975f5c5SAndroid Build Coastguard Worker {
4825*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidTimeout);
4826*8975f5c5SAndroid Build Coastguard Worker return false;
4827*8975f5c5SAndroid Build Coastguard Worker }
4828*8975f5c5SAndroid Build Coastguard Worker
4829*8975f5c5SAndroid Build Coastguard Worker Sync *waitSync = context->getSync(syncPacked);
4830*8975f5c5SAndroid Build Coastguard Worker if (!waitSync)
4831*8975f5c5SAndroid Build Coastguard Worker {
4832*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kSyncMissing);
4833*8975f5c5SAndroid Build Coastguard Worker return false;
4834*8975f5c5SAndroid Build Coastguard Worker }
4835*8975f5c5SAndroid Build Coastguard Worker
4836*8975f5c5SAndroid Build Coastguard Worker return true;
4837*8975f5c5SAndroid Build Coastguard Worker }
4838*8975f5c5SAndroid Build Coastguard Worker
ValidateGetInteger64v(const Context * context,angle::EntryPoint entryPoint,GLenum pname,const GLint64 * params)4839*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetInteger64v(const Context *context,
4840*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4841*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4842*8975f5c5SAndroid Build Coastguard Worker const GLint64 *params)
4843*8975f5c5SAndroid Build Coastguard Worker {
4844*8975f5c5SAndroid Build Coastguard Worker if ((context->getClientMajorVersion() < 3) && !context->getExtensions().syncARB)
4845*8975f5c5SAndroid Build Coastguard Worker {
4846*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4847*8975f5c5SAndroid Build Coastguard Worker return false;
4848*8975f5c5SAndroid Build Coastguard Worker }
4849*8975f5c5SAndroid Build Coastguard Worker
4850*8975f5c5SAndroid Build Coastguard Worker GLenum nativeType = GL_NONE;
4851*8975f5c5SAndroid Build Coastguard Worker unsigned int numParams = 0;
4852*8975f5c5SAndroid Build Coastguard Worker if (!ValidateStateQuery(context, entryPoint, pname, &nativeType, &numParams))
4853*8975f5c5SAndroid Build Coastguard Worker {
4854*8975f5c5SAndroid Build Coastguard Worker return false;
4855*8975f5c5SAndroid Build Coastguard Worker }
4856*8975f5c5SAndroid Build Coastguard Worker
4857*8975f5c5SAndroid Build Coastguard Worker return true;
4858*8975f5c5SAndroid Build Coastguard Worker }
4859*8975f5c5SAndroid Build Coastguard Worker
ValidateIsSampler(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler)4860*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsSampler(const Context *context, angle::EntryPoint entryPoint, SamplerID sampler)
4861*8975f5c5SAndroid Build Coastguard Worker {
4862*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4863*8975f5c5SAndroid Build Coastguard Worker {
4864*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4865*8975f5c5SAndroid Build Coastguard Worker return false;
4866*8975f5c5SAndroid Build Coastguard Worker }
4867*8975f5c5SAndroid Build Coastguard Worker
4868*8975f5c5SAndroid Build Coastguard Worker return true;
4869*8975f5c5SAndroid Build Coastguard Worker }
4870*8975f5c5SAndroid Build Coastguard Worker
ValidateBindSampler(const Context * context,angle::EntryPoint entryPoint,GLuint unit,SamplerID sampler)4871*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindSampler(const Context *context,
4872*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4873*8975f5c5SAndroid Build Coastguard Worker GLuint unit,
4874*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler)
4875*8975f5c5SAndroid Build Coastguard Worker {
4876*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4877*8975f5c5SAndroid Build Coastguard Worker {
4878*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4879*8975f5c5SAndroid Build Coastguard Worker return false;
4880*8975f5c5SAndroid Build Coastguard Worker }
4881*8975f5c5SAndroid Build Coastguard Worker
4882*8975f5c5SAndroid Build Coastguard Worker if (GetIDValue(sampler) != 0 && !context->isSampler(sampler))
4883*8975f5c5SAndroid Build Coastguard Worker {
4884*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidSampler);
4885*8975f5c5SAndroid Build Coastguard Worker return false;
4886*8975f5c5SAndroid Build Coastguard Worker }
4887*8975f5c5SAndroid Build Coastguard Worker
4888*8975f5c5SAndroid Build Coastguard Worker if (unit >= static_cast<GLuint>(context->getCaps().maxCombinedTextureImageUnits))
4889*8975f5c5SAndroid Build Coastguard Worker {
4890*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidCombinedImageUnit);
4891*8975f5c5SAndroid Build Coastguard Worker return false;
4892*8975f5c5SAndroid Build Coastguard Worker }
4893*8975f5c5SAndroid Build Coastguard Worker
4894*8975f5c5SAndroid Build Coastguard Worker return true;
4895*8975f5c5SAndroid Build Coastguard Worker }
4896*8975f5c5SAndroid Build Coastguard Worker
ValidateVertexAttribDivisor(const Context * context,angle::EntryPoint entryPoint,GLuint index,GLuint divisor)4897*8975f5c5SAndroid Build Coastguard Worker bool ValidateVertexAttribDivisor(const Context *context,
4898*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4899*8975f5c5SAndroid Build Coastguard Worker GLuint index,
4900*8975f5c5SAndroid Build Coastguard Worker GLuint divisor)
4901*8975f5c5SAndroid Build Coastguard Worker {
4902*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4903*8975f5c5SAndroid Build Coastguard Worker {
4904*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4905*8975f5c5SAndroid Build Coastguard Worker return false;
4906*8975f5c5SAndroid Build Coastguard Worker }
4907*8975f5c5SAndroid Build Coastguard Worker
4908*8975f5c5SAndroid Build Coastguard Worker return ValidateVertexAttribIndex(context->getPrivateState(),
4909*8975f5c5SAndroid Build Coastguard Worker context->getMutableErrorSetForValidation(), entryPoint, index);
4910*8975f5c5SAndroid Build Coastguard Worker }
4911*8975f5c5SAndroid Build Coastguard Worker
ValidateTexStorage2D(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height)4912*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorage2D(const Context *context,
4913*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4914*8975f5c5SAndroid Build Coastguard Worker TextureType target,
4915*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
4916*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
4917*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
4918*8975f5c5SAndroid Build Coastguard Worker GLsizei height)
4919*8975f5c5SAndroid Build Coastguard Worker {
4920*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4921*8975f5c5SAndroid Build Coastguard Worker {
4922*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4923*8975f5c5SAndroid Build Coastguard Worker return false;
4924*8975f5c5SAndroid Build Coastguard Worker }
4925*8975f5c5SAndroid Build Coastguard Worker
4926*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorage2DParameters(context, entryPoint, target, levels, internalformat,
4927*8975f5c5SAndroid Build Coastguard Worker width, height, 1))
4928*8975f5c5SAndroid Build Coastguard Worker {
4929*8975f5c5SAndroid Build Coastguard Worker return false;
4930*8975f5c5SAndroid Build Coastguard Worker }
4931*8975f5c5SAndroid Build Coastguard Worker
4932*8975f5c5SAndroid Build Coastguard Worker return true;
4933*8975f5c5SAndroid Build Coastguard Worker }
4934*8975f5c5SAndroid Build Coastguard Worker
ValidateTexStorage3D(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth)4935*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorage3D(const Context *context,
4936*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4937*8975f5c5SAndroid Build Coastguard Worker TextureType target,
4938*8975f5c5SAndroid Build Coastguard Worker GLsizei levels,
4939*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
4940*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
4941*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
4942*8975f5c5SAndroid Build Coastguard Worker GLsizei depth)
4943*8975f5c5SAndroid Build Coastguard Worker {
4944*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
4945*8975f5c5SAndroid Build Coastguard Worker {
4946*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
4947*8975f5c5SAndroid Build Coastguard Worker return false;
4948*8975f5c5SAndroid Build Coastguard Worker }
4949*8975f5c5SAndroid Build Coastguard Worker
4950*8975f5c5SAndroid Build Coastguard Worker if (!ValidateES3TexStorage3DParameters(context, entryPoint, target, levels, internalformat,
4951*8975f5c5SAndroid Build Coastguard Worker width, height, depth))
4952*8975f5c5SAndroid Build Coastguard Worker {
4953*8975f5c5SAndroid Build Coastguard Worker return false;
4954*8975f5c5SAndroid Build Coastguard Worker }
4955*8975f5c5SAndroid Build Coastguard Worker
4956*8975f5c5SAndroid Build Coastguard Worker return true;
4957*8975f5c5SAndroid Build Coastguard Worker }
4958*8975f5c5SAndroid Build Coastguard Worker
ValidateGetBufferParameteri64v(const Context * context,angle::EntryPoint entryPoint,BufferBinding target,GLenum pname,const GLint64 * params)4959*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetBufferParameteri64v(const Context *context,
4960*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4961*8975f5c5SAndroid Build Coastguard Worker BufferBinding target,
4962*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4963*8975f5c5SAndroid Build Coastguard Worker const GLint64 *params)
4964*8975f5c5SAndroid Build Coastguard Worker {
4965*8975f5c5SAndroid Build Coastguard Worker return ValidateGetBufferParameterBase(context, entryPoint, target, pname, false, nullptr);
4966*8975f5c5SAndroid Build Coastguard Worker }
4967*8975f5c5SAndroid Build Coastguard Worker
ValidateGetSamplerParameterfv(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLfloat * params)4968*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameterfv(const Context *context,
4969*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4970*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
4971*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4972*8975f5c5SAndroid Build Coastguard Worker const GLfloat *params)
4973*8975f5c5SAndroid Build Coastguard Worker {
4974*8975f5c5SAndroid Build Coastguard Worker return ValidateGetSamplerParameterBase(context, entryPoint, sampler, pname, nullptr);
4975*8975f5c5SAndroid Build Coastguard Worker }
4976*8975f5c5SAndroid Build Coastguard Worker
ValidateGetSamplerParameteriv(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLint * params)4977*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameteriv(const Context *context,
4978*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4979*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
4980*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4981*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
4982*8975f5c5SAndroid Build Coastguard Worker {
4983*8975f5c5SAndroid Build Coastguard Worker return ValidateGetSamplerParameterBase(context, entryPoint, sampler, pname, nullptr);
4984*8975f5c5SAndroid Build Coastguard Worker }
4985*8975f5c5SAndroid Build Coastguard Worker
ValidateSamplerParameterf(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,GLfloat param)4986*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterf(const Context *context,
4987*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4988*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
4989*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4990*8975f5c5SAndroid Build Coastguard Worker GLfloat param)
4991*8975f5c5SAndroid Build Coastguard Worker {
4992*8975f5c5SAndroid Build Coastguard Worker return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, false, ¶m);
4993*8975f5c5SAndroid Build Coastguard Worker }
4994*8975f5c5SAndroid Build Coastguard Worker
ValidateSamplerParameterfv(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLfloat * params)4995*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterfv(const Context *context,
4996*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
4997*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
4998*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
4999*8975f5c5SAndroid Build Coastguard Worker const GLfloat *params)
5000*8975f5c5SAndroid Build Coastguard Worker {
5001*8975f5c5SAndroid Build Coastguard Worker return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, true, params);
5002*8975f5c5SAndroid Build Coastguard Worker }
5003*8975f5c5SAndroid Build Coastguard Worker
ValidateSamplerParameteri(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,GLint param)5004*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameteri(const Context *context,
5005*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5006*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
5007*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5008*8975f5c5SAndroid Build Coastguard Worker GLint param)
5009*8975f5c5SAndroid Build Coastguard Worker {
5010*8975f5c5SAndroid Build Coastguard Worker return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, false, ¶m);
5011*8975f5c5SAndroid Build Coastguard Worker }
5012*8975f5c5SAndroid Build Coastguard Worker
ValidateSamplerParameteriv(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLint * params)5013*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameteriv(const Context *context,
5014*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5015*8975f5c5SAndroid Build Coastguard Worker SamplerID sampler,
5016*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5017*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
5018*8975f5c5SAndroid Build Coastguard Worker {
5019*8975f5c5SAndroid Build Coastguard Worker return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, true, params);
5020*8975f5c5SAndroid Build Coastguard Worker }
5021*8975f5c5SAndroid Build Coastguard Worker
ValidateGetVertexAttribIiv(const Context * context,angle::EntryPoint entryPoint,GLuint index,GLenum pname,const GLint * params)5022*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetVertexAttribIiv(const Context *context,
5023*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5024*8975f5c5SAndroid Build Coastguard Worker GLuint index,
5025*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5026*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
5027*8975f5c5SAndroid Build Coastguard Worker {
5028*8975f5c5SAndroid Build Coastguard Worker return ValidateGetVertexAttribBase(context, entryPoint, index, pname, nullptr, false, true);
5029*8975f5c5SAndroid Build Coastguard Worker }
5030*8975f5c5SAndroid Build Coastguard Worker
ValidateGetVertexAttribIuiv(const Context * context,angle::EntryPoint entryPoint,GLuint index,GLenum pname,const GLuint * params)5031*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetVertexAttribIuiv(const Context *context,
5032*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5033*8975f5c5SAndroid Build Coastguard Worker GLuint index,
5034*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5035*8975f5c5SAndroid Build Coastguard Worker const GLuint *params)
5036*8975f5c5SAndroid Build Coastguard Worker {
5037*8975f5c5SAndroid Build Coastguard Worker return ValidateGetVertexAttribBase(context, entryPoint, index, pname, nullptr, false, true);
5038*8975f5c5SAndroid Build Coastguard Worker }
5039*8975f5c5SAndroid Build Coastguard Worker
ValidateGetInternalformativ(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum internalformat,GLenum pname,GLsizei bufSize,const GLint * params)5040*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetInternalformativ(const Context *context,
5041*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5042*8975f5c5SAndroid Build Coastguard Worker GLenum target,
5043*8975f5c5SAndroid Build Coastguard Worker GLenum internalformat,
5044*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5045*8975f5c5SAndroid Build Coastguard Worker GLsizei bufSize,
5046*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
5047*8975f5c5SAndroid Build Coastguard Worker {
5048*8975f5c5SAndroid Build Coastguard Worker return ValidateGetInternalFormativBase(context, entryPoint, target, internalformat, pname,
5049*8975f5c5SAndroid Build Coastguard Worker bufSize, nullptr);
5050*8975f5c5SAndroid Build Coastguard Worker }
5051*8975f5c5SAndroid Build Coastguard Worker
ValidateBindFragDataLocationIndexedEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLuint colorNumber,GLuint index,const char * name)5052*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindFragDataLocationIndexedEXT(const Context *context,
5053*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5054*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
5055*8975f5c5SAndroid Build Coastguard Worker GLuint colorNumber,
5056*8975f5c5SAndroid Build Coastguard Worker GLuint index,
5057*8975f5c5SAndroid Build Coastguard Worker const char *name)
5058*8975f5c5SAndroid Build Coastguard Worker {
5059*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().blendFuncExtendedEXT)
5060*8975f5c5SAndroid Build Coastguard Worker {
5061*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
5062*8975f5c5SAndroid Build Coastguard Worker return false;
5063*8975f5c5SAndroid Build Coastguard Worker }
5064*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
5065*8975f5c5SAndroid Build Coastguard Worker {
5066*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
5067*8975f5c5SAndroid Build Coastguard Worker return false;
5068*8975f5c5SAndroid Build Coastguard Worker }
5069*8975f5c5SAndroid Build Coastguard Worker if (index > 1)
5070*8975f5c5SAndroid Build Coastguard Worker {
5071*8975f5c5SAndroid Build Coastguard Worker // This error is not explicitly specified but the spec does say that "<index> may be zero or
5072*8975f5c5SAndroid Build Coastguard Worker // one to specify that the color be used as either the first or second color input to the
5073*8975f5c5SAndroid Build Coastguard Worker // blend equation, respectively"
5074*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFragDataBindingIndexOutOfRange);
5075*8975f5c5SAndroid Build Coastguard Worker return false;
5076*8975f5c5SAndroid Build Coastguard Worker }
5077*8975f5c5SAndroid Build Coastguard Worker if (index == 1)
5078*8975f5c5SAndroid Build Coastguard Worker {
5079*8975f5c5SAndroid Build Coastguard Worker if (colorNumber >= context->getCaps().maxDualSourceDrawBuffers)
5080*8975f5c5SAndroid Build Coastguard Worker {
5081*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE,
5082*8975f5c5SAndroid Build Coastguard Worker kColorNumberGreaterThanMaxDualSourceDrawBuffers);
5083*8975f5c5SAndroid Build Coastguard Worker return false;
5084*8975f5c5SAndroid Build Coastguard Worker }
5085*8975f5c5SAndroid Build Coastguard Worker }
5086*8975f5c5SAndroid Build Coastguard Worker else
5087*8975f5c5SAndroid Build Coastguard Worker {
5088*8975f5c5SAndroid Build Coastguard Worker if (colorNumber >= static_cast<GLuint>(context->getCaps().maxDrawBuffers))
5089*8975f5c5SAndroid Build Coastguard Worker {
5090*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kColorNumberGreaterThanMaxDrawBuffers);
5091*8975f5c5SAndroid Build Coastguard Worker return false;
5092*8975f5c5SAndroid Build Coastguard Worker }
5093*8975f5c5SAndroid Build Coastguard Worker }
5094*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
5095*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
5096*8975f5c5SAndroid Build Coastguard Worker {
5097*8975f5c5SAndroid Build Coastguard Worker return false;
5098*8975f5c5SAndroid Build Coastguard Worker }
5099*8975f5c5SAndroid Build Coastguard Worker return true;
5100*8975f5c5SAndroid Build Coastguard Worker }
5101*8975f5c5SAndroid Build Coastguard Worker
ValidateBindFragDataLocationEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,GLuint colorNumber,const char * name)5102*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindFragDataLocationEXT(const Context *context,
5103*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5104*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
5105*8975f5c5SAndroid Build Coastguard Worker GLuint colorNumber,
5106*8975f5c5SAndroid Build Coastguard Worker const char *name)
5107*8975f5c5SAndroid Build Coastguard Worker {
5108*8975f5c5SAndroid Build Coastguard Worker return ValidateBindFragDataLocationIndexedEXT(context, entryPoint, program, colorNumber, 0u,
5109*8975f5c5SAndroid Build Coastguard Worker name);
5110*8975f5c5SAndroid Build Coastguard Worker }
5111*8975f5c5SAndroid Build Coastguard Worker
ValidateGetFragDataIndexEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID program,const char * name)5112*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFragDataIndexEXT(const Context *context,
5113*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5114*8975f5c5SAndroid Build Coastguard Worker ShaderProgramID program,
5115*8975f5c5SAndroid Build Coastguard Worker const char *name)
5116*8975f5c5SAndroid Build Coastguard Worker {
5117*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().blendFuncExtendedEXT)
5118*8975f5c5SAndroid Build Coastguard Worker {
5119*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
5120*8975f5c5SAndroid Build Coastguard Worker return false;
5121*8975f5c5SAndroid Build Coastguard Worker }
5122*8975f5c5SAndroid Build Coastguard Worker if (context->getClientMajorVersion() < 3)
5123*8975f5c5SAndroid Build Coastguard Worker {
5124*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
5125*8975f5c5SAndroid Build Coastguard Worker return false;
5126*8975f5c5SAndroid Build Coastguard Worker }
5127*8975f5c5SAndroid Build Coastguard Worker Program *programObject = GetValidProgram(context, entryPoint, program);
5128*8975f5c5SAndroid Build Coastguard Worker if (!programObject)
5129*8975f5c5SAndroid Build Coastguard Worker {
5130*8975f5c5SAndroid Build Coastguard Worker return false;
5131*8975f5c5SAndroid Build Coastguard Worker }
5132*8975f5c5SAndroid Build Coastguard Worker if (!programObject->isLinked())
5133*8975f5c5SAndroid Build Coastguard Worker {
5134*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kProgramNotLinked);
5135*8975f5c5SAndroid Build Coastguard Worker return false;
5136*8975f5c5SAndroid Build Coastguard Worker }
5137*8975f5c5SAndroid Build Coastguard Worker return true;
5138*8975f5c5SAndroid Build Coastguard Worker }
5139*8975f5c5SAndroid Build Coastguard Worker
ValidateTexStorage2DMultisampleANGLE(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations)5140*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorage2DMultisampleANGLE(const Context *context,
5141*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5142*8975f5c5SAndroid Build Coastguard Worker TextureType target,
5143*8975f5c5SAndroid Build Coastguard Worker GLsizei samples,
5144*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat,
5145*8975f5c5SAndroid Build Coastguard Worker GLsizei width,
5146*8975f5c5SAndroid Build Coastguard Worker GLsizei height,
5147*8975f5c5SAndroid Build Coastguard Worker GLboolean fixedSampleLocations)
5148*8975f5c5SAndroid Build Coastguard Worker {
5149*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().textureMultisampleANGLE)
5150*8975f5c5SAndroid Build Coastguard Worker {
5151*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMultisampleTextureExtensionOrES31Required);
5152*8975f5c5SAndroid Build Coastguard Worker return false;
5153*8975f5c5SAndroid Build Coastguard Worker }
5154*8975f5c5SAndroid Build Coastguard Worker
5155*8975f5c5SAndroid Build Coastguard Worker return ValidateTexStorage2DMultisampleBase(context, entryPoint, target, samples, internalFormat,
5156*8975f5c5SAndroid Build Coastguard Worker width, height);
5157*8975f5c5SAndroid Build Coastguard Worker }
5158*8975f5c5SAndroid Build Coastguard Worker
ValidateGetTexLevelParameterfvANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum pname,const GLfloat * params)5159*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexLevelParameterfvANGLE(const Context *context,
5160*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5161*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
5162*8975f5c5SAndroid Build Coastguard Worker GLint level,
5163*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5164*8975f5c5SAndroid Build Coastguard Worker const GLfloat *params)
5165*8975f5c5SAndroid Build Coastguard Worker {
5166*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().getTexLevelParameterANGLE)
5167*8975f5c5SAndroid Build Coastguard Worker {
5168*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
5169*8975f5c5SAndroid Build Coastguard Worker return false;
5170*8975f5c5SAndroid Build Coastguard Worker }
5171*8975f5c5SAndroid Build Coastguard Worker
5172*8975f5c5SAndroid Build Coastguard Worker return ValidateGetTexLevelParameterBase(context, entryPoint, target, level, pname, nullptr);
5173*8975f5c5SAndroid Build Coastguard Worker }
5174*8975f5c5SAndroid Build Coastguard Worker
ValidateGetTexLevelParameterivANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum pname,const GLint * params)5175*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexLevelParameterivANGLE(const Context *context,
5176*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5177*8975f5c5SAndroid Build Coastguard Worker TextureTarget target,
5178*8975f5c5SAndroid Build Coastguard Worker GLint level,
5179*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5180*8975f5c5SAndroid Build Coastguard Worker const GLint *params)
5181*8975f5c5SAndroid Build Coastguard Worker {
5182*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().getTexLevelParameterANGLE)
5183*8975f5c5SAndroid Build Coastguard Worker {
5184*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
5185*8975f5c5SAndroid Build Coastguard Worker return false;
5186*8975f5c5SAndroid Build Coastguard Worker }
5187*8975f5c5SAndroid Build Coastguard Worker
5188*8975f5c5SAndroid Build Coastguard Worker return ValidateGetTexLevelParameterBase(context, entryPoint, target, level, pname, nullptr);
5189*8975f5c5SAndroid Build Coastguard Worker }
5190*8975f5c5SAndroid Build Coastguard Worker
ValidateGetMultisamplefvANGLE(const Context * context,angle::EntryPoint entryPoint,GLenum pname,GLuint index,const GLfloat * val)5191*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetMultisamplefvANGLE(const Context *context,
5192*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5193*8975f5c5SAndroid Build Coastguard Worker GLenum pname,
5194*8975f5c5SAndroid Build Coastguard Worker GLuint index,
5195*8975f5c5SAndroid Build Coastguard Worker const GLfloat *val)
5196*8975f5c5SAndroid Build Coastguard Worker {
5197*8975f5c5SAndroid Build Coastguard Worker if (!context->getExtensions().textureMultisampleANGLE)
5198*8975f5c5SAndroid Build Coastguard Worker {
5199*8975f5c5SAndroid Build Coastguard Worker ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMultisampleTextureExtensionOrES31Required);
5200*8975f5c5SAndroid Build Coastguard Worker return false;
5201*8975f5c5SAndroid Build Coastguard Worker }
5202*8975f5c5SAndroid Build Coastguard Worker
5203*8975f5c5SAndroid Build Coastguard Worker return ValidateGetMultisamplefvBase(context, entryPoint, pname, index, val);
5204*8975f5c5SAndroid Build Coastguard Worker }
5205*8975f5c5SAndroid Build Coastguard Worker
ValidateSampleMaskiANGLE(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint maskNumber,GLbitfield mask)5206*8975f5c5SAndroid Build Coastguard Worker bool ValidateSampleMaskiANGLE(const PrivateState &state,
5207*8975f5c5SAndroid Build Coastguard Worker ErrorSet *errors,
5208*8975f5c5SAndroid Build Coastguard Worker angle::EntryPoint entryPoint,
5209*8975f5c5SAndroid Build Coastguard Worker GLuint maskNumber,
5210*8975f5c5SAndroid Build Coastguard Worker GLbitfield mask)
5211*8975f5c5SAndroid Build Coastguard Worker {
5212*8975f5c5SAndroid Build Coastguard Worker if (!state.getExtensions().textureMultisampleANGLE)
5213*8975f5c5SAndroid Build Coastguard Worker {
5214*8975f5c5SAndroid Build Coastguard Worker errors->validationError(entryPoint, GL_INVALID_OPERATION,
5215*8975f5c5SAndroid Build Coastguard Worker kMultisampleTextureExtensionOrES31Required);
5216*8975f5c5SAndroid Build Coastguard Worker return false;
5217*8975f5c5SAndroid Build Coastguard Worker }
5218*8975f5c5SAndroid Build Coastguard Worker
5219*8975f5c5SAndroid Build Coastguard Worker return ValidateSampleMaskiBase(state, errors, entryPoint, maskNumber, mask);
5220*8975f5c5SAndroid Build Coastguard Worker }
5221*8975f5c5SAndroid Build Coastguard Worker } // namespace gl
5222