summaryrefslogtreecommitdiffstats
path: root/gfx/angle/checkout/src/libANGLE/validationES1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/angle/checkout/src/libANGLE/validationES1.cpp')
-rw-r--r--gfx/angle/checkout/src/libANGLE/validationES1.cpp1880
1 files changed, 1880 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/libANGLE/validationES1.cpp b/gfx/angle/checkout/src/libANGLE/validationES1.cpp
new file mode 100644
index 0000000000..5b61d0a932
--- /dev/null
+++ b/gfx/angle/checkout/src/libANGLE/validationES1.cpp
@@ -0,0 +1,1880 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+
+// validationES1.cpp: Validation functions for OpenGL ES 1.0 entry point parameters
+
+#include "libANGLE/validationES1_autogen.h"
+
+#include "common/debug.h"
+#include "libANGLE/Context.h"
+#include "libANGLE/ErrorStrings.h"
+#include "libANGLE/GLES1State.h"
+#include "libANGLE/queryconversions.h"
+#include "libANGLE/queryutils.h"
+#include "libANGLE/validationES.h"
+
+#define ANGLE_VALIDATE_IS_GLES1(context) \
+ do \
+ { \
+ if (context->getClientType() != EGL_OPENGL_API && context->getClientMajorVersion() > 1) \
+ { \
+ context->validationError(GL_INVALID_OPERATION, kGLES1Only); \
+ return false; \
+ } \
+ } while (0)
+
+namespace gl
+{
+using namespace err;
+
+bool ValidateAlphaFuncCommon(const Context *context, AlphaTestFunc func)
+{
+ switch (func)
+ {
+ case AlphaTestFunc::AlwaysPass:
+ case AlphaTestFunc::Equal:
+ case AlphaTestFunc::Gequal:
+ case AlphaTestFunc::Greater:
+ case AlphaTestFunc::Lequal:
+ case AlphaTestFunc::Less:
+ case AlphaTestFunc::Never:
+ case AlphaTestFunc::NotEqual:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
+ return false;
+ }
+}
+
+bool ValidateClientStateCommon(const Context *context, ClientVertexArrayType arrayType)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ switch (arrayType)
+ {
+ case ClientVertexArrayType::Vertex:
+ case ClientVertexArrayType::Normal:
+ case ClientVertexArrayType::Color:
+ case ClientVertexArrayType::TextureCoord:
+ return true;
+ case ClientVertexArrayType::PointSize:
+ if (!context->getExtensions().pointSizeArrayOES)
+ {
+ context->validationError(GL_INVALID_ENUM, kPointSizeArrayExtensionNotEnabled);
+ return false;
+ }
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidClientState);
+ return false;
+ }
+}
+
+bool ValidateBuiltinVertexAttributeCommon(const Context *context,
+ ClientVertexArrayType arrayType,
+ GLint size,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (stride < 0)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidVertexPointerStride);
+ return false;
+ }
+
+ int minSize = 1;
+ int maxSize = 4;
+
+ switch (arrayType)
+ {
+ case ClientVertexArrayType::Vertex:
+ case ClientVertexArrayType::TextureCoord:
+ minSize = 2;
+ maxSize = 4;
+ break;
+ case ClientVertexArrayType::Normal:
+ minSize = 3;
+ maxSize = 3;
+ break;
+ case ClientVertexArrayType::Color:
+ minSize = 4;
+ maxSize = 4;
+ break;
+ case ClientVertexArrayType::PointSize:
+ if (!context->getExtensions().pointSizeArrayOES)
+ {
+ context->validationError(GL_INVALID_ENUM, kPointSizeArrayExtensionNotEnabled);
+ return false;
+ }
+
+ minSize = 1;
+ maxSize = 1;
+ break;
+ default:
+ UNREACHABLE();
+ return false;
+ }
+
+ if (size < minSize || size > maxSize)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidVertexPointerSize);
+ return false;
+ }
+
+ switch (type)
+ {
+ case VertexAttribType::Byte:
+ if (arrayType == ClientVertexArrayType::PointSize)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidVertexPointerType);
+ return false;
+ }
+ break;
+ case VertexAttribType::Short:
+ if (arrayType == ClientVertexArrayType::PointSize ||
+ arrayType == ClientVertexArrayType::Color)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidVertexPointerType);
+ return false;
+ }
+ break;
+ case VertexAttribType::Fixed:
+ case VertexAttribType::Float:
+ break;
+ case VertexAttribType::UnsignedByte:
+ if (arrayType != ClientVertexArrayType::Color)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidVertexPointerType);
+ return false;
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidVertexPointerType);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateLightCaps(const Context *context, GLenum light)
+{
+ if (light < GL_LIGHT0 || light >= GL_LIGHT0 + context->getCaps().maxLights)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidLight);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateLightCommon(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ const GLfloat *params)
+{
+
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (!ValidateLightCaps(context, light))
+ {
+ return false;
+ }
+
+ switch (pname)
+ {
+ case LightParameter::Ambient:
+ case LightParameter::Diffuse:
+ case LightParameter::Specular:
+ case LightParameter::Position:
+ case LightParameter::SpotDirection:
+ return true;
+ case LightParameter::SpotExponent:
+ if (params[0] < 0.0f || params[0] > 128.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kLightParameterOutOfRange);
+ return false;
+ }
+ return true;
+ case LightParameter::SpotCutoff:
+ if (params[0] == 180.0f)
+ {
+ return true;
+ }
+ if (params[0] < 0.0f || params[0] > 90.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kLightParameterOutOfRange);
+ return false;
+ }
+ return true;
+ case LightParameter::ConstantAttenuation:
+ case LightParameter::LinearAttenuation:
+ case LightParameter::QuadraticAttenuation:
+ if (params[0] < 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kLightParameterOutOfRange);
+ return false;
+ }
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidLightParameter);
+ return false;
+ }
+}
+
+bool ValidateLightSingleComponent(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ GLfloat param)
+{
+ if (!ValidateLightCommon(context, light, pname, &param))
+ {
+ return false;
+ }
+
+ if (GetLightParameterCount(pname) > 1)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidLightParameter);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateMaterialCommon(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfloat *params)
+{
+ switch (pname)
+ {
+ case MaterialParameter::Ambient:
+ case MaterialParameter::AmbientAndDiffuse:
+ case MaterialParameter::Diffuse:
+ case MaterialParameter::Specular:
+ case MaterialParameter::Emission:
+ return true;
+ case MaterialParameter::Shininess:
+ if (params[0] < 0.0f || params[0] > 128.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kMaterialParameterOutOfRange);
+ return false;
+ }
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidMaterialParameter);
+ return false;
+ }
+}
+
+bool ValidateMaterialSetting(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfloat *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (face != GL_FRONT_AND_BACK)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidMaterialFace);
+ return false;
+ }
+
+ return ValidateMaterialCommon(context, face, pname, params);
+}
+
+bool ValidateMaterialQuery(const Context *context, GLenum face, MaterialParameter pname)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (face != GL_FRONT && face != GL_BACK)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidMaterialFace);
+ return false;
+ }
+
+ GLfloat validateParams[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+
+ return ValidateMaterialCommon(context, face, pname, validateParams);
+}
+
+bool ValidateMaterialSingleComponent(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ GLfloat param)
+{
+ if (!ValidateMaterialSetting(context, face, pname, &param))
+ {
+ return false;
+ }
+
+ if (GetMaterialParameterCount(pname) > 1)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidMaterialParameter);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateLightModelCommon(const Context *context, GLenum pname)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ switch (pname)
+ {
+ case GL_LIGHT_MODEL_AMBIENT:
+ case GL_LIGHT_MODEL_TWO_SIDE:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidLightModelParameter);
+ return false;
+ }
+}
+
+bool ValidateLightModelSingleComponent(const Context *context, GLenum pname)
+{
+ if (!ValidateLightModelCommon(context, pname))
+ {
+ return false;
+ }
+
+ switch (pname)
+ {
+ case GL_LIGHT_MODEL_TWO_SIDE:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidLightModelParameter);
+ return false;
+ }
+}
+
+bool ValidateClipPlaneCommon(const Context *context, GLenum plane)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (plane < GL_CLIP_PLANE0 || plane >= GL_CLIP_PLANE0 + context->getCaps().maxClipPlanes)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidClipPlane);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateFogCommon(const Context *context, GLenum pname, const GLfloat *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ switch (pname)
+ {
+ case GL_FOG_MODE:
+ {
+ GLenum modeParam = static_cast<GLenum>(params[0]);
+ switch (modeParam)
+ {
+ case GL_EXP:
+ case GL_EXP2:
+ case GL_LINEAR:
+ return true;
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidFogMode);
+ return false;
+ }
+ }
+ break;
+ case GL_FOG_START:
+ case GL_FOG_END:
+ case GL_FOG_COLOR:
+ break;
+ case GL_FOG_DENSITY:
+ if (params[0] < 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidFogDensity);
+ return false;
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidFogParameter);
+ return false;
+ }
+ return true;
+}
+
+bool ValidateTexEnvCommon(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLfloat *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ switch (target)
+ {
+ case TextureEnvTarget::Env:
+ switch (pname)
+ {
+ case TextureEnvParameter::Mode:
+ {
+ TextureEnvMode mode = FromGLenum<TextureEnvMode>(ConvertToGLenum(params[0]));
+ switch (mode)
+ {
+ case TextureEnvMode::Add:
+ case TextureEnvMode::Blend:
+ case TextureEnvMode::Combine:
+ case TextureEnvMode::Decal:
+ case TextureEnvMode::Modulate:
+ case TextureEnvMode::Replace:
+ break;
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureEnvMode);
+ return false;
+ }
+ break;
+ }
+ case TextureEnvParameter::CombineRgb:
+ case TextureEnvParameter::CombineAlpha:
+ {
+ TextureCombine combine = FromGLenum<TextureCombine>(ConvertToGLenum(params[0]));
+ switch (combine)
+ {
+ case TextureCombine::Add:
+ case TextureCombine::AddSigned:
+ case TextureCombine::Interpolate:
+ case TextureCombine::Modulate:
+ case TextureCombine::Replace:
+ case TextureCombine::Subtract:
+ break;
+ case TextureCombine::Dot3Rgb:
+ case TextureCombine::Dot3Rgba:
+ if (pname == TextureEnvParameter::CombineAlpha)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureCombine);
+ return false;
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureCombine);
+ return false;
+ }
+ break;
+ }
+ case TextureEnvParameter::Src0Rgb:
+ case TextureEnvParameter::Src1Rgb:
+ case TextureEnvParameter::Src2Rgb:
+ case TextureEnvParameter::Src0Alpha:
+ case TextureEnvParameter::Src1Alpha:
+ case TextureEnvParameter::Src2Alpha:
+ {
+ TextureSrc combine = FromGLenum<TextureSrc>(ConvertToGLenum(params[0]));
+ switch (combine)
+ {
+ case TextureSrc::Constant:
+ case TextureSrc::Previous:
+ case TextureSrc::PrimaryColor:
+ case TextureSrc::Texture:
+ break;
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureCombineSrc);
+ return false;
+ }
+ break;
+ }
+ case TextureEnvParameter::Op0Rgb:
+ case TextureEnvParameter::Op1Rgb:
+ case TextureEnvParameter::Op2Rgb:
+ case TextureEnvParameter::Op0Alpha:
+ case TextureEnvParameter::Op1Alpha:
+ case TextureEnvParameter::Op2Alpha:
+ {
+ TextureOp operand = FromGLenum<TextureOp>(ConvertToGLenum(params[0]));
+ switch (operand)
+ {
+ case TextureOp::SrcAlpha:
+ case TextureOp::OneMinusSrcAlpha:
+ break;
+ case TextureOp::SrcColor:
+ case TextureOp::OneMinusSrcColor:
+ if (pname == TextureEnvParameter::Op0Alpha ||
+ pname == TextureEnvParameter::Op1Alpha ||
+ pname == TextureEnvParameter::Op2Alpha)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureCombine);
+ return false;
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureCombineOp);
+ return false;
+ }
+ break;
+ }
+ case TextureEnvParameter::RgbScale:
+ case TextureEnvParameter::AlphaScale:
+ if (params[0] != 1.0f && params[0] != 2.0f && params[0] != 4.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidTextureEnvScale);
+ return false;
+ }
+ break;
+ case TextureEnvParameter::Color:
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureEnvParameter);
+ return false;
+ }
+ break;
+ case TextureEnvTarget::PointSprite:
+ if (!context->getExtensions().pointSpriteOES)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureEnvTarget);
+ return false;
+ }
+ switch (pname)
+ {
+ case TextureEnvParameter::PointCoordReplace:
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureEnvParameter);
+ return false;
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureEnvTarget);
+ return false;
+ }
+ return true;
+}
+
+bool ValidateGetTexEnvCommon(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname)
+{
+ GLfloat validateParams[4] = {};
+ switch (pname)
+ {
+ case TextureEnvParameter::Mode:
+ ConvertPackedEnum(TextureEnvMode::Add, validateParams);
+ break;
+ case TextureEnvParameter::CombineRgb:
+ case TextureEnvParameter::CombineAlpha:
+ ConvertPackedEnum(TextureCombine::Add, validateParams);
+ break;
+ case TextureEnvParameter::Src0Rgb:
+ case TextureEnvParameter::Src1Rgb:
+ case TextureEnvParameter::Src2Rgb:
+ case TextureEnvParameter::Src0Alpha:
+ case TextureEnvParameter::Src1Alpha:
+ case TextureEnvParameter::Src2Alpha:
+ ConvertPackedEnum(TextureSrc::Constant, validateParams);
+ break;
+ case TextureEnvParameter::Op0Rgb:
+ case TextureEnvParameter::Op1Rgb:
+ case TextureEnvParameter::Op2Rgb:
+ case TextureEnvParameter::Op0Alpha:
+ case TextureEnvParameter::Op1Alpha:
+ case TextureEnvParameter::Op2Alpha:
+ ConvertPackedEnum(TextureOp::SrcAlpha, validateParams);
+ break;
+ case TextureEnvParameter::RgbScale:
+ case TextureEnvParameter::AlphaScale:
+ case TextureEnvParameter::PointCoordReplace:
+ validateParams[0] = 1.0f;
+ break;
+ default:
+ break;
+ }
+
+ return ValidateTexEnvCommon(context, target, pname, validateParams);
+}
+
+bool ValidatePointParameterCommon(const Context *context,
+ PointParameter pname,
+ const GLfloat *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ switch (pname)
+ {
+ case PointParameter::PointSizeMin:
+ case PointParameter::PointSizeMax:
+ case PointParameter::PointFadeThresholdSize:
+ case PointParameter::PointDistanceAttenuation:
+ for (unsigned int i = 0; i < GetPointParameterCount(pname); i++)
+ {
+ if (params[i] < 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidPointParameterValue);
+ return false;
+ }
+ }
+ break;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidPointParameter);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidatePointSizeCommon(const Context *context, GLfloat size)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (size <= 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidPointSizeValue);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateDrawTexCommon(const Context *context, float width, float height)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (width <= 0.0f || height <= 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kNonPositiveDrawTextureDimension);
+ return false;
+ }
+
+ return true;
+}
+
+} // namespace gl
+
+namespace gl
+{
+
+bool ValidateAlphaFunc(const Context *context, AlphaTestFunc func, GLfloat ref)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateAlphaFuncCommon(context, func);
+}
+
+bool ValidateAlphaFuncx(const Context *context, AlphaTestFunc func, GLfixed ref)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateAlphaFuncCommon(context, func);
+}
+
+bool ValidateClearColorx(const Context *context,
+ GLfixed red,
+ GLfixed green,
+ GLfixed blue,
+ GLfixed alpha)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateClearDepthx(const Context *context, GLfixed depth)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateClientActiveTexture(const Context *context, GLenum texture)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateMultitextureUnit(context, texture);
+}
+
+bool ValidateClipPlanef(const Context *context, GLenum plane, const GLfloat *eqn)
+{
+ return ValidateClipPlaneCommon(context, plane);
+}
+
+bool ValidateClipPlanex(const Context *context, GLenum plane, const GLfixed *equation)
+{
+ return ValidateClipPlaneCommon(context, plane);
+}
+
+bool ValidateColor4f(const Context *context,
+ GLfloat red,
+ GLfloat green,
+ GLfloat blue,
+ GLfloat alpha)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateColor4ub(const Context *context,
+ GLubyte red,
+ GLubyte green,
+ GLubyte blue,
+ GLubyte alpha)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateColor4x(const Context *context,
+ GLfixed red,
+ GLfixed green,
+ GLfixed blue,
+ GLfixed alpha)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateColorPointer(const Context *context,
+ GLint size,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ return ValidateBuiltinVertexAttributeCommon(context, ClientVertexArrayType::Color, size, type,
+ stride, pointer);
+}
+
+bool ValidateCullFace(const Context *context, GLenum mode)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateDepthRangex(const Context *context, GLfixed n, GLfixed f)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ if (context->getExtensions().webglCompatibility && n > f)
+ {
+ context->validationError(GL_INVALID_OPERATION, kInvalidDepthRange);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateDisableClientState(const Context *context, ClientVertexArrayType arrayType)
+{
+ return ValidateClientStateCommon(context, arrayType);
+}
+
+bool ValidateEnableClientState(const Context *context, ClientVertexArrayType arrayType)
+{
+ return ValidateClientStateCommon(context, arrayType);
+}
+
+bool ValidateFogf(const Context *context, GLenum pname, GLfloat param)
+{
+ return ValidateFogCommon(context, pname, &param);
+}
+
+bool ValidateFogfv(const Context *context, GLenum pname, const GLfloat *params)
+{
+ return ValidateFogCommon(context, pname, params);
+}
+
+bool ValidateFogx(const Context *context, GLenum pname, GLfixed param)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ GLfloat asFloat =
+ pname == GL_FOG_MODE ? static_cast<GLfloat>(param) : ConvertFixedToFloat(param);
+ return ValidateFogCommon(context, pname, &asFloat);
+}
+
+bool ValidateFogxv(const Context *context, GLenum pname, const GLfixed *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ unsigned int paramCount = GetFogParameterCount(pname);
+ GLfloat paramsf[4] = {};
+
+ if (pname == GL_FOG_MODE)
+ {
+ paramsf[0] = static_cast<GLfloat>(params[0]);
+ }
+ else
+ {
+ for (unsigned int i = 0; i < paramCount; i++)
+ {
+ paramsf[i] = ConvertFixedToFloat(params[i]);
+ }
+ }
+
+ return ValidateFogCommon(context, pname, paramsf);
+}
+
+bool ValidateFrustumf(const Context *context,
+ GLfloat l,
+ GLfloat r,
+ GLfloat b,
+ GLfloat t,
+ GLfloat n,
+ GLfloat f)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ if (l == r || b == t || n == f || n <= 0.0f || f <= 0.0f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidProjectionMatrix);
+ }
+ return true;
+}
+
+bool ValidateFrustumx(const Context *context,
+ GLfixed l,
+ GLfixed r,
+ GLfixed b,
+ GLfixed t,
+ GLfixed n,
+ GLfixed f)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ if (l == r || b == t || n == f || n <= 0 || f <= 0)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidProjectionMatrix);
+ }
+ return true;
+}
+
+bool ValidateGetBufferParameteriv(const Context *context,
+ GLenum target,
+ GLenum pname,
+ const GLint *params)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateGetClipPlanef(const Context *context, GLenum plane, const GLfloat *equation)
+{
+ return ValidateClipPlaneCommon(context, plane);
+}
+
+bool ValidateGetClipPlanex(const Context *context, GLenum plane, const GLfixed *equation)
+{
+ return ValidateClipPlaneCommon(context, plane);
+}
+
+bool ValidateGetFixedv(const Context *context, GLenum pname, const GLfixed *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ GLenum nativeType;
+ unsigned int numParams = 0;
+ return ValidateStateQuery(context, pname, &nativeType, &numParams);
+}
+
+bool ValidateGetLightfv(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ const GLfloat *params)
+{
+ GLfloat validateParams[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ return ValidateLightCommon(context, light, pname, validateParams);
+}
+
+bool ValidateGetLightxv(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ const GLfixed *params)
+{
+ GLfloat validateParams[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+ return ValidateLightCommon(context, light, pname, validateParams);
+}
+
+bool ValidateGetMaterialfv(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfloat *params)
+{
+ return ValidateMaterialQuery(context, face, pname);
+}
+
+bool ValidateGetMaterialxv(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfixed *params)
+{
+ return ValidateMaterialQuery(context, face, pname);
+}
+
+bool ValidateGetTexEnvfv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLfloat *params)
+{
+ return ValidateGetTexEnvCommon(context, target, pname);
+}
+
+bool ValidateGetTexEnviv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLint *params)
+{
+ return ValidateGetTexEnvCommon(context, target, pname);
+}
+
+bool ValidateGetTexEnvxv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLfixed *params)
+{
+ return ValidateGetTexEnvCommon(context, target, pname);
+}
+
+bool ValidateGetTexParameterxv(const Context *context,
+ TextureType target,
+ GLenum pname,
+ const GLfixed *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+
+ if (!ValidateGetTexParameterBase(context, target, pname, nullptr))
+ {
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateLightModelf(const Context *context, GLenum pname, GLfloat param)
+{
+ return ValidateLightModelSingleComponent(context, pname);
+}
+
+bool ValidateLightModelfv(const Context *context, GLenum pname, const GLfloat *params)
+{
+ return ValidateLightModelCommon(context, pname);
+}
+
+bool ValidateLightModelx(const Context *context, GLenum pname, GLfixed param)
+{
+ return ValidateLightModelSingleComponent(context, pname);
+}
+
+bool ValidateLightModelxv(const Context *context, GLenum pname, const GLfixed *param)
+{
+ return ValidateLightModelCommon(context, pname);
+}
+
+bool ValidateLightf(const Context *context, GLenum light, LightParameter pname, GLfloat param)
+{
+ return ValidateLightSingleComponent(context, light, pname, param);
+}
+
+bool ValidateLightfv(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ const GLfloat *params)
+{
+ return ValidateLightCommon(context, light, pname, params);
+}
+
+bool ValidateLightx(const Context *context, GLenum light, LightParameter pname, GLfixed param)
+{
+ return ValidateLightSingleComponent(context, light, pname, ConvertFixedToFloat(param));
+}
+
+bool ValidateLightxv(const Context *context,
+ GLenum light,
+ LightParameter pname,
+ const GLfixed *params)
+{
+ GLfloat paramsf[4];
+ for (unsigned int i = 0; i < GetLightParameterCount(pname); i++)
+ {
+ paramsf[i] = ConvertFixedToFloat(params[i]);
+ }
+
+ return ValidateLightCommon(context, light, pname, paramsf);
+}
+
+bool ValidateLineWidthx(const Context *context, GLfixed width)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ if (width <= 0)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidWidth);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateLoadIdentity(const Context *context)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateLoadMatrixf(const Context *context, const GLfloat *m)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateLoadMatrixx(const Context *context, const GLfixed *m)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateLogicOp(const Context *context, LogicalOperation opcode)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ switch (opcode)
+ {
+ case LogicalOperation::And:
+ case LogicalOperation::AndInverted:
+ case LogicalOperation::AndReverse:
+ case LogicalOperation::Clear:
+ case LogicalOperation::Copy:
+ case LogicalOperation::CopyInverted:
+ case LogicalOperation::Equiv:
+ case LogicalOperation::Invert:
+ case LogicalOperation::Nand:
+ case LogicalOperation::Noop:
+ case LogicalOperation::Nor:
+ case LogicalOperation::Or:
+ case LogicalOperation::OrInverted:
+ case LogicalOperation::OrReverse:
+ case LogicalOperation::Set:
+ case LogicalOperation::Xor:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidLogicOp);
+ return false;
+ }
+}
+
+bool ValidateMaterialf(const Context *context, GLenum face, MaterialParameter pname, GLfloat param)
+{
+ return ValidateMaterialSingleComponent(context, face, pname, param);
+}
+
+bool ValidateMaterialfv(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfloat *params)
+{
+ return ValidateMaterialSetting(context, face, pname, params);
+}
+
+bool ValidateMaterialx(const Context *context, GLenum face, MaterialParameter pname, GLfixed param)
+{
+ return ValidateMaterialSingleComponent(context, face, pname, ConvertFixedToFloat(param));
+}
+
+bool ValidateMaterialxv(const Context *context,
+ GLenum face,
+ MaterialParameter pname,
+ const GLfixed *params)
+{
+ GLfloat paramsf[4];
+
+ for (unsigned int i = 0; i < GetMaterialParameterCount(pname); i++)
+ {
+ paramsf[i] = ConvertFixedToFloat(params[i]);
+ }
+
+ return ValidateMaterialSetting(context, face, pname, paramsf);
+}
+
+bool ValidateMatrixMode(const Context *context, MatrixType mode)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ switch (mode)
+ {
+ case MatrixType::Projection:
+ case MatrixType::Modelview:
+ case MatrixType::Texture:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidMatrixMode);
+ return false;
+ }
+}
+
+bool ValidateMultMatrixf(const Context *context, const GLfloat *m)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateMultMatrixx(const Context *context, const GLfixed *m)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateMultiTexCoord4f(const Context *context,
+ GLenum target,
+ GLfloat s,
+ GLfloat t,
+ GLfloat r,
+ GLfloat q)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateMultitextureUnit(context, target);
+}
+
+bool ValidateMultiTexCoord4x(const Context *context,
+ GLenum target,
+ GLfixed s,
+ GLfixed t,
+ GLfixed r,
+ GLfixed q)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateMultitextureUnit(context, target);
+}
+
+bool ValidateNormal3f(const Context *context, GLfloat nx, GLfloat ny, GLfloat nz)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateNormal3x(const Context *context, GLfixed nx, GLfixed ny, GLfixed nz)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateNormalPointer(const Context *context,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ return ValidateBuiltinVertexAttributeCommon(context, ClientVertexArrayType::Normal, 3, type,
+ stride, pointer);
+}
+
+bool ValidateOrthof(const Context *context,
+ GLfloat l,
+ GLfloat r,
+ GLfloat b,
+ GLfloat t,
+ GLfloat n,
+ GLfloat f)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ // [OpenGL ES 1.1.12] section 2.10.2 page 31:
+ // If l is equal to r, b is equal to t, or n is equal to f, the
+ // error INVALID VALUE results.
+ if (l == r || b == t || n == f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidProjectionMatrix);
+ }
+ return true;
+}
+
+bool ValidateOrthox(const Context *context,
+ GLfixed l,
+ GLfixed r,
+ GLfixed b,
+ GLfixed t,
+ GLfixed n,
+ GLfixed f)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ if (l == r || b == t || n == f)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidProjectionMatrix);
+ }
+ return true;
+}
+
+bool ValidatePointParameterf(const Context *context, PointParameter pname, GLfloat param)
+{
+ unsigned int paramCount = GetPointParameterCount(pname);
+ if (paramCount != 1)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidPointParameter);
+ return false;
+ }
+
+ return ValidatePointParameterCommon(context, pname, &param);
+}
+
+bool ValidatePointParameterfv(const Context *context, PointParameter pname, const GLfloat *params)
+{
+ return ValidatePointParameterCommon(context, pname, params);
+}
+
+bool ValidatePointParameterx(const Context *context, PointParameter pname, GLfixed param)
+{
+ unsigned int paramCount = GetPointParameterCount(pname);
+ if (paramCount != 1)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidPointParameter);
+ return false;
+ }
+
+ GLfloat paramf = ConvertFixedToFloat(param);
+ return ValidatePointParameterCommon(context, pname, &paramf);
+}
+
+bool ValidatePointParameterxv(const Context *context, PointParameter pname, const GLfixed *params)
+{
+ GLfloat paramsf[4] = {};
+ for (unsigned int i = 0; i < GetPointParameterCount(pname); i++)
+ {
+ paramsf[i] = ConvertFixedToFloat(params[i]);
+ }
+ return ValidatePointParameterCommon(context, pname, paramsf);
+}
+
+bool ValidatePointSize(const Context *context, GLfloat size)
+{
+ return ValidatePointSizeCommon(context, size);
+}
+
+bool ValidatePointSizex(const Context *context, GLfixed size)
+{
+ return ValidatePointSizeCommon(context, ConvertFixedToFloat(size));
+}
+
+bool ValidatePolygonOffsetx(const Context *context, GLfixed factor, GLfixed units)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidatePopMatrix(const Context *context)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ const auto &stack = context->getState().gles1().currentMatrixStack();
+ if (stack.size() == 1)
+ {
+ context->validationError(GL_STACK_UNDERFLOW, kMatrixStackUnderflow);
+ return false;
+ }
+ return true;
+}
+
+bool ValidatePushMatrix(const Context *context)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ const auto &stack = context->getState().gles1().currentMatrixStack();
+ if (stack.size() == stack.max_size())
+ {
+ context->validationError(GL_STACK_OVERFLOW, kMatrixStackOverflow);
+ return false;
+ }
+ return true;
+}
+
+bool ValidateRotatef(const Context *context, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateRotatex(const Context *context, GLfixed angle, GLfixed x, GLfixed y, GLfixed z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateSampleCoveragex(const Context *context, GLclampx value, GLboolean invert)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateScalef(const Context *context, GLfloat x, GLfloat y, GLfloat z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateScalex(const Context *context, GLfixed x, GLfixed y, GLfixed z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateShadeModel(const Context *context, ShadingModel mode)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ switch (mode)
+ {
+ case ShadingModel::Flat:
+ case ShadingModel::Smooth:
+ return true;
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidShadingModel);
+ return false;
+ }
+}
+
+bool ValidateTexCoordPointer(const Context *context,
+ GLint size,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ return ValidateBuiltinVertexAttributeCommon(context, ClientVertexArrayType::TextureCoord, size,
+ type, stride, pointer);
+}
+
+bool ValidateTexEnvf(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ GLfloat param)
+{
+ return ValidateTexEnvCommon(context, target, pname, &param);
+}
+
+bool ValidateTexEnvfv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLfloat *params)
+{
+ return ValidateTexEnvCommon(context, target, pname, params);
+}
+
+bool ValidateTexEnvi(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ GLint param)
+{
+ GLfloat paramf = static_cast<GLfloat>(param);
+ return ValidateTexEnvCommon(context, target, pname, &paramf);
+}
+
+bool ValidateTexEnviv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLint *params)
+{
+ GLfloat paramsf[4];
+ for (unsigned int i = 0; i < GetTextureEnvParameterCount(pname); i++)
+ {
+ paramsf[i] = static_cast<GLfloat>(params[i]);
+ }
+ return ValidateTexEnvCommon(context, target, pname, paramsf);
+}
+
+bool ValidateTexEnvx(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ GLfixed param)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ GLfloat paramsf[4] = {};
+ ConvertTextureEnvFromFixed(pname, &param, paramsf);
+ return ValidateTexEnvCommon(context, target, pname, paramsf);
+}
+
+bool ValidateTexEnvxv(const Context *context,
+ TextureEnvTarget target,
+ TextureEnvParameter pname,
+ const GLfixed *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ GLfloat paramsf[4] = {};
+ ConvertTextureEnvFromFixed(pname, params, paramsf);
+ return ValidateTexEnvCommon(context, target, pname, paramsf);
+}
+
+bool ValidateTexParameterBaseForGLfixed(const Context *context,
+ TextureType target,
+ GLenum pname,
+ GLsizei bufSize,
+ bool vectorParams,
+ const GLfixed *params)
+{
+ // Convert GLfixed parameter for GL_TEXTURE_MAX_ANISOTROPY_EXT independently
+ // since it compares against 1 and maxTextureAnisotropy instead of just 0
+ // (other values are fine to leave unconverted since they only check positive or negative or
+ // are used as enums)
+ GLfloat paramValue;
+ if (pname == GL_TEXTURE_MAX_ANISOTROPY_EXT)
+ {
+ paramValue = ConvertFixedToFloat(static_cast<GLfixed>(params[0]));
+ }
+ else
+ {
+ paramValue = static_cast<GLfloat>(params[0]);
+ }
+ return ValidateTexParameterBase(context, target, pname, bufSize, vectorParams, &paramValue);
+}
+
+bool ValidateTexParameterx(const Context *context, TextureType target, GLenum pname, GLfixed param)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateTexParameterBaseForGLfixed(context, target, pname, -1, false, &param);
+}
+
+bool ValidateTexParameterxv(const Context *context,
+ TextureType target,
+ GLenum pname,
+ const GLfixed *params)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return ValidateTexParameterBaseForGLfixed(context, target, pname, -1, true, params);
+}
+
+bool ValidateTranslatef(const Context *context, GLfloat x, GLfloat y, GLfloat z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateTranslatex(const Context *context, GLfixed x, GLfixed y, GLfixed z)
+{
+ ANGLE_VALIDATE_IS_GLES1(context);
+ return true;
+}
+
+bool ValidateVertexPointer(const Context *context,
+ GLint size,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ return ValidateBuiltinVertexAttributeCommon(context, ClientVertexArrayType::Vertex, size, type,
+ stride, pointer);
+}
+
+bool ValidateDrawTexfOES(const Context *context,
+ GLfloat x,
+ GLfloat y,
+ GLfloat z,
+ GLfloat width,
+ GLfloat height)
+{
+ return ValidateDrawTexCommon(context, width, height);
+}
+
+bool ValidateDrawTexfvOES(const Context *context, const GLfloat *coords)
+{
+ return ValidateDrawTexCommon(context, coords[3], coords[4]);
+}
+
+bool ValidateDrawTexiOES(const Context *context,
+ GLint x,
+ GLint y,
+ GLint z,
+ GLint width,
+ GLint height)
+{
+ return ValidateDrawTexCommon(context, static_cast<GLfloat>(width),
+ static_cast<GLfloat>(height));
+}
+
+bool ValidateDrawTexivOES(const Context *context, const GLint *coords)
+{
+ return ValidateDrawTexCommon(context, static_cast<GLfloat>(coords[3]),
+ static_cast<GLfloat>(coords[4]));
+}
+
+bool ValidateDrawTexsOES(const Context *context,
+ GLshort x,
+ GLshort y,
+ GLshort z,
+ GLshort width,
+ GLshort height)
+{
+ return ValidateDrawTexCommon(context, static_cast<GLfloat>(width),
+ static_cast<GLfloat>(height));
+}
+
+bool ValidateDrawTexsvOES(const Context *context, const GLshort *coords)
+{
+ return ValidateDrawTexCommon(context, static_cast<GLfloat>(coords[3]),
+ static_cast<GLfloat>(coords[4]));
+}
+
+bool ValidateDrawTexxOES(const Context *context,
+ GLfixed x,
+ GLfixed y,
+ GLfixed z,
+ GLfixed width,
+ GLfixed height)
+{
+ return ValidateDrawTexCommon(context, ConvertFixedToFloat(width), ConvertFixedToFloat(height));
+}
+
+bool ValidateDrawTexxvOES(const Context *context, const GLfixed *coords)
+{
+ return ValidateDrawTexCommon(context, ConvertFixedToFloat(coords[3]),
+ ConvertFixedToFloat(coords[4]));
+}
+
+bool ValidateCurrentPaletteMatrixOES(const Context *context, GLuint matrixpaletteindex)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateLoadPaletteFromModelViewMatrixOES(const Context *context)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateMatrixIndexPointerOES(const Context *context,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void *pointer)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateWeightPointerOES(const Context *context,
+ GLint size,
+ GLenum type,
+ GLsizei stride,
+ const void *pointer)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidatePointSizePointerOES(const Context *context,
+ VertexAttribType type,
+ GLsizei stride,
+ const void *pointer)
+{
+ return ValidateBuiltinVertexAttributeCommon(context, ClientVertexArrayType::PointSize, 1, type,
+ stride, pointer);
+}
+
+bool ValidateQueryMatrixxOES(const Context *context, const GLfixed *mantissa, const GLint *exponent)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateGenFramebuffersOES(const Context *context,
+ GLsizei n,
+ const FramebufferID *framebuffers)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteFramebuffersOES(const Context *context,
+ GLsizei n,
+ const FramebufferID *framebuffers)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateGenRenderbuffersOES(const Context *context,
+ GLsizei n,
+ const RenderbufferID *renderbuffers)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateDeleteRenderbuffersOES(const Context *context,
+ GLsizei n,
+ const RenderbufferID *renderbuffers)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenOrDelete(context, n);
+}
+
+bool ValidateBindFramebufferOES(const Context *context, GLenum target, FramebufferID framebuffer)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateBindFramebufferBase(context, target, framebuffer);
+}
+
+bool ValidateBindRenderbufferOES(const Context *context, GLenum target, RenderbufferID renderbuffer)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateBindRenderbufferBase(context, target, renderbuffer);
+}
+
+bool ValidateCheckFramebufferStatusOES(const Context *context, GLenum target)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ if (!ValidFramebufferTarget(context, target))
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidFramebufferTarget);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateFramebufferRenderbufferOES(const Context *context,
+ GLenum target,
+ GLenum attachment,
+ GLenum rbtarget,
+ RenderbufferID renderbuffer)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateFramebufferRenderbufferBase(context, target, attachment, rbtarget, renderbuffer);
+}
+
+bool ValidateFramebufferTexture2DOES(const Context *context,
+ GLenum target,
+ GLenum attachment,
+ TextureTarget textarget,
+ TextureID texture,
+ GLint level)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ if (level != 0)
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidFramebufferTextureLevel);
+ return false;
+ }
+
+ if (!ValidateFramebufferTextureBase(context, target, attachment, texture, level))
+ {
+ return false;
+ }
+
+ if (texture.value != 0)
+ {
+ Texture *tex = context->getTexture(texture);
+ ASSERT(tex);
+
+ const Caps &caps = context->getCaps();
+
+ switch (textarget)
+ {
+ case TextureTarget::_2D:
+ {
+ if (level > log2(caps.max2DTextureSize))
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+ return false;
+ }
+ if (tex->getType() != TextureType::_2D)
+ {
+ context->validationError(GL_INVALID_OPERATION, kInvalidTextureTarget);
+ return false;
+ }
+ }
+ break;
+
+ case TextureTarget::CubeMapNegativeX:
+ case TextureTarget::CubeMapNegativeY:
+ case TextureTarget::CubeMapNegativeZ:
+ case TextureTarget::CubeMapPositiveX:
+ case TextureTarget::CubeMapPositiveY:
+ case TextureTarget::CubeMapPositiveZ:
+ {
+ if (!context->getExtensions().textureCubeMapOES)
+ {
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
+ return false;
+ }
+
+ if (level > log2(caps.maxCubeMapTextureSize))
+ {
+ context->validationError(GL_INVALID_VALUE, kInvalidMipLevel);
+ return false;
+ }
+ if (tex->getType() != TextureType::CubeMap)
+ {
+ context->validationError(GL_INVALID_OPERATION, kTextureTargetMismatch);
+ return false;
+ }
+ }
+ break;
+
+ default:
+ context->validationError(GL_INVALID_ENUM, kInvalidTextureTarget);
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool ValidateGenerateMipmapOES(const Context *context, TextureType target)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGenerateMipmapBase(context, target);
+}
+
+bool ValidateGetFramebufferAttachmentParameterivOES(const Context *context,
+ GLenum target,
+ GLenum attachment,
+ GLenum pname,
+ const GLint *params)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGetFramebufferAttachmentParameterivBase(context, target, attachment, pname,
+ nullptr);
+}
+
+bool ValidateGetRenderbufferParameterivOES(const Context *context,
+ GLenum target,
+ GLenum pname,
+ const GLint *params)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateGetRenderbufferParameterivBase(context, target, pname, nullptr);
+}
+
+bool ValidateIsFramebufferOES(const Context *context, FramebufferID framebuffer)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateIsRenderbufferOES(const Context *context, RenderbufferID renderbuffer)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return true;
+}
+
+bool ValidateRenderbufferStorageOES(const Context *context,
+ GLenum target,
+ GLenum internalformat,
+ GLsizei width,
+ GLsizei height)
+{
+ if (!context->getExtensions().framebufferObjectOES)
+ {
+ context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
+ return false;
+ }
+
+ return ValidateRenderbufferStorageParametersBase(context, target, 0, internalformat, width,
+ height);
+}
+
+// GL_OES_texture_cube_map
+
+bool ValidateGetTexGenfvOES(const Context *context,
+ GLenum coord,
+ GLenum pname,
+ const GLfloat *params)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateGetTexGenivOES(const Context *context, GLenum coord, GLenum pname, const int *params)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateGetTexGenxvOES(const Context *context,
+ GLenum coord,
+ GLenum pname,
+ const GLfixed *params)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGenfvOES(const Context *context, GLenum coord, GLenum pname, const GLfloat *params)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGenivOES(const Context *context, GLenum coord, GLenum pname, const GLint *param)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGenxvOES(const Context *context, GLenum coord, GLenum pname, const GLint *param)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGenfOES(const Context *context, GLenum coord, GLenum pname, GLfloat param)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGeniOES(const Context *context, GLenum coord, GLenum pname, GLint param)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+bool ValidateTexGenxOES(const Context *context, GLenum coord, GLenum pname, GLfixed param)
+{
+ UNIMPLEMENTED();
+ return true;
+}
+
+} // namespace gl