xref: /aosp_15_r20/external/angle/src/libANGLE/validationESEXT.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // validationESEXT.cpp: Validation functions for OpenGL ES extension entry points.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationESEXT_autogen.h"
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Display.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/ErrorStrings.h"
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/MemoryObject.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/PixelLocalStorage.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES2.h"
17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES3.h"
18*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES31.h"
19*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/validationES32.h"
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker #include <optional>
22*8975f5c5SAndroid Build Coastguard Worker 
23*8975f5c5SAndroid Build Coastguard Worker namespace gl
24*8975f5c5SAndroid Build Coastguard Worker {
25*8975f5c5SAndroid Build Coastguard Worker using namespace err;
26*8975f5c5SAndroid Build Coastguard Worker 
27*8975f5c5SAndroid Build Coastguard Worker namespace
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker template <typename ObjectT>
ValidateGetImageFormatAndType(const Context * context,angle::EntryPoint entryPoint,ObjectT * obj,GLenum format,GLenum type)30*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetImageFormatAndType(const Context *context,
31*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
32*8975f5c5SAndroid Build Coastguard Worker                                    ObjectT *obj,
33*8975f5c5SAndroid Build Coastguard Worker                                    GLenum format,
34*8975f5c5SAndroid Build Coastguard Worker                                    GLenum type)
35*8975f5c5SAndroid Build Coastguard Worker {
36*8975f5c5SAndroid Build Coastguard Worker     GLenum implFormat = obj->getImplementationColorReadFormat(context);
37*8975f5c5SAndroid Build Coastguard Worker     if (!ValidES3Format(format) && (format != implFormat || format == GL_NONE))
38*8975f5c5SAndroid Build Coastguard Worker     {
39*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidFormat);
40*8975f5c5SAndroid Build Coastguard Worker         return false;
41*8975f5c5SAndroid Build Coastguard Worker     }
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker     GLenum implType = obj->getImplementationColorReadType(context);
44*8975f5c5SAndroid Build Coastguard Worker     if (!ValidES3Type(type) && (type != implType || type == GL_NONE))
45*8975f5c5SAndroid Build Coastguard Worker     {
46*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
47*8975f5c5SAndroid Build Coastguard Worker         return false;
48*8975f5c5SAndroid Build Coastguard Worker     }
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     // Format/type combinations are not yet validated.
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     return true;
53*8975f5c5SAndroid Build Coastguard Worker }
54*8975f5c5SAndroid Build Coastguard Worker 
IsValidImageLayout(ImageLayout layout)55*8975f5c5SAndroid Build Coastguard Worker bool IsValidImageLayout(ImageLayout layout)
56*8975f5c5SAndroid Build Coastguard Worker {
57*8975f5c5SAndroid Build Coastguard Worker     switch (layout)
58*8975f5c5SAndroid Build Coastguard Worker     {
59*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::Undefined:
60*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::General:
61*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::ColorAttachment:
62*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::DepthStencilAttachment:
63*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::DepthStencilReadOnlyAttachment:
64*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::ShaderReadOnly:
65*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::TransferSrc:
66*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::TransferDst:
67*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::DepthReadOnlyStencilAttachment:
68*8975f5c5SAndroid Build Coastguard Worker         case ImageLayout::DepthAttachmentStencilReadOnly:
69*8975f5c5SAndroid Build Coastguard Worker             return true;
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker         default:
72*8975f5c5SAndroid Build Coastguard Worker             return false;
73*8975f5c5SAndroid Build Coastguard Worker     }
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker 
IsValidMemoryObjectParamater(const Context * context,angle::EntryPoint entryPoint,GLenum pname)76*8975f5c5SAndroid Build Coastguard Worker bool IsValidMemoryObjectParamater(const Context *context,
77*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
78*8975f5c5SAndroid Build Coastguard Worker                                   GLenum pname)
79*8975f5c5SAndroid Build Coastguard Worker {
80*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
81*8975f5c5SAndroid Build Coastguard Worker     {
82*8975f5c5SAndroid Build Coastguard Worker         case GL_DEDICATED_MEMORY_OBJECT_EXT:
83*8975f5c5SAndroid Build Coastguard Worker             return true;
84*8975f5c5SAndroid Build Coastguard Worker 
85*8975f5c5SAndroid Build Coastguard Worker         case GL_PROTECTED_MEMORY_OBJECT_EXT:
86*8975f5c5SAndroid Build Coastguard Worker             if (!context->getExtensions().protectedTexturesEXT)
87*8975f5c5SAndroid Build Coastguard Worker             {
88*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
89*8975f5c5SAndroid Build Coastguard Worker                 return false;
90*8975f5c5SAndroid Build Coastguard Worker             }
91*8975f5c5SAndroid Build Coastguard Worker             return true;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker         default:
94*8975f5c5SAndroid Build Coastguard Worker             return false;
95*8975f5c5SAndroid Build Coastguard Worker     }
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker 
ValidateObjectIdentifierAndName(const Context * context,angle::EntryPoint entryPoint,GLenum identifier,GLuint name)98*8975f5c5SAndroid Build Coastguard Worker bool ValidateObjectIdentifierAndName(const Context *context,
99*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
100*8975f5c5SAndroid Build Coastguard Worker                                      GLenum identifier,
101*8975f5c5SAndroid Build Coastguard Worker                                      GLuint name)
102*8975f5c5SAndroid Build Coastguard Worker {
103*8975f5c5SAndroid Build Coastguard Worker     bool isGLES11 = context->getClientVersion() == Version(1, 1);
104*8975f5c5SAndroid Build Coastguard Worker     bool isGLES3  = context->getClientMajorVersion() >= 3;
105*8975f5c5SAndroid Build Coastguard Worker     bool isGLES31 = context->getClientVersion() >= Version(3, 1);
106*8975f5c5SAndroid Build Coastguard Worker     switch (identifier)
107*8975f5c5SAndroid Build Coastguard Worker     {
108*8975f5c5SAndroid Build Coastguard Worker         case GL_BUFFER_OBJECT_EXT:
109*8975f5c5SAndroid Build Coastguard Worker             if (context->getBuffer({name}) == nullptr)
110*8975f5c5SAndroid Build Coastguard Worker             {
111*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidBufferName);
112*8975f5c5SAndroid Build Coastguard Worker                 return false;
113*8975f5c5SAndroid Build Coastguard Worker             }
114*8975f5c5SAndroid Build Coastguard Worker             return true;
115*8975f5c5SAndroid Build Coastguard Worker 
116*8975f5c5SAndroid Build Coastguard Worker         case GL_SHADER_OBJECT_EXT:
117*8975f5c5SAndroid Build Coastguard Worker             if (isGLES11)
118*8975f5c5SAndroid Build Coastguard Worker             {
119*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
120*8975f5c5SAndroid Build Coastguard Worker                 return false;
121*8975f5c5SAndroid Build Coastguard Worker             }
122*8975f5c5SAndroid Build Coastguard Worker             if (context->getShaderNoResolveCompile({name}) == nullptr)
123*8975f5c5SAndroid Build Coastguard Worker             {
124*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidShaderName);
125*8975f5c5SAndroid Build Coastguard Worker                 return false;
126*8975f5c5SAndroid Build Coastguard Worker             }
127*8975f5c5SAndroid Build Coastguard Worker             return true;
128*8975f5c5SAndroid Build Coastguard Worker 
129*8975f5c5SAndroid Build Coastguard Worker         case GL_PROGRAM_OBJECT_EXT:
130*8975f5c5SAndroid Build Coastguard Worker             if (isGLES11)
131*8975f5c5SAndroid Build Coastguard Worker             {
132*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
133*8975f5c5SAndroid Build Coastguard Worker                 return false;
134*8975f5c5SAndroid Build Coastguard Worker             }
135*8975f5c5SAndroid Build Coastguard Worker             if (context->getProgramNoResolveLink({name}) == nullptr)
136*8975f5c5SAndroid Build Coastguard Worker             {
137*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidProgramName);
138*8975f5c5SAndroid Build Coastguard Worker                 return false;
139*8975f5c5SAndroid Build Coastguard Worker             }
140*8975f5c5SAndroid Build Coastguard Worker             return true;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker         case GL_VERTEX_ARRAY_OBJECT_EXT:
143*8975f5c5SAndroid Build Coastguard Worker             if (!isGLES3 && !context->getExtensions().vertexArrayObjectOES)
144*8975f5c5SAndroid Build Coastguard Worker             {
145*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
146*8975f5c5SAndroid Build Coastguard Worker                 return false;
147*8975f5c5SAndroid Build Coastguard Worker             }
148*8975f5c5SAndroid Build Coastguard Worker             if (context->getVertexArray({name}) == nullptr)
149*8975f5c5SAndroid Build Coastguard Worker             {
150*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidVertexArrayName);
151*8975f5c5SAndroid Build Coastguard Worker                 return false;
152*8975f5c5SAndroid Build Coastguard Worker             }
153*8975f5c5SAndroid Build Coastguard Worker             return true;
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker         case GL_QUERY_OBJECT_EXT:
156*8975f5c5SAndroid Build Coastguard Worker             if (!isGLES3 && !context->getExtensions().occlusionQueryBooleanEXT)
157*8975f5c5SAndroid Build Coastguard Worker             {
158*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
159*8975f5c5SAndroid Build Coastguard Worker                 return false;
160*8975f5c5SAndroid Build Coastguard Worker             }
161*8975f5c5SAndroid Build Coastguard Worker             if (context->getQuery({name}) == nullptr)
162*8975f5c5SAndroid Build Coastguard Worker             {
163*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidQueryName);
164*8975f5c5SAndroid Build Coastguard Worker                 return false;
165*8975f5c5SAndroid Build Coastguard Worker             }
166*8975f5c5SAndroid Build Coastguard Worker             return true;
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker         case GL_TRANSFORM_FEEDBACK:
169*8975f5c5SAndroid Build Coastguard Worker             if (!isGLES3)
170*8975f5c5SAndroid Build Coastguard Worker             {
171*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
172*8975f5c5SAndroid Build Coastguard Worker                 return false;
173*8975f5c5SAndroid Build Coastguard Worker             }
174*8975f5c5SAndroid Build Coastguard Worker             if (context->getTransformFeedback({name}) == nullptr)
175*8975f5c5SAndroid Build Coastguard Worker             {
176*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTransformFeedbackName);
177*8975f5c5SAndroid Build Coastguard Worker                 return false;
178*8975f5c5SAndroid Build Coastguard Worker             }
179*8975f5c5SAndroid Build Coastguard Worker             return true;
180*8975f5c5SAndroid Build Coastguard Worker 
181*8975f5c5SAndroid Build Coastguard Worker         case GL_SAMPLER:
182*8975f5c5SAndroid Build Coastguard Worker             if (!isGLES3)
183*8975f5c5SAndroid Build Coastguard Worker             {
184*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
185*8975f5c5SAndroid Build Coastguard Worker                 return false;
186*8975f5c5SAndroid Build Coastguard Worker             }
187*8975f5c5SAndroid Build Coastguard Worker             if (context->getSampler({name}) == nullptr)
188*8975f5c5SAndroid Build Coastguard Worker             {
189*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidSamplerName);
190*8975f5c5SAndroid Build Coastguard Worker                 return false;
191*8975f5c5SAndroid Build Coastguard Worker             }
192*8975f5c5SAndroid Build Coastguard Worker             return true;
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker         case GL_TEXTURE:
195*8975f5c5SAndroid Build Coastguard Worker             if (context->getTexture({name}) == nullptr)
196*8975f5c5SAndroid Build Coastguard Worker             {
197*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
198*8975f5c5SAndroid Build Coastguard Worker                 return false;
199*8975f5c5SAndroid Build Coastguard Worker             }
200*8975f5c5SAndroid Build Coastguard Worker             return true;
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker         case GL_RENDERBUFFER:
203*8975f5c5SAndroid Build Coastguard Worker             if (!context->isRenderbuffer({name}))
204*8975f5c5SAndroid Build Coastguard Worker             {
205*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidRenderbufferName);
206*8975f5c5SAndroid Build Coastguard Worker                 return false;
207*8975f5c5SAndroid Build Coastguard Worker             }
208*8975f5c5SAndroid Build Coastguard Worker             return true;
209*8975f5c5SAndroid Build Coastguard Worker 
210*8975f5c5SAndroid Build Coastguard Worker         case GL_FRAMEBUFFER:
211*8975f5c5SAndroid Build Coastguard Worker             if (context->getFramebuffer({name}) == nullptr)
212*8975f5c5SAndroid Build Coastguard Worker             {
213*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidFramebufferName);
214*8975f5c5SAndroid Build Coastguard Worker                 return false;
215*8975f5c5SAndroid Build Coastguard Worker             }
216*8975f5c5SAndroid Build Coastguard Worker             return true;
217*8975f5c5SAndroid Build Coastguard Worker 
218*8975f5c5SAndroid Build Coastguard Worker         case GL_PROGRAM_PIPELINE_OBJECT_EXT:
219*8975f5c5SAndroid Build Coastguard Worker             if (!isGLES31 && !context->getExtensions().separateShaderObjectsEXT)
220*8975f5c5SAndroid Build Coastguard Worker             {
221*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidType);
222*8975f5c5SAndroid Build Coastguard Worker                 return false;
223*8975f5c5SAndroid Build Coastguard Worker             }
224*8975f5c5SAndroid Build Coastguard Worker             if (context->getProgramPipeline({name}) == nullptr)
225*8975f5c5SAndroid Build Coastguard Worker             {
226*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidProgramPipelineName);
227*8975f5c5SAndroid Build Coastguard Worker                 return false;
228*8975f5c5SAndroid Build Coastguard Worker             }
229*8975f5c5SAndroid Build Coastguard Worker             return true;
230*8975f5c5SAndroid Build Coastguard Worker 
231*8975f5c5SAndroid Build Coastguard Worker         default:
232*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidIndentifier);
233*8975f5c5SAndroid Build Coastguard Worker             return false;
234*8975f5c5SAndroid Build Coastguard Worker     }
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
ValidateClearTexImageFormat(const Context * context,angle::EntryPoint entryPoint,TextureType textureType,const Format & textureFormat,GLenum format,GLenum type)237*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearTexImageFormat(const Context *context,
238*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
239*8975f5c5SAndroid Build Coastguard Worker                                  TextureType textureType,
240*8975f5c5SAndroid Build Coastguard Worker                                  const Format &textureFormat,
241*8975f5c5SAndroid Build Coastguard Worker                                  GLenum format,
242*8975f5c5SAndroid Build Coastguard Worker                                  GLenum type)
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker     if (textureFormat.info->compressed)
245*8975f5c5SAndroid Build Coastguard Worker     {
246*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTextureIsCompressed);
247*8975f5c5SAndroid Build Coastguard Worker         return false;
248*8975f5c5SAndroid Build Coastguard Worker     }
249*8975f5c5SAndroid Build Coastguard Worker 
250*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateTexImageFormatCombination(context, entryPoint, textureType,
251*8975f5c5SAndroid Build Coastguard Worker                                            textureFormat.info->internalFormat, format, type))
252*8975f5c5SAndroid Build Coastguard Worker     {
253*8975f5c5SAndroid Build Coastguard Worker         return false;
254*8975f5c5SAndroid Build Coastguard Worker     }
255*8975f5c5SAndroid Build Coastguard Worker 
256*8975f5c5SAndroid Build Coastguard Worker     return true;
257*8975f5c5SAndroid Build Coastguard Worker }
258*8975f5c5SAndroid Build Coastguard Worker 
ValidateClearTexImageCommon(const Context * context,angle::EntryPoint entryPoint,TextureID texturePacked,GLint level,const std::optional<Box> & area,GLenum format,GLenum type,const void * data)259*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearTexImageCommon(const Context *context,
260*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
261*8975f5c5SAndroid Build Coastguard Worker                                  TextureID texturePacked,
262*8975f5c5SAndroid Build Coastguard Worker                                  GLint level,
263*8975f5c5SAndroid Build Coastguard Worker                                  const std::optional<Box> &area,
264*8975f5c5SAndroid Build Coastguard Worker                                  GLenum format,
265*8975f5c5SAndroid Build Coastguard Worker                                  GLenum type,
266*8975f5c5SAndroid Build Coastguard Worker                                  const void *data)
267*8975f5c5SAndroid Build Coastguard Worker {
268*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().clearTextureEXT)
269*8975f5c5SAndroid Build Coastguard Worker     {
270*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
271*8975f5c5SAndroid Build Coastguard Worker         return false;
272*8975f5c5SAndroid Build Coastguard Worker     }
273*8975f5c5SAndroid Build Coastguard Worker 
274*8975f5c5SAndroid Build Coastguard Worker     if (texturePacked.value == 0)
275*8975f5c5SAndroid Build Coastguard Worker     {
276*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMissingTextureName);
277*8975f5c5SAndroid Build Coastguard Worker         return false;
278*8975f5c5SAndroid Build Coastguard Worker     }
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker     Texture *tex = context->getTexture(texturePacked);
281*8975f5c5SAndroid Build Coastguard Worker     if (tex == nullptr)
282*8975f5c5SAndroid Build Coastguard Worker     {
283*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kMissingTextureName);
284*8975f5c5SAndroid Build Coastguard Worker         return false;
285*8975f5c5SAndroid Build Coastguard Worker     }
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker     if (tex->getType() == TextureType::Buffer)
288*8975f5c5SAndroid Build Coastguard Worker     {
289*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferTextureNotAllowed);
290*8975f5c5SAndroid Build Coastguard Worker         return false;
291*8975f5c5SAndroid Build Coastguard Worker     }
292*8975f5c5SAndroid Build Coastguard Worker 
293*8975f5c5SAndroid Build Coastguard Worker     if (!ValidMipLevel(context, tex->getType(), level))
294*8975f5c5SAndroid Build Coastguard Worker     {
295*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevel);
296*8975f5c5SAndroid Build Coastguard Worker         return false;
297*8975f5c5SAndroid Build Coastguard Worker     }
298*8975f5c5SAndroid Build Coastguard Worker 
299*8975f5c5SAndroid Build Coastguard Worker     if (area.has_value() && (area->x < 0 || area->y < 0 || area->z < 0 || area->width < 0 ||
300*8975f5c5SAndroid Build Coastguard Worker                              area->height < 0 || area->depth < 0))
301*8975f5c5SAndroid Build Coastguard Worker     {
302*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kNegativeOffset);
303*8975f5c5SAndroid Build Coastguard Worker         return false;
304*8975f5c5SAndroid Build Coastguard Worker     }
305*8975f5c5SAndroid Build Coastguard Worker 
306*8975f5c5SAndroid Build Coastguard Worker     if (tex->getType() == TextureType::CubeMap)
307*8975f5c5SAndroid Build Coastguard Worker     {
308*8975f5c5SAndroid Build Coastguard Worker         if (area.has_value() && area->z + area->depth > 6)
309*8975f5c5SAndroid Build Coastguard Worker         {
310*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationTextureTooSmall);
311*8975f5c5SAndroid Build Coastguard Worker             return false;
312*8975f5c5SAndroid Build Coastguard Worker         }
313*8975f5c5SAndroid Build Coastguard Worker 
314*8975f5c5SAndroid Build Coastguard Worker         ImageIndexIterator it = ImageIndexIterator::MakeGeneric(
315*8975f5c5SAndroid Build Coastguard Worker             tex->getType(), level, level + 1, area.has_value() ? area->z : ImageIndex::kEntireLevel,
316*8975f5c5SAndroid Build Coastguard Worker             area.has_value() ? area->z + area->depth : ImageIndex::kEntireLevel);
317*8975f5c5SAndroid Build Coastguard Worker         while (it.hasNext())
318*8975f5c5SAndroid Build Coastguard Worker         {
319*8975f5c5SAndroid Build Coastguard Worker             const ImageIndex index = it.next();
320*8975f5c5SAndroid Build Coastguard Worker             TextureTarget target   = index.getTarget();
321*8975f5c5SAndroid Build Coastguard Worker             const Extents extents  = tex->getExtents(target, level);
322*8975f5c5SAndroid Build Coastguard Worker 
323*8975f5c5SAndroid Build Coastguard Worker             if (!tex->getState().getImageDesc(index).format.valid())
324*8975f5c5SAndroid Build Coastguard Worker             {
325*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
326*8975f5c5SAndroid Build Coastguard Worker                 return false;
327*8975f5c5SAndroid Build Coastguard Worker             }
328*8975f5c5SAndroid Build Coastguard Worker 
329*8975f5c5SAndroid Build Coastguard Worker             if (area.has_value() &&
330*8975f5c5SAndroid Build Coastguard Worker                 (area->x + area->width > extents.width || area->y + area->height > extents.height))
331*8975f5c5SAndroid Build Coastguard Worker             {
332*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationTextureTooSmall);
333*8975f5c5SAndroid Build Coastguard Worker                 return false;
334*8975f5c5SAndroid Build Coastguard Worker             }
335*8975f5c5SAndroid Build Coastguard Worker 
336*8975f5c5SAndroid Build Coastguard Worker             if (!ValidateClearTexImageFormat(context, entryPoint, tex->getType(),
337*8975f5c5SAndroid Build Coastguard Worker                                              tex->getFormat(target, level), format, type))
338*8975f5c5SAndroid Build Coastguard Worker             {
339*8975f5c5SAndroid Build Coastguard Worker                 return false;
340*8975f5c5SAndroid Build Coastguard Worker             }
341*8975f5c5SAndroid Build Coastguard Worker         }
342*8975f5c5SAndroid Build Coastguard Worker     }
343*8975f5c5SAndroid Build Coastguard Worker     else
344*8975f5c5SAndroid Build Coastguard Worker     {
345*8975f5c5SAndroid Build Coastguard Worker         TextureTarget target  = NonCubeTextureTypeToTarget(tex->getType());
346*8975f5c5SAndroid Build Coastguard Worker         const Extents extents = tex->getExtents(target, level);
347*8975f5c5SAndroid Build Coastguard Worker 
348*8975f5c5SAndroid Build Coastguard Worker         if (!tex->getState().getImageDesc(target, level).format.valid())
349*8975f5c5SAndroid Build Coastguard Worker         {
350*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationLevelNotDefined);
351*8975f5c5SAndroid Build Coastguard Worker             return false;
352*8975f5c5SAndroid Build Coastguard Worker         }
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker         if (area.has_value() &&
355*8975f5c5SAndroid Build Coastguard Worker             (area->x + area->width > extents.width || area->y + area->height > extents.height ||
356*8975f5c5SAndroid Build Coastguard Worker              area->z + area->depth > extents.depth))
357*8975f5c5SAndroid Build Coastguard Worker         {
358*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kDestinationTextureTooSmall);
359*8975f5c5SAndroid Build Coastguard Worker             return false;
360*8975f5c5SAndroid Build Coastguard Worker         }
361*8975f5c5SAndroid Build Coastguard Worker 
362*8975f5c5SAndroid Build Coastguard Worker         if (!ValidateClearTexImageFormat(context, entryPoint, tex->getType(),
363*8975f5c5SAndroid Build Coastguard Worker                                          tex->getFormat(target, level), format, type))
364*8975f5c5SAndroid Build Coastguard Worker         {
365*8975f5c5SAndroid Build Coastguard Worker             return false;
366*8975f5c5SAndroid Build Coastguard Worker         }
367*8975f5c5SAndroid Build Coastguard Worker     }
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker     return true;
370*8975f5c5SAndroid Build Coastguard Worker }
371*8975f5c5SAndroid Build Coastguard Worker 
372*8975f5c5SAndroid Build Coastguard Worker }  // namespace
373*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexImage(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level)374*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexImage(const Context *context,
375*8975f5c5SAndroid Build Coastguard Worker                          angle::EntryPoint entryPoint,
376*8975f5c5SAndroid Build Coastguard Worker                          TextureTarget target,
377*8975f5c5SAndroid Build Coastguard Worker                          GLint level)
378*8975f5c5SAndroid Build Coastguard Worker {
379*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().getImageANGLE)
380*8975f5c5SAndroid Build Coastguard Worker     {
381*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kGetImageExtensionNotEnabled);
382*8975f5c5SAndroid Build Coastguard Worker         return false;
383*8975f5c5SAndroid Build Coastguard Worker     }
384*8975f5c5SAndroid Build Coastguard Worker 
385*8975f5c5SAndroid Build Coastguard Worker     if (!ValidTexture2DDestinationTarget(context, target) &&
386*8975f5c5SAndroid Build Coastguard Worker         !ValidTexture3DDestinationTarget(context, target))
387*8975f5c5SAndroid Build Coastguard Worker     {
388*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
389*8975f5c5SAndroid Build Coastguard Worker         return false;
390*8975f5c5SAndroid Build Coastguard Worker     }
391*8975f5c5SAndroid Build Coastguard Worker 
392*8975f5c5SAndroid Build Coastguard Worker     if (level < 0)
393*8975f5c5SAndroid Build Coastguard Worker     {
394*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeLevel);
395*8975f5c5SAndroid Build Coastguard Worker         return false;
396*8975f5c5SAndroid Build Coastguard Worker     }
397*8975f5c5SAndroid Build Coastguard Worker 
398*8975f5c5SAndroid Build Coastguard Worker     TextureType textureType = TextureTargetToType(target);
399*8975f5c5SAndroid Build Coastguard Worker     if (!ValidMipLevel(context, textureType, level))
400*8975f5c5SAndroid Build Coastguard Worker     {
401*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMipLevel);
402*8975f5c5SAndroid Build Coastguard Worker         return false;
403*8975f5c5SAndroid Build Coastguard Worker     }
404*8975f5c5SAndroid Build Coastguard Worker 
405*8975f5c5SAndroid Build Coastguard Worker     return true;
406*8975f5c5SAndroid Build Coastguard Worker }
407*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexImageANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,GLenum format,GLenum type,const void * pixels)408*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexImageANGLE(const Context *context,
409*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
410*8975f5c5SAndroid Build Coastguard Worker                               TextureTarget target,
411*8975f5c5SAndroid Build Coastguard Worker                               GLint level,
412*8975f5c5SAndroid Build Coastguard Worker                               GLenum format,
413*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
414*8975f5c5SAndroid Build Coastguard Worker                               const void *pixels)
415*8975f5c5SAndroid Build Coastguard Worker {
416*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateGetTexImage(context, entryPoint, target, level))
417*8975f5c5SAndroid Build Coastguard Worker     {
418*8975f5c5SAndroid Build Coastguard Worker         return false;
419*8975f5c5SAndroid Build Coastguard Worker     }
420*8975f5c5SAndroid Build Coastguard Worker 
421*8975f5c5SAndroid Build Coastguard Worker     Texture *texture = context->getTextureByTarget(target);
422*8975f5c5SAndroid Build Coastguard Worker 
423*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateGetImageFormatAndType(context, entryPoint, texture, format, type))
424*8975f5c5SAndroid Build Coastguard Worker     {
425*8975f5c5SAndroid Build Coastguard Worker         return false;
426*8975f5c5SAndroid Build Coastguard Worker     }
427*8975f5c5SAndroid Build Coastguard Worker 
428*8975f5c5SAndroid Build Coastguard Worker     GLsizei width  = static_cast<GLsizei>(texture->getWidth(target, level));
429*8975f5c5SAndroid Build Coastguard Worker     GLsizei height = static_cast<GLsizei>(texture->getHeight(target, level));
430*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePixelPack(context, entryPoint, format, type, 0, 0, width, height, -1, nullptr,
431*8975f5c5SAndroid Build Coastguard Worker                            pixels))
432*8975f5c5SAndroid Build Coastguard Worker     {
433*8975f5c5SAndroid Build Coastguard Worker         return false;
434*8975f5c5SAndroid Build Coastguard Worker     }
435*8975f5c5SAndroid Build Coastguard Worker 
436*8975f5c5SAndroid Build Coastguard Worker     if (texture->getFormat(target, level).info->compressed)
437*8975f5c5SAndroid Build Coastguard Worker     {
438*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kGetImageCompressed);
439*8975f5c5SAndroid Build Coastguard Worker         return false;
440*8975f5c5SAndroid Build Coastguard Worker     }
441*8975f5c5SAndroid Build Coastguard Worker 
442*8975f5c5SAndroid Build Coastguard Worker     return true;
443*8975f5c5SAndroid Build Coastguard Worker }
444*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetCompressedTexImageANGLE(const Context * context,angle::EntryPoint entryPoint,TextureTarget target,GLint level,const void * pixels)445*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetCompressedTexImageANGLE(const Context *context,
446*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
447*8975f5c5SAndroid Build Coastguard Worker                                         TextureTarget target,
448*8975f5c5SAndroid Build Coastguard Worker                                         GLint level,
449*8975f5c5SAndroid Build Coastguard Worker                                         const void *pixels)
450*8975f5c5SAndroid Build Coastguard Worker {
451*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateGetTexImage(context, entryPoint, target, level))
452*8975f5c5SAndroid Build Coastguard Worker     {
453*8975f5c5SAndroid Build Coastguard Worker         return false;
454*8975f5c5SAndroid Build Coastguard Worker     }
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker     Texture *texture = context->getTextureByTarget(target);
457*8975f5c5SAndroid Build Coastguard Worker     if (!texture->getFormat(target, level).info->compressed)
458*8975f5c5SAndroid Build Coastguard Worker     {
459*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kGetImageNotCompressed);
460*8975f5c5SAndroid Build Coastguard Worker         return false;
461*8975f5c5SAndroid Build Coastguard Worker     }
462*8975f5c5SAndroid Build Coastguard Worker 
463*8975f5c5SAndroid Build Coastguard Worker     return true;
464*8975f5c5SAndroid Build Coastguard Worker }
465*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetRenderbufferImageANGLE(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum format,GLenum type,const void * pixels)466*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetRenderbufferImageANGLE(const Context *context,
467*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
468*8975f5c5SAndroid Build Coastguard Worker                                        GLenum target,
469*8975f5c5SAndroid Build Coastguard Worker                                        GLenum format,
470*8975f5c5SAndroid Build Coastguard Worker                                        GLenum type,
471*8975f5c5SAndroid Build Coastguard Worker                                        const void *pixels)
472*8975f5c5SAndroid Build Coastguard Worker {
473*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().getImageANGLE)
474*8975f5c5SAndroid Build Coastguard Worker     {
475*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kGetImageExtensionNotEnabled);
476*8975f5c5SAndroid Build Coastguard Worker         return false;
477*8975f5c5SAndroid Build Coastguard Worker     }
478*8975f5c5SAndroid Build Coastguard Worker 
479*8975f5c5SAndroid Build Coastguard Worker     if (target != GL_RENDERBUFFER)
480*8975f5c5SAndroid Build Coastguard Worker     {
481*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidRenderbufferTarget);
482*8975f5c5SAndroid Build Coastguard Worker         return false;
483*8975f5c5SAndroid Build Coastguard Worker     }
484*8975f5c5SAndroid Build Coastguard Worker 
485*8975f5c5SAndroid Build Coastguard Worker     Renderbuffer *renderbuffer = context->getState().getCurrentRenderbuffer();
486*8975f5c5SAndroid Build Coastguard Worker 
487*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateGetImageFormatAndType(context, entryPoint, renderbuffer, format, type))
488*8975f5c5SAndroid Build Coastguard Worker     {
489*8975f5c5SAndroid Build Coastguard Worker         return false;
490*8975f5c5SAndroid Build Coastguard Worker     }
491*8975f5c5SAndroid Build Coastguard Worker 
492*8975f5c5SAndroid Build Coastguard Worker     GLsizei width  = renderbuffer->getWidth();
493*8975f5c5SAndroid Build Coastguard Worker     GLsizei height = renderbuffer->getHeight();
494*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePixelPack(context, entryPoint, format, type, 0, 0, width, height, -1, nullptr,
495*8975f5c5SAndroid Build Coastguard Worker                            pixels))
496*8975f5c5SAndroid Build Coastguard Worker     {
497*8975f5c5SAndroid Build Coastguard Worker         return false;
498*8975f5c5SAndroid Build Coastguard Worker     }
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker     return true;
501*8975f5c5SAndroid Build Coastguard Worker }
502*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsBaseVertexEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const void * indices,GLint basevertex)503*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsBaseVertexEXT(const Context *context,
504*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
505*8975f5c5SAndroid Build Coastguard Worker                                        PrimitiveMode mode,
506*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei count,
507*8975f5c5SAndroid Build Coastguard Worker                                        DrawElementsType type,
508*8975f5c5SAndroid Build Coastguard Worker                                        const void *indices,
509*8975f5c5SAndroid Build Coastguard Worker                                        GLint basevertex)
510*8975f5c5SAndroid Build Coastguard Worker {
511*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
512*8975f5c5SAndroid Build Coastguard Worker     {
513*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
514*8975f5c5SAndroid Build Coastguard Worker         return false;
515*8975f5c5SAndroid Build Coastguard Worker     }
516*8975f5c5SAndroid Build Coastguard Worker 
517*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1);
518*8975f5c5SAndroid Build Coastguard Worker }
519*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsInstancedBaseVertexEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const void * indices,GLsizei instancecount,GLint basevertex)520*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstancedBaseVertexEXT(const Context *context,
521*8975f5c5SAndroid Build Coastguard Worker                                                 angle::EntryPoint entryPoint,
522*8975f5c5SAndroid Build Coastguard Worker                                                 PrimitiveMode mode,
523*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei count,
524*8975f5c5SAndroid Build Coastguard Worker                                                 DrawElementsType type,
525*8975f5c5SAndroid Build Coastguard Worker                                                 const void *indices,
526*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei instancecount,
527*8975f5c5SAndroid Build Coastguard Worker                                                 GLint basevertex)
528*8975f5c5SAndroid Build Coastguard Worker {
529*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
530*8975f5c5SAndroid Build Coastguard Worker     {
531*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
532*8975f5c5SAndroid Build Coastguard Worker         return false;
533*8975f5c5SAndroid Build Coastguard Worker     }
534*8975f5c5SAndroid Build Coastguard Worker 
535*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, type, indices,
536*8975f5c5SAndroid Build Coastguard Worker                                              instancecount, 0);
537*8975f5c5SAndroid Build Coastguard Worker }
538*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawRangeElementsBaseVertexEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,DrawElementsType type,const void * indices,GLint basevertex)539*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawRangeElementsBaseVertexEXT(const Context *context,
540*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
541*8975f5c5SAndroid Build Coastguard Worker                                             PrimitiveMode mode,
542*8975f5c5SAndroid Build Coastguard Worker                                             GLuint start,
543*8975f5c5SAndroid Build Coastguard Worker                                             GLuint end,
544*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei count,
545*8975f5c5SAndroid Build Coastguard Worker                                             DrawElementsType type,
546*8975f5c5SAndroid Build Coastguard Worker                                             const void *indices,
547*8975f5c5SAndroid Build Coastguard Worker                                             GLint basevertex)
548*8975f5c5SAndroid Build Coastguard Worker {
549*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
550*8975f5c5SAndroid Build Coastguard Worker     {
551*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
552*8975f5c5SAndroid Build Coastguard Worker         return false;
553*8975f5c5SAndroid Build Coastguard Worker     }
554*8975f5c5SAndroid Build Coastguard Worker 
555*8975f5c5SAndroid Build Coastguard Worker     if (end < start)
556*8975f5c5SAndroid Build Coastguard Worker     {
557*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidElementRange);
558*8975f5c5SAndroid Build Coastguard Worker         return false;
559*8975f5c5SAndroid Build Coastguard Worker     }
560*8975f5c5SAndroid Build Coastguard Worker 
561*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1))
562*8975f5c5SAndroid Build Coastguard Worker     {
563*8975f5c5SAndroid Build Coastguard Worker         return false;
564*8975f5c5SAndroid Build Coastguard Worker     }
565*8975f5c5SAndroid Build Coastguard Worker 
566*8975f5c5SAndroid Build Coastguard Worker     // Skip range checks for no-op calls.
567*8975f5c5SAndroid Build Coastguard Worker     if (count <= 0)
568*8975f5c5SAndroid Build Coastguard Worker     {
569*8975f5c5SAndroid Build Coastguard Worker         return true;
570*8975f5c5SAndroid Build Coastguard Worker     }
571*8975f5c5SAndroid Build Coastguard Worker 
572*8975f5c5SAndroid Build Coastguard Worker     // Note that resolving the index range is a bit slow. We should probably optimize this.
573*8975f5c5SAndroid Build Coastguard Worker     IndexRange indexRange;
574*8975f5c5SAndroid Build Coastguard Worker     ANGLE_VALIDATION_TRY(context->getState().getVertexArray()->getIndexRange(context, type, count,
575*8975f5c5SAndroid Build Coastguard Worker                                                                              indices, &indexRange));
576*8975f5c5SAndroid Build Coastguard Worker 
577*8975f5c5SAndroid Build Coastguard Worker     if (indexRange.end > end || indexRange.start < start)
578*8975f5c5SAndroid Build Coastguard Worker     {
579*8975f5c5SAndroid Build Coastguard Worker         // GL spec says that behavior in this case is undefined - generating an error is fine.
580*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExceedsElementRange);
581*8975f5c5SAndroid Build Coastguard Worker         return false;
582*8975f5c5SAndroid Build Coastguard Worker     }
583*8975f5c5SAndroid Build Coastguard Worker     return true;
584*8975f5c5SAndroid Build Coastguard Worker }
585*8975f5c5SAndroid Build Coastguard Worker 
ValidateMultiDrawElementsBaseVertexEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,const GLsizei * count,DrawElementsType type,const void * const * indices,GLsizei drawcount,const GLint * basevertex)586*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawElementsBaseVertexEXT(const Context *context,
587*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
588*8975f5c5SAndroid Build Coastguard Worker                                             PrimitiveMode mode,
589*8975f5c5SAndroid Build Coastguard Worker                                             const GLsizei *count,
590*8975f5c5SAndroid Build Coastguard Worker                                             DrawElementsType type,
591*8975f5c5SAndroid Build Coastguard Worker                                             const void *const *indices,
592*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei drawcount,
593*8975f5c5SAndroid Build Coastguard Worker                                             const GLint *basevertex)
594*8975f5c5SAndroid Build Coastguard Worker {
595*8975f5c5SAndroid Build Coastguard Worker     return true;
596*8975f5c5SAndroid Build Coastguard Worker }
597*8975f5c5SAndroid Build Coastguard Worker 
ValidateMultiDrawArraysIndirectEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode modePacked,const void * indirect,GLsizei drawcount,GLsizei stride)598*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawArraysIndirectEXT(const Context *context,
599*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
600*8975f5c5SAndroid Build Coastguard Worker                                         PrimitiveMode modePacked,
601*8975f5c5SAndroid Build Coastguard Worker                                         const void *indirect,
602*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei drawcount,
603*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei stride)
604*8975f5c5SAndroid Build Coastguard Worker {
605*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateMultiDrawIndirectBase(context, entryPoint, drawcount, stride))
606*8975f5c5SAndroid Build Coastguard Worker     {
607*8975f5c5SAndroid Build Coastguard Worker         return false;
608*8975f5c5SAndroid Build Coastguard Worker     }
609*8975f5c5SAndroid Build Coastguard Worker 
610*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateDrawArraysIndirect(context, entryPoint, modePacked, indirect))
611*8975f5c5SAndroid Build Coastguard Worker     {
612*8975f5c5SAndroid Build Coastguard Worker         return false;
613*8975f5c5SAndroid Build Coastguard Worker     }
614*8975f5c5SAndroid Build Coastguard Worker 
615*8975f5c5SAndroid Build Coastguard Worker     return true;
616*8975f5c5SAndroid Build Coastguard Worker }
617*8975f5c5SAndroid Build Coastguard Worker 
ValidateMultiDrawElementsIndirectEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode modePacked,DrawElementsType typePacked,const void * indirect,GLsizei drawcount,GLsizei stride)618*8975f5c5SAndroid Build Coastguard Worker bool ValidateMultiDrawElementsIndirectEXT(const Context *context,
619*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
620*8975f5c5SAndroid Build Coastguard Worker                                           PrimitiveMode modePacked,
621*8975f5c5SAndroid Build Coastguard Worker                                           DrawElementsType typePacked,
622*8975f5c5SAndroid Build Coastguard Worker                                           const void *indirect,
623*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei drawcount,
624*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei stride)
625*8975f5c5SAndroid Build Coastguard Worker {
626*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateMultiDrawIndirectBase(context, entryPoint, drawcount, stride))
627*8975f5c5SAndroid Build Coastguard Worker     {
628*8975f5c5SAndroid Build Coastguard Worker         return false;
629*8975f5c5SAndroid Build Coastguard Worker     }
630*8975f5c5SAndroid Build Coastguard Worker 
631*8975f5c5SAndroid Build Coastguard Worker     const State &state                      = context->getState();
632*8975f5c5SAndroid Build Coastguard Worker     TransformFeedback *curTransformFeedback = state.getCurrentTransformFeedback();
633*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateDrawElementsIndirect(context, entryPoint, modePacked, typePacked, indirect))
634*8975f5c5SAndroid Build Coastguard Worker     {
635*8975f5c5SAndroid Build Coastguard Worker         return false;
636*8975f5c5SAndroid Build Coastguard Worker     }
637*8975f5c5SAndroid Build Coastguard Worker 
638*8975f5c5SAndroid Build Coastguard Worker     if (curTransformFeedback && curTransformFeedback->isActive() &&
639*8975f5c5SAndroid Build Coastguard Worker         !curTransformFeedback->isPaused())
640*8975f5c5SAndroid Build Coastguard Worker     {
641*8975f5c5SAndroid Build Coastguard Worker         // EXT_geometry_shader allows transform feedback to work with all draw commands.
642*8975f5c5SAndroid Build Coastguard Worker         // [EXT_geometry_shader] Section 12.1, "Transform Feedback"
643*8975f5c5SAndroid Build Coastguard Worker         if (context->getExtensions().geometryShaderAny() || context->getClientVersion() >= ES_3_2)
644*8975f5c5SAndroid Build Coastguard Worker         {
645*8975f5c5SAndroid Build Coastguard Worker             if (!ValidateTransformFeedbackPrimitiveMode(
646*8975f5c5SAndroid Build Coastguard Worker                     context, entryPoint, curTransformFeedback->getPrimitiveMode(), modePacked))
647*8975f5c5SAndroid Build Coastguard Worker             {
648*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidDrawModeTransformFeedback);
649*8975f5c5SAndroid Build Coastguard Worker                 return false;
650*8975f5c5SAndroid Build Coastguard Worker             }
651*8975f5c5SAndroid Build Coastguard Worker         }
652*8975f5c5SAndroid Build Coastguard Worker         else
653*8975f5c5SAndroid Build Coastguard Worker         {
654*8975f5c5SAndroid Build Coastguard Worker             // An INVALID_OPERATION error is generated if transform feedback is active and not
655*8975f5c5SAndroid Build Coastguard Worker             // paused.
656*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kUnsupportedDrawModeForTransformFeedback);
657*8975f5c5SAndroid Build Coastguard Worker             return false;
658*8975f5c5SAndroid Build Coastguard Worker         }
659*8975f5c5SAndroid Build Coastguard Worker     }
660*8975f5c5SAndroid Build Coastguard Worker 
661*8975f5c5SAndroid Build Coastguard Worker     return true;
662*8975f5c5SAndroid Build Coastguard Worker }
663*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawArraysInstancedBaseInstanceEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLint first,GLsizei count,GLsizei instanceCount,GLuint baseInstance)664*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawArraysInstancedBaseInstanceEXT(const Context *context,
665*8975f5c5SAndroid Build Coastguard Worker                                                 angle::EntryPoint entryPoint,
666*8975f5c5SAndroid Build Coastguard Worker                                                 PrimitiveMode mode,
667*8975f5c5SAndroid Build Coastguard Worker                                                 GLint first,
668*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei count,
669*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei instanceCount,
670*8975f5c5SAndroid Build Coastguard Worker                                                 GLuint baseInstance)
671*8975f5c5SAndroid Build Coastguard Worker {
672*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().baseInstanceEXT)
673*8975f5c5SAndroid Build Coastguard Worker     {
674*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
675*8975f5c5SAndroid Build Coastguard Worker         return false;
676*8975f5c5SAndroid Build Coastguard Worker     }
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawArraysInstancedBase(context, entryPoint, mode, first, count, instanceCount,
679*8975f5c5SAndroid Build Coastguard Worker                                            baseInstance);
680*8975f5c5SAndroid Build Coastguard Worker }
681*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsInstancedBaseInstanceEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,void const * indices,GLsizei instancecount,GLuint baseinstance)682*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstancedBaseInstanceEXT(const Context *context,
683*8975f5c5SAndroid Build Coastguard Worker                                                   angle::EntryPoint entryPoint,
684*8975f5c5SAndroid Build Coastguard Worker                                                   PrimitiveMode mode,
685*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei count,
686*8975f5c5SAndroid Build Coastguard Worker                                                   DrawElementsType type,
687*8975f5c5SAndroid Build Coastguard Worker                                                   void const *indices,
688*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei instancecount,
689*8975f5c5SAndroid Build Coastguard Worker                                                   GLuint baseinstance)
690*8975f5c5SAndroid Build Coastguard Worker {
691*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().baseInstanceEXT)
692*8975f5c5SAndroid Build Coastguard Worker     {
693*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
694*8975f5c5SAndroid Build Coastguard Worker         return false;
695*8975f5c5SAndroid Build Coastguard Worker     }
696*8975f5c5SAndroid Build Coastguard Worker 
697*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, type, indices,
698*8975f5c5SAndroid Build Coastguard Worker                                              instancecount, baseinstance);
699*8975f5c5SAndroid Build Coastguard Worker }
700*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsInstancedBaseVertexBaseInstanceEXT(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType typePacked,const void * indices,GLsizei instancecount,GLint basevertex,GLuint baseinstance)701*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstancedBaseVertexBaseInstanceEXT(const Context *context,
702*8975f5c5SAndroid Build Coastguard Worker                                                             angle::EntryPoint entryPoint,
703*8975f5c5SAndroid Build Coastguard Worker                                                             PrimitiveMode mode,
704*8975f5c5SAndroid Build Coastguard Worker                                                             GLsizei count,
705*8975f5c5SAndroid Build Coastguard Worker                                                             DrawElementsType typePacked,
706*8975f5c5SAndroid Build Coastguard Worker                                                             const void *indices,
707*8975f5c5SAndroid Build Coastguard Worker                                                             GLsizei instancecount,
708*8975f5c5SAndroid Build Coastguard Worker                                                             GLint basevertex,
709*8975f5c5SAndroid Build Coastguard Worker                                                             GLuint baseinstance)
710*8975f5c5SAndroid Build Coastguard Worker {
711*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().baseInstanceEXT)
712*8975f5c5SAndroid Build Coastguard Worker     {
713*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
714*8975f5c5SAndroid Build Coastguard Worker         return false;
715*8975f5c5SAndroid Build Coastguard Worker     }
716*8975f5c5SAndroid Build Coastguard Worker 
717*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, typePacked, indices,
718*8975f5c5SAndroid Build Coastguard Worker                                              instancecount, baseinstance);
719*8975f5c5SAndroid Build Coastguard Worker }
720*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsBaseVertexOES(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const void * indices,GLint basevertex)721*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsBaseVertexOES(const Context *context,
722*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
723*8975f5c5SAndroid Build Coastguard Worker                                        PrimitiveMode mode,
724*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei count,
725*8975f5c5SAndroid Build Coastguard Worker                                        DrawElementsType type,
726*8975f5c5SAndroid Build Coastguard Worker                                        const void *indices,
727*8975f5c5SAndroid Build Coastguard Worker                                        GLint basevertex)
728*8975f5c5SAndroid Build Coastguard Worker {
729*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
730*8975f5c5SAndroid Build Coastguard Worker     {
731*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
732*8975f5c5SAndroid Build Coastguard Worker         return false;
733*8975f5c5SAndroid Build Coastguard Worker     }
734*8975f5c5SAndroid Build Coastguard Worker 
735*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1);
736*8975f5c5SAndroid Build Coastguard Worker }
737*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawElementsInstancedBaseVertexOES(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLsizei count,DrawElementsType type,const void * indices,GLsizei instancecount,GLint basevertex)738*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawElementsInstancedBaseVertexOES(const Context *context,
739*8975f5c5SAndroid Build Coastguard Worker                                                 angle::EntryPoint entryPoint,
740*8975f5c5SAndroid Build Coastguard Worker                                                 PrimitiveMode mode,
741*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei count,
742*8975f5c5SAndroid Build Coastguard Worker                                                 DrawElementsType type,
743*8975f5c5SAndroid Build Coastguard Worker                                                 const void *indices,
744*8975f5c5SAndroid Build Coastguard Worker                                                 GLsizei instancecount,
745*8975f5c5SAndroid Build Coastguard Worker                                                 GLint basevertex)
746*8975f5c5SAndroid Build Coastguard Worker {
747*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
748*8975f5c5SAndroid Build Coastguard Worker     {
749*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
750*8975f5c5SAndroid Build Coastguard Worker         return false;
751*8975f5c5SAndroid Build Coastguard Worker     }
752*8975f5c5SAndroid Build Coastguard Worker 
753*8975f5c5SAndroid Build Coastguard Worker     return ValidateDrawElementsInstancedBase(context, entryPoint, mode, count, type, indices,
754*8975f5c5SAndroid Build Coastguard Worker                                              instancecount, 0);
755*8975f5c5SAndroid Build Coastguard Worker }
756*8975f5c5SAndroid Build Coastguard Worker 
ValidateDrawRangeElementsBaseVertexOES(const Context * context,angle::EntryPoint entryPoint,PrimitiveMode mode,GLuint start,GLuint end,GLsizei count,DrawElementsType type,const void * indices,GLint basevertex)757*8975f5c5SAndroid Build Coastguard Worker bool ValidateDrawRangeElementsBaseVertexOES(const Context *context,
758*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
759*8975f5c5SAndroid Build Coastguard Worker                                             PrimitiveMode mode,
760*8975f5c5SAndroid Build Coastguard Worker                                             GLuint start,
761*8975f5c5SAndroid Build Coastguard Worker                                             GLuint end,
762*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei count,
763*8975f5c5SAndroid Build Coastguard Worker                                             DrawElementsType type,
764*8975f5c5SAndroid Build Coastguard Worker                                             const void *indices,
765*8975f5c5SAndroid Build Coastguard Worker                                             GLint basevertex)
766*8975f5c5SAndroid Build Coastguard Worker {
767*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().drawElementsBaseVertexAny())
768*8975f5c5SAndroid Build Coastguard Worker     {
769*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
770*8975f5c5SAndroid Build Coastguard Worker         return false;
771*8975f5c5SAndroid Build Coastguard Worker     }
772*8975f5c5SAndroid Build Coastguard Worker 
773*8975f5c5SAndroid Build Coastguard Worker     if (end < start)
774*8975f5c5SAndroid Build Coastguard Worker     {
775*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidElementRange);
776*8975f5c5SAndroid Build Coastguard Worker         return false;
777*8975f5c5SAndroid Build Coastguard Worker     }
778*8975f5c5SAndroid Build Coastguard Worker 
779*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateDrawElementsCommon(context, entryPoint, mode, count, type, indices, 1))
780*8975f5c5SAndroid Build Coastguard Worker     {
781*8975f5c5SAndroid Build Coastguard Worker         return false;
782*8975f5c5SAndroid Build Coastguard Worker     }
783*8975f5c5SAndroid Build Coastguard Worker 
784*8975f5c5SAndroid Build Coastguard Worker     // Skip range checks for no-op calls.
785*8975f5c5SAndroid Build Coastguard Worker     if (count <= 0)
786*8975f5c5SAndroid Build Coastguard Worker     {
787*8975f5c5SAndroid Build Coastguard Worker         return true;
788*8975f5c5SAndroid Build Coastguard Worker     }
789*8975f5c5SAndroid Build Coastguard Worker 
790*8975f5c5SAndroid Build Coastguard Worker     // Note that resolving the index range is a bit slow. We should probably optimize this.
791*8975f5c5SAndroid Build Coastguard Worker     IndexRange indexRange;
792*8975f5c5SAndroid Build Coastguard Worker     ANGLE_VALIDATION_TRY(context->getState().getVertexArray()->getIndexRange(context, type, count,
793*8975f5c5SAndroid Build Coastguard Worker                                                                              indices, &indexRange));
794*8975f5c5SAndroid Build Coastguard Worker 
795*8975f5c5SAndroid Build Coastguard Worker     if (indexRange.end > end || indexRange.start < start)
796*8975f5c5SAndroid Build Coastguard Worker     {
797*8975f5c5SAndroid Build Coastguard Worker         // GL spec says that behavior in this case is undefined - generating an error is fine.
798*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExceedsElementRange);
799*8975f5c5SAndroid Build Coastguard Worker         return false;
800*8975f5c5SAndroid Build Coastguard Worker     }
801*8975f5c5SAndroid Build Coastguard Worker     return true;
802*8975f5c5SAndroid Build Coastguard Worker }
803*8975f5c5SAndroid Build Coastguard Worker 
804*8975f5c5SAndroid Build Coastguard Worker // GL_KHR_blend_equation_advanced
ValidateBlendBarrierKHR(const Context * context,angle::EntryPoint entryPoint)805*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendBarrierKHR(const Context *context, angle::EntryPoint entryPoint)
806*8975f5c5SAndroid Build Coastguard Worker {
807*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_2_0)
808*8975f5c5SAndroid Build Coastguard Worker     {
809*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES2Required);
810*8975f5c5SAndroid Build Coastguard Worker         return false;
811*8975f5c5SAndroid Build Coastguard Worker     }
812*8975f5c5SAndroid Build Coastguard Worker 
813*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().blendEquationAdvancedKHR)
814*8975f5c5SAndroid Build Coastguard Worker     {
815*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kAdvancedBlendExtensionNotEnabled);
816*8975f5c5SAndroid Build Coastguard Worker     }
817*8975f5c5SAndroid Build Coastguard Worker 
818*8975f5c5SAndroid Build Coastguard Worker     return true;
819*8975f5c5SAndroid Build Coastguard Worker }
820*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetGraphicsResetStatusKHR(const Context * context,angle::EntryPoint entryPoint)821*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetGraphicsResetStatusKHR(const Context *context, angle::EntryPoint entryPoint)
822*8975f5c5SAndroid Build Coastguard Worker {
823*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_2_0)
824*8975f5c5SAndroid Build Coastguard Worker     {
825*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES2Required);
826*8975f5c5SAndroid Build Coastguard Worker         return false;
827*8975f5c5SAndroid Build Coastguard Worker     }
828*8975f5c5SAndroid Build Coastguard Worker 
829*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().robustnessKHR)
830*8975f5c5SAndroid Build Coastguard Worker     {
831*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
832*8975f5c5SAndroid Build Coastguard Worker         return false;
833*8975f5c5SAndroid Build Coastguard Worker     }
834*8975f5c5SAndroid Build Coastguard Worker 
835*8975f5c5SAndroid Build Coastguard Worker     return true;
836*8975f5c5SAndroid Build Coastguard Worker }
837*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetnUniformfvKHR(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei bufSize,const GLfloat * params)838*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetnUniformfvKHR(const Context *context,
839*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
840*8975f5c5SAndroid Build Coastguard Worker                               ShaderProgramID programPacked,
841*8975f5c5SAndroid Build Coastguard Worker                               UniformLocation locationPacked,
842*8975f5c5SAndroid Build Coastguard Worker                               GLsizei bufSize,
843*8975f5c5SAndroid Build Coastguard Worker                               const GLfloat *params)
844*8975f5c5SAndroid Build Coastguard Worker {
845*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_2_0)
846*8975f5c5SAndroid Build Coastguard Worker     {
847*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES2Required);
848*8975f5c5SAndroid Build Coastguard Worker         return false;
849*8975f5c5SAndroid Build Coastguard Worker     }
850*8975f5c5SAndroid Build Coastguard Worker 
851*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().robustnessKHR)
852*8975f5c5SAndroid Build Coastguard Worker     {
853*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
854*8975f5c5SAndroid Build Coastguard Worker         return false;
855*8975f5c5SAndroid Build Coastguard Worker     }
856*8975f5c5SAndroid Build Coastguard Worker 
857*8975f5c5SAndroid Build Coastguard Worker     return ValidateSizedGetUniform(context, entryPoint, programPacked, locationPacked, bufSize,
858*8975f5c5SAndroid Build Coastguard Worker                                    nullptr);
859*8975f5c5SAndroid Build Coastguard Worker }
860*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetnUniformivKHR(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei bufSize,const GLint * params)861*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetnUniformivKHR(const Context *context,
862*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
863*8975f5c5SAndroid Build Coastguard Worker                               ShaderProgramID programPacked,
864*8975f5c5SAndroid Build Coastguard Worker                               UniformLocation locationPacked,
865*8975f5c5SAndroid Build Coastguard Worker                               GLsizei bufSize,
866*8975f5c5SAndroid Build Coastguard Worker                               const GLint *params)
867*8975f5c5SAndroid Build Coastguard Worker {
868*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_2_0)
869*8975f5c5SAndroid Build Coastguard Worker     {
870*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES2Required);
871*8975f5c5SAndroid Build Coastguard Worker         return false;
872*8975f5c5SAndroid Build Coastguard Worker     }
873*8975f5c5SAndroid Build Coastguard Worker 
874*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().robustnessKHR)
875*8975f5c5SAndroid Build Coastguard Worker     {
876*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
877*8975f5c5SAndroid Build Coastguard Worker         return false;
878*8975f5c5SAndroid Build Coastguard Worker     }
879*8975f5c5SAndroid Build Coastguard Worker 
880*8975f5c5SAndroid Build Coastguard Worker     return ValidateSizedGetUniform(context, entryPoint, programPacked, locationPacked, bufSize,
881*8975f5c5SAndroid Build Coastguard Worker                                    nullptr);
882*8975f5c5SAndroid Build Coastguard Worker }
883*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetnUniformuivKHR(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei bufSize,const GLuint * params)884*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetnUniformuivKHR(const Context *context,
885*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
886*8975f5c5SAndroid Build Coastguard Worker                                ShaderProgramID programPacked,
887*8975f5c5SAndroid Build Coastguard Worker                                UniformLocation locationPacked,
888*8975f5c5SAndroid Build Coastguard Worker                                GLsizei bufSize,
889*8975f5c5SAndroid Build Coastguard Worker                                const GLuint *params)
890*8975f5c5SAndroid Build Coastguard Worker {
891*8975f5c5SAndroid Build Coastguard Worker     // Based on the spec, if ES 3.0 or later is not supported, all references to GetnUniformuiv
892*8975f5c5SAndroid Build Coastguard Worker     // should be removed.
893*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_3_0)
894*8975f5c5SAndroid Build Coastguard Worker     {
895*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
896*8975f5c5SAndroid Build Coastguard Worker         return false;
897*8975f5c5SAndroid Build Coastguard Worker     }
898*8975f5c5SAndroid Build Coastguard Worker 
899*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().robustnessKHR)
900*8975f5c5SAndroid Build Coastguard Worker     {
901*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
902*8975f5c5SAndroid Build Coastguard Worker         return false;
903*8975f5c5SAndroid Build Coastguard Worker     }
904*8975f5c5SAndroid Build Coastguard Worker 
905*8975f5c5SAndroid Build Coastguard Worker     return ValidateSizedGetUniform(context, entryPoint, programPacked, locationPacked, bufSize,
906*8975f5c5SAndroid Build Coastguard Worker                                    nullptr);
907*8975f5c5SAndroid Build Coastguard Worker }
908*8975f5c5SAndroid Build Coastguard Worker 
ValidateReadnPixelsKHR(const Context * context,angle::EntryPoint entryPoint,GLint x,GLint y,GLsizei width,GLsizei height,GLenum format,GLenum type,GLsizei bufSize,const void * data)909*8975f5c5SAndroid Build Coastguard Worker bool ValidateReadnPixelsKHR(const Context *context,
910*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
911*8975f5c5SAndroid Build Coastguard Worker                             GLint x,
912*8975f5c5SAndroid Build Coastguard Worker                             GLint y,
913*8975f5c5SAndroid Build Coastguard Worker                             GLsizei width,
914*8975f5c5SAndroid Build Coastguard Worker                             GLsizei height,
915*8975f5c5SAndroid Build Coastguard Worker                             GLenum format,
916*8975f5c5SAndroid Build Coastguard Worker                             GLenum type,
917*8975f5c5SAndroid Build Coastguard Worker                             GLsizei bufSize,
918*8975f5c5SAndroid Build Coastguard Worker                             const void *data)
919*8975f5c5SAndroid Build Coastguard Worker {
920*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientVersion() < ES_2_0)
921*8975f5c5SAndroid Build Coastguard Worker     {
922*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES2Required);
923*8975f5c5SAndroid Build Coastguard Worker         return false;
924*8975f5c5SAndroid Build Coastguard Worker     }
925*8975f5c5SAndroid Build Coastguard Worker 
926*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().robustnessKHR)
927*8975f5c5SAndroid Build Coastguard Worker     {
928*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
929*8975f5c5SAndroid Build Coastguard Worker         return false;
930*8975f5c5SAndroid Build Coastguard Worker     }
931*8975f5c5SAndroid Build Coastguard Worker 
932*8975f5c5SAndroid Build Coastguard Worker     if (bufSize < 0)
933*8975f5c5SAndroid Build Coastguard Worker     {
934*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeBufferSize);
935*8975f5c5SAndroid Build Coastguard Worker         return false;
936*8975f5c5SAndroid Build Coastguard Worker     }
937*8975f5c5SAndroid Build Coastguard Worker 
938*8975f5c5SAndroid Build Coastguard Worker     return ValidateReadPixelsBase(context, entryPoint, x, y, width, height, format, type, bufSize,
939*8975f5c5SAndroid Build Coastguard Worker                                   nullptr, nullptr, nullptr, data);
940*8975f5c5SAndroid Build Coastguard Worker }
941*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendEquationOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum mode)942*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendEquationOES(const PrivateState &state,
943*8975f5c5SAndroid Build Coastguard Worker                               ErrorSet *errors,
944*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
945*8975f5c5SAndroid Build Coastguard Worker                               GLenum mode)
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().blendSubtractOES)
948*8975f5c5SAndroid Build Coastguard Worker     {
949*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
950*8975f5c5SAndroid Build Coastguard Worker         return false;
951*8975f5c5SAndroid Build Coastguard Worker     }
952*8975f5c5SAndroid Build Coastguard Worker 
953*8975f5c5SAndroid Build Coastguard Worker     switch (mode)
954*8975f5c5SAndroid Build Coastguard Worker     {
955*8975f5c5SAndroid Build Coastguard Worker         case GL_FUNC_ADD_OES:
956*8975f5c5SAndroid Build Coastguard Worker         case GL_FUNC_SUBTRACT_OES:
957*8975f5c5SAndroid Build Coastguard Worker         case GL_FUNC_REVERSE_SUBTRACT_OES:
958*8975f5c5SAndroid Build Coastguard Worker             return true;
959*8975f5c5SAndroid Build Coastguard Worker         default:
960*8975f5c5SAndroid Build Coastguard Worker             errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidBlendEquation);
961*8975f5c5SAndroid Build Coastguard Worker             return false;
962*8975f5c5SAndroid Build Coastguard Worker     }
963*8975f5c5SAndroid Build Coastguard Worker }
964*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendEquationSeparateiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum modeRGB,GLenum modeAlpha)965*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendEquationSeparateiEXT(const PrivateState &state,
966*8975f5c5SAndroid Build Coastguard Worker                                        ErrorSet *errors,
967*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
968*8975f5c5SAndroid Build Coastguard Worker                                        GLuint buf,
969*8975f5c5SAndroid Build Coastguard Worker                                        GLenum modeRGB,
970*8975f5c5SAndroid Build Coastguard Worker                                        GLenum modeAlpha)
971*8975f5c5SAndroid Build Coastguard Worker {
972*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
973*8975f5c5SAndroid Build Coastguard Worker     {
974*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
975*8975f5c5SAndroid Build Coastguard Worker         return false;
976*8975f5c5SAndroid Build Coastguard Worker     }
977*8975f5c5SAndroid Build Coastguard Worker 
978*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendEquationSeparatei(state, errors, entryPoint, buf, modeRGB, modeAlpha);
979*8975f5c5SAndroid Build Coastguard Worker }
980*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendEquationiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum mode)981*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendEquationiEXT(const PrivateState &state,
982*8975f5c5SAndroid Build Coastguard Worker                                ErrorSet *errors,
983*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
984*8975f5c5SAndroid Build Coastguard Worker                                GLuint buf,
985*8975f5c5SAndroid Build Coastguard Worker                                GLenum mode)
986*8975f5c5SAndroid Build Coastguard Worker {
987*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
988*8975f5c5SAndroid Build Coastguard Worker     {
989*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
990*8975f5c5SAndroid Build Coastguard Worker         return false;
991*8975f5c5SAndroid Build Coastguard Worker     }
992*8975f5c5SAndroid Build Coastguard Worker 
993*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendEquationi(state, errors, entryPoint, buf, mode);
994*8975f5c5SAndroid Build Coastguard Worker }
995*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendFuncSeparateiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha)996*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendFuncSeparateiEXT(const PrivateState &state,
997*8975f5c5SAndroid Build Coastguard Worker                                    ErrorSet *errors,
998*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
999*8975f5c5SAndroid Build Coastguard Worker                                    GLuint buf,
1000*8975f5c5SAndroid Build Coastguard Worker                                    GLenum srcRGB,
1001*8975f5c5SAndroid Build Coastguard Worker                                    GLenum dstRGB,
1002*8975f5c5SAndroid Build Coastguard Worker                                    GLenum srcAlpha,
1003*8975f5c5SAndroid Build Coastguard Worker                                    GLenum dstAlpha)
1004*8975f5c5SAndroid Build Coastguard Worker {
1005*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1006*8975f5c5SAndroid Build Coastguard Worker     {
1007*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1008*8975f5c5SAndroid Build Coastguard Worker         return false;
1009*8975f5c5SAndroid Build Coastguard Worker     }
1010*8975f5c5SAndroid Build Coastguard Worker 
1011*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendFuncSeparatei(state, errors, entryPoint, buf, srcRGB, dstRGB, srcAlpha,
1012*8975f5c5SAndroid Build Coastguard Worker                                       dstAlpha);
1013*8975f5c5SAndroid Build Coastguard Worker }
1014*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendFunciEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum src,GLenum dst)1015*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendFunciEXT(const PrivateState &state,
1016*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1017*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1018*8975f5c5SAndroid Build Coastguard Worker                            GLuint buf,
1019*8975f5c5SAndroid Build Coastguard Worker                            GLenum src,
1020*8975f5c5SAndroid Build Coastguard Worker                            GLenum dst)
1021*8975f5c5SAndroid Build Coastguard Worker {
1022*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1023*8975f5c5SAndroid Build Coastguard Worker     {
1024*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1025*8975f5c5SAndroid Build Coastguard Worker         return false;
1026*8975f5c5SAndroid Build Coastguard Worker     }
1027*8975f5c5SAndroid Build Coastguard Worker 
1028*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendFunci(state, errors, entryPoint, buf, src, dst);
1029*8975f5c5SAndroid Build Coastguard Worker }
1030*8975f5c5SAndroid Build Coastguard Worker 
ValidateColorMaskiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,GLboolean r,GLboolean g,GLboolean b,GLboolean a)1031*8975f5c5SAndroid Build Coastguard Worker bool ValidateColorMaskiEXT(const PrivateState &state,
1032*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1033*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1034*8975f5c5SAndroid Build Coastguard Worker                            GLuint index,
1035*8975f5c5SAndroid Build Coastguard Worker                            GLboolean r,
1036*8975f5c5SAndroid Build Coastguard Worker                            GLboolean g,
1037*8975f5c5SAndroid Build Coastguard Worker                            GLboolean b,
1038*8975f5c5SAndroid Build Coastguard Worker                            GLboolean a)
1039*8975f5c5SAndroid Build Coastguard Worker {
1040*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1041*8975f5c5SAndroid Build Coastguard Worker     {
1042*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1043*8975f5c5SAndroid Build Coastguard Worker         return false;
1044*8975f5c5SAndroid Build Coastguard Worker     }
1045*8975f5c5SAndroid Build Coastguard Worker 
1046*8975f5c5SAndroid Build Coastguard Worker     return ValidateColorMaski(state, errors, entryPoint, index, r, g, b, a);
1047*8975f5c5SAndroid Build Coastguard Worker }
1048*8975f5c5SAndroid Build Coastguard Worker 
ValidateDisableiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1049*8975f5c5SAndroid Build Coastguard Worker bool ValidateDisableiEXT(const PrivateState &state,
1050*8975f5c5SAndroid Build Coastguard Worker                          ErrorSet *errors,
1051*8975f5c5SAndroid Build Coastguard Worker                          angle::EntryPoint entryPoint,
1052*8975f5c5SAndroid Build Coastguard Worker                          GLenum target,
1053*8975f5c5SAndroid Build Coastguard Worker                          GLuint index)
1054*8975f5c5SAndroid Build Coastguard Worker {
1055*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1056*8975f5c5SAndroid Build Coastguard Worker     {
1057*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1058*8975f5c5SAndroid Build Coastguard Worker         return false;
1059*8975f5c5SAndroid Build Coastguard Worker     }
1060*8975f5c5SAndroid Build Coastguard Worker 
1061*8975f5c5SAndroid Build Coastguard Worker     return ValidateDisablei(state, errors, entryPoint, target, index);
1062*8975f5c5SAndroid Build Coastguard Worker }
1063*8975f5c5SAndroid Build Coastguard Worker 
ValidateEnableiEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1064*8975f5c5SAndroid Build Coastguard Worker bool ValidateEnableiEXT(const PrivateState &state,
1065*8975f5c5SAndroid Build Coastguard Worker                         ErrorSet *errors,
1066*8975f5c5SAndroid Build Coastguard Worker                         angle::EntryPoint entryPoint,
1067*8975f5c5SAndroid Build Coastguard Worker                         GLenum target,
1068*8975f5c5SAndroid Build Coastguard Worker                         GLuint index)
1069*8975f5c5SAndroid Build Coastguard Worker {
1070*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1071*8975f5c5SAndroid Build Coastguard Worker     {
1072*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1073*8975f5c5SAndroid Build Coastguard Worker         return false;
1074*8975f5c5SAndroid Build Coastguard Worker     }
1075*8975f5c5SAndroid Build Coastguard Worker 
1076*8975f5c5SAndroid Build Coastguard Worker     return ValidateEnablei(state, errors, entryPoint, target, index);
1077*8975f5c5SAndroid Build Coastguard Worker }
1078*8975f5c5SAndroid Build Coastguard Worker 
ValidateIsEnablediEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1079*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsEnablediEXT(const PrivateState &state,
1080*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1081*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1082*8975f5c5SAndroid Build Coastguard Worker                            GLenum target,
1083*8975f5c5SAndroid Build Coastguard Worker                            GLuint index)
1084*8975f5c5SAndroid Build Coastguard Worker {
1085*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedEXT)
1086*8975f5c5SAndroid Build Coastguard Worker     {
1087*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1088*8975f5c5SAndroid Build Coastguard Worker         return false;
1089*8975f5c5SAndroid Build Coastguard Worker     }
1090*8975f5c5SAndroid Build Coastguard Worker 
1091*8975f5c5SAndroid Build Coastguard Worker     return ValidateIsEnabledi(state, errors, entryPoint, target, index);
1092*8975f5c5SAndroid Build Coastguard Worker }
1093*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendEquationSeparateiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum modeRGB,GLenum modeAlpha)1094*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendEquationSeparateiOES(const PrivateState &state,
1095*8975f5c5SAndroid Build Coastguard Worker                                        ErrorSet *errors,
1096*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
1097*8975f5c5SAndroid Build Coastguard Worker                                        GLuint buf,
1098*8975f5c5SAndroid Build Coastguard Worker                                        GLenum modeRGB,
1099*8975f5c5SAndroid Build Coastguard Worker                                        GLenum modeAlpha)
1100*8975f5c5SAndroid Build Coastguard Worker {
1101*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1102*8975f5c5SAndroid Build Coastguard Worker     {
1103*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1104*8975f5c5SAndroid Build Coastguard Worker         return false;
1105*8975f5c5SAndroid Build Coastguard Worker     }
1106*8975f5c5SAndroid Build Coastguard Worker 
1107*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendEquationSeparatei(state, errors, entryPoint, buf, modeRGB, modeAlpha);
1108*8975f5c5SAndroid Build Coastguard Worker }
1109*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendEquationiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum mode)1110*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendEquationiOES(const PrivateState &state,
1111*8975f5c5SAndroid Build Coastguard Worker                                ErrorSet *errors,
1112*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
1113*8975f5c5SAndroid Build Coastguard Worker                                GLuint buf,
1114*8975f5c5SAndroid Build Coastguard Worker                                GLenum mode)
1115*8975f5c5SAndroid Build Coastguard Worker {
1116*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1117*8975f5c5SAndroid Build Coastguard Worker     {
1118*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1119*8975f5c5SAndroid Build Coastguard Worker         return false;
1120*8975f5c5SAndroid Build Coastguard Worker     }
1121*8975f5c5SAndroid Build Coastguard Worker 
1122*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendEquationi(state, errors, entryPoint, buf, mode);
1123*8975f5c5SAndroid Build Coastguard Worker }
1124*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendFuncSeparateiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum srcRGB,GLenum dstRGB,GLenum srcAlpha,GLenum dstAlpha)1125*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendFuncSeparateiOES(const PrivateState &state,
1126*8975f5c5SAndroid Build Coastguard Worker                                    ErrorSet *errors,
1127*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
1128*8975f5c5SAndroid Build Coastguard Worker                                    GLuint buf,
1129*8975f5c5SAndroid Build Coastguard Worker                                    GLenum srcRGB,
1130*8975f5c5SAndroid Build Coastguard Worker                                    GLenum dstRGB,
1131*8975f5c5SAndroid Build Coastguard Worker                                    GLenum srcAlpha,
1132*8975f5c5SAndroid Build Coastguard Worker                                    GLenum dstAlpha)
1133*8975f5c5SAndroid Build Coastguard Worker {
1134*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1135*8975f5c5SAndroid Build Coastguard Worker     {
1136*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1137*8975f5c5SAndroid Build Coastguard Worker         return false;
1138*8975f5c5SAndroid Build Coastguard Worker     }
1139*8975f5c5SAndroid Build Coastguard Worker 
1140*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendFuncSeparatei(state, errors, entryPoint, buf, srcRGB, dstRGB, srcAlpha,
1141*8975f5c5SAndroid Build Coastguard Worker                                       dstAlpha);
1142*8975f5c5SAndroid Build Coastguard Worker }
1143*8975f5c5SAndroid Build Coastguard Worker 
ValidateBlendFunciOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint buf,GLenum src,GLenum dst)1144*8975f5c5SAndroid Build Coastguard Worker bool ValidateBlendFunciOES(const PrivateState &state,
1145*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1146*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1147*8975f5c5SAndroid Build Coastguard Worker                            GLuint buf,
1148*8975f5c5SAndroid Build Coastguard Worker                            GLenum src,
1149*8975f5c5SAndroid Build Coastguard Worker                            GLenum dst)
1150*8975f5c5SAndroid Build Coastguard Worker {
1151*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1152*8975f5c5SAndroid Build Coastguard Worker     {
1153*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1154*8975f5c5SAndroid Build Coastguard Worker         return false;
1155*8975f5c5SAndroid Build Coastguard Worker     }
1156*8975f5c5SAndroid Build Coastguard Worker 
1157*8975f5c5SAndroid Build Coastguard Worker     return ValidateBlendFunci(state, errors, entryPoint, buf, src, dst);
1158*8975f5c5SAndroid Build Coastguard Worker }
1159*8975f5c5SAndroid Build Coastguard Worker 
ValidateColorMaskiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLuint index,GLboolean r,GLboolean g,GLboolean b,GLboolean a)1160*8975f5c5SAndroid Build Coastguard Worker bool ValidateColorMaskiOES(const PrivateState &state,
1161*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1162*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1163*8975f5c5SAndroid Build Coastguard Worker                            GLuint index,
1164*8975f5c5SAndroid Build Coastguard Worker                            GLboolean r,
1165*8975f5c5SAndroid Build Coastguard Worker                            GLboolean g,
1166*8975f5c5SAndroid Build Coastguard Worker                            GLboolean b,
1167*8975f5c5SAndroid Build Coastguard Worker                            GLboolean a)
1168*8975f5c5SAndroid Build Coastguard Worker {
1169*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1170*8975f5c5SAndroid Build Coastguard Worker     {
1171*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1172*8975f5c5SAndroid Build Coastguard Worker         return false;
1173*8975f5c5SAndroid Build Coastguard Worker     }
1174*8975f5c5SAndroid Build Coastguard Worker 
1175*8975f5c5SAndroid Build Coastguard Worker     return ValidateColorMaski(state, errors, entryPoint, index, r, g, b, a);
1176*8975f5c5SAndroid Build Coastguard Worker }
1177*8975f5c5SAndroid Build Coastguard Worker 
ValidateDisableiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1178*8975f5c5SAndroid Build Coastguard Worker bool ValidateDisableiOES(const PrivateState &state,
1179*8975f5c5SAndroid Build Coastguard Worker                          ErrorSet *errors,
1180*8975f5c5SAndroid Build Coastguard Worker                          angle::EntryPoint entryPoint,
1181*8975f5c5SAndroid Build Coastguard Worker                          GLenum target,
1182*8975f5c5SAndroid Build Coastguard Worker                          GLuint index)
1183*8975f5c5SAndroid Build Coastguard Worker {
1184*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1185*8975f5c5SAndroid Build Coastguard Worker     {
1186*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1187*8975f5c5SAndroid Build Coastguard Worker         return false;
1188*8975f5c5SAndroid Build Coastguard Worker     }
1189*8975f5c5SAndroid Build Coastguard Worker 
1190*8975f5c5SAndroid Build Coastguard Worker     return ValidateDisablei(state, errors, entryPoint, target, index);
1191*8975f5c5SAndroid Build Coastguard Worker }
1192*8975f5c5SAndroid Build Coastguard Worker 
ValidateEnableiOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1193*8975f5c5SAndroid Build Coastguard Worker bool ValidateEnableiOES(const PrivateState &state,
1194*8975f5c5SAndroid Build Coastguard Worker                         ErrorSet *errors,
1195*8975f5c5SAndroid Build Coastguard Worker                         angle::EntryPoint entryPoint,
1196*8975f5c5SAndroid Build Coastguard Worker                         GLenum target,
1197*8975f5c5SAndroid Build Coastguard Worker                         GLuint index)
1198*8975f5c5SAndroid Build Coastguard Worker {
1199*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1200*8975f5c5SAndroid Build Coastguard Worker     {
1201*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1202*8975f5c5SAndroid Build Coastguard Worker         return false;
1203*8975f5c5SAndroid Build Coastguard Worker     }
1204*8975f5c5SAndroid Build Coastguard Worker 
1205*8975f5c5SAndroid Build Coastguard Worker     return ValidateEnablei(state, errors, entryPoint, target, index);
1206*8975f5c5SAndroid Build Coastguard Worker }
1207*8975f5c5SAndroid Build Coastguard Worker 
ValidateIsEnablediOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum target,GLuint index)1208*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsEnablediOES(const PrivateState &state,
1209*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
1210*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
1211*8975f5c5SAndroid Build Coastguard Worker                            GLenum target,
1212*8975f5c5SAndroid Build Coastguard Worker                            GLuint index)
1213*8975f5c5SAndroid Build Coastguard Worker {
1214*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().drawBuffersIndexedOES)
1215*8975f5c5SAndroid Build Coastguard Worker     {
1216*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1217*8975f5c5SAndroid Build Coastguard Worker         return false;
1218*8975f5c5SAndroid Build Coastguard Worker     }
1219*8975f5c5SAndroid Build Coastguard Worker 
1220*8975f5c5SAndroid Build Coastguard Worker     return ValidateIsEnabledi(state, errors, entryPoint, target, index);
1221*8975f5c5SAndroid Build Coastguard Worker }
1222*8975f5c5SAndroid Build Coastguard Worker 
ValidateProvokingVertexANGLE(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,ProvokingVertexConvention provokeModePacked)1223*8975f5c5SAndroid Build Coastguard Worker bool ValidateProvokingVertexANGLE(const PrivateState &state,
1224*8975f5c5SAndroid Build Coastguard Worker                                   ErrorSet *errors,
1225*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
1226*8975f5c5SAndroid Build Coastguard Worker                                   ProvokingVertexConvention provokeModePacked)
1227*8975f5c5SAndroid Build Coastguard Worker {
1228*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().provokingVertexANGLE)
1229*8975f5c5SAndroid Build Coastguard Worker     {
1230*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
1231*8975f5c5SAndroid Build Coastguard Worker         return false;
1232*8975f5c5SAndroid Build Coastguard Worker     }
1233*8975f5c5SAndroid Build Coastguard Worker 
1234*8975f5c5SAndroid Build Coastguard Worker     switch (provokeModePacked)
1235*8975f5c5SAndroid Build Coastguard Worker     {
1236*8975f5c5SAndroid Build Coastguard Worker         case ProvokingVertexConvention::FirstVertexConvention:
1237*8975f5c5SAndroid Build Coastguard Worker         case ProvokingVertexConvention::LastVertexConvention:
1238*8975f5c5SAndroid Build Coastguard Worker             break;
1239*8975f5c5SAndroid Build Coastguard Worker         default:
1240*8975f5c5SAndroid Build Coastguard Worker             errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidProvokingVertex);
1241*8975f5c5SAndroid Build Coastguard Worker             return false;
1242*8975f5c5SAndroid Build Coastguard Worker     }
1243*8975f5c5SAndroid Build Coastguard Worker 
1244*8975f5c5SAndroid Build Coastguard Worker     return true;
1245*8975f5c5SAndroid Build Coastguard Worker }
1246*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetInteger64vEXT(const Context * context,angle::EntryPoint entryPoint,GLenum pname,const GLint64 * data)1247*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetInteger64vEXT(const Context *context,
1248*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
1249*8975f5c5SAndroid Build Coastguard Worker                               GLenum pname,
1250*8975f5c5SAndroid Build Coastguard Worker                               const GLint64 *data)
1251*8975f5c5SAndroid Build Coastguard Worker {
1252*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().disjointTimerQueryEXT)
1253*8975f5c5SAndroid Build Coastguard Worker     {
1254*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1255*8975f5c5SAndroid Build Coastguard Worker         return false;
1256*8975f5c5SAndroid Build Coastguard Worker     }
1257*8975f5c5SAndroid Build Coastguard Worker 
1258*8975f5c5SAndroid Build Coastguard Worker     GLenum nativeType      = GL_NONE;
1259*8975f5c5SAndroid Build Coastguard Worker     unsigned int numParams = 0;
1260*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateStateQuery(context, entryPoint, pname, &nativeType, &numParams))
1261*8975f5c5SAndroid Build Coastguard Worker     {
1262*8975f5c5SAndroid Build Coastguard Worker         return false;
1263*8975f5c5SAndroid Build Coastguard Worker     }
1264*8975f5c5SAndroid Build Coastguard Worker 
1265*8975f5c5SAndroid Build Coastguard Worker     return true;
1266*8975f5c5SAndroid Build Coastguard Worker }
1267*8975f5c5SAndroid Build Coastguard Worker 
ValidateCopyImageSubDataEXT(const Context * context,angle::EntryPoint entryPoint,GLuint srcName,GLenum srcTarget,GLint srcLevel,GLint srcX,GLint srcY,GLint srcZ,GLuint dstName,GLenum dstTarget,GLint dstLevel,GLint dstX,GLint dstY,GLint dstZ,GLsizei srcWidth,GLsizei srcHeight,GLsizei srcDepth)1268*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyImageSubDataEXT(const Context *context,
1269*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1270*8975f5c5SAndroid Build Coastguard Worker                                  GLuint srcName,
1271*8975f5c5SAndroid Build Coastguard Worker                                  GLenum srcTarget,
1272*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcLevel,
1273*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcX,
1274*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcY,
1275*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcZ,
1276*8975f5c5SAndroid Build Coastguard Worker                                  GLuint dstName,
1277*8975f5c5SAndroid Build Coastguard Worker                                  GLenum dstTarget,
1278*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstLevel,
1279*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstX,
1280*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstY,
1281*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstZ,
1282*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcWidth,
1283*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcHeight,
1284*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcDepth)
1285*8975f5c5SAndroid Build Coastguard Worker {
1286*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().copyImageEXT)
1287*8975f5c5SAndroid Build Coastguard Worker     {
1288*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1289*8975f5c5SAndroid Build Coastguard Worker         return false;
1290*8975f5c5SAndroid Build Coastguard Worker     }
1291*8975f5c5SAndroid Build Coastguard Worker 
1292*8975f5c5SAndroid Build Coastguard Worker     return ValidateCopyImageSubDataBase(context, entryPoint, srcName, srcTarget, srcLevel, srcX,
1293*8975f5c5SAndroid Build Coastguard Worker                                         srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ,
1294*8975f5c5SAndroid Build Coastguard Worker                                         srcWidth, srcHeight, srcDepth);
1295*8975f5c5SAndroid Build Coastguard Worker }
1296*8975f5c5SAndroid Build Coastguard Worker 
ValidateCopyImageSubDataOES(const Context * context,angle::EntryPoint entryPoint,GLuint srcName,GLenum srcTarget,GLint srcLevel,GLint srcX,GLint srcY,GLint srcZ,GLuint dstName,GLenum dstTarget,GLint dstLevel,GLint dstX,GLint dstY,GLint dstZ,GLsizei srcWidth,GLsizei srcHeight,GLsizei srcDepth)1297*8975f5c5SAndroid Build Coastguard Worker bool ValidateCopyImageSubDataOES(const Context *context,
1298*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1299*8975f5c5SAndroid Build Coastguard Worker                                  GLuint srcName,
1300*8975f5c5SAndroid Build Coastguard Worker                                  GLenum srcTarget,
1301*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcLevel,
1302*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcX,
1303*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcY,
1304*8975f5c5SAndroid Build Coastguard Worker                                  GLint srcZ,
1305*8975f5c5SAndroid Build Coastguard Worker                                  GLuint dstName,
1306*8975f5c5SAndroid Build Coastguard Worker                                  GLenum dstTarget,
1307*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstLevel,
1308*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstX,
1309*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstY,
1310*8975f5c5SAndroid Build Coastguard Worker                                  GLint dstZ,
1311*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcWidth,
1312*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcHeight,
1313*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei srcDepth)
1314*8975f5c5SAndroid Build Coastguard Worker {
1315*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().copyImageOES)
1316*8975f5c5SAndroid Build Coastguard Worker     {
1317*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1318*8975f5c5SAndroid Build Coastguard Worker         return false;
1319*8975f5c5SAndroid Build Coastguard Worker     }
1320*8975f5c5SAndroid Build Coastguard Worker 
1321*8975f5c5SAndroid Build Coastguard Worker     return ValidateCopyImageSubDataBase(context, entryPoint, srcName, srcTarget, srcLevel, srcX,
1322*8975f5c5SAndroid Build Coastguard Worker                                         srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ,
1323*8975f5c5SAndroid Build Coastguard Worker                                         srcWidth, srcHeight, srcDepth);
1324*8975f5c5SAndroid Build Coastguard Worker }
1325*8975f5c5SAndroid Build Coastguard Worker 
ValidateBufferStorageMemEXT(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizeiptr size,MemoryObjectID memory,GLuint64 offset)1326*8975f5c5SAndroid Build Coastguard Worker bool ValidateBufferStorageMemEXT(const Context *context,
1327*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1328*8975f5c5SAndroid Build Coastguard Worker                                  TextureType target,
1329*8975f5c5SAndroid Build Coastguard Worker                                  GLsizeiptr size,
1330*8975f5c5SAndroid Build Coastguard Worker                                  MemoryObjectID memory,
1331*8975f5c5SAndroid Build Coastguard Worker                                  GLuint64 offset)
1332*8975f5c5SAndroid Build Coastguard Worker {
1333*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1334*8975f5c5SAndroid Build Coastguard Worker     {
1335*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1336*8975f5c5SAndroid Build Coastguard Worker         return false;
1337*8975f5c5SAndroid Build Coastguard Worker     }
1338*8975f5c5SAndroid Build Coastguard Worker 
1339*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1340*8975f5c5SAndroid Build Coastguard Worker     return false;
1341*8975f5c5SAndroid Build Coastguard Worker }
1342*8975f5c5SAndroid Build Coastguard Worker 
ValidateCreateMemoryObjectsEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const MemoryObjectID * memoryObjects)1343*8975f5c5SAndroid Build Coastguard Worker bool ValidateCreateMemoryObjectsEXT(const Context *context,
1344*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1345*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei n,
1346*8975f5c5SAndroid Build Coastguard Worker                                     const MemoryObjectID *memoryObjects)
1347*8975f5c5SAndroid Build Coastguard Worker {
1348*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1349*8975f5c5SAndroid Build Coastguard Worker     {
1350*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1351*8975f5c5SAndroid Build Coastguard Worker         return false;
1352*8975f5c5SAndroid Build Coastguard Worker     }
1353*8975f5c5SAndroid Build Coastguard Worker 
1354*8975f5c5SAndroid Build Coastguard Worker     return ValidateGenOrDelete(context, entryPoint, n);
1355*8975f5c5SAndroid Build Coastguard Worker }
1356*8975f5c5SAndroid Build Coastguard Worker 
ValidateDeleteMemoryObjectsEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const MemoryObjectID * memoryObjects)1357*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteMemoryObjectsEXT(const Context *context,
1358*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1359*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei n,
1360*8975f5c5SAndroid Build Coastguard Worker                                     const MemoryObjectID *memoryObjects)
1361*8975f5c5SAndroid Build Coastguard Worker {
1362*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1363*8975f5c5SAndroid Build Coastguard Worker     {
1364*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1365*8975f5c5SAndroid Build Coastguard Worker         return false;
1366*8975f5c5SAndroid Build Coastguard Worker     }
1367*8975f5c5SAndroid Build Coastguard Worker 
1368*8975f5c5SAndroid Build Coastguard Worker     return ValidateGenOrDelete(context, entryPoint, n);
1369*8975f5c5SAndroid Build Coastguard Worker }
1370*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetMemoryObjectParameterivEXT(const Context * context,angle::EntryPoint entryPoint,MemoryObjectID memoryObject,GLenum pname,const GLint * params)1371*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetMemoryObjectParameterivEXT(const Context *context,
1372*8975f5c5SAndroid Build Coastguard Worker                                            angle::EntryPoint entryPoint,
1373*8975f5c5SAndroid Build Coastguard Worker                                            MemoryObjectID memoryObject,
1374*8975f5c5SAndroid Build Coastguard Worker                                            GLenum pname,
1375*8975f5c5SAndroid Build Coastguard Worker                                            const GLint *params)
1376*8975f5c5SAndroid Build Coastguard Worker {
1377*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1378*8975f5c5SAndroid Build Coastguard Worker     {
1379*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1380*8975f5c5SAndroid Build Coastguard Worker         return false;
1381*8975f5c5SAndroid Build Coastguard Worker     }
1382*8975f5c5SAndroid Build Coastguard Worker 
1383*8975f5c5SAndroid Build Coastguard Worker     const MemoryObject *memory = context->getMemoryObject(memoryObject);
1384*8975f5c5SAndroid Build Coastguard Worker     if (memory == nullptr)
1385*8975f5c5SAndroid Build Coastguard Worker     {
1386*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMemoryObject);
1387*8975f5c5SAndroid Build Coastguard Worker     }
1388*8975f5c5SAndroid Build Coastguard Worker 
1389*8975f5c5SAndroid Build Coastguard Worker     if (!IsValidMemoryObjectParamater(context, entryPoint, pname))
1390*8975f5c5SAndroid Build Coastguard Worker     {
1391*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidMemoryObjectParameter);
1392*8975f5c5SAndroid Build Coastguard Worker         return false;
1393*8975f5c5SAndroid Build Coastguard Worker     }
1394*8975f5c5SAndroid Build Coastguard Worker 
1395*8975f5c5SAndroid Build Coastguard Worker     return true;
1396*8975f5c5SAndroid Build Coastguard Worker }
1397*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetUnsignedBytevEXT(const Context * context,angle::EntryPoint entryPoint,GLenum pname,const GLubyte * data)1398*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetUnsignedBytevEXT(const Context *context,
1399*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1400*8975f5c5SAndroid Build Coastguard Worker                                  GLenum pname,
1401*8975f5c5SAndroid Build Coastguard Worker                                  const GLubyte *data)
1402*8975f5c5SAndroid Build Coastguard Worker {
1403*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT && !context->getExtensions().semaphoreEXT)
1404*8975f5c5SAndroid Build Coastguard Worker     {
1405*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1406*8975f5c5SAndroid Build Coastguard Worker         return false;
1407*8975f5c5SAndroid Build Coastguard Worker     }
1408*8975f5c5SAndroid Build Coastguard Worker 
1409*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1410*8975f5c5SAndroid Build Coastguard Worker     return false;
1411*8975f5c5SAndroid Build Coastguard Worker }
1412*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetUnsignedBytei_vEXT(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLuint index,const GLubyte * data)1413*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetUnsignedBytei_vEXT(const Context *context,
1414*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
1415*8975f5c5SAndroid Build Coastguard Worker                                    GLenum target,
1416*8975f5c5SAndroid Build Coastguard Worker                                    GLuint index,
1417*8975f5c5SAndroid Build Coastguard Worker                                    const GLubyte *data)
1418*8975f5c5SAndroid Build Coastguard Worker {
1419*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT && !context->getExtensions().semaphoreEXT)
1420*8975f5c5SAndroid Build Coastguard Worker     {
1421*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1422*8975f5c5SAndroid Build Coastguard Worker         return false;
1423*8975f5c5SAndroid Build Coastguard Worker     }
1424*8975f5c5SAndroid Build Coastguard Worker 
1425*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1426*8975f5c5SAndroid Build Coastguard Worker     return false;
1427*8975f5c5SAndroid Build Coastguard Worker }
1428*8975f5c5SAndroid Build Coastguard Worker 
ValidateIsMemoryObjectEXT(const Context * context,angle::EntryPoint entryPoint,MemoryObjectID memoryObject)1429*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsMemoryObjectEXT(const Context *context,
1430*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
1431*8975f5c5SAndroid Build Coastguard Worker                                MemoryObjectID memoryObject)
1432*8975f5c5SAndroid Build Coastguard Worker {
1433*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1434*8975f5c5SAndroid Build Coastguard Worker     {
1435*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1436*8975f5c5SAndroid Build Coastguard Worker         return false;
1437*8975f5c5SAndroid Build Coastguard Worker     }
1438*8975f5c5SAndroid Build Coastguard Worker 
1439*8975f5c5SAndroid Build Coastguard Worker     return true;
1440*8975f5c5SAndroid Build Coastguard Worker }
1441*8975f5c5SAndroid Build Coastguard Worker 
ValidateMemoryObjectParameterivEXT(const Context * context,angle::EntryPoint entryPoint,MemoryObjectID memoryObject,GLenum pname,const GLint * params)1442*8975f5c5SAndroid Build Coastguard Worker bool ValidateMemoryObjectParameterivEXT(const Context *context,
1443*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
1444*8975f5c5SAndroid Build Coastguard Worker                                         MemoryObjectID memoryObject,
1445*8975f5c5SAndroid Build Coastguard Worker                                         GLenum pname,
1446*8975f5c5SAndroid Build Coastguard Worker                                         const GLint *params)
1447*8975f5c5SAndroid Build Coastguard Worker {
1448*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1449*8975f5c5SAndroid Build Coastguard Worker     {
1450*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1451*8975f5c5SAndroid Build Coastguard Worker         return false;
1452*8975f5c5SAndroid Build Coastguard Worker     }
1453*8975f5c5SAndroid Build Coastguard Worker 
1454*8975f5c5SAndroid Build Coastguard Worker     const MemoryObject *memory = context->getMemoryObject(memoryObject);
1455*8975f5c5SAndroid Build Coastguard Worker     if (memory == nullptr)
1456*8975f5c5SAndroid Build Coastguard Worker     {
1457*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidMemoryObject);
1458*8975f5c5SAndroid Build Coastguard Worker         return false;
1459*8975f5c5SAndroid Build Coastguard Worker     }
1460*8975f5c5SAndroid Build Coastguard Worker 
1461*8975f5c5SAndroid Build Coastguard Worker     if (memory->isImmutable())
1462*8975f5c5SAndroid Build Coastguard Worker     {
1463*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kImmutableMemoryObject);
1464*8975f5c5SAndroid Build Coastguard Worker         return false;
1465*8975f5c5SAndroid Build Coastguard Worker     }
1466*8975f5c5SAndroid Build Coastguard Worker 
1467*8975f5c5SAndroid Build Coastguard Worker     if (!IsValidMemoryObjectParamater(context, entryPoint, pname))
1468*8975f5c5SAndroid Build Coastguard Worker     {
1469*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidMemoryObjectParameter);
1470*8975f5c5SAndroid Build Coastguard Worker         return false;
1471*8975f5c5SAndroid Build Coastguard Worker     }
1472*8975f5c5SAndroid Build Coastguard Worker 
1473*8975f5c5SAndroid Build Coastguard Worker     return true;
1474*8975f5c5SAndroid Build Coastguard Worker }
1475*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMem2DEXT(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,MemoryObjectID memory,GLuint64 offset)1476*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMem2DEXT(const Context *context,
1477*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
1478*8975f5c5SAndroid Build Coastguard Worker                                 TextureType target,
1479*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei levels,
1480*8975f5c5SAndroid Build Coastguard Worker                                 GLenum internalFormat,
1481*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei width,
1482*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei height,
1483*8975f5c5SAndroid Build Coastguard Worker                                 MemoryObjectID memory,
1484*8975f5c5SAndroid Build Coastguard Worker                                 GLuint64 offset)
1485*8975f5c5SAndroid Build Coastguard Worker {
1486*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1487*8975f5c5SAndroid Build Coastguard Worker     {
1488*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1489*8975f5c5SAndroid Build Coastguard Worker         return false;
1490*8975f5c5SAndroid Build Coastguard Worker     }
1491*8975f5c5SAndroid Build Coastguard Worker 
1492*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1493*8975f5c5SAndroid Build Coastguard Worker     {
1494*8975f5c5SAndroid Build Coastguard Worker         return ValidateES2TexStorageParametersBase(context, entryPoint, target, levels,
1495*8975f5c5SAndroid Build Coastguard Worker                                                    internalFormat, width, height);
1496*8975f5c5SAndroid Build Coastguard Worker     }
1497*8975f5c5SAndroid Build Coastguard Worker 
1498*8975f5c5SAndroid Build Coastguard Worker     ASSERT(context->getClientMajorVersion() >= 3);
1499*8975f5c5SAndroid Build Coastguard Worker     return ValidateES3TexStorage2DParameters(context, entryPoint, target, levels, internalFormat,
1500*8975f5c5SAndroid Build Coastguard Worker                                              width, height, 1);
1501*8975f5c5SAndroid Build Coastguard Worker }
1502*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMem3DEXT(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,MemoryObjectID memory,GLuint64 offset)1503*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMem3DEXT(const Context *context,
1504*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
1505*8975f5c5SAndroid Build Coastguard Worker                                 TextureType target,
1506*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei levels,
1507*8975f5c5SAndroid Build Coastguard Worker                                 GLenum internalFormat,
1508*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei width,
1509*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei height,
1510*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei depth,
1511*8975f5c5SAndroid Build Coastguard Worker                                 MemoryObjectID memory,
1512*8975f5c5SAndroid Build Coastguard Worker                                 GLuint64 offset)
1513*8975f5c5SAndroid Build Coastguard Worker {
1514*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectEXT)
1515*8975f5c5SAndroid Build Coastguard Worker     {
1516*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1517*8975f5c5SAndroid Build Coastguard Worker         return false;
1518*8975f5c5SAndroid Build Coastguard Worker     }
1519*8975f5c5SAndroid Build Coastguard Worker 
1520*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1521*8975f5c5SAndroid Build Coastguard Worker     return false;
1522*8975f5c5SAndroid Build Coastguard Worker }
1523*8975f5c5SAndroid Build Coastguard Worker 
ValidateImportMemoryFdEXT(const Context * context,angle::EntryPoint entryPoint,MemoryObjectID memory,GLuint64 size,HandleType handleType,GLint fd)1524*8975f5c5SAndroid Build Coastguard Worker bool ValidateImportMemoryFdEXT(const Context *context,
1525*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
1526*8975f5c5SAndroid Build Coastguard Worker                                MemoryObjectID memory,
1527*8975f5c5SAndroid Build Coastguard Worker                                GLuint64 size,
1528*8975f5c5SAndroid Build Coastguard Worker                                HandleType handleType,
1529*8975f5c5SAndroid Build Coastguard Worker                                GLint fd)
1530*8975f5c5SAndroid Build Coastguard Worker {
1531*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectFdEXT)
1532*8975f5c5SAndroid Build Coastguard Worker     {
1533*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1534*8975f5c5SAndroid Build Coastguard Worker         return false;
1535*8975f5c5SAndroid Build Coastguard Worker     }
1536*8975f5c5SAndroid Build Coastguard Worker 
1537*8975f5c5SAndroid Build Coastguard Worker     switch (handleType)
1538*8975f5c5SAndroid Build Coastguard Worker     {
1539*8975f5c5SAndroid Build Coastguard Worker         case HandleType::OpaqueFd:
1540*8975f5c5SAndroid Build Coastguard Worker             break;
1541*8975f5c5SAndroid Build Coastguard Worker         default:
1542*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidHandleType);
1543*8975f5c5SAndroid Build Coastguard Worker             return false;
1544*8975f5c5SAndroid Build Coastguard Worker     }
1545*8975f5c5SAndroid Build Coastguard Worker 
1546*8975f5c5SAndroid Build Coastguard Worker     return true;
1547*8975f5c5SAndroid Build Coastguard Worker }
1548*8975f5c5SAndroid Build Coastguard Worker 
ValidateImportMemoryZirconHandleANGLE(const Context * context,angle::EntryPoint entryPoint,MemoryObjectID memory,GLuint64 size,HandleType handleType,GLuint handle)1549*8975f5c5SAndroid Build Coastguard Worker bool ValidateImportMemoryZirconHandleANGLE(const Context *context,
1550*8975f5c5SAndroid Build Coastguard Worker                                            angle::EntryPoint entryPoint,
1551*8975f5c5SAndroid Build Coastguard Worker                                            MemoryObjectID memory,
1552*8975f5c5SAndroid Build Coastguard Worker                                            GLuint64 size,
1553*8975f5c5SAndroid Build Coastguard Worker                                            HandleType handleType,
1554*8975f5c5SAndroid Build Coastguard Worker                                            GLuint handle)
1555*8975f5c5SAndroid Build Coastguard Worker {
1556*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectFuchsiaANGLE)
1557*8975f5c5SAndroid Build Coastguard Worker     {
1558*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1559*8975f5c5SAndroid Build Coastguard Worker         return false;
1560*8975f5c5SAndroid Build Coastguard Worker     }
1561*8975f5c5SAndroid Build Coastguard Worker 
1562*8975f5c5SAndroid Build Coastguard Worker     switch (handleType)
1563*8975f5c5SAndroid Build Coastguard Worker     {
1564*8975f5c5SAndroid Build Coastguard Worker         case HandleType::ZirconVmo:
1565*8975f5c5SAndroid Build Coastguard Worker             break;
1566*8975f5c5SAndroid Build Coastguard Worker         default:
1567*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidHandleType);
1568*8975f5c5SAndroid Build Coastguard Worker             return false;
1569*8975f5c5SAndroid Build Coastguard Worker     }
1570*8975f5c5SAndroid Build Coastguard Worker 
1571*8975f5c5SAndroid Build Coastguard Worker     return true;
1572*8975f5c5SAndroid Build Coastguard Worker }
1573*8975f5c5SAndroid Build Coastguard Worker 
ValidateDeleteSemaphoresEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const SemaphoreID * semaphores)1574*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteSemaphoresEXT(const Context *context,
1575*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1576*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei n,
1577*8975f5c5SAndroid Build Coastguard Worker                                  const SemaphoreID *semaphores)
1578*8975f5c5SAndroid Build Coastguard Worker {
1579*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1580*8975f5c5SAndroid Build Coastguard Worker     {
1581*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1582*8975f5c5SAndroid Build Coastguard Worker         return false;
1583*8975f5c5SAndroid Build Coastguard Worker     }
1584*8975f5c5SAndroid Build Coastguard Worker 
1585*8975f5c5SAndroid Build Coastguard Worker     return ValidateGenOrDelete(context, entryPoint, n);
1586*8975f5c5SAndroid Build Coastguard Worker }
1587*8975f5c5SAndroid Build Coastguard Worker 
ValidateGenSemaphoresEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const SemaphoreID * semaphores)1588*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenSemaphoresEXT(const Context *context,
1589*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
1590*8975f5c5SAndroid Build Coastguard Worker                               GLsizei n,
1591*8975f5c5SAndroid Build Coastguard Worker                               const SemaphoreID *semaphores)
1592*8975f5c5SAndroid Build Coastguard Worker {
1593*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1594*8975f5c5SAndroid Build Coastguard Worker     {
1595*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1596*8975f5c5SAndroid Build Coastguard Worker         return false;
1597*8975f5c5SAndroid Build Coastguard Worker     }
1598*8975f5c5SAndroid Build Coastguard Worker 
1599*8975f5c5SAndroid Build Coastguard Worker     return ValidateGenOrDelete(context, entryPoint, n);
1600*8975f5c5SAndroid Build Coastguard Worker }
1601*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetSemaphoreParameterui64vEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,GLenum pname,const GLuint64 * params)1602*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSemaphoreParameterui64vEXT(const Context *context,
1603*8975f5c5SAndroid Build Coastguard Worker                                            angle::EntryPoint entryPoint,
1604*8975f5c5SAndroid Build Coastguard Worker                                            SemaphoreID semaphore,
1605*8975f5c5SAndroid Build Coastguard Worker                                            GLenum pname,
1606*8975f5c5SAndroid Build Coastguard Worker                                            const GLuint64 *params)
1607*8975f5c5SAndroid Build Coastguard Worker {
1608*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1609*8975f5c5SAndroid Build Coastguard Worker     {
1610*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1611*8975f5c5SAndroid Build Coastguard Worker         return false;
1612*8975f5c5SAndroid Build Coastguard Worker     }
1613*8975f5c5SAndroid Build Coastguard Worker 
1614*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1615*8975f5c5SAndroid Build Coastguard Worker     return false;
1616*8975f5c5SAndroid Build Coastguard Worker }
1617*8975f5c5SAndroid Build Coastguard Worker 
ValidateIsSemaphoreEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore)1618*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsSemaphoreEXT(const Context *context,
1619*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
1620*8975f5c5SAndroid Build Coastguard Worker                             SemaphoreID semaphore)
1621*8975f5c5SAndroid Build Coastguard Worker {
1622*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1623*8975f5c5SAndroid Build Coastguard Worker     {
1624*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1625*8975f5c5SAndroid Build Coastguard Worker         return false;
1626*8975f5c5SAndroid Build Coastguard Worker     }
1627*8975f5c5SAndroid Build Coastguard Worker 
1628*8975f5c5SAndroid Build Coastguard Worker     return true;
1629*8975f5c5SAndroid Build Coastguard Worker }
1630*8975f5c5SAndroid Build Coastguard Worker 
ValidateSemaphoreParameterui64vEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,GLenum pname,const GLuint64 * params)1631*8975f5c5SAndroid Build Coastguard Worker bool ValidateSemaphoreParameterui64vEXT(const Context *context,
1632*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
1633*8975f5c5SAndroid Build Coastguard Worker                                         SemaphoreID semaphore,
1634*8975f5c5SAndroid Build Coastguard Worker                                         GLenum pname,
1635*8975f5c5SAndroid Build Coastguard Worker                                         const GLuint64 *params)
1636*8975f5c5SAndroid Build Coastguard Worker {
1637*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1638*8975f5c5SAndroid Build Coastguard Worker     {
1639*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1640*8975f5c5SAndroid Build Coastguard Worker         return false;
1641*8975f5c5SAndroid Build Coastguard Worker     }
1642*8975f5c5SAndroid Build Coastguard Worker 
1643*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
1644*8975f5c5SAndroid Build Coastguard Worker     return false;
1645*8975f5c5SAndroid Build Coastguard Worker }
1646*8975f5c5SAndroid Build Coastguard Worker 
ValidateSignalSemaphoreEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,GLuint numBufferBarriers,const BufferID * buffers,GLuint numTextureBarriers,const TextureID * textures,const GLenum * dstLayouts)1647*8975f5c5SAndroid Build Coastguard Worker bool ValidateSignalSemaphoreEXT(const Context *context,
1648*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
1649*8975f5c5SAndroid Build Coastguard Worker                                 SemaphoreID semaphore,
1650*8975f5c5SAndroid Build Coastguard Worker                                 GLuint numBufferBarriers,
1651*8975f5c5SAndroid Build Coastguard Worker                                 const BufferID *buffers,
1652*8975f5c5SAndroid Build Coastguard Worker                                 GLuint numTextureBarriers,
1653*8975f5c5SAndroid Build Coastguard Worker                                 const TextureID *textures,
1654*8975f5c5SAndroid Build Coastguard Worker                                 const GLenum *dstLayouts)
1655*8975f5c5SAndroid Build Coastguard Worker {
1656*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1657*8975f5c5SAndroid Build Coastguard Worker     {
1658*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1659*8975f5c5SAndroid Build Coastguard Worker         return false;
1660*8975f5c5SAndroid Build Coastguard Worker     }
1661*8975f5c5SAndroid Build Coastguard Worker 
1662*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numBufferBarriers; ++i)
1663*8975f5c5SAndroid Build Coastguard Worker     {
1664*8975f5c5SAndroid Build Coastguard Worker         if (!context->getBuffer(buffers[i]))
1665*8975f5c5SAndroid Build Coastguard Worker         {
1666*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidBufferName);
1667*8975f5c5SAndroid Build Coastguard Worker             return false;
1668*8975f5c5SAndroid Build Coastguard Worker         }
1669*8975f5c5SAndroid Build Coastguard Worker     }
1670*8975f5c5SAndroid Build Coastguard Worker 
1671*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numTextureBarriers; ++i)
1672*8975f5c5SAndroid Build Coastguard Worker     {
1673*8975f5c5SAndroid Build Coastguard Worker         if (!context->getTexture(textures[i]))
1674*8975f5c5SAndroid Build Coastguard Worker         {
1675*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
1676*8975f5c5SAndroid Build Coastguard Worker             return false;
1677*8975f5c5SAndroid Build Coastguard Worker         }
1678*8975f5c5SAndroid Build Coastguard Worker         if (!IsValidImageLayout(FromGLenum<ImageLayout>(dstLayouts[i])))
1679*8975f5c5SAndroid Build Coastguard Worker         {
1680*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidImageLayout);
1681*8975f5c5SAndroid Build Coastguard Worker             return false;
1682*8975f5c5SAndroid Build Coastguard Worker         }
1683*8975f5c5SAndroid Build Coastguard Worker     }
1684*8975f5c5SAndroid Build Coastguard Worker 
1685*8975f5c5SAndroid Build Coastguard Worker     return true;
1686*8975f5c5SAndroid Build Coastguard Worker }
1687*8975f5c5SAndroid Build Coastguard Worker 
ValidateWaitSemaphoreEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,GLuint numBufferBarriers,const BufferID * buffers,GLuint numTextureBarriers,const TextureID * textures,const GLenum * srcLayouts)1688*8975f5c5SAndroid Build Coastguard Worker bool ValidateWaitSemaphoreEXT(const Context *context,
1689*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
1690*8975f5c5SAndroid Build Coastguard Worker                               SemaphoreID semaphore,
1691*8975f5c5SAndroid Build Coastguard Worker                               GLuint numBufferBarriers,
1692*8975f5c5SAndroid Build Coastguard Worker                               const BufferID *buffers,
1693*8975f5c5SAndroid Build Coastguard Worker                               GLuint numTextureBarriers,
1694*8975f5c5SAndroid Build Coastguard Worker                               const TextureID *textures,
1695*8975f5c5SAndroid Build Coastguard Worker                               const GLenum *srcLayouts)
1696*8975f5c5SAndroid Build Coastguard Worker {
1697*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreEXT)
1698*8975f5c5SAndroid Build Coastguard Worker     {
1699*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1700*8975f5c5SAndroid Build Coastguard Worker         return false;
1701*8975f5c5SAndroid Build Coastguard Worker     }
1702*8975f5c5SAndroid Build Coastguard Worker 
1703*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numBufferBarriers; ++i)
1704*8975f5c5SAndroid Build Coastguard Worker     {
1705*8975f5c5SAndroid Build Coastguard Worker         if (!context->getBuffer(buffers[i]))
1706*8975f5c5SAndroid Build Coastguard Worker         {
1707*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidBufferName);
1708*8975f5c5SAndroid Build Coastguard Worker             return false;
1709*8975f5c5SAndroid Build Coastguard Worker         }
1710*8975f5c5SAndroid Build Coastguard Worker     }
1711*8975f5c5SAndroid Build Coastguard Worker 
1712*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numTextureBarriers; ++i)
1713*8975f5c5SAndroid Build Coastguard Worker     {
1714*8975f5c5SAndroid Build Coastguard Worker         if (!context->getTexture(textures[i]))
1715*8975f5c5SAndroid Build Coastguard Worker         {
1716*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
1717*8975f5c5SAndroid Build Coastguard Worker             return false;
1718*8975f5c5SAndroid Build Coastguard Worker         }
1719*8975f5c5SAndroid Build Coastguard Worker         if (!IsValidImageLayout(FromGLenum<ImageLayout>(srcLayouts[i])))
1720*8975f5c5SAndroid Build Coastguard Worker         {
1721*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidImageLayout);
1722*8975f5c5SAndroid Build Coastguard Worker             return false;
1723*8975f5c5SAndroid Build Coastguard Worker         }
1724*8975f5c5SAndroid Build Coastguard Worker     }
1725*8975f5c5SAndroid Build Coastguard Worker 
1726*8975f5c5SAndroid Build Coastguard Worker     return true;
1727*8975f5c5SAndroid Build Coastguard Worker }
1728*8975f5c5SAndroid Build Coastguard Worker 
ValidateImportSemaphoreFdEXT(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,HandleType handleType,GLint fd)1729*8975f5c5SAndroid Build Coastguard Worker bool ValidateImportSemaphoreFdEXT(const Context *context,
1730*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
1731*8975f5c5SAndroid Build Coastguard Worker                                   SemaphoreID semaphore,
1732*8975f5c5SAndroid Build Coastguard Worker                                   HandleType handleType,
1733*8975f5c5SAndroid Build Coastguard Worker                                   GLint fd)
1734*8975f5c5SAndroid Build Coastguard Worker {
1735*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreFdEXT)
1736*8975f5c5SAndroid Build Coastguard Worker     {
1737*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1738*8975f5c5SAndroid Build Coastguard Worker         return false;
1739*8975f5c5SAndroid Build Coastguard Worker     }
1740*8975f5c5SAndroid Build Coastguard Worker 
1741*8975f5c5SAndroid Build Coastguard Worker     switch (handleType)
1742*8975f5c5SAndroid Build Coastguard Worker     {
1743*8975f5c5SAndroid Build Coastguard Worker         case HandleType::OpaqueFd:
1744*8975f5c5SAndroid Build Coastguard Worker             break;
1745*8975f5c5SAndroid Build Coastguard Worker         default:
1746*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidHandleType);
1747*8975f5c5SAndroid Build Coastguard Worker             return false;
1748*8975f5c5SAndroid Build Coastguard Worker     }
1749*8975f5c5SAndroid Build Coastguard Worker 
1750*8975f5c5SAndroid Build Coastguard Worker     return true;
1751*8975f5c5SAndroid Build Coastguard Worker }
1752*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexParameterIivOES(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLenum pname,const GLint * params)1753*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexParameterIivOES(const Context *context,
1754*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
1755*8975f5c5SAndroid Build Coastguard Worker                                    TextureType target,
1756*8975f5c5SAndroid Build Coastguard Worker                                    GLenum pname,
1757*8975f5c5SAndroid Build Coastguard Worker                                    const GLint *params)
1758*8975f5c5SAndroid Build Coastguard Worker {
1759*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1760*8975f5c5SAndroid Build Coastguard Worker     {
1761*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1762*8975f5c5SAndroid Build Coastguard Worker     }
1763*8975f5c5SAndroid Build Coastguard Worker 
1764*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1765*8975f5c5SAndroid Build Coastguard Worker     {
1766*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1767*8975f5c5SAndroid Build Coastguard Worker         return false;
1768*8975f5c5SAndroid Build Coastguard Worker     }
1769*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetTexParameterBase(context, entryPoint, target, pname, nullptr);
1770*8975f5c5SAndroid Build Coastguard Worker }
1771*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexParameterIuivOES(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLenum pname,const GLuint * params)1772*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexParameterIuivOES(const Context *context,
1773*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1774*8975f5c5SAndroid Build Coastguard Worker                                     TextureType target,
1775*8975f5c5SAndroid Build Coastguard Worker                                     GLenum pname,
1776*8975f5c5SAndroid Build Coastguard Worker                                     const GLuint *params)
1777*8975f5c5SAndroid Build Coastguard Worker {
1778*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1779*8975f5c5SAndroid Build Coastguard Worker     {
1780*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1781*8975f5c5SAndroid Build Coastguard Worker     }
1782*8975f5c5SAndroid Build Coastguard Worker 
1783*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1784*8975f5c5SAndroid Build Coastguard Worker     {
1785*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1786*8975f5c5SAndroid Build Coastguard Worker     }
1787*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetTexParameterBase(context, entryPoint, target, pname, nullptr);
1788*8975f5c5SAndroid Build Coastguard Worker }
1789*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexParameterIivOES(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLenum pname,const GLint * params)1790*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexParameterIivOES(const Context *context,
1791*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
1792*8975f5c5SAndroid Build Coastguard Worker                                 TextureType target,
1793*8975f5c5SAndroid Build Coastguard Worker                                 GLenum pname,
1794*8975f5c5SAndroid Build Coastguard Worker                                 const GLint *params)
1795*8975f5c5SAndroid Build Coastguard Worker {
1796*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1797*8975f5c5SAndroid Build Coastguard Worker     {
1798*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1799*8975f5c5SAndroid Build Coastguard Worker     }
1800*8975f5c5SAndroid Build Coastguard Worker 
1801*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1802*8975f5c5SAndroid Build Coastguard Worker     {
1803*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1804*8975f5c5SAndroid Build Coastguard Worker         return false;
1805*8975f5c5SAndroid Build Coastguard Worker     }
1806*8975f5c5SAndroid Build Coastguard Worker     return ValidateTexParameterBase(context, entryPoint, target, pname, -1, true, params);
1807*8975f5c5SAndroid Build Coastguard Worker }
1808*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexParameterIuivOES(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLenum pname,const GLuint * params)1809*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexParameterIuivOES(const Context *context,
1810*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
1811*8975f5c5SAndroid Build Coastguard Worker                                  TextureType target,
1812*8975f5c5SAndroid Build Coastguard Worker                                  GLenum pname,
1813*8975f5c5SAndroid Build Coastguard Worker                                  const GLuint *params)
1814*8975f5c5SAndroid Build Coastguard Worker {
1815*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1816*8975f5c5SAndroid Build Coastguard Worker     {
1817*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1818*8975f5c5SAndroid Build Coastguard Worker     }
1819*8975f5c5SAndroid Build Coastguard Worker 
1820*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1821*8975f5c5SAndroid Build Coastguard Worker     {
1822*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1823*8975f5c5SAndroid Build Coastguard Worker         return false;
1824*8975f5c5SAndroid Build Coastguard Worker     }
1825*8975f5c5SAndroid Build Coastguard Worker 
1826*8975f5c5SAndroid Build Coastguard Worker     return ValidateTexParameterBase(context, entryPoint, target, pname, -1, true, params);
1827*8975f5c5SAndroid Build Coastguard Worker }
1828*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetSamplerParameterIivOES(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLint * params)1829*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameterIivOES(const Context *context,
1830*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
1831*8975f5c5SAndroid Build Coastguard Worker                                        SamplerID sampler,
1832*8975f5c5SAndroid Build Coastguard Worker                                        GLenum pname,
1833*8975f5c5SAndroid Build Coastguard Worker                                        const GLint *params)
1834*8975f5c5SAndroid Build Coastguard Worker {
1835*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1836*8975f5c5SAndroid Build Coastguard Worker     {
1837*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1838*8975f5c5SAndroid Build Coastguard Worker     }
1839*8975f5c5SAndroid Build Coastguard Worker 
1840*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1841*8975f5c5SAndroid Build Coastguard Worker     {
1842*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1843*8975f5c5SAndroid Build Coastguard Worker         return false;
1844*8975f5c5SAndroid Build Coastguard Worker     }
1845*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetSamplerParameterBase(context, entryPoint, sampler, pname, nullptr);
1846*8975f5c5SAndroid Build Coastguard Worker }
1847*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetSamplerParameterIuivOES(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLuint * params)1848*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameterIuivOES(const Context *context,
1849*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
1850*8975f5c5SAndroid Build Coastguard Worker                                         SamplerID sampler,
1851*8975f5c5SAndroid Build Coastguard Worker                                         GLenum pname,
1852*8975f5c5SAndroid Build Coastguard Worker                                         const GLuint *params)
1853*8975f5c5SAndroid Build Coastguard Worker {
1854*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1855*8975f5c5SAndroid Build Coastguard Worker     {
1856*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1857*8975f5c5SAndroid Build Coastguard Worker     }
1858*8975f5c5SAndroid Build Coastguard Worker 
1859*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1860*8975f5c5SAndroid Build Coastguard Worker     {
1861*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1862*8975f5c5SAndroid Build Coastguard Worker         return false;
1863*8975f5c5SAndroid Build Coastguard Worker     }
1864*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetSamplerParameterBase(context, entryPoint, sampler, pname, nullptr);
1865*8975f5c5SAndroid Build Coastguard Worker }
1866*8975f5c5SAndroid Build Coastguard Worker 
ValidateSamplerParameterIivOES(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLint * params)1867*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterIivOES(const Context *context,
1868*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1869*8975f5c5SAndroid Build Coastguard Worker                                     SamplerID sampler,
1870*8975f5c5SAndroid Build Coastguard Worker                                     GLenum pname,
1871*8975f5c5SAndroid Build Coastguard Worker                                     const GLint *params)
1872*8975f5c5SAndroid Build Coastguard Worker {
1873*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1874*8975f5c5SAndroid Build Coastguard Worker     {
1875*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1876*8975f5c5SAndroid Build Coastguard Worker     }
1877*8975f5c5SAndroid Build Coastguard Worker 
1878*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1879*8975f5c5SAndroid Build Coastguard Worker     {
1880*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1881*8975f5c5SAndroid Build Coastguard Worker         return false;
1882*8975f5c5SAndroid Build Coastguard Worker     }
1883*8975f5c5SAndroid Build Coastguard Worker     return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, true, params);
1884*8975f5c5SAndroid Build Coastguard Worker }
1885*8975f5c5SAndroid Build Coastguard Worker 
ValidateSamplerParameterIuivOES(const Context * context,angle::EntryPoint entryPoint,SamplerID sampler,GLenum pname,const GLuint * params)1886*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterIuivOES(const Context *context,
1887*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
1888*8975f5c5SAndroid Build Coastguard Worker                                      SamplerID sampler,
1889*8975f5c5SAndroid Build Coastguard Worker                                      GLenum pname,
1890*8975f5c5SAndroid Build Coastguard Worker                                      const GLuint *params)
1891*8975f5c5SAndroid Build Coastguard Worker {
1892*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1893*8975f5c5SAndroid Build Coastguard Worker     {
1894*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1895*8975f5c5SAndroid Build Coastguard Worker     }
1896*8975f5c5SAndroid Build Coastguard Worker 
1897*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampOES)
1898*8975f5c5SAndroid Build Coastguard Worker     {
1899*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1900*8975f5c5SAndroid Build Coastguard Worker         return false;
1901*8975f5c5SAndroid Build Coastguard Worker     }
1902*8975f5c5SAndroid Build Coastguard Worker     return ValidateSamplerParameterBase(context, entryPoint, sampler, pname, -1, true, params);
1903*8975f5c5SAndroid Build Coastguard Worker }
1904*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetSamplerParameterIivEXT(const Context * context,angle::EntryPoint entryPoint,SamplerID samplerPacked,GLenum pname,const GLint * params)1905*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameterIivEXT(const Context *context,
1906*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
1907*8975f5c5SAndroid Build Coastguard Worker                                        SamplerID samplerPacked,
1908*8975f5c5SAndroid Build Coastguard Worker                                        GLenum pname,
1909*8975f5c5SAndroid Build Coastguard Worker                                        const GLint *params)
1910*8975f5c5SAndroid Build Coastguard Worker {
1911*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1912*8975f5c5SAndroid Build Coastguard Worker     {
1913*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1914*8975f5c5SAndroid Build Coastguard Worker     }
1915*8975f5c5SAndroid Build Coastguard Worker 
1916*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
1917*8975f5c5SAndroid Build Coastguard Worker     {
1918*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1919*8975f5c5SAndroid Build Coastguard Worker         return false;
1920*8975f5c5SAndroid Build Coastguard Worker     }
1921*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetSamplerParameterBase(context, entryPoint, samplerPacked, pname, nullptr);
1922*8975f5c5SAndroid Build Coastguard Worker }
1923*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetSamplerParameterIuivEXT(const Context * context,angle::EntryPoint entryPoint,SamplerID samplerPacked,GLenum pname,const GLuint * params)1924*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetSamplerParameterIuivEXT(const Context *context,
1925*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
1926*8975f5c5SAndroid Build Coastguard Worker                                         SamplerID samplerPacked,
1927*8975f5c5SAndroid Build Coastguard Worker                                         GLenum pname,
1928*8975f5c5SAndroid Build Coastguard Worker                                         const GLuint *params)
1929*8975f5c5SAndroid Build Coastguard Worker {
1930*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1931*8975f5c5SAndroid Build Coastguard Worker     {
1932*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1933*8975f5c5SAndroid Build Coastguard Worker     }
1934*8975f5c5SAndroid Build Coastguard Worker 
1935*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
1936*8975f5c5SAndroid Build Coastguard Worker     {
1937*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1938*8975f5c5SAndroid Build Coastguard Worker         return false;
1939*8975f5c5SAndroid Build Coastguard Worker     }
1940*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetSamplerParameterBase(context, entryPoint, samplerPacked, pname, nullptr);
1941*8975f5c5SAndroid Build Coastguard Worker }
1942*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexParameterIivEXT(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLenum pname,const GLint * params)1943*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexParameterIivEXT(const Context *context,
1944*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
1945*8975f5c5SAndroid Build Coastguard Worker                                    TextureType targetPacked,
1946*8975f5c5SAndroid Build Coastguard Worker                                    GLenum pname,
1947*8975f5c5SAndroid Build Coastguard Worker                                    const GLint *params)
1948*8975f5c5SAndroid Build Coastguard Worker {
1949*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1950*8975f5c5SAndroid Build Coastguard Worker     {
1951*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1952*8975f5c5SAndroid Build Coastguard Worker     }
1953*8975f5c5SAndroid Build Coastguard Worker 
1954*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
1955*8975f5c5SAndroid Build Coastguard Worker     {
1956*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1957*8975f5c5SAndroid Build Coastguard Worker         return false;
1958*8975f5c5SAndroid Build Coastguard Worker     }
1959*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetTexParameterBase(context, entryPoint, targetPacked, pname, nullptr);
1960*8975f5c5SAndroid Build Coastguard Worker }
1961*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetTexParameterIuivEXT(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLenum pname,const GLuint * params)1962*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetTexParameterIuivEXT(const Context *context,
1963*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1964*8975f5c5SAndroid Build Coastguard Worker                                     TextureType targetPacked,
1965*8975f5c5SAndroid Build Coastguard Worker                                     GLenum pname,
1966*8975f5c5SAndroid Build Coastguard Worker                                     const GLuint *params)
1967*8975f5c5SAndroid Build Coastguard Worker {
1968*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1969*8975f5c5SAndroid Build Coastguard Worker     {
1970*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1971*8975f5c5SAndroid Build Coastguard Worker     }
1972*8975f5c5SAndroid Build Coastguard Worker 
1973*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
1974*8975f5c5SAndroid Build Coastguard Worker     {
1975*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1976*8975f5c5SAndroid Build Coastguard Worker         return false;
1977*8975f5c5SAndroid Build Coastguard Worker     }
1978*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetTexParameterBase(context, entryPoint, targetPacked, pname, nullptr);
1979*8975f5c5SAndroid Build Coastguard Worker }
1980*8975f5c5SAndroid Build Coastguard Worker 
ValidateSamplerParameterIivEXT(const Context * context,angle::EntryPoint entryPoint,SamplerID samplerPacked,GLenum pname,const GLint * param)1981*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterIivEXT(const Context *context,
1982*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
1983*8975f5c5SAndroid Build Coastguard Worker                                     SamplerID samplerPacked,
1984*8975f5c5SAndroid Build Coastguard Worker                                     GLenum pname,
1985*8975f5c5SAndroid Build Coastguard Worker                                     const GLint *param)
1986*8975f5c5SAndroid Build Coastguard Worker {
1987*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
1988*8975f5c5SAndroid Build Coastguard Worker     {
1989*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
1990*8975f5c5SAndroid Build Coastguard Worker     }
1991*8975f5c5SAndroid Build Coastguard Worker 
1992*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
1993*8975f5c5SAndroid Build Coastguard Worker     {
1994*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
1995*8975f5c5SAndroid Build Coastguard Worker         return false;
1996*8975f5c5SAndroid Build Coastguard Worker     }
1997*8975f5c5SAndroid Build Coastguard Worker     return ValidateSamplerParameterBase(context, entryPoint, samplerPacked, pname, -1, true, param);
1998*8975f5c5SAndroid Build Coastguard Worker }
1999*8975f5c5SAndroid Build Coastguard Worker 
ValidateSamplerParameterIuivEXT(const Context * context,angle::EntryPoint entryPoint,SamplerID samplerPacked,GLenum pname,const GLuint * param)2000*8975f5c5SAndroid Build Coastguard Worker bool ValidateSamplerParameterIuivEXT(const Context *context,
2001*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
2002*8975f5c5SAndroid Build Coastguard Worker                                      SamplerID samplerPacked,
2003*8975f5c5SAndroid Build Coastguard Worker                                      GLenum pname,
2004*8975f5c5SAndroid Build Coastguard Worker                                      const GLuint *param)
2005*8975f5c5SAndroid Build Coastguard Worker {
2006*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
2007*8975f5c5SAndroid Build Coastguard Worker     {
2008*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2009*8975f5c5SAndroid Build Coastguard Worker     }
2010*8975f5c5SAndroid Build Coastguard Worker 
2011*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
2012*8975f5c5SAndroid Build Coastguard Worker     {
2013*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2014*8975f5c5SAndroid Build Coastguard Worker         return false;
2015*8975f5c5SAndroid Build Coastguard Worker     }
2016*8975f5c5SAndroid Build Coastguard Worker     return ValidateSamplerParameterBase(context, entryPoint, samplerPacked, pname, -1, true, param);
2017*8975f5c5SAndroid Build Coastguard Worker }
2018*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexParameterIivEXT(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLenum pname,const GLint * params)2019*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexParameterIivEXT(const Context *context,
2020*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
2021*8975f5c5SAndroid Build Coastguard Worker                                 TextureType targetPacked,
2022*8975f5c5SAndroid Build Coastguard Worker                                 GLenum pname,
2023*8975f5c5SAndroid Build Coastguard Worker                                 const GLint *params)
2024*8975f5c5SAndroid Build Coastguard Worker {
2025*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
2026*8975f5c5SAndroid Build Coastguard Worker     {
2027*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2028*8975f5c5SAndroid Build Coastguard Worker     }
2029*8975f5c5SAndroid Build Coastguard Worker 
2030*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
2031*8975f5c5SAndroid Build Coastguard Worker     {
2032*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2033*8975f5c5SAndroid Build Coastguard Worker         return false;
2034*8975f5c5SAndroid Build Coastguard Worker     }
2035*8975f5c5SAndroid Build Coastguard Worker     return ValidateTexParameterBase(context, entryPoint, targetPacked, pname, -1, true, params);
2036*8975f5c5SAndroid Build Coastguard Worker }
2037*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexParameterIuivEXT(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLenum pname,const GLuint * params)2038*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexParameterIuivEXT(const Context *context,
2039*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
2040*8975f5c5SAndroid Build Coastguard Worker                                  TextureType targetPacked,
2041*8975f5c5SAndroid Build Coastguard Worker                                  GLenum pname,
2042*8975f5c5SAndroid Build Coastguard Worker                                  const GLuint *params)
2043*8975f5c5SAndroid Build Coastguard Worker {
2044*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
2045*8975f5c5SAndroid Build Coastguard Worker     {
2046*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kES3Required);
2047*8975f5c5SAndroid Build Coastguard Worker     }
2048*8975f5c5SAndroid Build Coastguard Worker 
2049*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureBorderClampEXT)
2050*8975f5c5SAndroid Build Coastguard Worker     {
2051*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2052*8975f5c5SAndroid Build Coastguard Worker         return false;
2053*8975f5c5SAndroid Build Coastguard Worker     }
2054*8975f5c5SAndroid Build Coastguard Worker     return ValidateTexParameterBase(context, entryPoint, targetPacked, pname, -1, true, params);
2055*8975f5c5SAndroid Build Coastguard Worker }
2056*8975f5c5SAndroid Build Coastguard Worker 
ValidateImportSemaphoreZirconHandleANGLE(const Context * context,angle::EntryPoint entryPoint,SemaphoreID semaphore,HandleType handleType,GLuint handle)2057*8975f5c5SAndroid Build Coastguard Worker bool ValidateImportSemaphoreZirconHandleANGLE(const Context *context,
2058*8975f5c5SAndroid Build Coastguard Worker                                               angle::EntryPoint entryPoint,
2059*8975f5c5SAndroid Build Coastguard Worker                                               SemaphoreID semaphore,
2060*8975f5c5SAndroid Build Coastguard Worker                                               HandleType handleType,
2061*8975f5c5SAndroid Build Coastguard Worker                                               GLuint handle)
2062*8975f5c5SAndroid Build Coastguard Worker {
2063*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().semaphoreFuchsiaANGLE)
2064*8975f5c5SAndroid Build Coastguard Worker     {
2065*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2066*8975f5c5SAndroid Build Coastguard Worker         return false;
2067*8975f5c5SAndroid Build Coastguard Worker     }
2068*8975f5c5SAndroid Build Coastguard Worker 
2069*8975f5c5SAndroid Build Coastguard Worker     switch (handleType)
2070*8975f5c5SAndroid Build Coastguard Worker     {
2071*8975f5c5SAndroid Build Coastguard Worker         case HandleType::ZirconEvent:
2072*8975f5c5SAndroid Build Coastguard Worker             break;
2073*8975f5c5SAndroid Build Coastguard Worker         default:
2074*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidHandleType);
2075*8975f5c5SAndroid Build Coastguard Worker             return false;
2076*8975f5c5SAndroid Build Coastguard Worker     }
2077*8975f5c5SAndroid Build Coastguard Worker 
2078*8975f5c5SAndroid Build Coastguard Worker     return true;
2079*8975f5c5SAndroid Build Coastguard Worker }
2080*8975f5c5SAndroid Build Coastguard Worker 
2081*8975f5c5SAndroid Build Coastguard Worker namespace
2082*8975f5c5SAndroid Build Coastguard Worker {
2083*8975f5c5SAndroid Build Coastguard Worker enum class PLSExpectedStatus
2084*8975f5c5SAndroid Build Coastguard Worker {
2085*8975f5c5SAndroid Build Coastguard Worker     Inactive,
2086*8975f5c5SAndroid Build Coastguard Worker     Active,
2087*8975f5c5SAndroid Build Coastguard Worker     Any
2088*8975f5c5SAndroid Build Coastguard Worker };
2089*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSCommon(const Context * context,angle::EntryPoint entryPoint,PLSExpectedStatus expectedStatus)2090*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSCommon(const Context *context,
2091*8975f5c5SAndroid Build Coastguard Worker                        angle::EntryPoint entryPoint,
2092*8975f5c5SAndroid Build Coastguard Worker                        PLSExpectedStatus expectedStatus)
2093*8975f5c5SAndroid Build Coastguard Worker {
2094*8975f5c5SAndroid Build Coastguard Worker     // Check that the pixel local storage extension is enabled at all.
2095*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().shaderPixelLocalStorageANGLE)
2096*8975f5c5SAndroid Build Coastguard Worker     {
2097*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSExtensionNotEnabled);
2098*8975f5c5SAndroid Build Coastguard Worker         return false;
2099*8975f5c5SAndroid Build Coastguard Worker     }
2100*8975f5c5SAndroid Build Coastguard Worker 
2101*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
2102*8975f5c5SAndroid Build Coastguard Worker     if (expectedStatus != PLSExpectedStatus::Active)
2103*8975f5c5SAndroid Build Coastguard Worker     {
2104*8975f5c5SAndroid Build Coastguard Worker         // INVALID_FRAMEBUFFER_OPERATION is generated if the default framebuffer object name 0 is
2105*8975f5c5SAndroid Build Coastguard Worker         // bound to DRAW_FRAMEBUFFER.
2106*8975f5c5SAndroid Build Coastguard Worker         if (framebuffer->id().value == 0)
2107*8975f5c5SAndroid Build Coastguard Worker         {
2108*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION, kPLSDefaultFramebufferBound);
2109*8975f5c5SAndroid Build Coastguard Worker             return false;
2110*8975f5c5SAndroid Build Coastguard Worker         }
2111*8975f5c5SAndroid Build Coastguard Worker     }
2112*8975f5c5SAndroid Build Coastguard Worker 
2113*8975f5c5SAndroid Build Coastguard Worker     // INVALID_FRAMEBUFFER_OPERATION is generated if pixel local storage on the draw framebuffer is
2114*8975f5c5SAndroid Build Coastguard Worker     // in an interrupted state.
2115*8975f5c5SAndroid Build Coastguard Worker     const PixelLocalStorage *pls = framebuffer->peekPixelLocalStorage();
2116*8975f5c5SAndroid Build Coastguard Worker     if (pls != nullptr && pls->interruptCount() != 0)
2117*8975f5c5SAndroid Build Coastguard Worker     {
2118*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION, kPLSInterrupted);
2119*8975f5c5SAndroid Build Coastguard Worker         return false;
2120*8975f5c5SAndroid Build Coastguard Worker     }
2121*8975f5c5SAndroid Build Coastguard Worker 
2122*8975f5c5SAndroid Build Coastguard Worker     if (expectedStatus == PLSExpectedStatus::Active)
2123*8975f5c5SAndroid Build Coastguard Worker     {
2124*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE is zero.
2125*8975f5c5SAndroid Build Coastguard Worker         if (context->getState().getPixelLocalStorageActivePlanes() == 0)
2126*8975f5c5SAndroid Build Coastguard Worker         {
2127*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSInactive);
2128*8975f5c5SAndroid Build Coastguard Worker             return false;
2129*8975f5c5SAndroid Build Coastguard Worker         }
2130*8975f5c5SAndroid Build Coastguard Worker     }
2131*8975f5c5SAndroid Build Coastguard Worker     else
2132*8975f5c5SAndroid Build Coastguard Worker     {
2133*8975f5c5SAndroid Build Coastguard Worker         // PLSExpectedStatus::Inactive is validated by the allow list.
2134*8975f5c5SAndroid Build Coastguard Worker         ASSERT(expectedStatus != PLSExpectedStatus::Inactive ||
2135*8975f5c5SAndroid Build Coastguard Worker                context->getState().getPixelLocalStorageActivePlanes() == 0);
2136*8975f5c5SAndroid Build Coastguard Worker     }
2137*8975f5c5SAndroid Build Coastguard Worker 
2138*8975f5c5SAndroid Build Coastguard Worker     return true;
2139*8975f5c5SAndroid Build Coastguard Worker }
2140*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSCommon(const Context * context,angle::EntryPoint entryPoint,GLint plane,PLSExpectedStatus expectedStatus)2141*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSCommon(const Context *context,
2142*8975f5c5SAndroid Build Coastguard Worker                        angle::EntryPoint entryPoint,
2143*8975f5c5SAndroid Build Coastguard Worker                        GLint plane,
2144*8975f5c5SAndroid Build Coastguard Worker                        PLSExpectedStatus expectedStatus)
2145*8975f5c5SAndroid Build Coastguard Worker {
2146*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, expectedStatus))
2147*8975f5c5SAndroid Build Coastguard Worker     {
2148*8975f5c5SAndroid Build Coastguard Worker         return false;
2149*8975f5c5SAndroid Build Coastguard Worker     }
2150*8975f5c5SAndroid Build Coastguard Worker 
2151*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated if <plane> < 0 or <plane> >= MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE.
2152*8975f5c5SAndroid Build Coastguard Worker     if (plane < 0)
2153*8975f5c5SAndroid Build Coastguard Worker     {
2154*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSPlaneLessThanZero);
2155*8975f5c5SAndroid Build Coastguard Worker         return false;
2156*8975f5c5SAndroid Build Coastguard Worker     }
2157*8975f5c5SAndroid Build Coastguard Worker     if (plane >= static_cast<GLint>(context->getCaps().maxPixelLocalStoragePlanes))
2158*8975f5c5SAndroid Build Coastguard Worker     {
2159*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSPlaneOutOfRange);
2160*8975f5c5SAndroid Build Coastguard Worker         return false;
2161*8975f5c5SAndroid Build Coastguard Worker     }
2162*8975f5c5SAndroid Build Coastguard Worker 
2163*8975f5c5SAndroid Build Coastguard Worker     return true;
2164*8975f5c5SAndroid Build Coastguard Worker }
2165*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSInternalformat(const Context * context,angle::EntryPoint entryPoint,GLenum internalformat)2166*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSInternalformat(const Context *context,
2167*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
2168*8975f5c5SAndroid Build Coastguard Worker                                GLenum internalformat)
2169*8975f5c5SAndroid Build Coastguard Worker {
2170*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM is generated if <internalformat> is not one of the acceptable values in Table
2171*8975f5c5SAndroid Build Coastguard Worker     // X.2, or NONE.
2172*8975f5c5SAndroid Build Coastguard Worker     switch (internalformat)
2173*8975f5c5SAndroid Build Coastguard Worker     {
2174*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA8:
2175*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA8I:
2176*8975f5c5SAndroid Build Coastguard Worker         case GL_RGBA8UI:
2177*8975f5c5SAndroid Build Coastguard Worker         case GL_R32F:
2178*8975f5c5SAndroid Build Coastguard Worker         case GL_R32UI:
2179*8975f5c5SAndroid Build Coastguard Worker             return true;
2180*8975f5c5SAndroid Build Coastguard Worker         default:
2181*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kPLSInvalidInternalformat);
2182*8975f5c5SAndroid Build Coastguard Worker             return false;
2183*8975f5c5SAndroid Build Coastguard Worker     }
2184*8975f5c5SAndroid Build Coastguard Worker }
2185*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSTextureType(const Context * context,angle::EntryPoint entryPoint,Texture * tex,size_t * textureDepth)2186*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSTextureType(const Context *context,
2187*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
2188*8975f5c5SAndroid Build Coastguard Worker                             Texture *tex,
2189*8975f5c5SAndroid Build Coastguard Worker                             size_t *textureDepth)
2190*8975f5c5SAndroid Build Coastguard Worker {
2191*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if <backingtexture> is nonzero
2192*8975f5c5SAndroid Build Coastguard Worker     // and not of type TEXTURE_2D or TEXTURE_2D_ARRAY.
2193*8975f5c5SAndroid Build Coastguard Worker     switch (tex->getType())
2194*8975f5c5SAndroid Build Coastguard Worker     {
2195*8975f5c5SAndroid Build Coastguard Worker         case TextureType::_2D:
2196*8975f5c5SAndroid Build Coastguard Worker             *textureDepth = 1;
2197*8975f5c5SAndroid Build Coastguard Worker             return true;
2198*8975f5c5SAndroid Build Coastguard Worker         case TextureType::_2DArray:
2199*8975f5c5SAndroid Build Coastguard Worker             *textureDepth = tex->getDepth(TextureTarget::_2DArray, 0);
2200*8975f5c5SAndroid Build Coastguard Worker             return true;
2201*8975f5c5SAndroid Build Coastguard Worker         default:
2202*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSInvalidTextureType);
2203*8975f5c5SAndroid Build Coastguard Worker             return false;
2204*8975f5c5SAndroid Build Coastguard Worker     }
2205*8975f5c5SAndroid Build Coastguard Worker }
2206*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSActiveBlendFunc(const Context * context,angle::EntryPoint entryPoint,gl::BlendFactorType blendFunc)2207*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSActiveBlendFunc(const Context *context,
2208*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
2209*8975f5c5SAndroid Build Coastguard Worker                                 gl::BlendFactorType blendFunc)
2210*8975f5c5SAndroid Build Coastguard Worker {
2211*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if BLEND_DST_ALPHA, BLEND_DST_RGB, BLEND_SRC_ALPHA, or
2212*8975f5c5SAndroid Build Coastguard Worker     // BLEND_SRC_RGB, for any draw buffer, is a blend function requiring the secondary color input,
2213*8975f5c5SAndroid Build Coastguard Worker     // as specified in EXT_blend_func_extended.
2214*8975f5c5SAndroid Build Coastguard Worker     ASSERT(context->getState().getExtensions().blendFuncExtendedEXT);
2215*8975f5c5SAndroid Build Coastguard Worker     switch (blendFunc)
2216*8975f5c5SAndroid Build Coastguard Worker     {
2217*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendFactorType::Src1Color:
2218*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendFactorType::OneMinusSrc1Color:
2219*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendFactorType::Src1Alpha:
2220*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendFactorType::OneMinusSrc1Alpha:
2221*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSSecondaryBlendEnabled);
2222*8975f5c5SAndroid Build Coastguard Worker             return false;
2223*8975f5c5SAndroid Build Coastguard Worker         default:
2224*8975f5c5SAndroid Build Coastguard Worker             return true;
2225*8975f5c5SAndroid Build Coastguard Worker     }
2226*8975f5c5SAndroid Build Coastguard Worker }
ValidatePLSActiveBlendEquation(const Context * context,angle::EntryPoint entryPoint,gl::BlendEquationType blendEquation)2227*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSActiveBlendEquation(const Context *context,
2228*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
2229*8975f5c5SAndroid Build Coastguard Worker                                     gl::BlendEquationType blendEquation)
2230*8975f5c5SAndroid Build Coastguard Worker {
2231*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if BLEND_EQUATION_RGB and/or BLEND_EQUATION_ALPHA is an
2232*8975f5c5SAndroid Build Coastguard Worker     // advanced blend equation defined in KHR_blend_equation_advanced.
2233*8975f5c5SAndroid Build Coastguard Worker     ASSERT(context->getState().getExtensions().blendEquationAdvancedKHR);
2234*8975f5c5SAndroid Build Coastguard Worker     switch (blendEquation)
2235*8975f5c5SAndroid Build Coastguard Worker     {
2236*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Multiply:
2237*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Screen:
2238*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Overlay:
2239*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Darken:
2240*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Lighten:
2241*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Colordodge:
2242*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Colorburn:
2243*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Hardlight:
2244*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Softlight:
2245*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Difference:
2246*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::Exclusion:
2247*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::HslHue:
2248*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::HslSaturation:
2249*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::HslColor:
2250*8975f5c5SAndroid Build Coastguard Worker         case gl::BlendEquationType::HslLuminosity:
2251*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSAdvancedBlendEnabled);
2252*8975f5c5SAndroid Build Coastguard Worker             return false;
2253*8975f5c5SAndroid Build Coastguard Worker         default:
2254*8975f5c5SAndroid Build Coastguard Worker             return true;
2255*8975f5c5SAndroid Build Coastguard Worker     }
2256*8975f5c5SAndroid Build Coastguard Worker }
2257*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSLoadOperation(const Context * context,angle::EntryPoint entryPoint,GLenum loadop)2258*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSLoadOperation(const Context *context, angle::EntryPoint entryPoint, GLenum loadop)
2259*8975f5c5SAndroid Build Coastguard Worker {
2260*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM is generated if <loadops>[0..<n>-1] is not one of the Load Operations enumerated
2261*8975f5c5SAndroid Build Coastguard Worker     // in Table X.1.
2262*8975f5c5SAndroid Build Coastguard Worker     switch (loadop)
2263*8975f5c5SAndroid Build Coastguard Worker     {
2264*8975f5c5SAndroid Build Coastguard Worker         case GL_LOAD_OP_ZERO_ANGLE:
2265*8975f5c5SAndroid Build Coastguard Worker         case GL_LOAD_OP_CLEAR_ANGLE:
2266*8975f5c5SAndroid Build Coastguard Worker         case GL_LOAD_OP_LOAD_ANGLE:
2267*8975f5c5SAndroid Build Coastguard Worker         case GL_DONT_CARE:
2268*8975f5c5SAndroid Build Coastguard Worker             return true;
2269*8975f5c5SAndroid Build Coastguard Worker         default:
2270*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kPLSInvalidLoadOperation, loadop);
2271*8975f5c5SAndroid Build Coastguard Worker             return false;
2272*8975f5c5SAndroid Build Coastguard Worker     }
2273*8975f5c5SAndroid Build Coastguard Worker }
2274*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSStoreOperation(const Context * context,angle::EntryPoint entryPoint,GLenum storeop)2275*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSStoreOperation(const Context *context, angle::EntryPoint entryPoint, GLenum storeop)
2276*8975f5c5SAndroid Build Coastguard Worker {
2277*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM is generated if <storeops>[0..PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE-1] is not
2278*8975f5c5SAndroid Build Coastguard Worker     // one of the Store Operations enumerated in Table X.2.
2279*8975f5c5SAndroid Build Coastguard Worker     switch (storeop)
2280*8975f5c5SAndroid Build Coastguard Worker     {
2281*8975f5c5SAndroid Build Coastguard Worker         case GL_STORE_OP_STORE_ANGLE:
2282*8975f5c5SAndroid Build Coastguard Worker         case GL_DONT_CARE:
2283*8975f5c5SAndroid Build Coastguard Worker             return true;
2284*8975f5c5SAndroid Build Coastguard Worker         default:
2285*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kPLSInvalidStoreOperation, storeop);
2286*8975f5c5SAndroid Build Coastguard Worker             return false;
2287*8975f5c5SAndroid Build Coastguard Worker     }
2288*8975f5c5SAndroid Build Coastguard Worker }
2289*8975f5c5SAndroid Build Coastguard Worker 
ValidatePLSQueryCommon(const Context * context,angle::EntryPoint entryPoint,GLsizei paramCount,GLsizei bufSize,const void * params)2290*8975f5c5SAndroid Build Coastguard Worker bool ValidatePLSQueryCommon(const Context *context,
2291*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
2292*8975f5c5SAndroid Build Coastguard Worker                             GLsizei paramCount,
2293*8975f5c5SAndroid Build Coastguard Worker                             GLsizei bufSize,
2294*8975f5c5SAndroid Build Coastguard Worker                             const void *params)
2295*8975f5c5SAndroid Build Coastguard Worker {
2296*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if <bufSize> is not large enough to receive the requested
2297*8975f5c5SAndroid Build Coastguard Worker     // parameter.
2298*8975f5c5SAndroid Build Coastguard Worker     if (paramCount > bufSize)
2299*8975f5c5SAndroid Build Coastguard Worker     {
2300*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInsufficientParams);
2301*8975f5c5SAndroid Build Coastguard Worker         return false;
2302*8975f5c5SAndroid Build Coastguard Worker     }
2303*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated if <params> is NULL.
2304*8975f5c5SAndroid Build Coastguard Worker     if (params == nullptr)
2305*8975f5c5SAndroid Build Coastguard Worker     {
2306*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSParamsNULL);
2307*8975f5c5SAndroid Build Coastguard Worker         return false;
2308*8975f5c5SAndroid Build Coastguard Worker     }
2309*8975f5c5SAndroid Build Coastguard Worker     return true;
2310*8975f5c5SAndroid Build Coastguard Worker }
2311*8975f5c5SAndroid Build Coastguard Worker }  // namespace
2312*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferMemorylessPixelLocalStorageANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,GLenum internalformat)2313*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferMemorylessPixelLocalStorageANGLE(const Context *context,
2314*8975f5c5SAndroid Build Coastguard Worker                                                          angle::EntryPoint entryPoint,
2315*8975f5c5SAndroid Build Coastguard Worker                                                          GLint plane,
2316*8975f5c5SAndroid Build Coastguard Worker                                                          GLenum internalformat)
2317*8975f5c5SAndroid Build Coastguard Worker {
2318*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Any))
2319*8975f5c5SAndroid Build Coastguard Worker     {
2320*8975f5c5SAndroid Build Coastguard Worker         return false;
2321*8975f5c5SAndroid Build Coastguard Worker     }
2322*8975f5c5SAndroid Build Coastguard Worker 
2323*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM is generated if <internalformat> is not one of the acceptable values in Table
2324*8975f5c5SAndroid Build Coastguard Worker     // X.2, or NONE.
2325*8975f5c5SAndroid Build Coastguard Worker     if (internalformat != GL_NONE)
2326*8975f5c5SAndroid Build Coastguard Worker     {
2327*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSInternalformat(context, entryPoint, internalformat))
2328*8975f5c5SAndroid Build Coastguard Worker         {
2329*8975f5c5SAndroid Build Coastguard Worker             return false;
2330*8975f5c5SAndroid Build Coastguard Worker         }
2331*8975f5c5SAndroid Build Coastguard Worker     }
2332*8975f5c5SAndroid Build Coastguard Worker 
2333*8975f5c5SAndroid Build Coastguard Worker     return true;
2334*8975f5c5SAndroid Build Coastguard Worker }
2335*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferTexturePixelLocalStorageANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,TextureID backingtexture,GLint level,GLint layer)2336*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferTexturePixelLocalStorageANGLE(const Context *context,
2337*8975f5c5SAndroid Build Coastguard Worker                                                       angle::EntryPoint entryPoint,
2338*8975f5c5SAndroid Build Coastguard Worker                                                       GLint plane,
2339*8975f5c5SAndroid Build Coastguard Worker                                                       TextureID backingtexture,
2340*8975f5c5SAndroid Build Coastguard Worker                                                       GLint level,
2341*8975f5c5SAndroid Build Coastguard Worker                                                       GLint layer)
2342*8975f5c5SAndroid Build Coastguard Worker {
2343*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Any))
2344*8975f5c5SAndroid Build Coastguard Worker     {
2345*8975f5c5SAndroid Build Coastguard Worker         return false;
2346*8975f5c5SAndroid Build Coastguard Worker     }
2347*8975f5c5SAndroid Build Coastguard Worker 
2348*8975f5c5SAndroid Build Coastguard Worker     if (backingtexture.value != 0)
2349*8975f5c5SAndroid Build Coastguard Worker     {
2350*8975f5c5SAndroid Build Coastguard Worker         Texture *tex = context->getTexture(backingtexture);
2351*8975f5c5SAndroid Build Coastguard Worker 
2352*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if <backingtexture> is not the name of an existing
2353*8975f5c5SAndroid Build Coastguard Worker         // immutable texture object, or zero.
2354*8975f5c5SAndroid Build Coastguard Worker         if (!tex)
2355*8975f5c5SAndroid Build Coastguard Worker         {
2356*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
2357*8975f5c5SAndroid Build Coastguard Worker             return false;
2358*8975f5c5SAndroid Build Coastguard Worker         }
2359*8975f5c5SAndroid Build Coastguard Worker         if (!tex->getImmutableFormat())
2360*8975f5c5SAndroid Build Coastguard Worker         {
2361*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTextureIsNotImmutable);
2362*8975f5c5SAndroid Build Coastguard Worker             return false;
2363*8975f5c5SAndroid Build Coastguard Worker         }
2364*8975f5c5SAndroid Build Coastguard Worker 
2365*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if <backingtexture> is nonzero
2366*8975f5c5SAndroid Build Coastguard Worker         // and not of type GL_TEXTURE_2D or GL_TEXTURE_2D_ARRAY.
2367*8975f5c5SAndroid Build Coastguard Worker         size_t textureDepth;
2368*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSTextureType(context, entryPoint, tex, &textureDepth))
2369*8975f5c5SAndroid Build Coastguard Worker         {
2370*8975f5c5SAndroid Build Coastguard Worker             return false;
2371*8975f5c5SAndroid Build Coastguard Worker         }
2372*8975f5c5SAndroid Build Coastguard Worker 
2373*8975f5c5SAndroid Build Coastguard Worker         // INVALID_VALUE is generated if <backingtexture> is nonzero and <level> < 0.
2374*8975f5c5SAndroid Build Coastguard Worker         if (level < 0)
2375*8975f5c5SAndroid Build Coastguard Worker         {
2376*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeLevel);
2377*8975f5c5SAndroid Build Coastguard Worker             return false;
2378*8975f5c5SAndroid Build Coastguard Worker         }
2379*8975f5c5SAndroid Build Coastguard Worker 
2380*8975f5c5SAndroid Build Coastguard Worker         // INVALID_VALUE is generated if <backingtexture> is nonzero and <level> >= the
2381*8975f5c5SAndroid Build Coastguard Worker         // immutable number of mipmap levels in <backingtexture>.
2382*8975f5c5SAndroid Build Coastguard Worker         if (static_cast<GLuint>(level) >= tex->getImmutableLevels())
2383*8975f5c5SAndroid Build Coastguard Worker         {
2384*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTextureLevelOutOfRange);
2385*8975f5c5SAndroid Build Coastguard Worker             return false;
2386*8975f5c5SAndroid Build Coastguard Worker         }
2387*8975f5c5SAndroid Build Coastguard Worker 
2388*8975f5c5SAndroid Build Coastguard Worker         // INVALID_VALUE is generated if <backingtexture> is nonzero and <layer> < 0.
2389*8975f5c5SAndroid Build Coastguard Worker         if (layer < 0)
2390*8975f5c5SAndroid Build Coastguard Worker         {
2391*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeLayer);
2392*8975f5c5SAndroid Build Coastguard Worker             return false;
2393*8975f5c5SAndroid Build Coastguard Worker         }
2394*8975f5c5SAndroid Build Coastguard Worker 
2395*8975f5c5SAndroid Build Coastguard Worker         // INVALID_VALUE is generated if <backingtexture> is nonzero and <layer> >= the immutable
2396*8975f5c5SAndroid Build Coastguard Worker         // number of texture layers in <backingtexture>.
2397*8975f5c5SAndroid Build Coastguard Worker         if ((size_t)layer >= textureDepth)
2398*8975f5c5SAndroid Build Coastguard Worker         {
2399*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTextureLayerOutOfRange);
2400*8975f5c5SAndroid Build Coastguard Worker             return false;
2401*8975f5c5SAndroid Build Coastguard Worker         }
2402*8975f5c5SAndroid Build Coastguard Worker 
2403*8975f5c5SAndroid Build Coastguard Worker         // INVALID_ENUM is generated if <backingtexture> is nonzero and its internalformat is not
2404*8975f5c5SAndroid Build Coastguard Worker         // one of the acceptable values in Table X.2.
2405*8975f5c5SAndroid Build Coastguard Worker         ASSERT(tex->getImmutableFormat());
2406*8975f5c5SAndroid Build Coastguard Worker         GLenum internalformat = tex->getState().getBaseLevelDesc().format.info->internalFormat;
2407*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSInternalformat(context, entryPoint, internalformat))
2408*8975f5c5SAndroid Build Coastguard Worker         {
2409*8975f5c5SAndroid Build Coastguard Worker             return false;
2410*8975f5c5SAndroid Build Coastguard Worker         }
2411*8975f5c5SAndroid Build Coastguard Worker     }
2412*8975f5c5SAndroid Build Coastguard Worker 
2413*8975f5c5SAndroid Build Coastguard Worker     return true;
2414*8975f5c5SAndroid Build Coastguard Worker }
2415*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferPixelLocalClearValuefvANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,const GLfloat[])2416*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferPixelLocalClearValuefvANGLE(const Context *context,
2417*8975f5c5SAndroid Build Coastguard Worker                                                     angle::EntryPoint entryPoint,
2418*8975f5c5SAndroid Build Coastguard Worker                                                     GLint plane,
2419*8975f5c5SAndroid Build Coastguard Worker                                                     const GLfloat[])
2420*8975f5c5SAndroid Build Coastguard Worker {
2421*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Inactive);
2422*8975f5c5SAndroid Build Coastguard Worker }
2423*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferPixelLocalClearValueivANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,const GLint[])2424*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferPixelLocalClearValueivANGLE(const Context *context,
2425*8975f5c5SAndroid Build Coastguard Worker                                                     angle::EntryPoint entryPoint,
2426*8975f5c5SAndroid Build Coastguard Worker                                                     GLint plane,
2427*8975f5c5SAndroid Build Coastguard Worker                                                     const GLint[])
2428*8975f5c5SAndroid Build Coastguard Worker {
2429*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Inactive);
2430*8975f5c5SAndroid Build Coastguard Worker }
2431*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferPixelLocalClearValueuivANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,const GLuint[])2432*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferPixelLocalClearValueuivANGLE(const Context *context,
2433*8975f5c5SAndroid Build Coastguard Worker                                                      angle::EntryPoint entryPoint,
2434*8975f5c5SAndroid Build Coastguard Worker                                                      GLint plane,
2435*8975f5c5SAndroid Build Coastguard Worker                                                      const GLuint[])
2436*8975f5c5SAndroid Build Coastguard Worker {
2437*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Inactive);
2438*8975f5c5SAndroid Build Coastguard Worker }
2439*8975f5c5SAndroid Build Coastguard Worker 
ValidateBeginPixelLocalStorageANGLE(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const GLenum loadops[])2440*8975f5c5SAndroid Build Coastguard Worker bool ValidateBeginPixelLocalStorageANGLE(const Context *context,
2441*8975f5c5SAndroid Build Coastguard Worker                                          angle::EntryPoint entryPoint,
2442*8975f5c5SAndroid Build Coastguard Worker                                          GLsizei n,
2443*8975f5c5SAndroid Build Coastguard Worker                                          const GLenum loadops[])
2444*8975f5c5SAndroid Build Coastguard Worker {
2445*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, PLSExpectedStatus::Inactive))
2446*8975f5c5SAndroid Build Coastguard Worker     {
2447*8975f5c5SAndroid Build Coastguard Worker         return false;
2448*8975f5c5SAndroid Build Coastguard Worker     }
2449*8975f5c5SAndroid Build Coastguard Worker 
2450*8975f5c5SAndroid Build Coastguard Worker     const State &state             = context->getState();
2451*8975f5c5SAndroid Build Coastguard Worker     const Framebuffer *framebuffer = state.getDrawFramebuffer();
2452*8975f5c5SAndroid Build Coastguard Worker 
2453*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if the value of SAMPLE_BUFFERS is 1 (i.e., if rendering to a
2454*8975f5c5SAndroid Build Coastguard Worker     // multisampled framebuffer).
2455*8975f5c5SAndroid Build Coastguard Worker     if (framebuffer->getSamples(context) != 0)
2456*8975f5c5SAndroid Build Coastguard Worker     {
2457*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSMultisamplingEnabled);
2458*8975f5c5SAndroid Build Coastguard Worker         return false;
2459*8975f5c5SAndroid Build Coastguard Worker     }
2460*8975f5c5SAndroid Build Coastguard Worker 
2461*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if DITHER is enabled.
2462*8975f5c5SAndroid Build Coastguard Worker     if (state.isDitherEnabled())
2463*8975f5c5SAndroid Build Coastguard Worker     {
2464*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSDitherEnabled);
2465*8975f5c5SAndroid Build Coastguard Worker         return false;
2466*8975f5c5SAndroid Build Coastguard Worker     }
2467*8975f5c5SAndroid Build Coastguard Worker 
2468*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if RASTERIZER_DISCARD is enabled.
2469*8975f5c5SAndroid Build Coastguard Worker     if (state.isRasterizerDiscardEnabled())
2470*8975f5c5SAndroid Build Coastguard Worker     {
2471*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSRasterizerDiscardEnabled);
2472*8975f5c5SAndroid Build Coastguard Worker         return false;
2473*8975f5c5SAndroid Build Coastguard Worker     }
2474*8975f5c5SAndroid Build Coastguard Worker 
2475*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if TRANSFORM_FEEDBACK_ACTIVE is true.
2476*8975f5c5SAndroid Build Coastguard Worker     if (state.isTransformFeedbackActive())
2477*8975f5c5SAndroid Build Coastguard Worker     {
2478*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSTransformFeedbackActive);
2479*8975f5c5SAndroid Build Coastguard Worker         return false;
2480*8975f5c5SAndroid Build Coastguard Worker     }
2481*8975f5c5SAndroid Build Coastguard Worker 
2482*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if BLEND_DST_ALPHA, BLEND_DST_RGB, BLEND_SRC_ALPHA, or
2483*8975f5c5SAndroid Build Coastguard Worker     // BLEND_SRC_RGB, for any draw buffer, is a blend function requiring the secondary color input,
2484*8975f5c5SAndroid Build Coastguard Worker     // as specified in EXT_blend_func_extended.
2485*8975f5c5SAndroid Build Coastguard Worker     if (state.getExtensions().blendFuncExtendedEXT)
2486*8975f5c5SAndroid Build Coastguard Worker     {
2487*8975f5c5SAndroid Build Coastguard Worker         for (GLsizei i = 0; i < state.getCaps().maxDrawBuffers; ++i)
2488*8975f5c5SAndroid Build Coastguard Worker         {
2489*8975f5c5SAndroid Build Coastguard Worker             const BlendStateExt &blend = state.getBlendStateExt();
2490*8975f5c5SAndroid Build Coastguard Worker             if (!ValidatePLSActiveBlendFunc(context, entryPoint, blend.getDstAlphaIndexed(i)) ||
2491*8975f5c5SAndroid Build Coastguard Worker                 !ValidatePLSActiveBlendFunc(context, entryPoint, blend.getDstColorIndexed(i)) ||
2492*8975f5c5SAndroid Build Coastguard Worker                 !ValidatePLSActiveBlendFunc(context, entryPoint, blend.getSrcAlphaIndexed(i)) ||
2493*8975f5c5SAndroid Build Coastguard Worker                 !ValidatePLSActiveBlendFunc(context, entryPoint, blend.getSrcColorIndexed(i)))
2494*8975f5c5SAndroid Build Coastguard Worker             {
2495*8975f5c5SAndroid Build Coastguard Worker                 return false;
2496*8975f5c5SAndroid Build Coastguard Worker             }
2497*8975f5c5SAndroid Build Coastguard Worker         }
2498*8975f5c5SAndroid Build Coastguard Worker     }
2499*8975f5c5SAndroid Build Coastguard Worker 
2500*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if BLEND_EQUATION_RGB and/or BLEND_EQUATION_ALPHA is an
2501*8975f5c5SAndroid Build Coastguard Worker     // advanced blend equation defined in KHR_blend_equation_advanced.
2502*8975f5c5SAndroid Build Coastguard Worker     if (state.getExtensions().blendEquationAdvancedKHR)
2503*8975f5c5SAndroid Build Coastguard Worker     {
2504*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSActiveBlendEquation(context, entryPoint,
2505*8975f5c5SAndroid Build Coastguard Worker                                             state.getBlendStateExt().getEquationColorIndexed(0)) ||
2506*8975f5c5SAndroid Build Coastguard Worker             !ValidatePLSActiveBlendEquation(context, entryPoint,
2507*8975f5c5SAndroid Build Coastguard Worker                                             state.getBlendStateExt().getEquationAlphaIndexed(0)))
2508*8975f5c5SAndroid Build Coastguard Worker         {
2509*8975f5c5SAndroid Build Coastguard Worker             return false;
2510*8975f5c5SAndroid Build Coastguard Worker         }
2511*8975f5c5SAndroid Build Coastguard Worker     }
2512*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated if <n> < 1 or <n> > MAX_PIXEL_LOCAL_STORAGE_PLANES_ANGLE.
2513*8975f5c5SAndroid Build Coastguard Worker     if (n < 1)
2514*8975f5c5SAndroid Build Coastguard Worker     {
2515*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSPlanesLessThanOne);
2516*8975f5c5SAndroid Build Coastguard Worker         return false;
2517*8975f5c5SAndroid Build Coastguard Worker     }
2518*8975f5c5SAndroid Build Coastguard Worker     if (n > static_cast<GLsizei>(context->getCaps().maxPixelLocalStoragePlanes))
2519*8975f5c5SAndroid Build Coastguard Worker     {
2520*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSPlanesOutOfRange);
2521*8975f5c5SAndroid Build Coastguard Worker         return false;
2522*8975f5c5SAndroid Build Coastguard Worker     }
2523*8975f5c5SAndroid Build Coastguard Worker 
2524*8975f5c5SAndroid Build Coastguard Worker     // INVALID_FRAMEBUFFER_OPERATION is generated if the draw framebuffer has an image attached to
2525*8975f5c5SAndroid Build Coastguard Worker     // any color attachment point on or after:
2526*8975f5c5SAndroid Build Coastguard Worker     //
2527*8975f5c5SAndroid Build Coastguard Worker     //   COLOR_ATTACHMENT0 +
2528*8975f5c5SAndroid Build Coastguard Worker     //   MAX_COLOR_ATTACHMENTS_WITH_ACTIVE_PIXEL_LOCAL_STORAGE_ANGLE
2529*8975f5c5SAndroid Build Coastguard Worker     //
2530*8975f5c5SAndroid Build Coastguard Worker     const Caps &caps = context->getCaps();
2531*8975f5c5SAndroid Build Coastguard Worker     for (int i = caps.maxColorAttachmentsWithActivePixelLocalStorage; i < caps.maxColorAttachments;
2532*8975f5c5SAndroid Build Coastguard Worker          ++i)
2533*8975f5c5SAndroid Build Coastguard Worker     {
2534*8975f5c5SAndroid Build Coastguard Worker         if (framebuffer->getColorAttachment(i))
2535*8975f5c5SAndroid Build Coastguard Worker         {
2536*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION,
2537*8975f5c5SAndroid Build Coastguard Worker                                    kPLSMaxColorAttachmentsExceded);
2538*8975f5c5SAndroid Build Coastguard Worker             return false;
2539*8975f5c5SAndroid Build Coastguard Worker         }
2540*8975f5c5SAndroid Build Coastguard Worker     }
2541*8975f5c5SAndroid Build Coastguard Worker 
2542*8975f5c5SAndroid Build Coastguard Worker     // INVALID_FRAMEBUFFER_OPERATION is generated if the draw framebuffer has an image attached to
2543*8975f5c5SAndroid Build Coastguard Worker     // any color attachment point on or after:
2544*8975f5c5SAndroid Build Coastguard Worker     //
2545*8975f5c5SAndroid Build Coastguard Worker     //   COLOR_ATTACHMENT0 + MAX_COMBINED_DRAW_BUFFERS_AND_PIXEL_LOCAL_STORAGE_PLANES_ANGLE - <n>
2546*8975f5c5SAndroid Build Coastguard Worker     //
2547*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = caps.maxCombinedDrawBuffersAndPixelLocalStoragePlanes - n;
2548*8975f5c5SAndroid Build Coastguard Worker          i < caps.maxColorAttachmentsWithActivePixelLocalStorage; ++i)
2549*8975f5c5SAndroid Build Coastguard Worker     {
2550*8975f5c5SAndroid Build Coastguard Worker         if (framebuffer->getColorAttachment(i))
2551*8975f5c5SAndroid Build Coastguard Worker         {
2552*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION,
2553*8975f5c5SAndroid Build Coastguard Worker                                    kPLSMaxCombinedDrawBuffersAndPlanesExceded);
2554*8975f5c5SAndroid Build Coastguard Worker             return false;
2555*8975f5c5SAndroid Build Coastguard Worker         }
2556*8975f5c5SAndroid Build Coastguard Worker     }
2557*8975f5c5SAndroid Build Coastguard Worker 
2558*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated if <loadops> is NULL.
2559*8975f5c5SAndroid Build Coastguard Worker     if (loadops == nullptr)
2560*8975f5c5SAndroid Build Coastguard Worker     {
2561*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSLoadOpsNULL);
2562*8975f5c5SAndroid Build Coastguard Worker         return false;
2563*8975f5c5SAndroid Build Coastguard Worker     }
2564*8975f5c5SAndroid Build Coastguard Worker 
2565*8975f5c5SAndroid Build Coastguard Worker     const PixelLocalStorage *pls   = framebuffer->peekPixelLocalStorage();
2566*8975f5c5SAndroid Build Coastguard Worker     bool hasTextureBackedPLSPlanes = false;
2567*8975f5c5SAndroid Build Coastguard Worker     Extents textureBackedPLSExtents{};
2568*8975f5c5SAndroid Build Coastguard Worker 
2569*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei i = 0; i < n; ++i)
2570*8975f5c5SAndroid Build Coastguard Worker     {
2571*8975f5c5SAndroid Build Coastguard Worker         // INVALID_ENUM is generated if <loadops>[0..<n>-1] is not one of the Load Operations
2572*8975f5c5SAndroid Build Coastguard Worker         // enumerated in Table X.1.
2573*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSLoadOperation(context, entryPoint, loadops[i]))
2574*8975f5c5SAndroid Build Coastguard Worker         {
2575*8975f5c5SAndroid Build Coastguard Worker             return false;
2576*8975f5c5SAndroid Build Coastguard Worker         }
2577*8975f5c5SAndroid Build Coastguard Worker 
2578*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if a pixel local storage plane at index [0..<n>-1] is in a
2579*8975f5c5SAndroid Build Coastguard Worker         // deinitialized state.
2580*8975f5c5SAndroid Build Coastguard Worker         if (pls == nullptr || pls->getPlane(i).isDeinitialized())
2581*8975f5c5SAndroid Build Coastguard Worker         {
2582*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSEnablingDeinitializedPlane);
2583*8975f5c5SAndroid Build Coastguard Worker             return false;
2584*8975f5c5SAndroid Build Coastguard Worker         }
2585*8975f5c5SAndroid Build Coastguard Worker 
2586*8975f5c5SAndroid Build Coastguard Worker         // [ANGLE_shader_pixel_local_storage] Section 4.4.2.X "Configuring Pixel Local Storage
2587*8975f5c5SAndroid Build Coastguard Worker         // on a Framebuffer": When a texture object is deleted, any pixel local storage plane to
2588*8975f5c5SAndroid Build Coastguard Worker         // which it was bound is automatically converted to a memoryless plane of matching
2589*8975f5c5SAndroid Build Coastguard Worker         // internalformat.
2590*8975f5c5SAndroid Build Coastguard Worker         const PixelLocalStoragePlane &plane = pls->getPlane(i);
2591*8975f5c5SAndroid Build Coastguard Worker 
2592*8975f5c5SAndroid Build Coastguard Worker         Extents textureExtents;
2593*8975f5c5SAndroid Build Coastguard Worker         if (plane.getTextureImageExtents(context, &textureExtents))
2594*8975f5c5SAndroid Build Coastguard Worker         {
2595*8975f5c5SAndroid Build Coastguard Worker             // INVALID_OPERATION is generated if all enabled, texture-backed pixel local storage
2596*8975f5c5SAndroid Build Coastguard Worker             // planes do not have the same width and height.
2597*8975f5c5SAndroid Build Coastguard Worker             if (!hasTextureBackedPLSPlanes)
2598*8975f5c5SAndroid Build Coastguard Worker             {
2599*8975f5c5SAndroid Build Coastguard Worker                 textureBackedPLSExtents   = textureExtents;
2600*8975f5c5SAndroid Build Coastguard Worker                 hasTextureBackedPLSPlanes = true;
2601*8975f5c5SAndroid Build Coastguard Worker             }
2602*8975f5c5SAndroid Build Coastguard Worker             else if (textureExtents != textureBackedPLSExtents)
2603*8975f5c5SAndroid Build Coastguard Worker             {
2604*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSMismatchedBackingTextureSizes);
2605*8975f5c5SAndroid Build Coastguard Worker                 return false;
2606*8975f5c5SAndroid Build Coastguard Worker             }
2607*8975f5c5SAndroid Build Coastguard Worker         }
2608*8975f5c5SAndroid Build Coastguard Worker         else
2609*8975f5c5SAndroid Build Coastguard Worker         {
2610*8975f5c5SAndroid Build Coastguard Worker             // INVALID_OPERATION is generated if <loadops>[0..<n>-1] is
2611*8975f5c5SAndroid Build Coastguard Worker             // LOAD_OP_LOAD_ANGLE and the pixel local storage plane at that same
2612*8975f5c5SAndroid Build Coastguard Worker             // index is memoryless.
2613*8975f5c5SAndroid Build Coastguard Worker             if (loadops[i] == GL_LOAD_OP_LOAD_ANGLE)
2614*8975f5c5SAndroid Build Coastguard Worker             {
2615*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSKeepingMemorylessPlane);
2616*8975f5c5SAndroid Build Coastguard Worker                 return false;
2617*8975f5c5SAndroid Build Coastguard Worker             }
2618*8975f5c5SAndroid Build Coastguard Worker         }
2619*8975f5c5SAndroid Build Coastguard Worker     }
2620*8975f5c5SAndroid Build Coastguard Worker 
2621*8975f5c5SAndroid Build Coastguard Worker     const FramebufferAttachment *firstAttachment =
2622*8975f5c5SAndroid Build Coastguard Worker         framebuffer->getState().getFirstNonNullAttachment();
2623*8975f5c5SAndroid Build Coastguard Worker     if (firstAttachment)
2624*8975f5c5SAndroid Build Coastguard Worker     {
2625*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if the draw framebuffer has other attachments, and its
2626*8975f5c5SAndroid Build Coastguard Worker         // enabled, texture-backed pixel local storage planes do not have identical dimensions
2627*8975f5c5SAndroid Build Coastguard Worker         // with the rendering area.
2628*8975f5c5SAndroid Build Coastguard Worker         if (hasTextureBackedPLSPlanes &&
2629*8975f5c5SAndroid Build Coastguard Worker             textureBackedPLSExtents != framebuffer->getState().getAttachmentExtentsIntersection())
2630*8975f5c5SAndroid Build Coastguard Worker         {
2631*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSDimensionsDontMatchRenderingArea);
2632*8975f5c5SAndroid Build Coastguard Worker             return false;
2633*8975f5c5SAndroid Build Coastguard Worker         }
2634*8975f5c5SAndroid Build Coastguard Worker     }
2635*8975f5c5SAndroid Build Coastguard Worker     else
2636*8975f5c5SAndroid Build Coastguard Worker     {
2637*8975f5c5SAndroid Build Coastguard Worker         // INVALID_OPERATION is generated if the draw framebuffer has no attachments and no
2638*8975f5c5SAndroid Build Coastguard Worker         // enabled, texture-backed pixel local storage planes.
2639*8975f5c5SAndroid Build Coastguard Worker         if (!hasTextureBackedPLSPlanes)
2640*8975f5c5SAndroid Build Coastguard Worker         {
2641*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSNoAttachmentsNoTextureBacked);
2642*8975f5c5SAndroid Build Coastguard Worker             return false;
2643*8975f5c5SAndroid Build Coastguard Worker         }
2644*8975f5c5SAndroid Build Coastguard Worker     }
2645*8975f5c5SAndroid Build Coastguard Worker 
2646*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if a single texture image is bound to more than one pixel
2647*8975f5c5SAndroid Build Coastguard Worker     // local storage plane.
2648*8975f5c5SAndroid Build Coastguard Worker     //
2649*8975f5c5SAndroid Build Coastguard Worker     //   TODO(anglebug.com/40096838): Block feedback loops
2650*8975f5c5SAndroid Build Coastguard Worker     //
2651*8975f5c5SAndroid Build Coastguard Worker 
2652*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated if a single texture image is simultaneously bound to a pixel
2653*8975f5c5SAndroid Build Coastguard Worker     // local storage plane and attached to the draw framebuffer.
2654*8975f5c5SAndroid Build Coastguard Worker     //
2655*8975f5c5SAndroid Build Coastguard Worker     //   TODO(anglebug.com/40096838): Block feedback loops
2656*8975f5c5SAndroid Build Coastguard Worker     //
2657*8975f5c5SAndroid Build Coastguard Worker 
2658*8975f5c5SAndroid Build Coastguard Worker     return true;
2659*8975f5c5SAndroid Build Coastguard Worker }
2660*8975f5c5SAndroid Build Coastguard Worker 
ValidateEndPixelLocalStorageANGLE(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const GLenum storeops[])2661*8975f5c5SAndroid Build Coastguard Worker bool ValidateEndPixelLocalStorageANGLE(const Context *context,
2662*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
2663*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei n,
2664*8975f5c5SAndroid Build Coastguard Worker                                        const GLenum storeops[])
2665*8975f5c5SAndroid Build Coastguard Worker {
2666*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, PLSExpectedStatus::Active))
2667*8975f5c5SAndroid Build Coastguard Worker     {
2668*8975f5c5SAndroid Build Coastguard Worker         return false;
2669*8975f5c5SAndroid Build Coastguard Worker     }
2670*8975f5c5SAndroid Build Coastguard Worker 
2671*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated if <n> != PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE.
2672*8975f5c5SAndroid Build Coastguard Worker     if (n != context->getState().getPixelLocalStorageActivePlanes())
2673*8975f5c5SAndroid Build Coastguard Worker     {
2674*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kPLSNNotEqualActivePlanes);
2675*8975f5c5SAndroid Build Coastguard Worker         return false;
2676*8975f5c5SAndroid Build Coastguard Worker     }
2677*8975f5c5SAndroid Build Coastguard Worker 
2678*8975f5c5SAndroid Build Coastguard Worker     // INVALID_ENUM is generated if <storeops>[0..PIXEL_LOCAL_STORAGE_ACTIVE_PLANES_ANGLE-1] is not
2679*8975f5c5SAndroid Build Coastguard Worker     // one of the Store Operations enumerated in Table X.2.
2680*8975f5c5SAndroid Build Coastguard Worker     for (GLsizei i = 0; i < n; ++i)
2681*8975f5c5SAndroid Build Coastguard Worker     {
2682*8975f5c5SAndroid Build Coastguard Worker         if (!ValidatePLSStoreOperation(context, entryPoint, storeops[i]))
2683*8975f5c5SAndroid Build Coastguard Worker         {
2684*8975f5c5SAndroid Build Coastguard Worker             return false;
2685*8975f5c5SAndroid Build Coastguard Worker         }
2686*8975f5c5SAndroid Build Coastguard Worker     }
2687*8975f5c5SAndroid Build Coastguard Worker 
2688*8975f5c5SAndroid Build Coastguard Worker     return true;
2689*8975f5c5SAndroid Build Coastguard Worker }
2690*8975f5c5SAndroid Build Coastguard Worker 
ValidatePixelLocalStorageBarrierANGLE(const Context * context,angle::EntryPoint entryPoint)2691*8975f5c5SAndroid Build Coastguard Worker bool ValidatePixelLocalStorageBarrierANGLE(const Context *context, angle::EntryPoint entryPoint)
2692*8975f5c5SAndroid Build Coastguard Worker {
2693*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSCommon(context, entryPoint, PLSExpectedStatus::Active);
2694*8975f5c5SAndroid Build Coastguard Worker }
2695*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferPixelLocalStorageInterruptANGLE(const Context * context,angle::EntryPoint entryPoint)2696*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferPixelLocalStorageInterruptANGLE(const Context *context,
2697*8975f5c5SAndroid Build Coastguard Worker                                                         angle::EntryPoint entryPoint)
2698*8975f5c5SAndroid Build Coastguard Worker {
2699*8975f5c5SAndroid Build Coastguard Worker     // Check that the pixel local storage extension is enabled at all.
2700*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().shaderPixelLocalStorageANGLE)
2701*8975f5c5SAndroid Build Coastguard Worker     {
2702*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSExtensionNotEnabled);
2703*8975f5c5SAndroid Build Coastguard Worker         return false;
2704*8975f5c5SAndroid Build Coastguard Worker     }
2705*8975f5c5SAndroid Build Coastguard Worker 
2706*8975f5c5SAndroid Build Coastguard Worker     // INVALID_FRAMEBUFFER_OPERATION is generated if the current interrupt count on the draw
2707*8975f5c5SAndroid Build Coastguard Worker     // framebuffer is greater than or equal to 255.
2708*8975f5c5SAndroid Build Coastguard Worker     const PixelLocalStorage *pls =
2709*8975f5c5SAndroid Build Coastguard Worker         context->getState().getDrawFramebuffer()->peekPixelLocalStorage();
2710*8975f5c5SAndroid Build Coastguard Worker     if (pls != nullptr && pls->interruptCount() >= 255)
2711*8975f5c5SAndroid Build Coastguard Worker     {
2712*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION, kPLSInterruptOverflow);
2713*8975f5c5SAndroid Build Coastguard Worker         return false;
2714*8975f5c5SAndroid Build Coastguard Worker     }
2715*8975f5c5SAndroid Build Coastguard Worker 
2716*8975f5c5SAndroid Build Coastguard Worker     return true;
2717*8975f5c5SAndroid Build Coastguard Worker }
2718*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferPixelLocalStorageRestoreANGLE(const Context * context,angle::EntryPoint entryPoint)2719*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferPixelLocalStorageRestoreANGLE(const Context *context,
2720*8975f5c5SAndroid Build Coastguard Worker                                                       angle::EntryPoint entryPoint)
2721*8975f5c5SAndroid Build Coastguard Worker {
2722*8975f5c5SAndroid Build Coastguard Worker     // Check that the pixel local storage extension is enabled at all.
2723*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().shaderPixelLocalStorageANGLE)
2724*8975f5c5SAndroid Build Coastguard Worker     {
2725*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPLSExtensionNotEnabled);
2726*8975f5c5SAndroid Build Coastguard Worker         return false;
2727*8975f5c5SAndroid Build Coastguard Worker     }
2728*8975f5c5SAndroid Build Coastguard Worker 
2729*8975f5c5SAndroid Build Coastguard Worker     // This command is ignored when the default framebuffer object name 0 is bound.
2730*8975f5c5SAndroid Build Coastguard Worker     const Framebuffer *framebuffer = context->getState().getDrawFramebuffer();
2731*8975f5c5SAndroid Build Coastguard Worker     if (context->getState().getDrawFramebuffer()->id().value == 0)
2732*8975f5c5SAndroid Build Coastguard Worker     {
2733*8975f5c5SAndroid Build Coastguard Worker         return true;
2734*8975f5c5SAndroid Build Coastguard Worker     }
2735*8975f5c5SAndroid Build Coastguard Worker 
2736*8975f5c5SAndroid Build Coastguard Worker     // INVALID_FRAMEBUFFER_OPERATION is generated if pixel local storage on the draw framebuffer is
2737*8975f5c5SAndroid Build Coastguard Worker     // not in an interrupted state.
2738*8975f5c5SAndroid Build Coastguard Worker     const PixelLocalStorage *pls = framebuffer->peekPixelLocalStorage();
2739*8975f5c5SAndroid Build Coastguard Worker     if (pls == nullptr || pls->interruptCount() == 0)
2740*8975f5c5SAndroid Build Coastguard Worker     {
2741*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_FRAMEBUFFER_OPERATION, kPLSNotInterrupted);
2742*8975f5c5SAndroid Build Coastguard Worker         return false;
2743*8975f5c5SAndroid Build Coastguard Worker     }
2744*8975f5c5SAndroid Build Coastguard Worker 
2745*8975f5c5SAndroid Build Coastguard Worker     return true;
2746*8975f5c5SAndroid Build Coastguard Worker }
2747*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetFramebufferPixelLocalStorageParameterfvANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,GLenum pname,const GLfloat * params)2748*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFramebufferPixelLocalStorageParameterfvANGLE(const Context *context,
2749*8975f5c5SAndroid Build Coastguard Worker                                                              angle::EntryPoint entryPoint,
2750*8975f5c5SAndroid Build Coastguard Worker                                                              GLint plane,
2751*8975f5c5SAndroid Build Coastguard Worker                                                              GLenum pname,
2752*8975f5c5SAndroid Build Coastguard Worker                                                              const GLfloat *params)
2753*8975f5c5SAndroid Build Coastguard Worker {
2754*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetFramebufferPixelLocalStorageParameterfvRobustANGLE(
2755*8975f5c5SAndroid Build Coastguard Worker         context, entryPoint, plane, pname, std::numeric_limits<GLsizei>::max(), nullptr, params);
2756*8975f5c5SAndroid Build Coastguard Worker }
2757*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetFramebufferPixelLocalStorageParameterivANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,GLenum pname,const GLint * params)2758*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFramebufferPixelLocalStorageParameterivANGLE(const Context *context,
2759*8975f5c5SAndroid Build Coastguard Worker                                                              angle::EntryPoint entryPoint,
2760*8975f5c5SAndroid Build Coastguard Worker                                                              GLint plane,
2761*8975f5c5SAndroid Build Coastguard Worker                                                              GLenum pname,
2762*8975f5c5SAndroid Build Coastguard Worker                                                              const GLint *params)
2763*8975f5c5SAndroid Build Coastguard Worker {
2764*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetFramebufferPixelLocalStorageParameterivRobustANGLE(
2765*8975f5c5SAndroid Build Coastguard Worker         context, entryPoint, plane, pname, std::numeric_limits<GLsizei>::max(), nullptr, params);
2766*8975f5c5SAndroid Build Coastguard Worker }
2767*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetFramebufferPixelLocalStorageParameterfvRobustANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,GLenum pname,GLsizei bufSize,const GLsizei * length,const GLfloat * params)2768*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFramebufferPixelLocalStorageParameterfvRobustANGLE(const Context *context,
2769*8975f5c5SAndroid Build Coastguard Worker                                                                    angle::EntryPoint entryPoint,
2770*8975f5c5SAndroid Build Coastguard Worker                                                                    GLint plane,
2771*8975f5c5SAndroid Build Coastguard Worker                                                                    GLenum pname,
2772*8975f5c5SAndroid Build Coastguard Worker                                                                    GLsizei bufSize,
2773*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLsizei *length,
2774*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLfloat *params)
2775*8975f5c5SAndroid Build Coastguard Worker {
2776*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Any))
2777*8975f5c5SAndroid Build Coastguard Worker     {
2778*8975f5c5SAndroid Build Coastguard Worker         return false;
2779*8975f5c5SAndroid Build Coastguard Worker     }
2780*8975f5c5SAndroid Build Coastguard Worker     GLsizei paramCount = 0;
2781*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
2782*8975f5c5SAndroid Build Coastguard Worker     {
2783*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_CLEAR_VALUE_FLOAT_ANGLE:
2784*8975f5c5SAndroid Build Coastguard Worker             paramCount = 4;
2785*8975f5c5SAndroid Build Coastguard Worker             break;
2786*8975f5c5SAndroid Build Coastguard Worker         default:
2787*8975f5c5SAndroid Build Coastguard Worker             // INVALID_ENUM is generated if <pname> is not in Table 6.Y, or if the command issued is
2788*8975f5c5SAndroid Build Coastguard Worker             // not the associated "Get Command" for <pname> in Table 6.Y.
2789*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, pname);
2790*8975f5c5SAndroid Build Coastguard Worker             return false;
2791*8975f5c5SAndroid Build Coastguard Worker     }
2792*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSQueryCommon(context, entryPoint, paramCount, bufSize, params);
2793*8975f5c5SAndroid Build Coastguard Worker }
2794*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetFramebufferPixelLocalStorageParameterivRobustANGLE(const Context * context,angle::EntryPoint entryPoint,GLint plane,GLenum pname,GLsizei bufSize,const GLsizei * length,const GLint * params)2795*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFramebufferPixelLocalStorageParameterivRobustANGLE(const Context *context,
2796*8975f5c5SAndroid Build Coastguard Worker                                                                    angle::EntryPoint entryPoint,
2797*8975f5c5SAndroid Build Coastguard Worker                                                                    GLint plane,
2798*8975f5c5SAndroid Build Coastguard Worker                                                                    GLenum pname,
2799*8975f5c5SAndroid Build Coastguard Worker                                                                    GLsizei bufSize,
2800*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLsizei *length,
2801*8975f5c5SAndroid Build Coastguard Worker                                                                    const GLint *params)
2802*8975f5c5SAndroid Build Coastguard Worker {
2803*8975f5c5SAndroid Build Coastguard Worker     if (!ValidatePLSCommon(context, entryPoint, plane, PLSExpectedStatus::Any))
2804*8975f5c5SAndroid Build Coastguard Worker     {
2805*8975f5c5SAndroid Build Coastguard Worker         return false;
2806*8975f5c5SAndroid Build Coastguard Worker     }
2807*8975f5c5SAndroid Build Coastguard Worker     GLsizei paramCount = 0;
2808*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
2809*8975f5c5SAndroid Build Coastguard Worker     {
2810*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_FORMAT_ANGLE:
2811*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_TEXTURE_NAME_ANGLE:
2812*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_TEXTURE_LEVEL_ANGLE:
2813*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_TEXTURE_LAYER_ANGLE:
2814*8975f5c5SAndroid Build Coastguard Worker             paramCount = 1;
2815*8975f5c5SAndroid Build Coastguard Worker             break;
2816*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_CLEAR_VALUE_INT_ANGLE:
2817*8975f5c5SAndroid Build Coastguard Worker         case GL_PIXEL_LOCAL_CLEAR_VALUE_UNSIGNED_INT_ANGLE:
2818*8975f5c5SAndroid Build Coastguard Worker             paramCount = 4;
2819*8975f5c5SAndroid Build Coastguard Worker             break;
2820*8975f5c5SAndroid Build Coastguard Worker         default:
2821*8975f5c5SAndroid Build Coastguard Worker             // INVALID_ENUM is generated if <pname> is not in Table 6.Y, or if the command issued is
2822*8975f5c5SAndroid Build Coastguard Worker             // not the associated "Get Command" for <pname> in Table 6.Y.
2823*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, pname);
2824*8975f5c5SAndroid Build Coastguard Worker             return false;
2825*8975f5c5SAndroid Build Coastguard Worker     }
2826*8975f5c5SAndroid Build Coastguard Worker     return ValidatePLSQueryCommon(context, entryPoint, paramCount, bufSize, params);
2827*8975f5c5SAndroid Build Coastguard Worker }
2828*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferFetchBarrierEXT(const Context * context,angle::EntryPoint entryPoint)2829*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferFetchBarrierEXT(const Context *context, angle::EntryPoint entryPoint)
2830*8975f5c5SAndroid Build Coastguard Worker {
2831*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().shaderFramebufferFetchNonCoherentEXT)
2832*8975f5c5SAndroid Build Coastguard Worker     {
2833*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION,
2834*8975f5c5SAndroid Build Coastguard Worker                                kFramebufferFetchNonCoherentExtensionNotEnabled);
2835*8975f5c5SAndroid Build Coastguard Worker         return false;
2836*8975f5c5SAndroid Build Coastguard Worker     }
2837*8975f5c5SAndroid Build Coastguard Worker     return true;
2838*8975f5c5SAndroid Build Coastguard Worker }
2839*8975f5c5SAndroid Build Coastguard Worker 
ValidatePatchParameteriEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum pname,GLint value)2840*8975f5c5SAndroid Build Coastguard Worker bool ValidatePatchParameteriEXT(const PrivateState &state,
2841*8975f5c5SAndroid Build Coastguard Worker                                 ErrorSet *errors,
2842*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
2843*8975f5c5SAndroid Build Coastguard Worker                                 GLenum pname,
2844*8975f5c5SAndroid Build Coastguard Worker                                 GLint value)
2845*8975f5c5SAndroid Build Coastguard Worker {
2846*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().tessellationShaderEXT)
2847*8975f5c5SAndroid Build Coastguard Worker     {
2848*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kTessellationShaderEXTNotEnabled);
2849*8975f5c5SAndroid Build Coastguard Worker         return false;
2850*8975f5c5SAndroid Build Coastguard Worker     }
2851*8975f5c5SAndroid Build Coastguard Worker 
2852*8975f5c5SAndroid Build Coastguard Worker     return ValidatePatchParameteriBase(state, errors, entryPoint, pname, value);
2853*8975f5c5SAndroid Build Coastguard Worker }
2854*8975f5c5SAndroid Build Coastguard Worker 
ValidatePatchParameteriOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum pname,GLint value)2855*8975f5c5SAndroid Build Coastguard Worker bool ValidatePatchParameteriOES(const PrivateState &state,
2856*8975f5c5SAndroid Build Coastguard Worker                                 ErrorSet *errors,
2857*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
2858*8975f5c5SAndroid Build Coastguard Worker                                 GLenum pname,
2859*8975f5c5SAndroid Build Coastguard Worker                                 GLint value)
2860*8975f5c5SAndroid Build Coastguard Worker {
2861*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().tessellationShaderOES)
2862*8975f5c5SAndroid Build Coastguard Worker     {
2863*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kTessellationShaderOESNotEnabled);
2864*8975f5c5SAndroid Build Coastguard Worker         return false;
2865*8975f5c5SAndroid Build Coastguard Worker     }
2866*8975f5c5SAndroid Build Coastguard Worker 
2867*8975f5c5SAndroid Build Coastguard Worker     return ValidatePatchParameteriBase(state, errors, entryPoint, pname, value);
2868*8975f5c5SAndroid Build Coastguard Worker }
2869*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMemFlags2DANGLE(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,MemoryObjectID memoryPacked,GLuint64 offset,GLbitfield createFlags,GLbitfield usageFlags,const void * imageCreateInfoPNext)2870*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMemFlags2DANGLE(const Context *context,
2871*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
2872*8975f5c5SAndroid Build Coastguard Worker                                        TextureType targetPacked,
2873*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei levels,
2874*8975f5c5SAndroid Build Coastguard Worker                                        GLenum internalFormat,
2875*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei width,
2876*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei height,
2877*8975f5c5SAndroid Build Coastguard Worker                                        MemoryObjectID memoryPacked,
2878*8975f5c5SAndroid Build Coastguard Worker                                        GLuint64 offset,
2879*8975f5c5SAndroid Build Coastguard Worker                                        GLbitfield createFlags,
2880*8975f5c5SAndroid Build Coastguard Worker                                        GLbitfield usageFlags,
2881*8975f5c5SAndroid Build Coastguard Worker                                        const void *imageCreateInfoPNext)
2882*8975f5c5SAndroid Build Coastguard Worker {
2883*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().memoryObjectFlagsANGLE)
2884*8975f5c5SAndroid Build Coastguard Worker     {
2885*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
2886*8975f5c5SAndroid Build Coastguard Worker         return false;
2887*8975f5c5SAndroid Build Coastguard Worker     }
2888*8975f5c5SAndroid Build Coastguard Worker 
2889*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateTexStorageMem2DEXT(context, entryPoint, targetPacked, levels, internalFormat,
2890*8975f5c5SAndroid Build Coastguard Worker                                     width, height, memoryPacked, offset))
2891*8975f5c5SAndroid Build Coastguard Worker     {
2892*8975f5c5SAndroid Build Coastguard Worker         return false;
2893*8975f5c5SAndroid Build Coastguard Worker     }
2894*8975f5c5SAndroid Build Coastguard Worker 
2895*8975f5c5SAndroid Build Coastguard Worker     // |createFlags| and |usageFlags| must only have bits specified by the extension.
2896*8975f5c5SAndroid Build Coastguard Worker     constexpr GLbitfield kAllCreateFlags =
2897*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_SPARSE_BINDING_BIT_ANGLE | GL_CREATE_SPARSE_RESIDENCY_BIT_ANGLE |
2898*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_SPARSE_ALIASED_BIT_ANGLE | GL_CREATE_MUTABLE_FORMAT_BIT_ANGLE |
2899*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_CUBE_COMPATIBLE_BIT_ANGLE | GL_CREATE_ALIAS_BIT_ANGLE |
2900*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_ANGLE | GL_CREATE_2D_ARRAY_COMPATIBLE_BIT_ANGLE |
2901*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_ANGLE | GL_CREATE_EXTENDED_USAGE_BIT_ANGLE |
2902*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_PROTECTED_BIT_ANGLE | GL_CREATE_DISJOINT_BIT_ANGLE |
2903*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_CORNER_SAMPLED_BIT_ANGLE | GL_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_ANGLE |
2904*8975f5c5SAndroid Build Coastguard Worker         GL_CREATE_SUBSAMPLED_BIT_ANGLE;
2905*8975f5c5SAndroid Build Coastguard Worker 
2906*8975f5c5SAndroid Build Coastguard Worker     if ((createFlags & ~kAllCreateFlags) != 0)
2907*8975f5c5SAndroid Build Coastguard Worker     {
2908*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidExternalCreateFlags);
2909*8975f5c5SAndroid Build Coastguard Worker         return false;
2910*8975f5c5SAndroid Build Coastguard Worker     }
2911*8975f5c5SAndroid Build Coastguard Worker 
2912*8975f5c5SAndroid Build Coastguard Worker     constexpr GLbitfield kAllUsageFlags =
2913*8975f5c5SAndroid Build Coastguard Worker         GL_USAGE_TRANSFER_SRC_BIT_ANGLE | GL_USAGE_TRANSFER_DST_BIT_ANGLE |
2914*8975f5c5SAndroid Build Coastguard Worker         GL_USAGE_SAMPLED_BIT_ANGLE | GL_USAGE_STORAGE_BIT_ANGLE |
2915*8975f5c5SAndroid Build Coastguard Worker         GL_USAGE_COLOR_ATTACHMENT_BIT_ANGLE | GL_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT_ANGLE |
2916*8975f5c5SAndroid Build Coastguard Worker         GL_USAGE_TRANSIENT_ATTACHMENT_BIT_ANGLE | GL_USAGE_INPUT_ATTACHMENT_BIT_ANGLE |
2917*8975f5c5SAndroid Build Coastguard Worker         GL_USAGE_SHADING_RATE_IMAGE_BIT_ANGLE | GL_USAGE_FRAGMENT_DENSITY_MAP_BIT_ANGLE;
2918*8975f5c5SAndroid Build Coastguard Worker 
2919*8975f5c5SAndroid Build Coastguard Worker     if ((usageFlags & ~kAllUsageFlags) != 0)
2920*8975f5c5SAndroid Build Coastguard Worker     {
2921*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidExternalUsageFlags);
2922*8975f5c5SAndroid Build Coastguard Worker         return false;
2923*8975f5c5SAndroid Build Coastguard Worker     }
2924*8975f5c5SAndroid Build Coastguard Worker 
2925*8975f5c5SAndroid Build Coastguard Worker     return true;
2926*8975f5c5SAndroid Build Coastguard Worker }
2927*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMemFlags2DMultisampleANGLE(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLboolean fixedSampleLocations,MemoryObjectID memoryPacked,GLuint64 offset,GLbitfield createFlags,GLbitfield usageFlags,const void * imageCreateInfoPNext)2928*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMemFlags2DMultisampleANGLE(const Context *context,
2929*8975f5c5SAndroid Build Coastguard Worker                                                   angle::EntryPoint entryPoint,
2930*8975f5c5SAndroid Build Coastguard Worker                                                   TextureType targetPacked,
2931*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei samples,
2932*8975f5c5SAndroid Build Coastguard Worker                                                   GLenum internalFormat,
2933*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei width,
2934*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei height,
2935*8975f5c5SAndroid Build Coastguard Worker                                                   GLboolean fixedSampleLocations,
2936*8975f5c5SAndroid Build Coastguard Worker                                                   MemoryObjectID memoryPacked,
2937*8975f5c5SAndroid Build Coastguard Worker                                                   GLuint64 offset,
2938*8975f5c5SAndroid Build Coastguard Worker                                                   GLbitfield createFlags,
2939*8975f5c5SAndroid Build Coastguard Worker                                                   GLbitfield usageFlags,
2940*8975f5c5SAndroid Build Coastguard Worker                                                   const void *imageCreateInfoPNext)
2941*8975f5c5SAndroid Build Coastguard Worker {
2942*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
2943*8975f5c5SAndroid Build Coastguard Worker     return false;
2944*8975f5c5SAndroid Build Coastguard Worker }
2945*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMemFlags3DANGLE(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLsizei levels,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,MemoryObjectID memoryPacked,GLuint64 offset,GLbitfield createFlags,GLbitfield usageFlags,const void * imageCreateInfoPNext)2946*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMemFlags3DANGLE(const Context *context,
2947*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
2948*8975f5c5SAndroid Build Coastguard Worker                                        TextureType targetPacked,
2949*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei levels,
2950*8975f5c5SAndroid Build Coastguard Worker                                        GLenum internalFormat,
2951*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei width,
2952*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei height,
2953*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei depth,
2954*8975f5c5SAndroid Build Coastguard Worker                                        MemoryObjectID memoryPacked,
2955*8975f5c5SAndroid Build Coastguard Worker                                        GLuint64 offset,
2956*8975f5c5SAndroid Build Coastguard Worker                                        GLbitfield createFlags,
2957*8975f5c5SAndroid Build Coastguard Worker                                        GLbitfield usageFlags,
2958*8975f5c5SAndroid Build Coastguard Worker                                        const void *imageCreateInfoPNext)
2959*8975f5c5SAndroid Build Coastguard Worker {
2960*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
2961*8975f5c5SAndroid Build Coastguard Worker     return false;
2962*8975f5c5SAndroid Build Coastguard Worker }
2963*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageMemFlags3DMultisampleANGLE(const Context * context,angle::EntryPoint entryPoint,TextureType targetPacked,GLsizei samples,GLenum internalFormat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedSampleLocations,MemoryObjectID memoryPacked,GLuint64 offset,GLbitfield createFlags,GLbitfield usageFlags,const void * imageCreateInfoPNext)2964*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageMemFlags3DMultisampleANGLE(const Context *context,
2965*8975f5c5SAndroid Build Coastguard Worker                                                   angle::EntryPoint entryPoint,
2966*8975f5c5SAndroid Build Coastguard Worker                                                   TextureType targetPacked,
2967*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei samples,
2968*8975f5c5SAndroid Build Coastguard Worker                                                   GLenum internalFormat,
2969*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei width,
2970*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei height,
2971*8975f5c5SAndroid Build Coastguard Worker                                                   GLsizei depth,
2972*8975f5c5SAndroid Build Coastguard Worker                                                   GLboolean fixedSampleLocations,
2973*8975f5c5SAndroid Build Coastguard Worker                                                   MemoryObjectID memoryPacked,
2974*8975f5c5SAndroid Build Coastguard Worker                                                   GLuint64 offset,
2975*8975f5c5SAndroid Build Coastguard Worker                                                   GLbitfield createFlags,
2976*8975f5c5SAndroid Build Coastguard Worker                                                   GLbitfield usageFlags,
2977*8975f5c5SAndroid Build Coastguard Worker                                                   const void *imageCreateInfoPNext)
2978*8975f5c5SAndroid Build Coastguard Worker {
2979*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
2980*8975f5c5SAndroid Build Coastguard Worker     return false;
2981*8975f5c5SAndroid Build Coastguard Worker }
2982*8975f5c5SAndroid Build Coastguard Worker 
2983*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_buffer_storage
ValidateBufferStorageEXT(const Context * context,angle::EntryPoint entryPoint,BufferBinding targetPacked,GLsizeiptr size,const void * data,GLbitfield flags)2984*8975f5c5SAndroid Build Coastguard Worker bool ValidateBufferStorageEXT(const Context *context,
2985*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
2986*8975f5c5SAndroid Build Coastguard Worker                               BufferBinding targetPacked,
2987*8975f5c5SAndroid Build Coastguard Worker                               GLsizeiptr size,
2988*8975f5c5SAndroid Build Coastguard Worker                               const void *data,
2989*8975f5c5SAndroid Build Coastguard Worker                               GLbitfield flags)
2990*8975f5c5SAndroid Build Coastguard Worker {
2991*8975f5c5SAndroid Build Coastguard Worker     if (!context->isValidBufferBinding(targetPacked))
2992*8975f5c5SAndroid Build Coastguard Worker     {
2993*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidBufferTypes);
2994*8975f5c5SAndroid Build Coastguard Worker         return false;
2995*8975f5c5SAndroid Build Coastguard Worker     }
2996*8975f5c5SAndroid Build Coastguard Worker 
2997*8975f5c5SAndroid Build Coastguard Worker     if (size <= 0)
2998*8975f5c5SAndroid Build Coastguard Worker     {
2999*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNonPositiveSize);
3000*8975f5c5SAndroid Build Coastguard Worker         return false;
3001*8975f5c5SAndroid Build Coastguard Worker     }
3002*8975f5c5SAndroid Build Coastguard Worker 
3003*8975f5c5SAndroid Build Coastguard Worker     constexpr GLbitfield kAllUsageFlags =
3004*8975f5c5SAndroid Build Coastguard Worker         (GL_DYNAMIC_STORAGE_BIT_EXT | GL_MAP_READ_BIT | GL_MAP_WRITE_BIT |
3005*8975f5c5SAndroid Build Coastguard Worker          GL_MAP_PERSISTENT_BIT_EXT | GL_MAP_COHERENT_BIT_EXT | GL_CLIENT_STORAGE_BIT_EXT);
3006*8975f5c5SAndroid Build Coastguard Worker     if ((flags & ~kAllUsageFlags) != 0)
3007*8975f5c5SAndroid Build Coastguard Worker     {
3008*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBufferUsageFlags);
3009*8975f5c5SAndroid Build Coastguard Worker         return false;
3010*8975f5c5SAndroid Build Coastguard Worker     }
3011*8975f5c5SAndroid Build Coastguard Worker 
3012*8975f5c5SAndroid Build Coastguard Worker     if (((flags & GL_MAP_PERSISTENT_BIT_EXT) != 0) &&
3013*8975f5c5SAndroid Build Coastguard Worker         ((flags & (GL_MAP_READ_BIT | GL_MAP_WRITE_BIT)) == 0))
3014*8975f5c5SAndroid Build Coastguard Worker     {
3015*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBufferUsageFlags);
3016*8975f5c5SAndroid Build Coastguard Worker         return false;
3017*8975f5c5SAndroid Build Coastguard Worker     }
3018*8975f5c5SAndroid Build Coastguard Worker 
3019*8975f5c5SAndroid Build Coastguard Worker     if (((flags & GL_MAP_COHERENT_BIT_EXT) != 0) && ((flags & GL_MAP_PERSISTENT_BIT_EXT) == 0))
3020*8975f5c5SAndroid Build Coastguard Worker     {
3021*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidBufferUsageFlags);
3022*8975f5c5SAndroid Build Coastguard Worker         return false;
3023*8975f5c5SAndroid Build Coastguard Worker     }
3024*8975f5c5SAndroid Build Coastguard Worker 
3025*8975f5c5SAndroid Build Coastguard Worker     Buffer *buffer = context->getState().getTargetBuffer(targetPacked);
3026*8975f5c5SAndroid Build Coastguard Worker 
3027*8975f5c5SAndroid Build Coastguard Worker     if (buffer == nullptr)
3028*8975f5c5SAndroid Build Coastguard Worker     {
3029*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferNotBound);
3030*8975f5c5SAndroid Build Coastguard Worker         return false;
3031*8975f5c5SAndroid Build Coastguard Worker     }
3032*8975f5c5SAndroid Build Coastguard Worker 
3033*8975f5c5SAndroid Build Coastguard Worker     if (buffer->isImmutable())
3034*8975f5c5SAndroid Build Coastguard Worker     {
3035*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kBufferImmutable);
3036*8975f5c5SAndroid Build Coastguard Worker         return false;
3037*8975f5c5SAndroid Build Coastguard Worker     }
3038*8975f5c5SAndroid Build Coastguard Worker 
3039*8975f5c5SAndroid Build Coastguard Worker     return true;
3040*8975f5c5SAndroid Build Coastguard Worker }
3041*8975f5c5SAndroid Build Coastguard Worker 
3042*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_clear_texture
ValidateClearTexImageEXT(const Context * context,angle::EntryPoint entryPoint,TextureID texturePacked,GLint level,GLenum format,GLenum type,const void * data)3043*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearTexImageEXT(const Context *context,
3044*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
3045*8975f5c5SAndroid Build Coastguard Worker                               TextureID texturePacked,
3046*8975f5c5SAndroid Build Coastguard Worker                               GLint level,
3047*8975f5c5SAndroid Build Coastguard Worker                               GLenum format,
3048*8975f5c5SAndroid Build Coastguard Worker                               GLenum type,
3049*8975f5c5SAndroid Build Coastguard Worker                               const void *data)
3050*8975f5c5SAndroid Build Coastguard Worker {
3051*8975f5c5SAndroid Build Coastguard Worker     return ValidateClearTexImageCommon(context, entryPoint, texturePacked, level, std::nullopt,
3052*8975f5c5SAndroid Build Coastguard Worker                                        format, type, data);
3053*8975f5c5SAndroid Build Coastguard Worker }
3054*8975f5c5SAndroid Build Coastguard Worker 
ValidateClearTexSubImageEXT(const Context * context,angle::EntryPoint entryPoint,TextureID texturePacked,GLint level,GLint xoffset,GLint yoffset,GLint zoffset,GLsizei width,GLsizei height,GLsizei depth,GLenum format,GLenum type,const void * data)3055*8975f5c5SAndroid Build Coastguard Worker bool ValidateClearTexSubImageEXT(const Context *context,
3056*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3057*8975f5c5SAndroid Build Coastguard Worker                                  TextureID texturePacked,
3058*8975f5c5SAndroid Build Coastguard Worker                                  GLint level,
3059*8975f5c5SAndroid Build Coastguard Worker                                  GLint xoffset,
3060*8975f5c5SAndroid Build Coastguard Worker                                  GLint yoffset,
3061*8975f5c5SAndroid Build Coastguard Worker                                  GLint zoffset,
3062*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei width,
3063*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei height,
3064*8975f5c5SAndroid Build Coastguard Worker                                  GLsizei depth,
3065*8975f5c5SAndroid Build Coastguard Worker                                  GLenum format,
3066*8975f5c5SAndroid Build Coastguard Worker                                  GLenum type,
3067*8975f5c5SAndroid Build Coastguard Worker                                  const void *data)
3068*8975f5c5SAndroid Build Coastguard Worker {
3069*8975f5c5SAndroid Build Coastguard Worker     return ValidateClearTexImageCommon(context, entryPoint, texturePacked, level,
3070*8975f5c5SAndroid Build Coastguard Worker                                        Box(xoffset, yoffset, zoffset, width, height, depth), format,
3071*8975f5c5SAndroid Build Coastguard Worker                                        type, data);
3072*8975f5c5SAndroid Build Coastguard Worker }
3073*8975f5c5SAndroid Build Coastguard Worker 
3074*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_clip_control
ValidateClipControlEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,ClipOrigin originPacked,ClipDepthMode depthPacked)3075*8975f5c5SAndroid Build Coastguard Worker bool ValidateClipControlEXT(const PrivateState &state,
3076*8975f5c5SAndroid Build Coastguard Worker                             ErrorSet *errors,
3077*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
3078*8975f5c5SAndroid Build Coastguard Worker                             ClipOrigin originPacked,
3079*8975f5c5SAndroid Build Coastguard Worker                             ClipDepthMode depthPacked)
3080*8975f5c5SAndroid Build Coastguard Worker {
3081*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().clipControlEXT)
3082*8975f5c5SAndroid Build Coastguard Worker     {
3083*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3084*8975f5c5SAndroid Build Coastguard Worker         return false;
3085*8975f5c5SAndroid Build Coastguard Worker     }
3086*8975f5c5SAndroid Build Coastguard Worker 
3087*8975f5c5SAndroid Build Coastguard Worker     if (originPacked == ClipOrigin::InvalidEnum)
3088*8975f5c5SAndroid Build Coastguard Worker     {
3089*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidOriginEnum);
3090*8975f5c5SAndroid Build Coastguard Worker         return false;
3091*8975f5c5SAndroid Build Coastguard Worker     }
3092*8975f5c5SAndroid Build Coastguard Worker 
3093*8975f5c5SAndroid Build Coastguard Worker     if (depthPacked == ClipDepthMode::InvalidEnum)
3094*8975f5c5SAndroid Build Coastguard Worker     {
3095*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidDepthEnum);
3096*8975f5c5SAndroid Build Coastguard Worker         return false;
3097*8975f5c5SAndroid Build Coastguard Worker     }
3098*8975f5c5SAndroid Build Coastguard Worker 
3099*8975f5c5SAndroid Build Coastguard Worker     return true;
3100*8975f5c5SAndroid Build Coastguard Worker }
3101*8975f5c5SAndroid Build Coastguard Worker 
3102*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_external_buffer
ValidateBufferStorageExternalEXT(const Context * context,angle::EntryPoint entryPoint,BufferBinding targetPacked,GLintptr offset,GLsizeiptr size,GLeglClientBufferEXT clientBuffer,GLbitfield flags)3103*8975f5c5SAndroid Build Coastguard Worker bool ValidateBufferStorageExternalEXT(const Context *context,
3104*8975f5c5SAndroid Build Coastguard Worker                                       angle::EntryPoint entryPoint,
3105*8975f5c5SAndroid Build Coastguard Worker                                       BufferBinding targetPacked,
3106*8975f5c5SAndroid Build Coastguard Worker                                       GLintptr offset,
3107*8975f5c5SAndroid Build Coastguard Worker                                       GLsizeiptr size,
3108*8975f5c5SAndroid Build Coastguard Worker                                       GLeglClientBufferEXT clientBuffer,
3109*8975f5c5SAndroid Build Coastguard Worker                                       GLbitfield flags)
3110*8975f5c5SAndroid Build Coastguard Worker {
3111*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateBufferStorageEXT(context, entryPoint, targetPacked, size, nullptr, flags))
3112*8975f5c5SAndroid Build Coastguard Worker     {
3113*8975f5c5SAndroid Build Coastguard Worker         return false;
3114*8975f5c5SAndroid Build Coastguard Worker     }
3115*8975f5c5SAndroid Build Coastguard Worker 
3116*8975f5c5SAndroid Build Coastguard Worker     if (offset != 0)
3117*8975f5c5SAndroid Build Coastguard Worker     {
3118*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kExternalBufferInvalidOffset);
3119*8975f5c5SAndroid Build Coastguard Worker         return false;
3120*8975f5c5SAndroid Build Coastguard Worker     }
3121*8975f5c5SAndroid Build Coastguard Worker 
3122*8975f5c5SAndroid Build Coastguard Worker     if (clientBuffer == nullptr && size > 0)
3123*8975f5c5SAndroid Build Coastguard Worker     {
3124*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kClientBufferInvalid);
3125*8975f5c5SAndroid Build Coastguard Worker         return false;
3126*8975f5c5SAndroid Build Coastguard Worker     }
3127*8975f5c5SAndroid Build Coastguard Worker 
3128*8975f5c5SAndroid Build Coastguard Worker     return true;
3129*8975f5c5SAndroid Build Coastguard Worker }
3130*8975f5c5SAndroid Build Coastguard Worker 
ValidateNamedBufferStorageExternalEXT(const Context * context,angle::EntryPoint entryPoint,GLuint buffer,GLintptr offset,GLsizeiptr size,GLeglClientBufferEXT clientBuffer,GLbitfield flags)3131*8975f5c5SAndroid Build Coastguard Worker bool ValidateNamedBufferStorageExternalEXT(const Context *context,
3132*8975f5c5SAndroid Build Coastguard Worker                                            angle::EntryPoint entryPoint,
3133*8975f5c5SAndroid Build Coastguard Worker                                            GLuint buffer,
3134*8975f5c5SAndroid Build Coastguard Worker                                            GLintptr offset,
3135*8975f5c5SAndroid Build Coastguard Worker                                            GLsizeiptr size,
3136*8975f5c5SAndroid Build Coastguard Worker                                            GLeglClientBufferEXT clientBuffer,
3137*8975f5c5SAndroid Build Coastguard Worker                                            GLbitfield flags)
3138*8975f5c5SAndroid Build Coastguard Worker {
3139*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
3140*8975f5c5SAndroid Build Coastguard Worker     return false;
3141*8975f5c5SAndroid Build Coastguard Worker }
3142*8975f5c5SAndroid Build Coastguard Worker 
3143*8975f5c5SAndroid Build Coastguard Worker // GL_ANGLE_polygon_mode
ValidatePolygonModeANGLE(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum face,PolygonMode modePacked)3144*8975f5c5SAndroid Build Coastguard Worker bool ValidatePolygonModeANGLE(const PrivateState &state,
3145*8975f5c5SAndroid Build Coastguard Worker                               ErrorSet *errors,
3146*8975f5c5SAndroid Build Coastguard Worker                               angle::EntryPoint entryPoint,
3147*8975f5c5SAndroid Build Coastguard Worker                               GLenum face,
3148*8975f5c5SAndroid Build Coastguard Worker                               PolygonMode modePacked)
3149*8975f5c5SAndroid Build Coastguard Worker {
3150*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().polygonModeANGLE)
3151*8975f5c5SAndroid Build Coastguard Worker     {
3152*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3153*8975f5c5SAndroid Build Coastguard Worker         return false;
3154*8975f5c5SAndroid Build Coastguard Worker     }
3155*8975f5c5SAndroid Build Coastguard Worker 
3156*8975f5c5SAndroid Build Coastguard Worker     if (face != GL_FRONT_AND_BACK)
3157*8975f5c5SAndroid Build Coastguard Worker     {
3158*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidCullMode);
3159*8975f5c5SAndroid Build Coastguard Worker         return false;
3160*8975f5c5SAndroid Build Coastguard Worker     }
3161*8975f5c5SAndroid Build Coastguard Worker 
3162*8975f5c5SAndroid Build Coastguard Worker     if (modePacked == PolygonMode::Point || modePacked == PolygonMode::InvalidEnum)
3163*8975f5c5SAndroid Build Coastguard Worker     {
3164*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPolygonMode);
3165*8975f5c5SAndroid Build Coastguard Worker         return false;
3166*8975f5c5SAndroid Build Coastguard Worker     }
3167*8975f5c5SAndroid Build Coastguard Worker 
3168*8975f5c5SAndroid Build Coastguard Worker     return true;
3169*8975f5c5SAndroid Build Coastguard Worker }
3170*8975f5c5SAndroid Build Coastguard Worker 
3171*8975f5c5SAndroid Build Coastguard Worker // GL_NV_polygon_mode
ValidatePolygonModeNV(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum face,PolygonMode modePacked)3172*8975f5c5SAndroid Build Coastguard Worker bool ValidatePolygonModeNV(const PrivateState &state,
3173*8975f5c5SAndroid Build Coastguard Worker                            ErrorSet *errors,
3174*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
3175*8975f5c5SAndroid Build Coastguard Worker                            GLenum face,
3176*8975f5c5SAndroid Build Coastguard Worker                            PolygonMode modePacked)
3177*8975f5c5SAndroid Build Coastguard Worker {
3178*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().polygonModeNV)
3179*8975f5c5SAndroid Build Coastguard Worker     {
3180*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3181*8975f5c5SAndroid Build Coastguard Worker         return false;
3182*8975f5c5SAndroid Build Coastguard Worker     }
3183*8975f5c5SAndroid Build Coastguard Worker 
3184*8975f5c5SAndroid Build Coastguard Worker     if (face != GL_FRONT_AND_BACK)
3185*8975f5c5SAndroid Build Coastguard Worker     {
3186*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidCullMode);
3187*8975f5c5SAndroid Build Coastguard Worker         return false;
3188*8975f5c5SAndroid Build Coastguard Worker     }
3189*8975f5c5SAndroid Build Coastguard Worker 
3190*8975f5c5SAndroid Build Coastguard Worker     if (modePacked == PolygonMode::InvalidEnum)
3191*8975f5c5SAndroid Build Coastguard Worker     {
3192*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidPolygonMode);
3193*8975f5c5SAndroid Build Coastguard Worker         return false;
3194*8975f5c5SAndroid Build Coastguard Worker     }
3195*8975f5c5SAndroid Build Coastguard Worker 
3196*8975f5c5SAndroid Build Coastguard Worker     return true;
3197*8975f5c5SAndroid Build Coastguard Worker }
3198*8975f5c5SAndroid Build Coastguard Worker 
3199*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_polygon_offset_clamp
ValidatePolygonOffsetClampEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLfloat factor,GLfloat units,GLfloat clamp)3200*8975f5c5SAndroid Build Coastguard Worker bool ValidatePolygonOffsetClampEXT(const PrivateState &state,
3201*8975f5c5SAndroid Build Coastguard Worker                                    ErrorSet *errors,
3202*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
3203*8975f5c5SAndroid Build Coastguard Worker                                    GLfloat factor,
3204*8975f5c5SAndroid Build Coastguard Worker                                    GLfloat units,
3205*8975f5c5SAndroid Build Coastguard Worker                                    GLfloat clamp)
3206*8975f5c5SAndroid Build Coastguard Worker {
3207*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().polygonOffsetClampEXT)
3208*8975f5c5SAndroid Build Coastguard Worker     {
3209*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3210*8975f5c5SAndroid Build Coastguard Worker         return false;
3211*8975f5c5SAndroid Build Coastguard Worker     }
3212*8975f5c5SAndroid Build Coastguard Worker 
3213*8975f5c5SAndroid Build Coastguard Worker     return true;
3214*8975f5c5SAndroid Build Coastguard Worker }
3215*8975f5c5SAndroid Build Coastguard Worker 
3216*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_primitive_bounding_box
ValidatePrimitiveBoundingBoxEXT(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLfloat minX,GLfloat minY,GLfloat minZ,GLfloat minW,GLfloat maxX,GLfloat maxY,GLfloat maxZ,GLfloat maxW)3217*8975f5c5SAndroid Build Coastguard Worker bool ValidatePrimitiveBoundingBoxEXT(const PrivateState &state,
3218*8975f5c5SAndroid Build Coastguard Worker                                      ErrorSet *errors,
3219*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
3220*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minX,
3221*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minY,
3222*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minZ,
3223*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minW,
3224*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxX,
3225*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxY,
3226*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxZ,
3227*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxW)
3228*8975f5c5SAndroid Build Coastguard Worker {
3229*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().primitiveBoundingBoxEXT)
3230*8975f5c5SAndroid Build Coastguard Worker     {
3231*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3232*8975f5c5SAndroid Build Coastguard Worker         return false;
3233*8975f5c5SAndroid Build Coastguard Worker     }
3234*8975f5c5SAndroid Build Coastguard Worker 
3235*8975f5c5SAndroid Build Coastguard Worker     return true;
3236*8975f5c5SAndroid Build Coastguard Worker }
3237*8975f5c5SAndroid Build Coastguard Worker 
3238*8975f5c5SAndroid Build Coastguard Worker // GL_OES_primitive_bounding_box
ValidatePrimitiveBoundingBoxOES(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLfloat minX,GLfloat minY,GLfloat minZ,GLfloat minW,GLfloat maxX,GLfloat maxY,GLfloat maxZ,GLfloat maxW)3239*8975f5c5SAndroid Build Coastguard Worker bool ValidatePrimitiveBoundingBoxOES(const PrivateState &state,
3240*8975f5c5SAndroid Build Coastguard Worker                                      ErrorSet *errors,
3241*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
3242*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minX,
3243*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minY,
3244*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minZ,
3245*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat minW,
3246*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxX,
3247*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxY,
3248*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxZ,
3249*8975f5c5SAndroid Build Coastguard Worker                                      GLfloat maxW)
3250*8975f5c5SAndroid Build Coastguard Worker {
3251*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().primitiveBoundingBoxOES)
3252*8975f5c5SAndroid Build Coastguard Worker     {
3253*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
3254*8975f5c5SAndroid Build Coastguard Worker         return false;
3255*8975f5c5SAndroid Build Coastguard Worker     }
3256*8975f5c5SAndroid Build Coastguard Worker 
3257*8975f5c5SAndroid Build Coastguard Worker     return true;
3258*8975f5c5SAndroid Build Coastguard Worker }
3259*8975f5c5SAndroid Build Coastguard Worker 
3260*8975f5c5SAndroid Build Coastguard Worker // GL_OES_texture_storage_multisample_2d_array
ValidateTexStorage3DMultisampleOES(const Context * context,angle::EntryPoint entryPoint,TextureType target,GLsizei samples,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,GLboolean fixedsamplelocations)3261*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorage3DMultisampleOES(const Context *context,
3262*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
3263*8975f5c5SAndroid Build Coastguard Worker                                         TextureType target,
3264*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei samples,
3265*8975f5c5SAndroid Build Coastguard Worker                                         GLenum internalformat,
3266*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei width,
3267*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei height,
3268*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei depth,
3269*8975f5c5SAndroid Build Coastguard Worker                                         GLboolean fixedsamplelocations)
3270*8975f5c5SAndroid Build Coastguard Worker {
3271*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureStorageMultisample2dArrayOES)
3272*8975f5c5SAndroid Build Coastguard Worker     {
3273*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3274*8975f5c5SAndroid Build Coastguard Worker         return false;
3275*8975f5c5SAndroid Build Coastguard Worker     }
3276*8975f5c5SAndroid Build Coastguard Worker 
3277*8975f5c5SAndroid Build Coastguard Worker     return ValidateTexStorage3DMultisampleBase(context, entryPoint, target, samples, internalformat,
3278*8975f5c5SAndroid Build Coastguard Worker                                                width, height, depth);
3279*8975f5c5SAndroid Build Coastguard Worker }
3280*8975f5c5SAndroid Build Coastguard Worker 
3281*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_separate_shader_objects
ValidateActiveShaderProgramEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked,ShaderProgramID programPacked)3282*8975f5c5SAndroid Build Coastguard Worker bool ValidateActiveShaderProgramEXT(const Context *context,
3283*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
3284*8975f5c5SAndroid Build Coastguard Worker                                     ProgramPipelineID pipelinePacked,
3285*8975f5c5SAndroid Build Coastguard Worker                                     ShaderProgramID programPacked)
3286*8975f5c5SAndroid Build Coastguard Worker {
3287*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3288*8975f5c5SAndroid Build Coastguard Worker     {
3289*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3290*8975f5c5SAndroid Build Coastguard Worker         return false;
3291*8975f5c5SAndroid Build Coastguard Worker     }
3292*8975f5c5SAndroid Build Coastguard Worker 
3293*8975f5c5SAndroid Build Coastguard Worker     return ValidateActiveShaderProgramBase(context, entryPoint, pipelinePacked, programPacked);
3294*8975f5c5SAndroid Build Coastguard Worker }
3295*8975f5c5SAndroid Build Coastguard Worker 
ValidateBindProgramPipelineEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked)3296*8975f5c5SAndroid Build Coastguard Worker bool ValidateBindProgramPipelineEXT(const Context *context,
3297*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
3298*8975f5c5SAndroid Build Coastguard Worker                                     ProgramPipelineID pipelinePacked)
3299*8975f5c5SAndroid Build Coastguard Worker {
3300*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3301*8975f5c5SAndroid Build Coastguard Worker     {
3302*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3303*8975f5c5SAndroid Build Coastguard Worker         return false;
3304*8975f5c5SAndroid Build Coastguard Worker     }
3305*8975f5c5SAndroid Build Coastguard Worker 
3306*8975f5c5SAndroid Build Coastguard Worker     return ValidateBindProgramPipelineBase(context, entryPoint, pipelinePacked);
3307*8975f5c5SAndroid Build Coastguard Worker }
3308*8975f5c5SAndroid Build Coastguard Worker 
ValidateCreateShaderProgramvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderType typePacked,GLsizei count,const GLchar ** strings)3309*8975f5c5SAndroid Build Coastguard Worker bool ValidateCreateShaderProgramvEXT(const Context *context,
3310*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
3311*8975f5c5SAndroid Build Coastguard Worker                                      ShaderType typePacked,
3312*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei count,
3313*8975f5c5SAndroid Build Coastguard Worker                                      const GLchar **strings)
3314*8975f5c5SAndroid Build Coastguard Worker {
3315*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3316*8975f5c5SAndroid Build Coastguard Worker     {
3317*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3318*8975f5c5SAndroid Build Coastguard Worker         return false;
3319*8975f5c5SAndroid Build Coastguard Worker     }
3320*8975f5c5SAndroid Build Coastguard Worker 
3321*8975f5c5SAndroid Build Coastguard Worker     return ValidateCreateShaderProgramvBase(context, entryPoint, typePacked, count, strings);
3322*8975f5c5SAndroid Build Coastguard Worker }
3323*8975f5c5SAndroid Build Coastguard Worker 
ValidateDeleteProgramPipelinesEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const ProgramPipelineID * pipelinesPacked)3324*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeleteProgramPipelinesEXT(const Context *context,
3325*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
3326*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei n,
3327*8975f5c5SAndroid Build Coastguard Worker                                        const ProgramPipelineID *pipelinesPacked)
3328*8975f5c5SAndroid Build Coastguard Worker {
3329*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3330*8975f5c5SAndroid Build Coastguard Worker     {
3331*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3332*8975f5c5SAndroid Build Coastguard Worker         return false;
3333*8975f5c5SAndroid Build Coastguard Worker     }
3334*8975f5c5SAndroid Build Coastguard Worker 
3335*8975f5c5SAndroid Build Coastguard Worker     return ValidateDeleteProgramPipelinesBase(context, entryPoint, n, pipelinesPacked);
3336*8975f5c5SAndroid Build Coastguard Worker }
3337*8975f5c5SAndroid Build Coastguard Worker 
ValidateGenProgramPipelinesEXT(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const ProgramPipelineID * pipelinesPacked)3338*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenProgramPipelinesEXT(const Context *context,
3339*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
3340*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei n,
3341*8975f5c5SAndroid Build Coastguard Worker                                     const ProgramPipelineID *pipelinesPacked)
3342*8975f5c5SAndroid Build Coastguard Worker {
3343*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3344*8975f5c5SAndroid Build Coastguard Worker     {
3345*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3346*8975f5c5SAndroid Build Coastguard Worker         return false;
3347*8975f5c5SAndroid Build Coastguard Worker     }
3348*8975f5c5SAndroid Build Coastguard Worker 
3349*8975f5c5SAndroid Build Coastguard Worker     return ValidateGenProgramPipelinesBase(context, entryPoint, n, pipelinesPacked);
3350*8975f5c5SAndroid Build Coastguard Worker }
3351*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetProgramPipelineInfoLogEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked,GLsizei bufSize,const GLsizei * length,const GLchar * infoLog)3352*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetProgramPipelineInfoLogEXT(const Context *context,
3353*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3354*8975f5c5SAndroid Build Coastguard Worker                                           ProgramPipelineID pipelinePacked,
3355*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei bufSize,
3356*8975f5c5SAndroid Build Coastguard Worker                                           const GLsizei *length,
3357*8975f5c5SAndroid Build Coastguard Worker                                           const GLchar *infoLog)
3358*8975f5c5SAndroid Build Coastguard Worker {
3359*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3360*8975f5c5SAndroid Build Coastguard Worker     {
3361*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3362*8975f5c5SAndroid Build Coastguard Worker         return false;
3363*8975f5c5SAndroid Build Coastguard Worker     }
3364*8975f5c5SAndroid Build Coastguard Worker 
3365*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetProgramPipelineInfoLogBase(context, entryPoint, pipelinePacked, bufSize,
3366*8975f5c5SAndroid Build Coastguard Worker                                                  length, infoLog);
3367*8975f5c5SAndroid Build Coastguard Worker }
3368*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetProgramPipelineivEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked,GLenum pname,const GLint * params)3369*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetProgramPipelineivEXT(const Context *context,
3370*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
3371*8975f5c5SAndroid Build Coastguard Worker                                      ProgramPipelineID pipelinePacked,
3372*8975f5c5SAndroid Build Coastguard Worker                                      GLenum pname,
3373*8975f5c5SAndroid Build Coastguard Worker                                      const GLint *params)
3374*8975f5c5SAndroid Build Coastguard Worker {
3375*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3376*8975f5c5SAndroid Build Coastguard Worker     {
3377*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3378*8975f5c5SAndroid Build Coastguard Worker         return false;
3379*8975f5c5SAndroid Build Coastguard Worker     }
3380*8975f5c5SAndroid Build Coastguard Worker 
3381*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetProgramPipelineivBase(context, entryPoint, pipelinePacked, pname, params);
3382*8975f5c5SAndroid Build Coastguard Worker }
3383*8975f5c5SAndroid Build Coastguard Worker 
ValidateIsProgramPipelineEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked)3384*8975f5c5SAndroid Build Coastguard Worker bool ValidateIsProgramPipelineEXT(const Context *context,
3385*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3386*8975f5c5SAndroid Build Coastguard Worker                                   ProgramPipelineID pipelinePacked)
3387*8975f5c5SAndroid Build Coastguard Worker {
3388*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3389*8975f5c5SAndroid Build Coastguard Worker     {
3390*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3391*8975f5c5SAndroid Build Coastguard Worker         return false;
3392*8975f5c5SAndroid Build Coastguard Worker     }
3393*8975f5c5SAndroid Build Coastguard Worker 
3394*8975f5c5SAndroid Build Coastguard Worker     return ValidateIsProgramPipelineBase(context, entryPoint, pipelinePacked);
3395*8975f5c5SAndroid Build Coastguard Worker }
3396*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramParameteriEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,GLenum pname,GLint value)3397*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramParameteriEXT(const Context *context,
3398*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3399*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3400*8975f5c5SAndroid Build Coastguard Worker                                   GLenum pname,
3401*8975f5c5SAndroid Build Coastguard Worker                                   GLint value)
3402*8975f5c5SAndroid Build Coastguard Worker {
3403*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3404*8975f5c5SAndroid Build Coastguard Worker     {
3405*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3406*8975f5c5SAndroid Build Coastguard Worker         return false;
3407*8975f5c5SAndroid Build Coastguard Worker     }
3408*8975f5c5SAndroid Build Coastguard Worker 
3409*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramParameteriBase(context, entryPoint, programPacked, pname, value);
3410*8975f5c5SAndroid Build Coastguard Worker }
3411*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1fEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLfloat v0)3412*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1fEXT(const Context *context,
3413*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3414*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3415*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3416*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v0)
3417*8975f5c5SAndroid Build Coastguard Worker {
3418*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3419*8975f5c5SAndroid Build Coastguard Worker     {
3420*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3421*8975f5c5SAndroid Build Coastguard Worker         return false;
3422*8975f5c5SAndroid Build Coastguard Worker     }
3423*8975f5c5SAndroid Build Coastguard Worker 
3424*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1fBase(context, entryPoint, programPacked, locationPacked, v0);
3425*8975f5c5SAndroid Build Coastguard Worker }
3426*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLfloat * value)3427*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1fvEXT(const Context *context,
3428*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3429*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3430*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3431*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3432*8975f5c5SAndroid Build Coastguard Worker                                   const GLfloat *value)
3433*8975f5c5SAndroid Build Coastguard Worker {
3434*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3435*8975f5c5SAndroid Build Coastguard Worker     {
3436*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3437*8975f5c5SAndroid Build Coastguard Worker         return false;
3438*8975f5c5SAndroid Build Coastguard Worker     }
3439*8975f5c5SAndroid Build Coastguard Worker 
3440*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1fvBase(context, entryPoint, programPacked, locationPacked, count,
3441*8975f5c5SAndroid Build Coastguard Worker                                          value);
3442*8975f5c5SAndroid Build Coastguard Worker }
3443*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1iEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLint v0)3444*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1iEXT(const Context *context,
3445*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3446*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3447*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3448*8975f5c5SAndroid Build Coastguard Worker                                  GLint v0)
3449*8975f5c5SAndroid Build Coastguard Worker {
3450*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3451*8975f5c5SAndroid Build Coastguard Worker     {
3452*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3453*8975f5c5SAndroid Build Coastguard Worker         return false;
3454*8975f5c5SAndroid Build Coastguard Worker     }
3455*8975f5c5SAndroid Build Coastguard Worker 
3456*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1iBase(context, entryPoint, programPacked, locationPacked, v0);
3457*8975f5c5SAndroid Build Coastguard Worker }
3458*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1ivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLint * value)3459*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1ivEXT(const Context *context,
3460*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3461*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3462*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3463*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3464*8975f5c5SAndroid Build Coastguard Worker                                   const GLint *value)
3465*8975f5c5SAndroid Build Coastguard Worker {
3466*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3467*8975f5c5SAndroid Build Coastguard Worker     {
3468*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3469*8975f5c5SAndroid Build Coastguard Worker         return false;
3470*8975f5c5SAndroid Build Coastguard Worker     }
3471*8975f5c5SAndroid Build Coastguard Worker 
3472*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1ivBase(context, entryPoint, programPacked, locationPacked, count,
3473*8975f5c5SAndroid Build Coastguard Worker                                          value);
3474*8975f5c5SAndroid Build Coastguard Worker }
3475*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1uiEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLuint v0)3476*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1uiEXT(const Context *context,
3477*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3478*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3479*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3480*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v0)
3481*8975f5c5SAndroid Build Coastguard Worker {
3482*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3483*8975f5c5SAndroid Build Coastguard Worker     {
3484*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3485*8975f5c5SAndroid Build Coastguard Worker         return false;
3486*8975f5c5SAndroid Build Coastguard Worker     }
3487*8975f5c5SAndroid Build Coastguard Worker 
3488*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1uiBase(context, entryPoint, programPacked, locationPacked, v0);
3489*8975f5c5SAndroid Build Coastguard Worker }
3490*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform1uivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLuint * value)3491*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform1uivEXT(const Context *context,
3492*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
3493*8975f5c5SAndroid Build Coastguard Worker                                    ShaderProgramID programPacked,
3494*8975f5c5SAndroid Build Coastguard Worker                                    UniformLocation locationPacked,
3495*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei count,
3496*8975f5c5SAndroid Build Coastguard Worker                                    const GLuint *value)
3497*8975f5c5SAndroid Build Coastguard Worker {
3498*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3499*8975f5c5SAndroid Build Coastguard Worker     {
3500*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3501*8975f5c5SAndroid Build Coastguard Worker         return false;
3502*8975f5c5SAndroid Build Coastguard Worker     }
3503*8975f5c5SAndroid Build Coastguard Worker 
3504*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform1uivBase(context, entryPoint, programPacked, locationPacked, count,
3505*8975f5c5SAndroid Build Coastguard Worker                                           value);
3506*8975f5c5SAndroid Build Coastguard Worker }
3507*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2fEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLfloat v0,GLfloat v1)3508*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2fEXT(const Context *context,
3509*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3510*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3511*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3512*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v0,
3513*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v1)
3514*8975f5c5SAndroid Build Coastguard Worker {
3515*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3516*8975f5c5SAndroid Build Coastguard Worker     {
3517*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3518*8975f5c5SAndroid Build Coastguard Worker         return false;
3519*8975f5c5SAndroid Build Coastguard Worker     }
3520*8975f5c5SAndroid Build Coastguard Worker 
3521*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2fBase(context, entryPoint, programPacked, locationPacked, v0, v1);
3522*8975f5c5SAndroid Build Coastguard Worker }
3523*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLfloat * value)3524*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2fvEXT(const Context *context,
3525*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3526*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3527*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3528*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3529*8975f5c5SAndroid Build Coastguard Worker                                   const GLfloat *value)
3530*8975f5c5SAndroid Build Coastguard Worker {
3531*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3532*8975f5c5SAndroid Build Coastguard Worker     {
3533*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3534*8975f5c5SAndroid Build Coastguard Worker         return false;
3535*8975f5c5SAndroid Build Coastguard Worker     }
3536*8975f5c5SAndroid Build Coastguard Worker 
3537*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2fvBase(context, entryPoint, programPacked, locationPacked, count,
3538*8975f5c5SAndroid Build Coastguard Worker                                          value);
3539*8975f5c5SAndroid Build Coastguard Worker }
3540*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2iEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLint v0,GLint v1)3541*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2iEXT(const Context *context,
3542*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3543*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3544*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3545*8975f5c5SAndroid Build Coastguard Worker                                  GLint v0,
3546*8975f5c5SAndroid Build Coastguard Worker                                  GLint v1)
3547*8975f5c5SAndroid Build Coastguard Worker {
3548*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3549*8975f5c5SAndroid Build Coastguard Worker     {
3550*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3551*8975f5c5SAndroid Build Coastguard Worker         return false;
3552*8975f5c5SAndroid Build Coastguard Worker     }
3553*8975f5c5SAndroid Build Coastguard Worker 
3554*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2iBase(context, entryPoint, programPacked, locationPacked, v0, v1);
3555*8975f5c5SAndroid Build Coastguard Worker }
3556*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2ivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLint * value)3557*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2ivEXT(const Context *context,
3558*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3559*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3560*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3561*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3562*8975f5c5SAndroid Build Coastguard Worker                                   const GLint *value)
3563*8975f5c5SAndroid Build Coastguard Worker {
3564*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3565*8975f5c5SAndroid Build Coastguard Worker     {
3566*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3567*8975f5c5SAndroid Build Coastguard Worker         return false;
3568*8975f5c5SAndroid Build Coastguard Worker     }
3569*8975f5c5SAndroid Build Coastguard Worker 
3570*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2ivBase(context, entryPoint, programPacked, locationPacked, count,
3571*8975f5c5SAndroid Build Coastguard Worker                                          value);
3572*8975f5c5SAndroid Build Coastguard Worker }
3573*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2uiEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLuint v0,GLuint v1)3574*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2uiEXT(const Context *context,
3575*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3576*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3577*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3578*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v0,
3579*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v1)
3580*8975f5c5SAndroid Build Coastguard Worker {
3581*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3582*8975f5c5SAndroid Build Coastguard Worker     {
3583*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3584*8975f5c5SAndroid Build Coastguard Worker         return false;
3585*8975f5c5SAndroid Build Coastguard Worker     }
3586*8975f5c5SAndroid Build Coastguard Worker 
3587*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2uiBase(context, entryPoint, programPacked, locationPacked, v0,
3588*8975f5c5SAndroid Build Coastguard Worker                                          v1);
3589*8975f5c5SAndroid Build Coastguard Worker }
3590*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform2uivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLuint * value)3591*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform2uivEXT(const Context *context,
3592*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
3593*8975f5c5SAndroid Build Coastguard Worker                                    ShaderProgramID programPacked,
3594*8975f5c5SAndroid Build Coastguard Worker                                    UniformLocation locationPacked,
3595*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei count,
3596*8975f5c5SAndroid Build Coastguard Worker                                    const GLuint *value)
3597*8975f5c5SAndroid Build Coastguard Worker {
3598*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3599*8975f5c5SAndroid Build Coastguard Worker     {
3600*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3601*8975f5c5SAndroid Build Coastguard Worker         return false;
3602*8975f5c5SAndroid Build Coastguard Worker     }
3603*8975f5c5SAndroid Build Coastguard Worker 
3604*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform2uivBase(context, entryPoint, programPacked, locationPacked, count,
3605*8975f5c5SAndroid Build Coastguard Worker                                           value);
3606*8975f5c5SAndroid Build Coastguard Worker }
3607*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3fEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLfloat v0,GLfloat v1,GLfloat v2)3608*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3fEXT(const Context *context,
3609*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3610*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3611*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3612*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v0,
3613*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v1,
3614*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v2)
3615*8975f5c5SAndroid Build Coastguard Worker {
3616*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3617*8975f5c5SAndroid Build Coastguard Worker     {
3618*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3619*8975f5c5SAndroid Build Coastguard Worker         return false;
3620*8975f5c5SAndroid Build Coastguard Worker     }
3621*8975f5c5SAndroid Build Coastguard Worker 
3622*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3fBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3623*8975f5c5SAndroid Build Coastguard Worker                                         v2);
3624*8975f5c5SAndroid Build Coastguard Worker }
3625*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLfloat * value)3626*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3fvEXT(const Context *context,
3627*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3628*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3629*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3630*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3631*8975f5c5SAndroid Build Coastguard Worker                                   const GLfloat *value)
3632*8975f5c5SAndroid Build Coastguard Worker {
3633*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3634*8975f5c5SAndroid Build Coastguard Worker     {
3635*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3636*8975f5c5SAndroid Build Coastguard Worker         return false;
3637*8975f5c5SAndroid Build Coastguard Worker     }
3638*8975f5c5SAndroid Build Coastguard Worker 
3639*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3fvBase(context, entryPoint, programPacked, locationPacked, count,
3640*8975f5c5SAndroid Build Coastguard Worker                                          value);
3641*8975f5c5SAndroid Build Coastguard Worker }
3642*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3iEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLint v0,GLint v1,GLint v2)3643*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3iEXT(const Context *context,
3644*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3645*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3646*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3647*8975f5c5SAndroid Build Coastguard Worker                                  GLint v0,
3648*8975f5c5SAndroid Build Coastguard Worker                                  GLint v1,
3649*8975f5c5SAndroid Build Coastguard Worker                                  GLint v2)
3650*8975f5c5SAndroid Build Coastguard Worker {
3651*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3652*8975f5c5SAndroid Build Coastguard Worker     {
3653*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3654*8975f5c5SAndroid Build Coastguard Worker         return false;
3655*8975f5c5SAndroid Build Coastguard Worker     }
3656*8975f5c5SAndroid Build Coastguard Worker 
3657*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3iBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3658*8975f5c5SAndroid Build Coastguard Worker                                         v2);
3659*8975f5c5SAndroid Build Coastguard Worker }
3660*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3ivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLint * value)3661*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3ivEXT(const Context *context,
3662*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3663*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3664*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3665*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3666*8975f5c5SAndroid Build Coastguard Worker                                   const GLint *value)
3667*8975f5c5SAndroid Build Coastguard Worker {
3668*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3669*8975f5c5SAndroid Build Coastguard Worker     {
3670*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3671*8975f5c5SAndroid Build Coastguard Worker         return false;
3672*8975f5c5SAndroid Build Coastguard Worker     }
3673*8975f5c5SAndroid Build Coastguard Worker 
3674*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3ivBase(context, entryPoint, programPacked, locationPacked, count,
3675*8975f5c5SAndroid Build Coastguard Worker                                          value);
3676*8975f5c5SAndroid Build Coastguard Worker }
3677*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3uiEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLuint v0,GLuint v1,GLuint v2)3678*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3uiEXT(const Context *context,
3679*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3680*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3681*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3682*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v0,
3683*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v1,
3684*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v2)
3685*8975f5c5SAndroid Build Coastguard Worker {
3686*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3687*8975f5c5SAndroid Build Coastguard Worker     {
3688*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3689*8975f5c5SAndroid Build Coastguard Worker         return false;
3690*8975f5c5SAndroid Build Coastguard Worker     }
3691*8975f5c5SAndroid Build Coastguard Worker 
3692*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3uiBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3693*8975f5c5SAndroid Build Coastguard Worker                                          v2);
3694*8975f5c5SAndroid Build Coastguard Worker }
3695*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform3uivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLuint * value)3696*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform3uivEXT(const Context *context,
3697*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
3698*8975f5c5SAndroid Build Coastguard Worker                                    ShaderProgramID programPacked,
3699*8975f5c5SAndroid Build Coastguard Worker                                    UniformLocation locationPacked,
3700*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei count,
3701*8975f5c5SAndroid Build Coastguard Worker                                    const GLuint *value)
3702*8975f5c5SAndroid Build Coastguard Worker {
3703*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3704*8975f5c5SAndroid Build Coastguard Worker     {
3705*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3706*8975f5c5SAndroid Build Coastguard Worker         return false;
3707*8975f5c5SAndroid Build Coastguard Worker     }
3708*8975f5c5SAndroid Build Coastguard Worker 
3709*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform3uivBase(context, entryPoint, programPacked, locationPacked, count,
3710*8975f5c5SAndroid Build Coastguard Worker                                           value);
3711*8975f5c5SAndroid Build Coastguard Worker }
3712*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4fEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLfloat v0,GLfloat v1,GLfloat v2,GLfloat v3)3713*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4fEXT(const Context *context,
3714*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3715*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3716*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3717*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v0,
3718*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v1,
3719*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v2,
3720*8975f5c5SAndroid Build Coastguard Worker                                  GLfloat v3)
3721*8975f5c5SAndroid Build Coastguard Worker {
3722*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3723*8975f5c5SAndroid Build Coastguard Worker     {
3724*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3725*8975f5c5SAndroid Build Coastguard Worker         return false;
3726*8975f5c5SAndroid Build Coastguard Worker     }
3727*8975f5c5SAndroid Build Coastguard Worker 
3728*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4fBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3729*8975f5c5SAndroid Build Coastguard Worker                                         v2, v3);
3730*8975f5c5SAndroid Build Coastguard Worker }
3731*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLfloat * value)3732*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4fvEXT(const Context *context,
3733*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3734*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3735*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3736*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3737*8975f5c5SAndroid Build Coastguard Worker                                   const GLfloat *value)
3738*8975f5c5SAndroid Build Coastguard Worker {
3739*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3740*8975f5c5SAndroid Build Coastguard Worker     {
3741*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3742*8975f5c5SAndroid Build Coastguard Worker         return false;
3743*8975f5c5SAndroid Build Coastguard Worker     }
3744*8975f5c5SAndroid Build Coastguard Worker 
3745*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4fvBase(context, entryPoint, programPacked, locationPacked, count,
3746*8975f5c5SAndroid Build Coastguard Worker                                          value);
3747*8975f5c5SAndroid Build Coastguard Worker }
3748*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4iEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLint v0,GLint v1,GLint v2,GLint v3)3749*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4iEXT(const Context *context,
3750*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3751*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked,
3752*8975f5c5SAndroid Build Coastguard Worker                                  UniformLocation locationPacked,
3753*8975f5c5SAndroid Build Coastguard Worker                                  GLint v0,
3754*8975f5c5SAndroid Build Coastguard Worker                                  GLint v1,
3755*8975f5c5SAndroid Build Coastguard Worker                                  GLint v2,
3756*8975f5c5SAndroid Build Coastguard Worker                                  GLint v3)
3757*8975f5c5SAndroid Build Coastguard Worker {
3758*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3759*8975f5c5SAndroid Build Coastguard Worker     {
3760*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3761*8975f5c5SAndroid Build Coastguard Worker         return false;
3762*8975f5c5SAndroid Build Coastguard Worker     }
3763*8975f5c5SAndroid Build Coastguard Worker 
3764*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4iBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3765*8975f5c5SAndroid Build Coastguard Worker                                         v2, v3);
3766*8975f5c5SAndroid Build Coastguard Worker }
3767*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4ivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLint * value)3768*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4ivEXT(const Context *context,
3769*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3770*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3771*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3772*8975f5c5SAndroid Build Coastguard Worker                                   GLsizei count,
3773*8975f5c5SAndroid Build Coastguard Worker                                   const GLint *value)
3774*8975f5c5SAndroid Build Coastguard Worker {
3775*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4ivBase(context, entryPoint, programPacked, locationPacked, count,
3776*8975f5c5SAndroid Build Coastguard Worker                                          value);
3777*8975f5c5SAndroid Build Coastguard Worker }
3778*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4uiEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLuint v0,GLuint v1,GLuint v2,GLuint v3)3779*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4uiEXT(const Context *context,
3780*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
3781*8975f5c5SAndroid Build Coastguard Worker                                   ShaderProgramID programPacked,
3782*8975f5c5SAndroid Build Coastguard Worker                                   UniformLocation locationPacked,
3783*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v0,
3784*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v1,
3785*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v2,
3786*8975f5c5SAndroid Build Coastguard Worker                                   GLuint v3)
3787*8975f5c5SAndroid Build Coastguard Worker {
3788*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3789*8975f5c5SAndroid Build Coastguard Worker     {
3790*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3791*8975f5c5SAndroid Build Coastguard Worker         return false;
3792*8975f5c5SAndroid Build Coastguard Worker     }
3793*8975f5c5SAndroid Build Coastguard Worker 
3794*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4uiBase(context, entryPoint, programPacked, locationPacked, v0, v1,
3795*8975f5c5SAndroid Build Coastguard Worker                                          v2, v3);
3796*8975f5c5SAndroid Build Coastguard Worker }
3797*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniform4uivEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,const GLuint * value)3798*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniform4uivEXT(const Context *context,
3799*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
3800*8975f5c5SAndroid Build Coastguard Worker                                    ShaderProgramID programPacked,
3801*8975f5c5SAndroid Build Coastguard Worker                                    UniformLocation locationPacked,
3802*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei count,
3803*8975f5c5SAndroid Build Coastguard Worker                                    const GLuint *value)
3804*8975f5c5SAndroid Build Coastguard Worker {
3805*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniform4uivBase(context, entryPoint, programPacked, locationPacked, count,
3806*8975f5c5SAndroid Build Coastguard Worker                                           value);
3807*8975f5c5SAndroid Build Coastguard Worker }
3808*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix2fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3809*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix2fvEXT(const Context *context,
3810*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
3811*8975f5c5SAndroid Build Coastguard Worker                                         ShaderProgramID programPacked,
3812*8975f5c5SAndroid Build Coastguard Worker                                         UniformLocation locationPacked,
3813*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
3814*8975f5c5SAndroid Build Coastguard Worker                                         GLboolean transpose,
3815*8975f5c5SAndroid Build Coastguard Worker                                         const GLfloat *value)
3816*8975f5c5SAndroid Build Coastguard Worker {
3817*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3818*8975f5c5SAndroid Build Coastguard Worker     {
3819*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3820*8975f5c5SAndroid Build Coastguard Worker         return false;
3821*8975f5c5SAndroid Build Coastguard Worker     }
3822*8975f5c5SAndroid Build Coastguard Worker 
3823*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix2fvBase(context, entryPoint, programPacked, locationPacked,
3824*8975f5c5SAndroid Build Coastguard Worker                                                count, transpose, value);
3825*8975f5c5SAndroid Build Coastguard Worker }
3826*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix2x3fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3827*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix2x3fvEXT(const Context *context,
3828*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3829*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3830*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3831*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3832*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3833*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3834*8975f5c5SAndroid Build Coastguard Worker {
3835*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3836*8975f5c5SAndroid Build Coastguard Worker     {
3837*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3838*8975f5c5SAndroid Build Coastguard Worker         return false;
3839*8975f5c5SAndroid Build Coastguard Worker     }
3840*8975f5c5SAndroid Build Coastguard Worker 
3841*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix2x3fvBase(context, entryPoint, programPacked, locationPacked,
3842*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3843*8975f5c5SAndroid Build Coastguard Worker }
3844*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix2x4fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3845*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix2x4fvEXT(const Context *context,
3846*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3847*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3848*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3849*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3850*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3851*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3852*8975f5c5SAndroid Build Coastguard Worker {
3853*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3854*8975f5c5SAndroid Build Coastguard Worker     {
3855*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3856*8975f5c5SAndroid Build Coastguard Worker         return false;
3857*8975f5c5SAndroid Build Coastguard Worker     }
3858*8975f5c5SAndroid Build Coastguard Worker 
3859*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix2x4fvBase(context, entryPoint, programPacked, locationPacked,
3860*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3861*8975f5c5SAndroid Build Coastguard Worker }
3862*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix3fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3863*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix3fvEXT(const Context *context,
3864*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
3865*8975f5c5SAndroid Build Coastguard Worker                                         ShaderProgramID programPacked,
3866*8975f5c5SAndroid Build Coastguard Worker                                         UniformLocation locationPacked,
3867*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
3868*8975f5c5SAndroid Build Coastguard Worker                                         GLboolean transpose,
3869*8975f5c5SAndroid Build Coastguard Worker                                         const GLfloat *value)
3870*8975f5c5SAndroid Build Coastguard Worker {
3871*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3872*8975f5c5SAndroid Build Coastguard Worker     {
3873*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3874*8975f5c5SAndroid Build Coastguard Worker         return false;
3875*8975f5c5SAndroid Build Coastguard Worker     }
3876*8975f5c5SAndroid Build Coastguard Worker 
3877*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix3fvBase(context, entryPoint, programPacked, locationPacked,
3878*8975f5c5SAndroid Build Coastguard Worker                                                count, transpose, value);
3879*8975f5c5SAndroid Build Coastguard Worker }
3880*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix3x2fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3881*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix3x2fvEXT(const Context *context,
3882*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3883*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3884*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3885*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3886*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3887*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3888*8975f5c5SAndroid Build Coastguard Worker {
3889*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3890*8975f5c5SAndroid Build Coastguard Worker     {
3891*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3892*8975f5c5SAndroid Build Coastguard Worker         return false;
3893*8975f5c5SAndroid Build Coastguard Worker     }
3894*8975f5c5SAndroid Build Coastguard Worker 
3895*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix3x2fvBase(context, entryPoint, programPacked, locationPacked,
3896*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3897*8975f5c5SAndroid Build Coastguard Worker }
3898*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix3x4fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3899*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix3x4fvEXT(const Context *context,
3900*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3901*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3902*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3903*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3904*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3905*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3906*8975f5c5SAndroid Build Coastguard Worker {
3907*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3908*8975f5c5SAndroid Build Coastguard Worker     {
3909*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3910*8975f5c5SAndroid Build Coastguard Worker         return false;
3911*8975f5c5SAndroid Build Coastguard Worker     }
3912*8975f5c5SAndroid Build Coastguard Worker 
3913*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix3x4fvBase(context, entryPoint, programPacked, locationPacked,
3914*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3915*8975f5c5SAndroid Build Coastguard Worker }
3916*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix4fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3917*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix4fvEXT(const Context *context,
3918*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
3919*8975f5c5SAndroid Build Coastguard Worker                                         ShaderProgramID programPacked,
3920*8975f5c5SAndroid Build Coastguard Worker                                         UniformLocation locationPacked,
3921*8975f5c5SAndroid Build Coastguard Worker                                         GLsizei count,
3922*8975f5c5SAndroid Build Coastguard Worker                                         GLboolean transpose,
3923*8975f5c5SAndroid Build Coastguard Worker                                         const GLfloat *value)
3924*8975f5c5SAndroid Build Coastguard Worker {
3925*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3926*8975f5c5SAndroid Build Coastguard Worker     {
3927*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3928*8975f5c5SAndroid Build Coastguard Worker         return false;
3929*8975f5c5SAndroid Build Coastguard Worker     }
3930*8975f5c5SAndroid Build Coastguard Worker 
3931*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix4fvBase(context, entryPoint, programPacked, locationPacked,
3932*8975f5c5SAndroid Build Coastguard Worker                                                count, transpose, value);
3933*8975f5c5SAndroid Build Coastguard Worker }
3934*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix4x2fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3935*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix4x2fvEXT(const Context *context,
3936*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3937*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3938*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3939*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3940*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3941*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3942*8975f5c5SAndroid Build Coastguard Worker {
3943*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3944*8975f5c5SAndroid Build Coastguard Worker     {
3945*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3946*8975f5c5SAndroid Build Coastguard Worker         return false;
3947*8975f5c5SAndroid Build Coastguard Worker     }
3948*8975f5c5SAndroid Build Coastguard Worker 
3949*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix4x2fvBase(context, entryPoint, programPacked, locationPacked,
3950*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3951*8975f5c5SAndroid Build Coastguard Worker }
3952*8975f5c5SAndroid Build Coastguard Worker 
ValidateProgramUniformMatrix4x3fvEXT(const Context * context,angle::EntryPoint entryPoint,ShaderProgramID programPacked,UniformLocation locationPacked,GLsizei count,GLboolean transpose,const GLfloat * value)3953*8975f5c5SAndroid Build Coastguard Worker bool ValidateProgramUniformMatrix4x3fvEXT(const Context *context,
3954*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
3955*8975f5c5SAndroid Build Coastguard Worker                                           ShaderProgramID programPacked,
3956*8975f5c5SAndroid Build Coastguard Worker                                           UniformLocation locationPacked,
3957*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei count,
3958*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean transpose,
3959*8975f5c5SAndroid Build Coastguard Worker                                           const GLfloat *value)
3960*8975f5c5SAndroid Build Coastguard Worker {
3961*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3962*8975f5c5SAndroid Build Coastguard Worker     {
3963*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3964*8975f5c5SAndroid Build Coastguard Worker         return false;
3965*8975f5c5SAndroid Build Coastguard Worker     }
3966*8975f5c5SAndroid Build Coastguard Worker 
3967*8975f5c5SAndroid Build Coastguard Worker     return ValidateProgramUniformMatrix4x3fvBase(context, entryPoint, programPacked, locationPacked,
3968*8975f5c5SAndroid Build Coastguard Worker                                                  count, transpose, value);
3969*8975f5c5SAndroid Build Coastguard Worker }
3970*8975f5c5SAndroid Build Coastguard Worker 
ValidateUseProgramStagesEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked,GLbitfield stages,ShaderProgramID programPacked)3971*8975f5c5SAndroid Build Coastguard Worker bool ValidateUseProgramStagesEXT(const Context *context,
3972*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
3973*8975f5c5SAndroid Build Coastguard Worker                                  ProgramPipelineID pipelinePacked,
3974*8975f5c5SAndroid Build Coastguard Worker                                  GLbitfield stages,
3975*8975f5c5SAndroid Build Coastguard Worker                                  ShaderProgramID programPacked)
3976*8975f5c5SAndroid Build Coastguard Worker {
3977*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3978*8975f5c5SAndroid Build Coastguard Worker     {
3979*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3980*8975f5c5SAndroid Build Coastguard Worker         return false;
3981*8975f5c5SAndroid Build Coastguard Worker     }
3982*8975f5c5SAndroid Build Coastguard Worker 
3983*8975f5c5SAndroid Build Coastguard Worker     return ValidateUseProgramStagesBase(context, entryPoint, pipelinePacked, stages, programPacked);
3984*8975f5c5SAndroid Build Coastguard Worker }
3985*8975f5c5SAndroid Build Coastguard Worker 
ValidateValidateProgramPipelineEXT(const Context * context,angle::EntryPoint entryPoint,ProgramPipelineID pipelinePacked)3986*8975f5c5SAndroid Build Coastguard Worker bool ValidateValidateProgramPipelineEXT(const Context *context,
3987*8975f5c5SAndroid Build Coastguard Worker                                         angle::EntryPoint entryPoint,
3988*8975f5c5SAndroid Build Coastguard Worker                                         ProgramPipelineID pipelinePacked)
3989*8975f5c5SAndroid Build Coastguard Worker {
3990*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().separateShaderObjectsEXT)
3991*8975f5c5SAndroid Build Coastguard Worker     {
3992*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
3993*8975f5c5SAndroid Build Coastguard Worker         return false;
3994*8975f5c5SAndroid Build Coastguard Worker     }
3995*8975f5c5SAndroid Build Coastguard Worker 
3996*8975f5c5SAndroid Build Coastguard Worker     return ValidateValidateProgramPipelineBase(context, entryPoint, pipelinePacked);
3997*8975f5c5SAndroid Build Coastguard Worker }
3998*8975f5c5SAndroid Build Coastguard Worker 
3999*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_debug_label
ValidateGetObjectLabelEXT(const Context * context,angle::EntryPoint entryPoint,GLenum type,GLuint object,GLsizei bufSize,const GLsizei * length,const GLchar * label)4000*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetObjectLabelEXT(const Context *context,
4001*8975f5c5SAndroid Build Coastguard Worker                                angle::EntryPoint entryPoint,
4002*8975f5c5SAndroid Build Coastguard Worker                                GLenum type,
4003*8975f5c5SAndroid Build Coastguard Worker                                GLuint object,
4004*8975f5c5SAndroid Build Coastguard Worker                                GLsizei bufSize,
4005*8975f5c5SAndroid Build Coastguard Worker                                const GLsizei *length,
4006*8975f5c5SAndroid Build Coastguard Worker                                const GLchar *label)
4007*8975f5c5SAndroid Build Coastguard Worker {
4008*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().debugLabelEXT)
4009*8975f5c5SAndroid Build Coastguard Worker     {
4010*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4011*8975f5c5SAndroid Build Coastguard Worker         return false;
4012*8975f5c5SAndroid Build Coastguard Worker     }
4013*8975f5c5SAndroid Build Coastguard Worker 
4014*8975f5c5SAndroid Build Coastguard Worker     if (bufSize < 0)
4015*8975f5c5SAndroid Build Coastguard Worker     {
4016*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeBufferSize);
4017*8975f5c5SAndroid Build Coastguard Worker         return false;
4018*8975f5c5SAndroid Build Coastguard Worker     }
4019*8975f5c5SAndroid Build Coastguard Worker 
4020*8975f5c5SAndroid Build Coastguard Worker     return ValidateObjectIdentifierAndName(context, entryPoint, type, object);
4021*8975f5c5SAndroid Build Coastguard Worker }
4022*8975f5c5SAndroid Build Coastguard Worker 
ValidateLabelObjectEXT(const Context * context,angle::EntryPoint entryPoint,GLenum type,GLuint object,GLsizei length,const GLchar * label)4023*8975f5c5SAndroid Build Coastguard Worker bool ValidateLabelObjectEXT(const Context *context,
4024*8975f5c5SAndroid Build Coastguard Worker                             angle::EntryPoint entryPoint,
4025*8975f5c5SAndroid Build Coastguard Worker                             GLenum type,
4026*8975f5c5SAndroid Build Coastguard Worker                             GLuint object,
4027*8975f5c5SAndroid Build Coastguard Worker                             GLsizei length,
4028*8975f5c5SAndroid Build Coastguard Worker                             const GLchar *label)
4029*8975f5c5SAndroid Build Coastguard Worker {
4030*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().debugLabelEXT)
4031*8975f5c5SAndroid Build Coastguard Worker     {
4032*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4033*8975f5c5SAndroid Build Coastguard Worker         return false;
4034*8975f5c5SAndroid Build Coastguard Worker     }
4035*8975f5c5SAndroid Build Coastguard Worker 
4036*8975f5c5SAndroid Build Coastguard Worker     if (length < 0)
4037*8975f5c5SAndroid Build Coastguard Worker     {
4038*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kNegativeLength);
4039*8975f5c5SAndroid Build Coastguard Worker         return false;
4040*8975f5c5SAndroid Build Coastguard Worker     }
4041*8975f5c5SAndroid Build Coastguard Worker 
4042*8975f5c5SAndroid Build Coastguard Worker     return ValidateObjectIdentifierAndName(context, entryPoint, type, object);
4043*8975f5c5SAndroid Build Coastguard Worker }
4044*8975f5c5SAndroid Build Coastguard Worker 
ValidateEGLImageTargetTextureStorageEXT(const Context * context,angle::EntryPoint entryPoint,GLuint texture,egl::ImageID image,const GLint * attrib_list)4045*8975f5c5SAndroid Build Coastguard Worker bool ValidateEGLImageTargetTextureStorageEXT(const Context *context,
4046*8975f5c5SAndroid Build Coastguard Worker                                              angle::EntryPoint entryPoint,
4047*8975f5c5SAndroid Build Coastguard Worker                                              GLuint texture,
4048*8975f5c5SAndroid Build Coastguard Worker                                              egl::ImageID image,
4049*8975f5c5SAndroid Build Coastguard Worker                                              const GLint *attrib_list)
4050*8975f5c5SAndroid Build Coastguard Worker {
4051*8975f5c5SAndroid Build Coastguard Worker     UNREACHABLE();
4052*8975f5c5SAndroid Build Coastguard Worker     return false;
4053*8975f5c5SAndroid Build Coastguard Worker }
4054*8975f5c5SAndroid Build Coastguard Worker 
ValidateEGLImageTargetTexStorageEXT(const Context * context,angle::EntryPoint entryPoint,GLenum target,egl::ImageID image,const GLint * attrib_list)4055*8975f5c5SAndroid Build Coastguard Worker bool ValidateEGLImageTargetTexStorageEXT(const Context *context,
4056*8975f5c5SAndroid Build Coastguard Worker                                          angle::EntryPoint entryPoint,
4057*8975f5c5SAndroid Build Coastguard Worker                                          GLenum target,
4058*8975f5c5SAndroid Build Coastguard Worker                                          egl::ImageID image,
4059*8975f5c5SAndroid Build Coastguard Worker                                          const GLint *attrib_list)
4060*8975f5c5SAndroid Build Coastguard Worker {
4061*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().EGLImageStorageEXT)
4062*8975f5c5SAndroid Build Coastguard Worker     {
4063*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4064*8975f5c5SAndroid Build Coastguard Worker         return false;
4065*8975f5c5SAndroid Build Coastguard Worker     }
4066*8975f5c5SAndroid Build Coastguard Worker 
4067*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType targetType = FromGLenum<TextureType>(target);
4068*8975f5c5SAndroid Build Coastguard Worker     switch (targetType)
4069*8975f5c5SAndroid Build Coastguard Worker     {
4070*8975f5c5SAndroid Build Coastguard Worker         case TextureType::External:
4071*8975f5c5SAndroid Build Coastguard Worker             if (!context->getExtensions().EGLImageExternalOES)
4072*8975f5c5SAndroid Build Coastguard Worker             {
4073*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, ToGLenum(targetType));
4074*8975f5c5SAndroid Build Coastguard Worker             }
4075*8975f5c5SAndroid Build Coastguard Worker             break;
4076*8975f5c5SAndroid Build Coastguard Worker         case TextureType::CubeMapArray:
4077*8975f5c5SAndroid Build Coastguard Worker             if (!context->getExtensions().textureCubeMapArrayAny())
4078*8975f5c5SAndroid Build Coastguard Worker             {
4079*8975f5c5SAndroid Build Coastguard Worker                 ANGLE_VALIDATION_ERRORF(GL_INVALID_ENUM, kEnumNotSupported, ToGLenum(targetType));
4080*8975f5c5SAndroid Build Coastguard Worker             }
4081*8975f5c5SAndroid Build Coastguard Worker             break;
4082*8975f5c5SAndroid Build Coastguard Worker         case TextureType::_2D:
4083*8975f5c5SAndroid Build Coastguard Worker         case TextureType::_2DArray:
4084*8975f5c5SAndroid Build Coastguard Worker         case TextureType::_3D:
4085*8975f5c5SAndroid Build Coastguard Worker         case TextureType::CubeMap:
4086*8975f5c5SAndroid Build Coastguard Worker             break;
4087*8975f5c5SAndroid Build Coastguard Worker         default:
4088*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidTextureTarget);
4089*8975f5c5SAndroid Build Coastguard Worker             return false;
4090*8975f5c5SAndroid Build Coastguard Worker     }
4091*8975f5c5SAndroid Build Coastguard Worker 
4092*8975f5c5SAndroid Build Coastguard Worker     // Validate egl source image is valid
4093*8975f5c5SAndroid Build Coastguard Worker     egl::Image *imageObject = context->getDisplay()->getImage(image);
4094*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateEGLImageObject(context, entryPoint, targetType, image))
4095*8975f5c5SAndroid Build Coastguard Worker     {
4096*8975f5c5SAndroid Build Coastguard Worker         return false;
4097*8975f5c5SAndroid Build Coastguard Worker     }
4098*8975f5c5SAndroid Build Coastguard Worker 
4099*8975f5c5SAndroid Build Coastguard Worker     if (attrib_list != nullptr)
4100*8975f5c5SAndroid Build Coastguard Worker     {
4101*8975f5c5SAndroid Build Coastguard Worker         for (const GLint *attrib = attrib_list; attrib[0] != GL_NONE; attrib += 2)
4102*8975f5c5SAndroid Build Coastguard Worker         {
4103*8975f5c5SAndroid Build Coastguard Worker             switch (attrib[0])
4104*8975f5c5SAndroid Build Coastguard Worker             {
4105*8975f5c5SAndroid Build Coastguard Worker                 case GL_SURFACE_COMPRESSION_EXT:
4106*8975f5c5SAndroid Build Coastguard Worker                     switch (attrib[1])
4107*8975f5c5SAndroid Build Coastguard Worker                     {
4108*8975f5c5SAndroid Build Coastguard Worker                         case GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT:
4109*8975f5c5SAndroid Build Coastguard Worker                             if (imageObject->isFixedRatedCompression(context))
4110*8975f5c5SAndroid Build Coastguard Worker                             {
4111*8975f5c5SAndroid Build Coastguard Worker                                 ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kAttributeNotMatch);
4112*8975f5c5SAndroid Build Coastguard Worker                                 return false;
4113*8975f5c5SAndroid Build Coastguard Worker                             }
4114*8975f5c5SAndroid Build Coastguard Worker                             break;
4115*8975f5c5SAndroid Build Coastguard Worker                         case GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT:
4116*8975f5c5SAndroid Build Coastguard Worker                             break;
4117*8975f5c5SAndroid Build Coastguard Worker                         default:
4118*8975f5c5SAndroid Build Coastguard Worker                             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kAttributeNotValid);
4119*8975f5c5SAndroid Build Coastguard Worker                             return false;
4120*8975f5c5SAndroid Build Coastguard Worker                     }
4121*8975f5c5SAndroid Build Coastguard Worker                     break;
4122*8975f5c5SAndroid Build Coastguard Worker                 default:
4123*8975f5c5SAndroid Build Coastguard Worker                     ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kAttributeNotValid);
4124*8975f5c5SAndroid Build Coastguard Worker                     return false;
4125*8975f5c5SAndroid Build Coastguard Worker             }
4126*8975f5c5SAndroid Build Coastguard Worker         }
4127*8975f5c5SAndroid Build Coastguard Worker     }
4128*8975f5c5SAndroid Build Coastguard Worker 
4129*8975f5c5SAndroid Build Coastguard Worker     GLsizei levelCount    = imageObject->getLevelCount();
4130*8975f5c5SAndroid Build Coastguard Worker     Extents size          = imageObject->getExtents();
4131*8975f5c5SAndroid Build Coastguard Worker     GLsizei width         = static_cast<GLsizei>(size.width);
4132*8975f5c5SAndroid Build Coastguard Worker     GLsizei height        = static_cast<GLsizei>(size.height);
4133*8975f5c5SAndroid Build Coastguard Worker     GLsizei depth         = static_cast<GLsizei>(size.depth);
4134*8975f5c5SAndroid Build Coastguard Worker     GLenum internalformat = imageObject->getFormat().info->sizedInternalFormat;
4135*8975f5c5SAndroid Build Coastguard Worker 
4136*8975f5c5SAndroid Build Coastguard Worker     if (width < 1 || height < 1 || depth < 1 || levelCount < 1)
4137*8975f5c5SAndroid Build Coastguard Worker     {
4138*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kTextureSizeTooSmall);
4139*8975f5c5SAndroid Build Coastguard Worker         return false;
4140*8975f5c5SAndroid Build Coastguard Worker     }
4141*8975f5c5SAndroid Build Coastguard Worker 
4142*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateES3TexStorageParametersLevel(context, entryPoint, targetType, levelCount, width,
4143*8975f5c5SAndroid Build Coastguard Worker                                               height, depth))
4144*8975f5c5SAndroid Build Coastguard Worker     {
4145*8975f5c5SAndroid Build Coastguard Worker         // Error already generated.
4146*8975f5c5SAndroid Build Coastguard Worker         return false;
4147*8975f5c5SAndroid Build Coastguard Worker     }
4148*8975f5c5SAndroid Build Coastguard Worker 
4149*8975f5c5SAndroid Build Coastguard Worker     if (targetType == TextureType::External)
4150*8975f5c5SAndroid Build Coastguard Worker     {
4151*8975f5c5SAndroid Build Coastguard Worker         const Caps &caps = context->getCaps();
4152*8975f5c5SAndroid Build Coastguard Worker         if (width > caps.max2DTextureSize || height > caps.max2DTextureSize)
4153*8975f5c5SAndroid Build Coastguard Worker         {
4154*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kResourceMaxTextureSize);
4155*8975f5c5SAndroid Build Coastguard Worker             return false;
4156*8975f5c5SAndroid Build Coastguard Worker         }
4157*8975f5c5SAndroid Build Coastguard Worker     }
4158*8975f5c5SAndroid Build Coastguard Worker     else if (!ValidateES3TexStorageParametersExtent(context, entryPoint, targetType, levelCount,
4159*8975f5c5SAndroid Build Coastguard Worker                                                     width, height, depth))
4160*8975f5c5SAndroid Build Coastguard Worker     {
4161*8975f5c5SAndroid Build Coastguard Worker         // Error already generated.
4162*8975f5c5SAndroid Build Coastguard Worker         return false;
4163*8975f5c5SAndroid Build Coastguard Worker     }
4164*8975f5c5SAndroid Build Coastguard Worker 
4165*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateES3TexStorageParametersTexObject(context, entryPoint, targetType))
4166*8975f5c5SAndroid Build Coastguard Worker     {
4167*8975f5c5SAndroid Build Coastguard Worker         // Error already generated.
4168*8975f5c5SAndroid Build Coastguard Worker         return false;
4169*8975f5c5SAndroid Build Coastguard Worker     }
4170*8975f5c5SAndroid Build Coastguard Worker 
4171*8975f5c5SAndroid Build Coastguard Worker     if (!ValidateES3TexStorageParametersFormat(context, entryPoint, targetType, levelCount,
4172*8975f5c5SAndroid Build Coastguard Worker                                                internalformat, width, height, depth))
4173*8975f5c5SAndroid Build Coastguard Worker     {
4174*8975f5c5SAndroid Build Coastguard Worker         // Error already generated.
4175*8975f5c5SAndroid Build Coastguard Worker         return false;
4176*8975f5c5SAndroid Build Coastguard Worker     }
4177*8975f5c5SAndroid Build Coastguard Worker 
4178*8975f5c5SAndroid Build Coastguard Worker     return true;
4179*8975f5c5SAndroid Build Coastguard Worker }
4180*8975f5c5SAndroid Build Coastguard Worker 
ValidateAcquireTexturesANGLE(const Context * context,angle::EntryPoint entryPoint,GLuint numTextures,const TextureID * textures,const GLenum * layouts)4181*8975f5c5SAndroid Build Coastguard Worker bool ValidateAcquireTexturesANGLE(const Context *context,
4182*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
4183*8975f5c5SAndroid Build Coastguard Worker                                   GLuint numTextures,
4184*8975f5c5SAndroid Build Coastguard Worker                                   const TextureID *textures,
4185*8975f5c5SAndroid Build Coastguard Worker                                   const GLenum *layouts)
4186*8975f5c5SAndroid Build Coastguard Worker {
4187*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().vulkanImageANGLE)
4188*8975f5c5SAndroid Build Coastguard Worker     {
4189*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4190*8975f5c5SAndroid Build Coastguard Worker         return false;
4191*8975f5c5SAndroid Build Coastguard Worker     }
4192*8975f5c5SAndroid Build Coastguard Worker 
4193*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numTextures; ++i)
4194*8975f5c5SAndroid Build Coastguard Worker     {
4195*8975f5c5SAndroid Build Coastguard Worker         if (!context->getTexture(textures[i]))
4196*8975f5c5SAndroid Build Coastguard Worker         {
4197*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
4198*8975f5c5SAndroid Build Coastguard Worker             return false;
4199*8975f5c5SAndroid Build Coastguard Worker         }
4200*8975f5c5SAndroid Build Coastguard Worker         if (!IsValidImageLayout(FromGLenum<ImageLayout>(layouts[i])))
4201*8975f5c5SAndroid Build Coastguard Worker         {
4202*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidImageLayout);
4203*8975f5c5SAndroid Build Coastguard Worker             return false;
4204*8975f5c5SAndroid Build Coastguard Worker         }
4205*8975f5c5SAndroid Build Coastguard Worker     }
4206*8975f5c5SAndroid Build Coastguard Worker 
4207*8975f5c5SAndroid Build Coastguard Worker     return true;
4208*8975f5c5SAndroid Build Coastguard Worker }
4209*8975f5c5SAndroid Build Coastguard Worker 
ValidateReleaseTexturesANGLE(const Context * context,angle::EntryPoint entryPoint,GLuint numTextures,const TextureID * textures,const GLenum * layouts)4210*8975f5c5SAndroid Build Coastguard Worker bool ValidateReleaseTexturesANGLE(const Context *context,
4211*8975f5c5SAndroid Build Coastguard Worker                                   angle::EntryPoint entryPoint,
4212*8975f5c5SAndroid Build Coastguard Worker                                   GLuint numTextures,
4213*8975f5c5SAndroid Build Coastguard Worker                                   const TextureID *textures,
4214*8975f5c5SAndroid Build Coastguard Worker                                   const GLenum *layouts)
4215*8975f5c5SAndroid Build Coastguard Worker {
4216*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().vulkanImageANGLE)
4217*8975f5c5SAndroid Build Coastguard Worker     {
4218*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4219*8975f5c5SAndroid Build Coastguard Worker         return false;
4220*8975f5c5SAndroid Build Coastguard Worker     }
4221*8975f5c5SAndroid Build Coastguard Worker     for (GLuint i = 0; i < numTextures; ++i)
4222*8975f5c5SAndroid Build Coastguard Worker     {
4223*8975f5c5SAndroid Build Coastguard Worker         if (!context->getTexture(textures[i]))
4224*8975f5c5SAndroid Build Coastguard Worker         {
4225*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kInvalidTextureName);
4226*8975f5c5SAndroid Build Coastguard Worker             return false;
4227*8975f5c5SAndroid Build Coastguard Worker         }
4228*8975f5c5SAndroid Build Coastguard Worker     }
4229*8975f5c5SAndroid Build Coastguard Worker 
4230*8975f5c5SAndroid Build Coastguard Worker     return true;
4231*8975f5c5SAndroid Build Coastguard Worker }
4232*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferParameteriMESA(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum pname,GLint param)4233*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferParameteriMESA(const Context *context,
4234*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
4235*8975f5c5SAndroid Build Coastguard Worker                                        GLenum target,
4236*8975f5c5SAndroid Build Coastguard Worker                                        GLenum pname,
4237*8975f5c5SAndroid Build Coastguard Worker                                        GLint param)
4238*8975f5c5SAndroid Build Coastguard Worker {
4239*8975f5c5SAndroid Build Coastguard Worker     if (pname != GL_FRAMEBUFFER_FLIP_Y_MESA)
4240*8975f5c5SAndroid Build Coastguard Worker     {
4241*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
4242*8975f5c5SAndroid Build Coastguard Worker         return false;
4243*8975f5c5SAndroid Build Coastguard Worker     }
4244*8975f5c5SAndroid Build Coastguard Worker     return ValidateFramebufferParameteriBase(context, entryPoint, target, pname, param);
4245*8975f5c5SAndroid Build Coastguard Worker }
4246*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetFramebufferParameterivMESA(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLenum pname,const GLint * params)4247*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetFramebufferParameterivMESA(const Context *context,
4248*8975f5c5SAndroid Build Coastguard Worker                                            angle::EntryPoint entryPoint,
4249*8975f5c5SAndroid Build Coastguard Worker                                            GLenum target,
4250*8975f5c5SAndroid Build Coastguard Worker                                            GLenum pname,
4251*8975f5c5SAndroid Build Coastguard Worker                                            const GLint *params)
4252*8975f5c5SAndroid Build Coastguard Worker {
4253*8975f5c5SAndroid Build Coastguard Worker     if (pname != GL_FRAMEBUFFER_FLIP_Y_MESA)
4254*8975f5c5SAndroid Build Coastguard Worker     {
4255*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
4256*8975f5c5SAndroid Build Coastguard Worker         return false;
4257*8975f5c5SAndroid Build Coastguard Worker     }
4258*8975f5c5SAndroid Build Coastguard Worker     return ValidateGetFramebufferParameterivBase(context, entryPoint, target, pname, params);
4259*8975f5c5SAndroid Build Coastguard Worker }
4260*8975f5c5SAndroid Build Coastguard Worker 
4261*8975f5c5SAndroid Build Coastguard Worker // GL_AMD_performance_monitor
ValidateBeginPerfMonitorAMD(const Context * context,angle::EntryPoint entryPoint,GLuint monitor)4262*8975f5c5SAndroid Build Coastguard Worker bool ValidateBeginPerfMonitorAMD(const Context *context,
4263*8975f5c5SAndroid Build Coastguard Worker                                  angle::EntryPoint entryPoint,
4264*8975f5c5SAndroid Build Coastguard Worker                                  GLuint monitor)
4265*8975f5c5SAndroid Build Coastguard Worker {
4266*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4267*8975f5c5SAndroid Build Coastguard Worker     {
4268*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4269*8975f5c5SAndroid Build Coastguard Worker         return false;
4270*8975f5c5SAndroid Build Coastguard Worker     }
4271*8975f5c5SAndroid Build Coastguard Worker 
4272*8975f5c5SAndroid Build Coastguard Worker     return true;
4273*8975f5c5SAndroid Build Coastguard Worker }
4274*8975f5c5SAndroid Build Coastguard Worker 
ValidateDeletePerfMonitorsAMD(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const GLuint * monitors)4275*8975f5c5SAndroid Build Coastguard Worker bool ValidateDeletePerfMonitorsAMD(const Context *context,
4276*8975f5c5SAndroid Build Coastguard Worker                                    angle::EntryPoint entryPoint,
4277*8975f5c5SAndroid Build Coastguard Worker                                    GLsizei n,
4278*8975f5c5SAndroid Build Coastguard Worker                                    const GLuint *monitors)
4279*8975f5c5SAndroid Build Coastguard Worker {
4280*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4281*8975f5c5SAndroid Build Coastguard Worker     {
4282*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4283*8975f5c5SAndroid Build Coastguard Worker         return false;
4284*8975f5c5SAndroid Build Coastguard Worker     }
4285*8975f5c5SAndroid Build Coastguard Worker 
4286*8975f5c5SAndroid Build Coastguard Worker     // Note: ANGLE does not really create monitor objects or track ids.
4287*8975f5c5SAndroid Build Coastguard Worker     return true;
4288*8975f5c5SAndroid Build Coastguard Worker }
4289*8975f5c5SAndroid Build Coastguard Worker 
ValidateEndPerfMonitorAMD(const Context * context,angle::EntryPoint entryPoint,GLuint monitor)4290*8975f5c5SAndroid Build Coastguard Worker bool ValidateEndPerfMonitorAMD(const Context *context, angle::EntryPoint entryPoint, GLuint monitor)
4291*8975f5c5SAndroid Build Coastguard Worker {
4292*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4293*8975f5c5SAndroid Build Coastguard Worker     {
4294*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4295*8975f5c5SAndroid Build Coastguard Worker         return false;
4296*8975f5c5SAndroid Build Coastguard Worker     }
4297*8975f5c5SAndroid Build Coastguard Worker 
4298*8975f5c5SAndroid Build Coastguard Worker     if (!context->getState().isPerfMonitorActive())
4299*8975f5c5SAndroid Build Coastguard Worker     {
4300*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kPerfMonitorNotActive);
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 
ValidateGenPerfMonitorsAMD(const Context * context,angle::EntryPoint entryPoint,GLsizei n,const GLuint * monitors)4307*8975f5c5SAndroid Build Coastguard Worker bool ValidateGenPerfMonitorsAMD(const Context *context,
4308*8975f5c5SAndroid Build Coastguard Worker                                 angle::EntryPoint entryPoint,
4309*8975f5c5SAndroid Build Coastguard Worker                                 GLsizei n,
4310*8975f5c5SAndroid Build Coastguard Worker                                 const GLuint *monitors)
4311*8975f5c5SAndroid Build Coastguard Worker {
4312*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4313*8975f5c5SAndroid Build Coastguard Worker     {
4314*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4315*8975f5c5SAndroid Build Coastguard Worker         return false;
4316*8975f5c5SAndroid Build Coastguard Worker     }
4317*8975f5c5SAndroid Build Coastguard Worker 
4318*8975f5c5SAndroid Build Coastguard Worker     return true;
4319*8975f5c5SAndroid Build Coastguard Worker }
4320*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorCounterDataAMD(const Context * context,angle::EntryPoint entryPoint,GLuint monitor,GLenum pname,GLsizei dataSize,const GLuint * data,const GLint * bytesWritten)4321*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorCounterDataAMD(const Context *context,
4322*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
4323*8975f5c5SAndroid Build Coastguard Worker                                           GLuint monitor,
4324*8975f5c5SAndroid Build Coastguard Worker                                           GLenum pname,
4325*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei dataSize,
4326*8975f5c5SAndroid Build Coastguard Worker                                           const GLuint *data,
4327*8975f5c5SAndroid Build Coastguard Worker                                           const GLint *bytesWritten)
4328*8975f5c5SAndroid Build Coastguard Worker {
4329*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4330*8975f5c5SAndroid Build Coastguard Worker     {
4331*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4332*8975f5c5SAndroid Build Coastguard Worker         return false;
4333*8975f5c5SAndroid Build Coastguard Worker     }
4334*8975f5c5SAndroid Build Coastguard Worker 
4335*8975f5c5SAndroid Build Coastguard Worker     if (monitor != 0)
4336*8975f5c5SAndroid Build Coastguard Worker     {
4337*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitor);
4338*8975f5c5SAndroid Build Coastguard Worker         return false;
4339*8975f5c5SAndroid Build Coastguard Worker     }
4340*8975f5c5SAndroid Build Coastguard Worker 
4341*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
4342*8975f5c5SAndroid Build Coastguard Worker     {
4343*8975f5c5SAndroid Build Coastguard Worker         case GL_PERFMON_RESULT_AVAILABLE_AMD:
4344*8975f5c5SAndroid Build Coastguard Worker         case GL_PERFMON_RESULT_SIZE_AMD:
4345*8975f5c5SAndroid Build Coastguard Worker         case GL_PERFMON_RESULT_AMD:
4346*8975f5c5SAndroid Build Coastguard Worker             break;
4347*8975f5c5SAndroid Build Coastguard Worker 
4348*8975f5c5SAndroid Build Coastguard Worker         default:
4349*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
4350*8975f5c5SAndroid Build Coastguard Worker             return false;
4351*8975f5c5SAndroid Build Coastguard Worker     }
4352*8975f5c5SAndroid Build Coastguard Worker 
4353*8975f5c5SAndroid Build Coastguard Worker     return true;
4354*8975f5c5SAndroid Build Coastguard Worker }
4355*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorCounterInfoAMD(const Context * context,angle::EntryPoint entryPoint,GLuint group,GLuint counter,GLenum pname,const void * data)4356*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorCounterInfoAMD(const Context *context,
4357*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
4358*8975f5c5SAndroid Build Coastguard Worker                                           GLuint group,
4359*8975f5c5SAndroid Build Coastguard Worker                                           GLuint counter,
4360*8975f5c5SAndroid Build Coastguard Worker                                           GLenum pname,
4361*8975f5c5SAndroid Build Coastguard Worker                                           const void *data)
4362*8975f5c5SAndroid Build Coastguard Worker {
4363*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4364*8975f5c5SAndroid Build Coastguard Worker     {
4365*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4366*8975f5c5SAndroid Build Coastguard Worker         return false;
4367*8975f5c5SAndroid Build Coastguard Worker     }
4368*8975f5c5SAndroid Build Coastguard Worker 
4369*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &groups = context->getPerfMonitorCounterGroups();
4370*8975f5c5SAndroid Build Coastguard Worker 
4371*8975f5c5SAndroid Build Coastguard Worker     if (group >= groups.size())
4372*8975f5c5SAndroid Build Coastguard Worker     {
4373*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorGroup);
4374*8975f5c5SAndroid Build Coastguard Worker         return false;
4375*8975f5c5SAndroid Build Coastguard Worker     }
4376*8975f5c5SAndroid Build Coastguard Worker 
4377*8975f5c5SAndroid Build Coastguard Worker     if (counter >= groups[group].counters.size())
4378*8975f5c5SAndroid Build Coastguard Worker     {
4379*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorCounter);
4380*8975f5c5SAndroid Build Coastguard Worker         return false;
4381*8975f5c5SAndroid Build Coastguard Worker     }
4382*8975f5c5SAndroid Build Coastguard Worker 
4383*8975f5c5SAndroid Build Coastguard Worker     switch (pname)
4384*8975f5c5SAndroid Build Coastguard Worker     {
4385*8975f5c5SAndroid Build Coastguard Worker         case GL_COUNTER_TYPE_AMD:
4386*8975f5c5SAndroid Build Coastguard Worker         case GL_COUNTER_RANGE_AMD:
4387*8975f5c5SAndroid Build Coastguard Worker             break;
4388*8975f5c5SAndroid Build Coastguard Worker 
4389*8975f5c5SAndroid Build Coastguard Worker         default:
4390*8975f5c5SAndroid Build Coastguard Worker             ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname);
4391*8975f5c5SAndroid Build Coastguard Worker             return false;
4392*8975f5c5SAndroid Build Coastguard Worker     }
4393*8975f5c5SAndroid Build Coastguard Worker 
4394*8975f5c5SAndroid Build Coastguard Worker     return true;
4395*8975f5c5SAndroid Build Coastguard Worker }
4396*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorCounterStringAMD(const Context * context,angle::EntryPoint entryPoint,GLuint group,GLuint counter,GLsizei bufSize,const GLsizei * length,const GLchar * counterString)4397*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorCounterStringAMD(const Context *context,
4398*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
4399*8975f5c5SAndroid Build Coastguard Worker                                             GLuint group,
4400*8975f5c5SAndroid Build Coastguard Worker                                             GLuint counter,
4401*8975f5c5SAndroid Build Coastguard Worker                                             GLsizei bufSize,
4402*8975f5c5SAndroid Build Coastguard Worker                                             const GLsizei *length,
4403*8975f5c5SAndroid Build Coastguard Worker                                             const GLchar *counterString)
4404*8975f5c5SAndroid Build Coastguard Worker {
4405*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4406*8975f5c5SAndroid Build Coastguard Worker     {
4407*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4408*8975f5c5SAndroid Build Coastguard Worker         return false;
4409*8975f5c5SAndroid Build Coastguard Worker     }
4410*8975f5c5SAndroid Build Coastguard Worker 
4411*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &groups = context->getPerfMonitorCounterGroups();
4412*8975f5c5SAndroid Build Coastguard Worker 
4413*8975f5c5SAndroid Build Coastguard Worker     if (group >= groups.size())
4414*8975f5c5SAndroid Build Coastguard Worker     {
4415*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorGroup);
4416*8975f5c5SAndroid Build Coastguard Worker         return false;
4417*8975f5c5SAndroid Build Coastguard Worker     }
4418*8975f5c5SAndroid Build Coastguard Worker 
4419*8975f5c5SAndroid Build Coastguard Worker     if (counter >= groups[group].counters.size())
4420*8975f5c5SAndroid Build Coastguard Worker     {
4421*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorCounter);
4422*8975f5c5SAndroid Build Coastguard Worker         return false;
4423*8975f5c5SAndroid Build Coastguard Worker     }
4424*8975f5c5SAndroid Build Coastguard Worker 
4425*8975f5c5SAndroid Build Coastguard Worker     return true;
4426*8975f5c5SAndroid Build Coastguard Worker }
4427*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorCountersAMD(const Context * context,angle::EntryPoint entryPoint,GLuint group,const GLint * numCounters,const GLint * maxActiveCounters,GLsizei counterSize,const GLuint * counters)4428*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorCountersAMD(const Context *context,
4429*8975f5c5SAndroid Build Coastguard Worker                                        angle::EntryPoint entryPoint,
4430*8975f5c5SAndroid Build Coastguard Worker                                        GLuint group,
4431*8975f5c5SAndroid Build Coastguard Worker                                        const GLint *numCounters,
4432*8975f5c5SAndroid Build Coastguard Worker                                        const GLint *maxActiveCounters,
4433*8975f5c5SAndroid Build Coastguard Worker                                        GLsizei counterSize,
4434*8975f5c5SAndroid Build Coastguard Worker                                        const GLuint *counters)
4435*8975f5c5SAndroid Build Coastguard Worker {
4436*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4437*8975f5c5SAndroid Build Coastguard Worker     {
4438*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4439*8975f5c5SAndroid Build Coastguard Worker         return false;
4440*8975f5c5SAndroid Build Coastguard Worker     }
4441*8975f5c5SAndroid Build Coastguard Worker 
4442*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &groups = context->getPerfMonitorCounterGroups();
4443*8975f5c5SAndroid Build Coastguard Worker 
4444*8975f5c5SAndroid Build Coastguard Worker     if (group >= groups.size())
4445*8975f5c5SAndroid Build Coastguard Worker     {
4446*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorGroup);
4447*8975f5c5SAndroid Build Coastguard Worker         return false;
4448*8975f5c5SAndroid Build Coastguard Worker     }
4449*8975f5c5SAndroid Build Coastguard Worker 
4450*8975f5c5SAndroid Build Coastguard Worker     return true;
4451*8975f5c5SAndroid Build Coastguard Worker }
4452*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorGroupStringAMD(const Context * context,angle::EntryPoint entryPoint,GLuint group,GLsizei bufSize,const GLsizei * length,const GLchar * groupString)4453*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorGroupStringAMD(const Context *context,
4454*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
4455*8975f5c5SAndroid Build Coastguard Worker                                           GLuint group,
4456*8975f5c5SAndroid Build Coastguard Worker                                           GLsizei bufSize,
4457*8975f5c5SAndroid Build Coastguard Worker                                           const GLsizei *length,
4458*8975f5c5SAndroid Build Coastguard Worker                                           const GLchar *groupString)
4459*8975f5c5SAndroid Build Coastguard Worker {
4460*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4461*8975f5c5SAndroid Build Coastguard Worker     {
4462*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4463*8975f5c5SAndroid Build Coastguard Worker         return false;
4464*8975f5c5SAndroid Build Coastguard Worker     }
4465*8975f5c5SAndroid Build Coastguard Worker 
4466*8975f5c5SAndroid Build Coastguard Worker     const angle::PerfMonitorCounterGroups &groups = context->getPerfMonitorCounterGroups();
4467*8975f5c5SAndroid Build Coastguard Worker 
4468*8975f5c5SAndroid Build Coastguard Worker     if (group >= groups.size())
4469*8975f5c5SAndroid Build Coastguard Worker     {
4470*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidPerfMonitorGroup);
4471*8975f5c5SAndroid Build Coastguard Worker         return false;
4472*8975f5c5SAndroid Build Coastguard Worker     }
4473*8975f5c5SAndroid Build Coastguard Worker 
4474*8975f5c5SAndroid Build Coastguard Worker     return true;
4475*8975f5c5SAndroid Build Coastguard Worker }
4476*8975f5c5SAndroid Build Coastguard Worker 
ValidateGetPerfMonitorGroupsAMD(const Context * context,angle::EntryPoint entryPoint,const GLint * numGroups,GLsizei groupsSize,const GLuint * groups)4477*8975f5c5SAndroid Build Coastguard Worker bool ValidateGetPerfMonitorGroupsAMD(const Context *context,
4478*8975f5c5SAndroid Build Coastguard Worker                                      angle::EntryPoint entryPoint,
4479*8975f5c5SAndroid Build Coastguard Worker                                      const GLint *numGroups,
4480*8975f5c5SAndroid Build Coastguard Worker                                      GLsizei groupsSize,
4481*8975f5c5SAndroid Build Coastguard Worker                                      const GLuint *groups)
4482*8975f5c5SAndroid Build Coastguard Worker {
4483*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4484*8975f5c5SAndroid Build Coastguard Worker     {
4485*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4486*8975f5c5SAndroid Build Coastguard Worker         return false;
4487*8975f5c5SAndroid Build Coastguard Worker     }
4488*8975f5c5SAndroid Build Coastguard Worker 
4489*8975f5c5SAndroid Build Coastguard Worker     return true;
4490*8975f5c5SAndroid Build Coastguard Worker }
4491*8975f5c5SAndroid Build Coastguard Worker 
ValidateSelectPerfMonitorCountersAMD(const Context * context,angle::EntryPoint entryPoint,GLuint monitor,GLboolean enable,GLuint group,GLint numCounters,const GLuint * counterList)4492*8975f5c5SAndroid Build Coastguard Worker bool ValidateSelectPerfMonitorCountersAMD(const Context *context,
4493*8975f5c5SAndroid Build Coastguard Worker                                           angle::EntryPoint entryPoint,
4494*8975f5c5SAndroid Build Coastguard Worker                                           GLuint monitor,
4495*8975f5c5SAndroid Build Coastguard Worker                                           GLboolean enable,
4496*8975f5c5SAndroid Build Coastguard Worker                                           GLuint group,
4497*8975f5c5SAndroid Build Coastguard Worker                                           GLint numCounters,
4498*8975f5c5SAndroid Build Coastguard Worker                                           const GLuint *counterList)
4499*8975f5c5SAndroid Build Coastguard Worker {
4500*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().performanceMonitorAMD)
4501*8975f5c5SAndroid Build Coastguard Worker     {
4502*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4503*8975f5c5SAndroid Build Coastguard Worker         return false;
4504*8975f5c5SAndroid Build Coastguard Worker     }
4505*8975f5c5SAndroid Build Coastguard Worker 
4506*8975f5c5SAndroid Build Coastguard Worker     UNIMPLEMENTED();
4507*8975f5c5SAndroid Build Coastguard Worker     return false;
4508*8975f5c5SAndroid Build Coastguard Worker }
4509*8975f5c5SAndroid Build Coastguard Worker 
ValidateShadingRateQCOM(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,GLenum rate)4510*8975f5c5SAndroid Build Coastguard Worker bool ValidateShadingRateQCOM(const PrivateState &state,
4511*8975f5c5SAndroid Build Coastguard Worker                              ErrorSet *errors,
4512*8975f5c5SAndroid Build Coastguard Worker                              angle::EntryPoint entryPoint,
4513*8975f5c5SAndroid Build Coastguard Worker                              GLenum rate)
4514*8975f5c5SAndroid Build Coastguard Worker {
4515*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().shadingRateQCOM)
4516*8975f5c5SAndroid Build Coastguard Worker     {
4517*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
4518*8975f5c5SAndroid Build Coastguard Worker         return false;
4519*8975f5c5SAndroid Build Coastguard Worker     }
4520*8975f5c5SAndroid Build Coastguard Worker 
4521*8975f5c5SAndroid Build Coastguard Worker     gl::ShadingRate shadingRate = gl::FromGLenum<gl::ShadingRate>(rate);
4522*8975f5c5SAndroid Build Coastguard Worker     if (shadingRate == gl::ShadingRate::Undefined || shadingRate == gl::ShadingRate::InvalidEnum)
4523*8975f5c5SAndroid Build Coastguard Worker     {
4524*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_ENUM, kInvalidShadingRate);
4525*8975f5c5SAndroid Build Coastguard Worker         return false;
4526*8975f5c5SAndroid Build Coastguard Worker     }
4527*8975f5c5SAndroid Build Coastguard Worker 
4528*8975f5c5SAndroid Build Coastguard Worker     return true;
4529*8975f5c5SAndroid Build Coastguard Worker }
4530*8975f5c5SAndroid Build Coastguard Worker 
ValidateLogicOpANGLE(const PrivateState & state,ErrorSet * errors,angle::EntryPoint entryPoint,LogicalOperation opcodePacked)4531*8975f5c5SAndroid Build Coastguard Worker bool ValidateLogicOpANGLE(const PrivateState &state,
4532*8975f5c5SAndroid Build Coastguard Worker                           ErrorSet *errors,
4533*8975f5c5SAndroid Build Coastguard Worker                           angle::EntryPoint entryPoint,
4534*8975f5c5SAndroid Build Coastguard Worker                           LogicalOperation opcodePacked)
4535*8975f5c5SAndroid Build Coastguard Worker {
4536*8975f5c5SAndroid Build Coastguard Worker     if (!state.getExtensions().logicOpANGLE)
4537*8975f5c5SAndroid Build Coastguard Worker     {
4538*8975f5c5SAndroid Build Coastguard Worker         errors->validationError(entryPoint, GL_INVALID_OPERATION, kExtensionNotEnabled);
4539*8975f5c5SAndroid Build Coastguard Worker         return false;
4540*8975f5c5SAndroid Build Coastguard Worker     }
4541*8975f5c5SAndroid Build Coastguard Worker 
4542*8975f5c5SAndroid Build Coastguard Worker     return ValidateLogicOpCommon(state, errors, entryPoint, opcodePacked);
4543*8975f5c5SAndroid Build Coastguard Worker }
4544*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferFoveationConfigQCOM(const Context * context,angle::EntryPoint entryPoint,FramebufferID framebufferPacked,GLuint numLayers,GLuint focalPointsPerLayer,GLuint requestedFeatures,const GLuint * providedFeatures)4545*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferFoveationConfigQCOM(const Context *context,
4546*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
4547*8975f5c5SAndroid Build Coastguard Worker                                             FramebufferID framebufferPacked,
4548*8975f5c5SAndroid Build Coastguard Worker                                             GLuint numLayers,
4549*8975f5c5SAndroid Build Coastguard Worker                                             GLuint focalPointsPerLayer,
4550*8975f5c5SAndroid Build Coastguard Worker                                             GLuint requestedFeatures,
4551*8975f5c5SAndroid Build Coastguard Worker                                             const GLuint *providedFeatures)
4552*8975f5c5SAndroid Build Coastguard Worker {
4553*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *framebuffer = context->getFramebuffer(framebufferPacked);
4554*8975f5c5SAndroid Build Coastguard Worker 
4555*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationConfigQCOM if 'fbo' is not a valid
4556*8975f5c5SAndroid Build Coastguard Worker     // framebuffer.
4557*8975f5c5SAndroid Build Coastguard Worker     if (framebuffer == nullptr)
4558*8975f5c5SAndroid Build Coastguard Worker     {
4559*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidFramebufferName);
4560*8975f5c5SAndroid Build Coastguard Worker         return false;
4561*8975f5c5SAndroid Build Coastguard Worker     }
4562*8975f5c5SAndroid Build Coastguard Worker 
4563*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationConfigQCOM if 'numLayers' is greater than
4564*8975f5c5SAndroid Build Coastguard Worker     // GL_MAX_ARRAY_TEXTURE_LAYERS - 1.
4565*8975f5c5SAndroid Build Coastguard Worker     if (numLayers > static_cast<GLuint>(context->getState().getCaps().maxArrayTextureLayers) - 1)
4566*8975f5c5SAndroid Build Coastguard Worker     {
4567*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferFoveationLayersExceedMaxArrayLayers);
4568*8975f5c5SAndroid Build Coastguard Worker         return false;
4569*8975f5c5SAndroid Build Coastguard Worker     }
4570*8975f5c5SAndroid Build Coastguard Worker 
4571*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationConfigQCOM if 'numFocalPoints' is greater
4572*8975f5c5SAndroid Build Coastguard Worker     // than implementation can support.
4573*8975f5c5SAndroid Build Coastguard Worker     if (focalPointsPerLayer > gl::IMPLEMENTATION_MAX_FOCAL_POINTS)
4574*8975f5c5SAndroid Build Coastguard Worker     {
4575*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFocalPointsExceedMaxFocalPoints);
4576*8975f5c5SAndroid Build Coastguard Worker         return false;
4577*8975f5c5SAndroid Build Coastguard Worker     }
4578*8975f5c5SAndroid Build Coastguard Worker 
4579*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated by FramebufferFoveationConfigQCOM if it is called for a fbo
4580*8975f5c5SAndroid Build Coastguard Worker     // that has already been cofigured for foveated rendering.
4581*8975f5c5SAndroid Build Coastguard Worker     if (framebuffer->isFoveationConfigured())
4582*8975f5c5SAndroid Build Coastguard Worker     {
4583*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferFoveationAlreadyConfigured);
4584*8975f5c5SAndroid Build Coastguard Worker         return false;
4585*8975f5c5SAndroid Build Coastguard Worker     }
4586*8975f5c5SAndroid Build Coastguard Worker 
4587*8975f5c5SAndroid Build Coastguard Worker     return true;
4588*8975f5c5SAndroid Build Coastguard Worker }
4589*8975f5c5SAndroid Build Coastguard Worker 
ValidateFramebufferFoveationParametersQCOM(const Context * context,angle::EntryPoint entryPoint,FramebufferID framebufferPacked,GLuint layer,GLuint focalPoint,GLfloat focalX,GLfloat focalY,GLfloat gainX,GLfloat gainY,GLfloat foveaArea)4590*8975f5c5SAndroid Build Coastguard Worker bool ValidateFramebufferFoveationParametersQCOM(const Context *context,
4591*8975f5c5SAndroid Build Coastguard Worker                                                 angle::EntryPoint entryPoint,
4592*8975f5c5SAndroid Build Coastguard Worker                                                 FramebufferID framebufferPacked,
4593*8975f5c5SAndroid Build Coastguard Worker                                                 GLuint layer,
4594*8975f5c5SAndroid Build Coastguard Worker                                                 GLuint focalPoint,
4595*8975f5c5SAndroid Build Coastguard Worker                                                 GLfloat focalX,
4596*8975f5c5SAndroid Build Coastguard Worker                                                 GLfloat focalY,
4597*8975f5c5SAndroid Build Coastguard Worker                                                 GLfloat gainX,
4598*8975f5c5SAndroid Build Coastguard Worker                                                 GLfloat gainY,
4599*8975f5c5SAndroid Build Coastguard Worker                                                 GLfloat foveaArea)
4600*8975f5c5SAndroid Build Coastguard Worker {
4601*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *framebuffer = context->getFramebuffer(framebufferPacked);
4602*8975f5c5SAndroid Build Coastguard Worker 
4603*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationParametersQCOM if 'fbo' is not a valid
4604*8975f5c5SAndroid Build Coastguard Worker     // framebuffer.
4605*8975f5c5SAndroid Build Coastguard Worker     if (framebuffer == nullptr)
4606*8975f5c5SAndroid Build Coastguard Worker     {
4607*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidFramebufferName);
4608*8975f5c5SAndroid Build Coastguard Worker         return false;
4609*8975f5c5SAndroid Build Coastguard Worker     }
4610*8975f5c5SAndroid Build Coastguard Worker 
4611*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated by FramebufferFoveationParametersQCOM if 'fbo' has not been
4612*8975f5c5SAndroid Build Coastguard Worker     // configured for foveated rendering.
4613*8975f5c5SAndroid Build Coastguard Worker     if (!framebuffer->isFoveationConfigured())
4614*8975f5c5SAndroid Build Coastguard Worker     {
4615*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kFramebufferFoveationNotConfigured);
4616*8975f5c5SAndroid Build Coastguard Worker         return false;
4617*8975f5c5SAndroid Build Coastguard Worker     }
4618*8975f5c5SAndroid Build Coastguard Worker 
4619*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationParametersQCOM if 'layer' is greater than
4620*8975f5c5SAndroid Build Coastguard Worker     // or equal to the numLayers that the fbo was previously configured for in
4621*8975f5c5SAndroid Build Coastguard Worker     // FramebufferFoveationConfigQCOM.
4622*8975f5c5SAndroid Build Coastguard Worker     if (layer >= gl::IMPLEMENTATION_MAX_NUM_LAYERS)
4623*8975f5c5SAndroid Build Coastguard Worker     {
4624*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFramebufferFoveationLayersExceedMaxArrayLayers);
4625*8975f5c5SAndroid Build Coastguard Worker         return false;
4626*8975f5c5SAndroid Build Coastguard Worker     }
4627*8975f5c5SAndroid Build Coastguard Worker 
4628*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by FramebufferFoveationParametersQCOM if 'numFocalPoints' is
4629*8975f5c5SAndroid Build Coastguard Worker     // greater than implementation can support. INVALID_OPERATION is generated by
4630*8975f5c5SAndroid Build Coastguard Worker     if (focalPoint >= gl::IMPLEMENTATION_MAX_FOCAL_POINTS)
4631*8975f5c5SAndroid Build Coastguard Worker     {
4632*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFocalPointsExceedMaxFocalPoints);
4633*8975f5c5SAndroid Build Coastguard Worker         return false;
4634*8975f5c5SAndroid Build Coastguard Worker     }
4635*8975f5c5SAndroid Build Coastguard Worker     return true;
4636*8975f5c5SAndroid Build Coastguard Worker }
4637*8975f5c5SAndroid Build Coastguard Worker 
ValidateTextureFoveationParametersQCOM(const Context * context,angle::EntryPoint entryPoint,TextureID texturePacked,GLuint layer,GLuint focalPoint,GLfloat focalX,GLfloat focalY,GLfloat gainX,GLfloat gainY,GLfloat foveaArea)4638*8975f5c5SAndroid Build Coastguard Worker bool ValidateTextureFoveationParametersQCOM(const Context *context,
4639*8975f5c5SAndroid Build Coastguard Worker                                             angle::EntryPoint entryPoint,
4640*8975f5c5SAndroid Build Coastguard Worker                                             TextureID texturePacked,
4641*8975f5c5SAndroid Build Coastguard Worker                                             GLuint layer,
4642*8975f5c5SAndroid Build Coastguard Worker                                             GLuint focalPoint,
4643*8975f5c5SAndroid Build Coastguard Worker                                             GLfloat focalX,
4644*8975f5c5SAndroid Build Coastguard Worker                                             GLfloat focalY,
4645*8975f5c5SAndroid Build Coastguard Worker                                             GLfloat gainX,
4646*8975f5c5SAndroid Build Coastguard Worker                                             GLfloat gainY,
4647*8975f5c5SAndroid Build Coastguard Worker                                             GLfloat foveaArea)
4648*8975f5c5SAndroid Build Coastguard Worker {
4649*8975f5c5SAndroid Build Coastguard Worker     Texture *texture = context->getTexture(texturePacked);
4650*8975f5c5SAndroid Build Coastguard Worker 
4651*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by TextureFoveationParametersQCOM if 'texture' is not a valid
4652*8975f5c5SAndroid Build Coastguard Worker     // texture object.
4653*8975f5c5SAndroid Build Coastguard Worker     if (texture == nullptr)
4654*8975f5c5SAndroid Build Coastguard Worker     {
4655*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidTextureName);
4656*8975f5c5SAndroid Build Coastguard Worker         return false;
4657*8975f5c5SAndroid Build Coastguard Worker     }
4658*8975f5c5SAndroid Build Coastguard Worker 
4659*8975f5c5SAndroid Build Coastguard Worker     // INVALID_OPERATION is generated by TextureFoveationParametersQCOM if 'texture' has not been
4660*8975f5c5SAndroid Build Coastguard Worker     // set as foveated. i.e. 'texture's parameter TEXTURE_FOVEATED_FEATURE_BITS_QCOM does not
4661*8975f5c5SAndroid Build Coastguard Worker     // contain FOVEATION_ENABLE_BIT_QCOM.
4662*8975f5c5SAndroid Build Coastguard Worker     if (!texture->isFoveationEnabled())
4663*8975f5c5SAndroid Build Coastguard Worker     {
4664*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTextureFoveationNotEnabled);
4665*8975f5c5SAndroid Build Coastguard Worker         return false;
4666*8975f5c5SAndroid Build Coastguard Worker     }
4667*8975f5c5SAndroid Build Coastguard Worker 
4668*8975f5c5SAndroid Build Coastguard Worker     // INVALID_VALUE is generated by TextureFoveationParametersQCOM if 'focalPoint' is larger than
4669*8975f5c5SAndroid Build Coastguard Worker     // TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM minus one.
4670*8975f5c5SAndroid Build Coastguard Worker     if (focalPoint > texture->getNumFocalPoints() - 1)
4671*8975f5c5SAndroid Build Coastguard Worker     {
4672*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kFocalPointsExceedMaxFocalPoints);
4673*8975f5c5SAndroid Build Coastguard Worker         return false;
4674*8975f5c5SAndroid Build Coastguard Worker     }
4675*8975f5c5SAndroid Build Coastguard Worker 
4676*8975f5c5SAndroid Build Coastguard Worker     return true;
4677*8975f5c5SAndroid Build Coastguard Worker }
4678*8975f5c5SAndroid Build Coastguard Worker 
ValidateEndTilingQCOM(const Context * context,angle::EntryPoint entryPoint,GLbitfield preserveMask)4679*8975f5c5SAndroid Build Coastguard Worker bool ValidateEndTilingQCOM(const Context *context,
4680*8975f5c5SAndroid Build Coastguard Worker                            angle::EntryPoint entryPoint,
4681*8975f5c5SAndroid Build Coastguard Worker                            GLbitfield preserveMask)
4682*8975f5c5SAndroid Build Coastguard Worker {
4683*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().tiledRenderingQCOM)
4684*8975f5c5SAndroid Build Coastguard Worker     {
4685*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4686*8975f5c5SAndroid Build Coastguard Worker         return false;
4687*8975f5c5SAndroid Build Coastguard Worker     }
4688*8975f5c5SAndroid Build Coastguard Worker 
4689*8975f5c5SAndroid Build Coastguard Worker     const gl::PrivateState &privateState = context->getPrivateState();
4690*8975f5c5SAndroid Build Coastguard Worker     if (!privateState.isTiledRendering())
4691*8975f5c5SAndroid Build Coastguard Worker     {
4692*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTilingEndCalledWithoutStart);
4693*8975f5c5SAndroid Build Coastguard Worker         return false;
4694*8975f5c5SAndroid Build Coastguard Worker     }
4695*8975f5c5SAndroid Build Coastguard Worker 
4696*8975f5c5SAndroid Build Coastguard Worker     // preserveMask does not need to be validated. The bitfield covers the entire 32 bits of
4697*8975f5c5SAndroid Build Coastguard Worker     // GLbitfield and unbound attachments are siliently ignored like in glClear
4698*8975f5c5SAndroid Build Coastguard Worker 
4699*8975f5c5SAndroid Build Coastguard Worker     return true;
4700*8975f5c5SAndroid Build Coastguard Worker }
4701*8975f5c5SAndroid Build Coastguard Worker 
ValidateStartTilingQCOM(const Context * context,angle::EntryPoint entryPoint,GLuint x,GLuint y,GLuint width,GLuint height,GLbitfield preserveMask)4702*8975f5c5SAndroid Build Coastguard Worker bool ValidateStartTilingQCOM(const Context *context,
4703*8975f5c5SAndroid Build Coastguard Worker                              angle::EntryPoint entryPoint,
4704*8975f5c5SAndroid Build Coastguard Worker                              GLuint x,
4705*8975f5c5SAndroid Build Coastguard Worker                              GLuint y,
4706*8975f5c5SAndroid Build Coastguard Worker                              GLuint width,
4707*8975f5c5SAndroid Build Coastguard Worker                              GLuint height,
4708*8975f5c5SAndroid Build Coastguard Worker                              GLbitfield preserveMask)
4709*8975f5c5SAndroid Build Coastguard Worker {
4710*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().tiledRenderingQCOM)
4711*8975f5c5SAndroid Build Coastguard Worker     {
4712*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4713*8975f5c5SAndroid Build Coastguard Worker         return false;
4714*8975f5c5SAndroid Build Coastguard Worker     }
4715*8975f5c5SAndroid Build Coastguard Worker 
4716*8975f5c5SAndroid Build Coastguard Worker     const gl::PrivateState &privateState = context->getPrivateState();
4717*8975f5c5SAndroid Build Coastguard Worker     if (privateState.isTiledRendering())
4718*8975f5c5SAndroid Build Coastguard Worker     {
4719*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kTilingStartCalledWithoutEnd);
4720*8975f5c5SAndroid Build Coastguard Worker         return false;
4721*8975f5c5SAndroid Build Coastguard Worker     }
4722*8975f5c5SAndroid Build Coastguard Worker 
4723*8975f5c5SAndroid Build Coastguard Worker     Framebuffer *framebuffer                   = context->getState().getDrawFramebuffer();
4724*8975f5c5SAndroid Build Coastguard Worker     const FramebufferStatus &framebufferStatus = framebuffer->checkStatus(context);
4725*8975f5c5SAndroid Build Coastguard Worker     if (!framebufferStatus.isComplete())
4726*8975f5c5SAndroid Build Coastguard Worker     {
4727*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, framebufferStatus.reason);
4728*8975f5c5SAndroid Build Coastguard Worker         return false;
4729*8975f5c5SAndroid Build Coastguard Worker     }
4730*8975f5c5SAndroid Build Coastguard Worker 
4731*8975f5c5SAndroid Build Coastguard Worker     // preserveMask does not need to be validated. The bitfield covers the entire 32 bits of
4732*8975f5c5SAndroid Build Coastguard Worker     // GLbitfield and unbound attachments are siliently ignored like in glClear
4733*8975f5c5SAndroid Build Coastguard Worker 
4734*8975f5c5SAndroid Build Coastguard Worker     return true;
4735*8975f5c5SAndroid Build Coastguard Worker }
4736*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageAttribs(const GLint * attrib_list)4737*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageAttribs(const GLint *attrib_list)
4738*8975f5c5SAndroid Build Coastguard Worker {
4739*8975f5c5SAndroid Build Coastguard Worker     if (nullptr != attrib_list && GL_NONE != *attrib_list)
4740*8975f5c5SAndroid Build Coastguard Worker     {
4741*8975f5c5SAndroid Build Coastguard Worker         attrib_list++;
4742*8975f5c5SAndroid Build Coastguard Worker         if (nullptr == attrib_list)
4743*8975f5c5SAndroid Build Coastguard Worker         {
4744*8975f5c5SAndroid Build Coastguard Worker             return false;
4745*8975f5c5SAndroid Build Coastguard Worker         }
4746*8975f5c5SAndroid Build Coastguard Worker 
4747*8975f5c5SAndroid Build Coastguard Worker         if (*attrib_list == GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT ||
4748*8975f5c5SAndroid Build Coastguard Worker             *attrib_list == GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT)
4749*8975f5c5SAndroid Build Coastguard Worker         {
4750*8975f5c5SAndroid Build Coastguard Worker             return true;
4751*8975f5c5SAndroid Build Coastguard Worker         }
4752*8975f5c5SAndroid Build Coastguard Worker         else if (*attrib_list >= GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT &&
4753*8975f5c5SAndroid Build Coastguard Worker                  *attrib_list <= GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT)
4754*8975f5c5SAndroid Build Coastguard Worker         {
4755*8975f5c5SAndroid Build Coastguard Worker             return true;
4756*8975f5c5SAndroid Build Coastguard Worker         }
4757*8975f5c5SAndroid Build Coastguard Worker         else
4758*8975f5c5SAndroid Build Coastguard Worker         {
4759*8975f5c5SAndroid Build Coastguard Worker             return false;
4760*8975f5c5SAndroid Build Coastguard Worker         }
4761*8975f5c5SAndroid Build Coastguard Worker     }
4762*8975f5c5SAndroid Build Coastguard Worker 
4763*8975f5c5SAndroid Build Coastguard Worker     return true;
4764*8975f5c5SAndroid Build Coastguard Worker }
4765*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageAttribs2DEXT(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,const GLint * attrib_list)4766*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageAttribs2DEXT(const Context *context,
4767*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
4768*8975f5c5SAndroid Build Coastguard Worker                                     GLenum target,
4769*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei levels,
4770*8975f5c5SAndroid Build Coastguard Worker                                     GLenum internalformat,
4771*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei width,
4772*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei height,
4773*8975f5c5SAndroid Build Coastguard Worker                                     const GLint *attrib_list)
4774*8975f5c5SAndroid Build Coastguard Worker {
4775*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType targetType = FromGLenum<TextureType>(target);
4776*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureStorageCompressionEXT)
4777*8975f5c5SAndroid Build Coastguard Worker     {
4778*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4779*8975f5c5SAndroid Build Coastguard Worker         return false;
4780*8975f5c5SAndroid Build Coastguard Worker     }
4781*8975f5c5SAndroid Build Coastguard Worker 
4782*8975f5c5SAndroid Build Coastguard Worker     if (ValidateTexStorageAttribs(attrib_list) == false)
4783*8975f5c5SAndroid Build Coastguard Worker     {
4784*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidAttribList);
4785*8975f5c5SAndroid Build Coastguard Worker     }
4786*8975f5c5SAndroid Build Coastguard Worker 
4787*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
4788*8975f5c5SAndroid Build Coastguard Worker     {
4789*8975f5c5SAndroid Build Coastguard Worker         return ValidateES2TexStorageParametersBase(context, entryPoint, targetType, levels,
4790*8975f5c5SAndroid Build Coastguard Worker                                                    internalformat, width, height);
4791*8975f5c5SAndroid Build Coastguard Worker     }
4792*8975f5c5SAndroid Build Coastguard Worker 
4793*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() >= 3)
4794*8975f5c5SAndroid Build Coastguard Worker     {
4795*8975f5c5SAndroid Build Coastguard Worker         return ValidateES3TexStorage2DParameters(context, entryPoint, targetType, levels,
4796*8975f5c5SAndroid Build Coastguard Worker                                                  internalformat, width, height, 1);
4797*8975f5c5SAndroid Build Coastguard Worker     }
4798*8975f5c5SAndroid Build Coastguard Worker 
4799*8975f5c5SAndroid Build Coastguard Worker     return true;
4800*8975f5c5SAndroid Build Coastguard Worker }
4801*8975f5c5SAndroid Build Coastguard Worker 
ValidateTexStorageAttribs3DEXT(const Context * context,angle::EntryPoint entryPoint,GLenum target,GLsizei levels,GLenum internalformat,GLsizei width,GLsizei height,GLsizei depth,const GLint * attrib_list)4802*8975f5c5SAndroid Build Coastguard Worker bool ValidateTexStorageAttribs3DEXT(const Context *context,
4803*8975f5c5SAndroid Build Coastguard Worker                                     angle::EntryPoint entryPoint,
4804*8975f5c5SAndroid Build Coastguard Worker                                     GLenum target,
4805*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei levels,
4806*8975f5c5SAndroid Build Coastguard Worker                                     GLenum internalformat,
4807*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei width,
4808*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei height,
4809*8975f5c5SAndroid Build Coastguard Worker                                     GLsizei depth,
4810*8975f5c5SAndroid Build Coastguard Worker                                     const GLint *attrib_list)
4811*8975f5c5SAndroid Build Coastguard Worker {
4812*8975f5c5SAndroid Build Coastguard Worker     gl::TextureType targetType = FromGLenum<TextureType>(target);
4813*8975f5c5SAndroid Build Coastguard Worker     if (!context->getExtensions().textureStorageCompressionEXT)
4814*8975f5c5SAndroid Build Coastguard Worker     {
4815*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_OPERATION, kExtensionNotEnabled);
4816*8975f5c5SAndroid Build Coastguard Worker         return false;
4817*8975f5c5SAndroid Build Coastguard Worker     }
4818*8975f5c5SAndroid Build Coastguard Worker 
4819*8975f5c5SAndroid Build Coastguard Worker     if (ValidateTexStorageAttribs(attrib_list) == false)
4820*8975f5c5SAndroid Build Coastguard Worker     {
4821*8975f5c5SAndroid Build Coastguard Worker         ANGLE_VALIDATION_ERROR(GL_INVALID_VALUE, kInvalidAttribList);
4822*8975f5c5SAndroid Build Coastguard Worker     }
4823*8975f5c5SAndroid Build Coastguard Worker 
4824*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() < 3)
4825*8975f5c5SAndroid Build Coastguard Worker     {
4826*8975f5c5SAndroid Build Coastguard Worker         return ValidateES2TexStorageParametersBase(context, entryPoint, targetType, levels,
4827*8975f5c5SAndroid Build Coastguard Worker                                                    internalformat, width, height);
4828*8975f5c5SAndroid Build Coastguard Worker     }
4829*8975f5c5SAndroid Build Coastguard Worker 
4830*8975f5c5SAndroid Build Coastguard Worker     if (context->getClientMajorVersion() >= 3)
4831*8975f5c5SAndroid Build Coastguard Worker     {
4832*8975f5c5SAndroid Build Coastguard Worker         return ValidateES3TexStorage3DParameters(context, entryPoint, targetType, levels,
4833*8975f5c5SAndroid Build Coastguard Worker                                                  internalformat, width, height, depth);
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 
4839*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
4840