Commit 0b031061 by Geoff Lang Committed by Commit Bot

Implement robust GetVertexAttrib entry points.

BUG=angleproject:1354 Change-Id: Ic71392555ae4212c4144bc67d7c5e53874af4d53 Reviewed-on: https://chromium-review.googlesource.com/398198Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>
parent 336b1470
...@@ -39,9 +39,6 @@ struct VertexAttribute ...@@ -39,9 +39,6 @@ struct VertexAttribute
bool operator==(const VertexAttribute &a, const VertexAttribute &b); bool operator==(const VertexAttribute &a, const VertexAttribute &b);
bool operator!=(const VertexAttribute &a, const VertexAttribute &b); bool operator!=(const VertexAttribute &a, const VertexAttribute &b);
template <typename T>
T QuerySingleVertexAttributeParameter(const VertexAttribute& attrib, GLenum pname);
size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib); size_t ComputeVertexAttributeTypeSize(const VertexAttribute& attrib);
size_t ComputeVertexAttributeStride(const VertexAttribute& attrib); size_t ComputeVertexAttributeStride(const VertexAttribute& attrib);
size_t ComputeVertexAttributeElementCount(const VertexAttribute &attrib, size_t ComputeVertexAttributeElementCount(const VertexAttribute &attrib,
......
...@@ -27,33 +27,6 @@ inline bool operator!=(const VertexAttribute &a, const VertexAttribute &b) ...@@ -27,33 +27,6 @@ inline bool operator!=(const VertexAttribute &a, const VertexAttribute &b)
return !(a == b); return !(a == b);
} }
template <typename T>
T QuerySingleVertexAttributeParameter(const VertexAttribute& attrib, GLenum pname)
{
switch (pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
return static_cast<T>(attrib.enabled ? GL_TRUE : GL_FALSE);
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
return static_cast<T>(attrib.size);
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
return static_cast<T>(attrib.stride);
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
return static_cast<T>(attrib.type);
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
return static_cast<T>(attrib.normalized ? GL_TRUE : GL_FALSE);
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
return static_cast<T>(attrib.buffer.id());
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
return static_cast<T>(attrib.divisor);
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
return static_cast<T>(attrib.pureInteger ? GL_TRUE : GL_FALSE);
default:
UNREACHABLE();
return static_cast<T>(0);
}
}
inline VertexAttribCurrentValueData::VertexAttribCurrentValueData() inline VertexAttribCurrentValueData::VertexAttribCurrentValueData()
: Type(GL_FLOAT) : Type(GL_FLOAT)
{ {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "libANGLE/Sampler.h" #include "libANGLE/Sampler.h"
#include "libANGLE/Shader.h" #include "libANGLE/Shader.h"
#include "libANGLE/Texture.h" #include "libANGLE/Texture.h"
#include "libANGLE/VertexAttribute.h"
namespace gl namespace gl
{ {
...@@ -239,6 +240,62 @@ void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *pa ...@@ -239,6 +240,62 @@ void SetSamplerParameterBase(Sampler *sampler, GLenum pname, const ParamType *pa
} }
} }
template <typename ParamType, typename CurrentDataType>
ParamType ConvertCurrentValue(CurrentDataType currentValue)
{
return static_cast<ParamType>(currentValue);
}
template <>
GLint ConvertCurrentValue(GLfloat currentValue)
{
return iround<GLint>(currentValue);
}
template <typename ParamType, typename CurrentDataType, size_t CurrentValueCount>
void QueryVertexAttribBase(const VertexAttribute &attrib,
const CurrentDataType (&currentValueData)[CurrentValueCount],
GLenum pname,
ParamType *params)
{
switch (pname)
{
case GL_CURRENT_VERTEX_ATTRIB:
for (size_t i = 0; i < CurrentValueCount; ++i)
{
params[i] = ConvertCurrentValue<ParamType>(currentValueData[i]);
}
break;
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
*params = ConvertFromGLboolean<ParamType>(attrib.enabled);
break;
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
*params = ConvertFromGLuint<ParamType>(attrib.size);
break;
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
*params = ConvertFromGLuint<ParamType>(attrib.stride);
break;
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
*params = ConvertFromGLenum<ParamType>(attrib.type);
break;
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
*params = ConvertFromGLboolean<ParamType>(attrib.normalized);
break;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
*params = ConvertFromGLuint<ParamType>(attrib.buffer.id());
break;
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
*params = ConvertFromGLuint<ParamType>(attrib.divisor);
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
*params = ConvertFromGLboolean<ParamType>(attrib.pureInteger);
break;
default:
UNREACHABLE();
break;
}
}
} // anonymous namespace } // anonymous namespace
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
...@@ -521,6 +578,52 @@ void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params ...@@ -521,6 +578,52 @@ void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params
QuerySamplerParameterBase(sampler, pname, params); QuerySamplerParameterBase(sampler, pname, params);
} }
void QueryVertexAttribfv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLfloat *params)
{
QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
}
void QueryVertexAttribiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLint *params)
{
QueryVertexAttribBase(attrib, currentValueData.FloatValues, pname, params);
}
void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer)
{
switch (pname)
{
case GL_VERTEX_ATTRIB_ARRAY_POINTER:
*pointer = const_cast<GLvoid *>(attrib.pointer);
break;
default:
UNREACHABLE();
break;
}
}
void QueryVertexAttribIiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLint *params)
{
QueryVertexAttribBase(attrib, currentValueData.IntValues, pname, params);
}
void QueryVertexAttribIuiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLuint *params)
{
QueryVertexAttribBase(attrib, currentValueData.UnsignedIntValues, pname, params);
}
void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param) void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param)
{ {
SetTexParameterBase(texture, pname, &param); SetTexParameterBase(texture, pname, &param);
......
...@@ -21,6 +21,8 @@ class Renderbuffer; ...@@ -21,6 +21,8 @@ class Renderbuffer;
class Sampler; class Sampler;
class Shader; class Shader;
class Texture; class Texture;
struct VertexAttribute;
struct VertexAttribCurrentValueData;
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer, void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLenum attachment, GLenum attachment,
...@@ -34,6 +36,23 @@ void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params); ...@@ -34,6 +36,23 @@ void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params);
void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params); void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params);
void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params); void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *params);
void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params); void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *params);
void QueryVertexAttribfv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLfloat *params);
void QueryVertexAttribiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLint *params);
void QueryVertexAttribPointerv(const VertexAttribute &attrib, GLenum pname, GLvoid **pointer);
void QueryVertexAttribIiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLint *params);
void QueryVertexAttribIuiv(const VertexAttribute &attrib,
const VertexAttribCurrentValueData &currentValueData,
GLenum pname,
GLuint *params);
void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param); void SetTexParameterf(Texture *texture, GLenum pname, GLfloat param);
void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params); void SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params);
......
...@@ -926,6 +926,96 @@ bool ValidateGetSamplerParameterBase(Context *context, ...@@ -926,6 +926,96 @@ bool ValidateGetSamplerParameterBase(Context *context,
return true; return true;
} }
bool ValidateGetVertexAttribBase(Context *context,
GLuint index,
GLenum pname,
GLsizei *length,
bool pointer,
bool pureIntegerEntryPoint)
{
if (length)
{
*length = 0;
}
if (pureIntegerEntryPoint && context->getClientMajorVersion() < 3)
{
context->handleError(
Error(GL_INVALID_OPERATION, "Context does not support OpenGL ES 3.0."));
return false;
}
if (index >= context->getCaps().maxVertexAttributes)
{
context->handleError(Error(
GL_INVALID_VALUE, "index must be less than the value of GL_MAX_VERTEX_ATTRIBUTES."));
return false;
}
if (pointer)
{
if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
{
context->handleError(Error(GL_INVALID_ENUM, "Unknown pname."));
return false;
}
}
else
{
switch (pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
case GL_CURRENT_VERTEX_ATTRIB:
break;
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
static_assert(
GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE,
"ANGLE extension enums not equal to GL enums.");
if (context->getClientMajorVersion() < 3 &&
!context->getExtensions().instancedArrays)
{
context->handleError(Error(GL_INVALID_ENUM,
"GL_VERTEX_ATTRIB_ARRAY_DIVISOR requires OpenGL ES "
"3.0 or GL_ANGLE_instanced_arrays."));
return false;
}
break;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_ENUM, "pname requires OpenGL ES 3.0."));
return false;
}
break;
default:
context->handleError(Error(GL_INVALID_ENUM, "Unknown pname."));
return false;
}
}
if (length)
{
if (pname == GL_CURRENT_VERTEX_ATTRIB)
{
*length = 4;
}
else
{
*length = 1;
}
}
return true;
}
} // anonymous namespace } // anonymous namespace
bool ValidTextureTarget(const ValidationContext *context, GLenum target) bool ValidTextureTarget(const ValidationContext *context, GLenum target)
...@@ -1681,40 +1771,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context, ...@@ -1681,40 +1771,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context,
return true; return true;
} }
bool ValidateGetVertexAttribParameters(Context *context, GLenum pname)
{
switch (pname)
{
case GL_VERTEX_ATTRIB_ARRAY_ENABLED:
case GL_VERTEX_ATTRIB_ARRAY_SIZE:
case GL_VERTEX_ATTRIB_ARRAY_STRIDE:
case GL_VERTEX_ATTRIB_ARRAY_TYPE:
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED:
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING:
case GL_CURRENT_VERTEX_ATTRIB:
return true;
case GL_VERTEX_ATTRIB_ARRAY_DIVISOR:
// Don't verify ES3 context because GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE uses
// the same constant.
static_assert(GL_VERTEX_ATTRIB_ARRAY_DIVISOR == GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE,
"ANGLE extension enums not equal to GL enums.");
return true;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_ENUM));
return false;
}
return true;
default:
context->handleError(Error(GL_INVALID_ENUM));
return false;
}
}
bool ValidateReadPixels(ValidationContext *context, bool ValidateReadPixels(ValidationContext *context,
GLint x, GLint x,
GLint y, GLint y,
...@@ -4557,4 +4613,154 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context, ...@@ -4557,4 +4613,154 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context,
return ValidateSamplerParameterBase(context, sampler, pname, bufSize, params); return ValidateSamplerParameterBase(context, sampler, pname, bufSize, params);
} }
bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params)
{
return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
}
bool ValidateGetVertexAttribfvRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLfloat *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetVertexAttribBase(context, index, pname, length, false, false))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params)
{
return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, false);
}
bool ValidateGetVertexAttribivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetVertexAttribBase(context, index, pname, length, false, false))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer)
{
return ValidateGetVertexAttribBase(context, index, pname, nullptr, true, false);
}
bool ValidateGetVertexAttribPointervRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
void **pointer)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetVertexAttribBase(context, index, pname, length, true, false))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetVertexAttribIiv(Context *context, GLuint index, GLenum pname, GLint *params)
{
return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, true);
}
bool ValidateGetVertexAttribIivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetVertexAttribBase(context, index, pname, length, false, true))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
bool ValidateGetVertexAttribIuiv(Context *context, GLuint index, GLenum pname, GLuint *params)
{
return ValidateGetVertexAttribBase(context, index, pname, nullptr, false, true);
}
bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint *params)
{
if (!ValidateRobustEntryPoint(context, bufSize))
{
return false;
}
if (!ValidateGetVertexAttribBase(context, index, pname, length, false, true))
{
return false;
}
if (!ValidateRobustBufferSize(context, bufSize, *length))
{
return false;
}
return true;
}
} // namespace gl } // namespace gl
...@@ -93,8 +93,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context, ...@@ -93,8 +93,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context,
GLbitfield mask, GLbitfield mask,
GLenum filter); GLenum filter);
bool ValidateGetVertexAttribParameters(Context *context, GLenum pname);
bool ValidateReadPixels(ValidationContext *context, bool ValidateReadPixels(ValidationContext *context,
GLint x, GLint x,
GLint y, GLint y,
...@@ -439,6 +437,46 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context, ...@@ -439,6 +437,46 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context,
GLsizei bufSize, GLsizei bufSize,
const GLint *params); const GLint *params);
bool ValidateGetVertexAttribfv(Context *context, GLuint index, GLenum pname, GLfloat *params);
bool ValidateGetVertexAttribfvRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLfloat *params);
bool ValidateGetVertexAttribiv(Context *context, GLuint index, GLenum pname, GLint *params);
bool ValidateGetVertexAttribivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
bool ValidateGetVertexAttribPointerv(Context *context, GLuint index, GLenum pname, void **pointer);
bool ValidateGetVertexAttribPointervRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
void **pointer);
bool ValidateGetVertexAttribIiv(Context *context, GLuint index, GLenum pname, GLint *params);
bool ValidateGetVertexAttribIivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLint *params);
bool ValidateGetVertexAttribIuiv(Context *context, GLuint index, GLenum pname, GLuint *params);
bool ValidateGetVertexAttribIuivRobustANGLE(Context *context,
GLuint index,
GLenum pname,
GLsizei bufSize,
GLsizei *length,
GLuint *params);
// Error messages shared here for use in testing. // Error messages shared here for use in testing.
extern const char *g_ExceedsMaxElementErrorMessage; extern const char *g_ExceedsMaxElementErrorMessage;
} // namespace gl } // namespace gl
......
...@@ -1822,32 +1822,16 @@ void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params) ...@@ -1822,32 +1822,16 @@ void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (index >= MAX_VERTEX_ATTRIBS) if (!context->skipValidation() && !ValidateGetVertexAttribfv(context, index, pname, params))
{ {
context->handleError(Error(GL_INVALID_VALUE));
return; return;
} }
if (!ValidateGetVertexAttribParameters(context, pname)) const VertexAttribCurrentValueData &currentValues =
{ context->getGLState().getVertexAttribCurrentValue(index);
return; const VertexAttribute &attrib =
} context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribfv(attrib, currentValues, pname, params);
if (pname == GL_CURRENT_VERTEX_ATTRIB)
{
const VertexAttribCurrentValueData &currentValueData =
context->getGLState().getVertexAttribCurrentValue(index);
for (int i = 0; i < 4; ++i)
{
params[i] = currentValueData.FloatValues[i];
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLfloat>(attribState, pname);
}
} }
} }
...@@ -1858,33 +1842,16 @@ void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint* params) ...@@ -1858,33 +1842,16 @@ void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (index >= MAX_VERTEX_ATTRIBS) if (!context->skipValidation() && !ValidateGetVertexAttribiv(context, index, pname, params))
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
{ {
return; return;
} }
if (pname == GL_CURRENT_VERTEX_ATTRIB) const VertexAttribCurrentValueData &currentValues =
{ context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribCurrentValueData &currentValueData = const VertexAttribute &attrib =
context->getGLState().getVertexAttribCurrentValue(index); context->getGLState().getVertexArray()->getVertexAttribute(index);
for (int i = 0; i < 4; ++i) QueryVertexAttribiv(attrib, currentValues, pname, params);
{
float currentValue = currentValueData.FloatValues[i];
params[i] = iround<GLint>(currentValue);
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
}
} }
} }
...@@ -1895,19 +1862,15 @@ void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** po ...@@ -1895,19 +1862,15 @@ void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** po
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (index >= MAX_VERTEX_ATTRIBS) if (!context->skipValidation() &&
{ !ValidateGetVertexAttribPointerv(context, index, pname, pointer))
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
{ {
context->handleError(Error(GL_INVALID_ENUM));
return; return;
} }
*pointer = const_cast<GLvoid *>(context->getGLState().getVertexAttribPointer(index)); const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribPointerv(attrib, pname, pointer);
} }
} }
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include "libANGLE/Query.h" #include "libANGLE/Query.h"
#include "libANGLE/queryconversions.h" #include "libANGLE/queryconversions.h"
#include "libANGLE/queryutils.h" #include "libANGLE/queryutils.h"
#include "libANGLE/VertexArray.h"
#include "libANGLE/validationES.h" #include "libANGLE/validationES.h"
#include "libANGLE/validationES2.h" #include "libANGLE/validationES2.h"
...@@ -2334,7 +2335,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribfvRobustANGLE(GLuint index, ...@@ -2334,7 +2335,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribfvRobustANGLE(GLuint index,
"(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLfloat* params = 0x%0.8p)", "GLfloat* params = 0x%0.8p)",
index, pname, bufSize, length, params); index, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetVertexAttribfvRobustANGLE(context, index, pname, bufSize, &writeLength,
params))
{
return;
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribfv(attrib, currentValues, pname, params);
SetRobustLengthParam(length, writeLength);
}
} }
ANGLE_EXPORT void GL_APIENTRY GetVertexAttribivRobustANGLE(GLuint index, ANGLE_EXPORT void GL_APIENTRY GetVertexAttribivRobustANGLE(GLuint index,
...@@ -2347,7 +2365,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribivRobustANGLE(GLuint index, ...@@ -2347,7 +2365,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribivRobustANGLE(GLuint index,
"(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLint* params = 0x%0.8p)", "GLint* params = 0x%0.8p)",
index, pname, bufSize, length, params); index, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetVertexAttribivRobustANGLE(context, index, pname, bufSize, &writeLength,
params))
{
return;
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribiv(attrib, currentValues, pname, params);
SetRobustLengthParam(length, writeLength);
}
} }
ANGLE_EXPORT void GL_APIENTRY GetVertexAttribPointervRobustANGLE(GLuint index, ANGLE_EXPORT void GL_APIENTRY GetVertexAttribPointervRobustANGLE(GLuint index,
...@@ -2360,7 +2395,22 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribPointervRobustANGLE(GLuint index, ...@@ -2360,7 +2395,22 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribPointervRobustANGLE(GLuint index,
"(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint index = %d, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLvoid** pointer = 0x%0.8p)", "GLvoid** pointer = 0x%0.8p)",
index, pname, bufSize, length, pointer); index, pname, bufSize, length, pointer);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetVertexAttribPointervRobustANGLE(context, index, pname, bufSize,
&writeLength, pointer))
{
return;
}
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribPointerv(attrib, pname, pointer);
SetRobustLengthParam(length, writeLength);
}
} }
ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x, ANGLE_EXPORT void GL_APIENTRY ReadPixelsRobustANGLE(GLint x,
...@@ -2581,7 +2631,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIivRobustANGLE(GLuint index, ...@@ -2581,7 +2631,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIivRobustANGLE(GLuint index,
"(GLuint index = %u, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint index = %u, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLint* params = 0x%0.8p)", "GLint* params = 0x%0.8p)",
index, pname, bufSize, length, params); index, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetVertexAttribIivRobustANGLE(context, index, pname, bufSize, &writeLength,
params))
{
return;
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribIiv(attrib, currentValues, pname, params);
SetRobustLengthParam(length, writeLength);
}
} }
ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuivRobustANGLE(GLuint index, ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuivRobustANGLE(GLuint index,
...@@ -2594,7 +2661,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuivRobustANGLE(GLuint index, ...@@ -2594,7 +2661,24 @@ ANGLE_EXPORT void GL_APIENTRY GetVertexAttribIuivRobustANGLE(GLuint index,
"(GLuint index = %u, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, " "(GLuint index = %u, GLenum pname = 0x%X, GLsizei bufsize = %d, GLsizei* length = 0x%0.8p, "
"GLuint* params = 0x%0.8p)", "GLuint* params = 0x%0.8p)",
index, pname, bufSize, length, params); index, pname, bufSize, length, params);
UNIMPLEMENTED();
Context *context = GetValidGlobalContext();
if (context)
{
GLsizei writeLength = 0;
if (!ValidateGetVertexAttribIuivRobustANGLE(context, index, pname, bufSize, &writeLength,
params))
{
return;
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribIuiv(attrib, currentValues, pname, params);
SetRobustLengthParam(length, writeLength);
}
} }
ANGLE_EXPORT void GL_APIENTRY GetUniformuivRobustANGLE(GLuint program, ANGLE_EXPORT void GL_APIENTRY GetUniformuivRobustANGLE(GLuint program,
......
...@@ -1038,38 +1038,17 @@ void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params) ...@@ -1038,38 +1038,17 @@ void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (context->getClientMajorVersion() < 3) if (!context->skipValidation() &&
{ !ValidateGetVertexAttribIiv(context, index, pname, params))
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
{ {
return; return;
} }
if (pname == GL_CURRENT_VERTEX_ATTRIB) const VertexAttribCurrentValueData &currentValues =
{ context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribCurrentValueData &currentValueData = const VertexAttribute &attrib =
context->getGLState().getVertexAttribCurrentValue(index); context->getGLState().getVertexArray()->getVertexAttribute(index);
for (int i = 0; i < 4; ++i) QueryVertexAttribIiv(attrib, currentValues, pname, params);
{
params[i] = currentValueData.IntValues[i];
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
}
} }
} }
...@@ -1081,38 +1060,17 @@ void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params) ...@@ -1081,38 +1060,17 @@ void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
Context *context = GetValidGlobalContext(); Context *context = GetValidGlobalContext();
if (context) if (context)
{ {
if (context->getClientMajorVersion() < 3) if (!context->skipValidation() &&
{ !ValidateGetVertexAttribIuiv(context, index, pname, params))
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
{ {
return; return;
} }
if (pname == GL_CURRENT_VERTEX_ATTRIB) const VertexAttribCurrentValueData &currentValues =
{ context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribCurrentValueData &currentValueData = const VertexAttribute &attrib =
context->getGLState().getVertexAttribCurrentValue(index); context->getGLState().getVertexArray()->getVertexAttribute(index);
for (int i = 0; i < 4; ++i) QueryVertexAttribIuiv(attrib, currentValues, pname, params);
{
params[i] = currentValueData.UnsignedIntValues[i];
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
}
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment