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