Add support for glGetnUniform*vEXT

Trac #18608 Signed-off-by: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@870 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 47c60053
...@@ -911,7 +911,7 @@ bool Program::setUniform4iv(GLint location, GLsizei count, const GLint *v) ...@@ -911,7 +911,7 @@ bool Program::setUniform4iv(GLint location, GLsizei count, const GLint *v)
return true; return true;
} }
bool Program::getUniformfv(GLint location, GLfloat *params) bool Program::getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params)
{ {
if (location < 0 || location >= (int)mUniformIndex.size()) if (location < 0 || location >= (int)mUniformIndex.size())
{ {
...@@ -920,6 +920,16 @@ bool Program::getUniformfv(GLint location, GLfloat *params) ...@@ -920,6 +920,16 @@ bool Program::getUniformfv(GLint location, GLfloat *params)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
// sized queries -- ensure the provided buffer is large enough
if (bufSize)
{
int requiredBytes = UniformExternalSize(targetUniform->type);
if (*bufSize < requiredBytes)
{
return false;
}
}
switch (targetUniform->type) switch (targetUniform->type)
{ {
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
...@@ -970,7 +980,7 @@ bool Program::getUniformfv(GLint location, GLfloat *params) ...@@ -970,7 +980,7 @@ bool Program::getUniformfv(GLint location, GLfloat *params)
return true; return true;
} }
bool Program::getUniformiv(GLint location, GLint *params) bool Program::getUniformiv(GLint location, GLsizei *bufSize, GLint *params)
{ {
if (location < 0 || location >= (int)mUniformIndex.size()) if (location < 0 || location >= (int)mUniformIndex.size())
{ {
...@@ -979,6 +989,16 @@ bool Program::getUniformiv(GLint location, GLint *params) ...@@ -979,6 +989,16 @@ bool Program::getUniformiv(GLint location, GLint *params)
Uniform *targetUniform = mUniforms[mUniformIndex[location].index]; Uniform *targetUniform = mUniforms[mUniformIndex[location].index];
// sized queries -- ensure the provided buffer is large enough
if (bufSize)
{
int requiredBytes = UniformExternalSize(targetUniform->type);
if (*bufSize < requiredBytes)
{
return false;
}
}
switch (targetUniform->type) switch (targetUniform->type)
{ {
case GL_FLOAT_MAT2: case GL_FLOAT_MAT2:
......
...@@ -98,8 +98,8 @@ class Program ...@@ -98,8 +98,8 @@ class Program
bool setUniform3iv(GLint location, GLsizei count, const GLint *v); bool setUniform3iv(GLint location, GLsizei count, const GLint *v);
bool setUniform4iv(GLint location, GLsizei count, const GLint *v); bool setUniform4iv(GLint location, GLsizei count, const GLint *v);
bool getUniformfv(GLint location, GLfloat *params); bool getUniformfv(GLint location, GLsizei *bufSize, GLfloat *params);
bool getUniformiv(GLint location, GLint *params); bool getUniformiv(GLint location, GLsizei *bufSize, GLint *params);
GLint getDxDepthRangeLocation() const; GLint getDxDepthRangeLocation() const;
GLint getDxDepthLocation() const; GLint getDxDepthLocation() const;
......
...@@ -3470,6 +3470,46 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params) ...@@ -3470,6 +3470,46 @@ void __stdcall glGetTexParameteriv(GLenum target, GLenum pname, GLint* params)
} }
} }
void __stdcall glGetnUniformfvEXT(GLuint program, GLint location, GLsizei bufSize, GLfloat* params)
{
EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLfloat* params = 0x%0.8p)",
program, location, bufSize, params);
try
{
if (bufSize < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
if (program == 0)
{
return error(GL_INVALID_VALUE);
}
gl::Program *programObject = context->getProgram(program);
if (!programObject || !programObject->isLinked())
{
return error(GL_INVALID_OPERATION);
}
if (!programObject->getUniformfv(location, &bufSize, params))
{
return error(GL_INVALID_OPERATION);
}
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params) void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
{ {
EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params); EVENT("(GLuint program = %d, GLint location = %d, GLfloat* params = 0x%0.8p)", program, location, params);
...@@ -3492,7 +3532,52 @@ void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params) ...@@ -3492,7 +3532,52 @@ void __stdcall glGetUniformfv(GLuint program, GLint location, GLfloat* params)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if (!programObject->getUniformfv(location, params)) if (!programObject->getUniformfv(location, NULL, params))
{
return error(GL_INVALID_OPERATION);
}
}
}
catch(std::bad_alloc&)
{
return error(GL_OUT_OF_MEMORY);
}
}
void __stdcall glGetnUniformivEXT(GLuint program, GLint location, GLsizei bufSize, GLint* params)
{
EVENT("(GLuint program = %d, GLint location = %d, GLsizei bufSize = %d, GLint* params = 0x%0.8p)",
program, location, bufSize, params);
try
{
if (bufSize < 0)
{
return error(GL_INVALID_VALUE);
}
gl::Context *context = gl::getNonLostContext();
if (context)
{
if (program == 0)
{
return error(GL_INVALID_VALUE);
}
gl::Program *programObject = context->getProgram(program);
if (!programObject || !programObject->isLinked())
{
return error(GL_INVALID_OPERATION);
}
if (!programObject)
{
return error(GL_INVALID_OPERATION);
}
if (!programObject->getUniformiv(location, &bufSize, params))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
...@@ -3531,7 +3616,7 @@ void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params) ...@@ -3531,7 +3616,7 @@ void __stdcall glGetUniformiv(GLuint program, GLint location, GLint* params)
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
if (!programObject->getUniformiv(location, params)) if (!programObject->getUniformiv(location, NULL, params))
{ {
return error(GL_INVALID_OPERATION); return error(GL_INVALID_OPERATION);
} }
......
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