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
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 ComputeVertexAttributeStride(const VertexAttribute& attrib);
size_t ComputeVertexAttributeElementCount(const VertexAttribute &attrib,
......
......@@ -27,33 +27,6 @@ inline bool operator!=(const VertexAttribute &a, const VertexAttribute &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()
: Type(GL_FLOAT)
{
......
......@@ -17,6 +17,7 @@
#include "libANGLE/Sampler.h"
#include "libANGLE/Shader.h"
#include "libANGLE/Texture.h"
#include "libANGLE/VertexAttribute.h"
namespace gl
{
......@@ -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
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
......@@ -521,6 +578,52 @@ void QuerySamplerParameteriv(const Sampler *sampler, GLenum pname, GLint *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)
{
SetTexParameterBase(texture, pname, &param);
......
......@@ -21,6 +21,8 @@ class Renderbuffer;
class Sampler;
class Shader;
class Texture;
struct VertexAttribute;
struct VertexAttribCurrentValueData;
void QueryFramebufferAttachmentParameteriv(const Framebuffer *framebuffer,
GLenum attachment,
......@@ -34,6 +36,23 @@ void QueryTexParameterfv(const Texture *texture, GLenum pname, GLfloat *params);
void QueryTexParameteriv(const Texture *texture, GLenum pname, GLint *params);
void QuerySamplerParameterfv(const Sampler *sampler, GLenum pname, GLfloat *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 SetTexParameterfv(Texture *texture, GLenum pname, const GLfloat *params);
......
......@@ -926,6 +926,96 @@ bool ValidateGetSamplerParameterBase(Context *context,
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
bool ValidTextureTarget(const ValidationContext *context, GLenum target)
......@@ -1681,40 +1771,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context,
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,
GLint x,
GLint y,
......@@ -4557,4 +4613,154 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context,
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
......@@ -93,8 +93,6 @@ bool ValidateBlitFramebufferParameters(ValidationContext *context,
GLbitfield mask,
GLenum filter);
bool ValidateGetVertexAttribParameters(Context *context, GLenum pname);
bool ValidateReadPixels(ValidationContext *context,
GLint x,
GLint y,
......@@ -439,6 +437,46 @@ bool ValidateSamplerParameterivRobustANGLE(Context *context,
GLsizei bufSize,
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.
extern const char *g_ExceedsMaxElementErrorMessage;
} // namespace gl
......
......@@ -1822,32 +1822,16 @@ void GL_APIENTRY GetVertexAttribfv(GLuint index, GLenum pname, GLfloat* params)
Context *context = GetValidGlobalContext();
if (context)
{
if (index >= MAX_VERTEX_ATTRIBS)
if (!context->skipValidation() && !ValidateGetVertexAttribfv(context, index, pname, params))
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
{
return;
}
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);
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribfv(attrib, currentValues, pname, params);
}
}
......@@ -1858,33 +1842,16 @@ void GL_APIENTRY GetVertexAttribiv(GLuint index, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext();
if (context)
{
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
if (!context->skipValidation() && !ValidateGetVertexAttribiv(context, index, pname, params))
{
return;
}
if (pname == GL_CURRENT_VERTEX_ATTRIB)
{
const VertexAttribCurrentValueData &currentValueData =
context->getGLState().getVertexAttribCurrentValue(index);
for (int i = 0; i < 4; ++i)
{
float currentValue = currentValueData.FloatValues[i];
params[i] = iround<GLint>(currentValue);
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribiv(attrib, currentValues, pname, params);
}
}
......@@ -1895,19 +1862,15 @@ void GL_APIENTRY GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid** po
Context *context = GetValidGlobalContext();
if (context)
{
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER)
if (!context->skipValidation() &&
!ValidateGetVertexAttribPointerv(context, index, pname, pointer))
{
context->handleError(Error(GL_INVALID_ENUM));
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 @@
#include "libANGLE/Query.h"
#include "libANGLE/queryconversions.h"
#include "libANGLE/queryutils.h"
#include "libANGLE/VertexArray.h"
#include "libANGLE/validationES.h"
#include "libANGLE/validationES2.h"
......@@ -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, "
"GLfloat* params = 0x%0.8p)",
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,
......@@ -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, "
"GLint* params = 0x%0.8p)",
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,
......@@ -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, "
"GLvoid** pointer = 0x%0.8p)",
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,
......@@ -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, "
"GLint* params = 0x%0.8p)",
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,
......@@ -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* params = 0x%0.8p)",
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,
......
......@@ -1038,38 +1038,17 @@ void GL_APIENTRY GetVertexAttribIiv(GLuint index, GLenum pname, GLint* params)
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
if (!context->skipValidation() &&
!ValidateGetVertexAttribIiv(context, index, pname, params))
{
return;
}
if (pname == GL_CURRENT_VERTEX_ATTRIB)
{
const VertexAttribCurrentValueData &currentValueData =
context->getGLState().getVertexAttribCurrentValue(index);
for (int i = 0; i < 4; ++i)
{
params[i] = currentValueData.IntValues[i];
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLint>(attribState, pname);
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribIiv(attrib, currentValues, pname, params);
}
}
......@@ -1081,38 +1060,17 @@ void GL_APIENTRY GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint* params)
Context *context = GetValidGlobalContext();
if (context)
{
if (context->getClientMajorVersion() < 3)
{
context->handleError(Error(GL_INVALID_OPERATION));
return;
}
if (index >= MAX_VERTEX_ATTRIBS)
{
context->handleError(Error(GL_INVALID_VALUE));
return;
}
if (!ValidateGetVertexAttribParameters(context, pname))
if (!context->skipValidation() &&
!ValidateGetVertexAttribIuiv(context, index, pname, params))
{
return;
}
if (pname == GL_CURRENT_VERTEX_ATTRIB)
{
const VertexAttribCurrentValueData &currentValueData =
context->getGLState().getVertexAttribCurrentValue(index);
for (int i = 0; i < 4; ++i)
{
params[i] = currentValueData.UnsignedIntValues[i];
}
}
else
{
const VertexAttribute &attribState =
context->getGLState().getVertexArray()->getVertexAttribute(index);
*params = QuerySingleVertexAttributeParameter<GLuint>(attribState, pname);
}
const VertexAttribCurrentValueData &currentValues =
context->getGLState().getVertexAttribCurrentValue(index);
const VertexAttribute &attrib =
context->getGLState().getVertexArray()->getVertexAttribute(index);
QueryVertexAttribIuiv(attrib, currentValues, pname, params);
}
}
......
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