Implement glGetActiveUniformBlockName.

TRAC #22858 Signed-off-by: Geoff Lang Signed-off-by: Nicolas Capens Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2309 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 70eb1ea2
...@@ -2356,6 +2356,31 @@ GLint ProgramBinary::getActiveUniformi(GLuint index, GLenum pname) const ...@@ -2356,6 +2356,31 @@ GLint ProgramBinary::getActiveUniformi(GLuint index, GLenum pname) const
return 0; return 0;
} }
void ProgramBinary::getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const
{
ASSERT(uniformBlockIndex < mUniformBlocks.size()); // index must be smaller than getActiveUniformBlockCount()
const UniformBlock &uniformBlock = *mUniformBlocks[uniformBlockIndex];
if (bufSize > 0)
{
std::string string = uniformBlock.name;
if (uniformBlock.isArrayElement())
{
string += "[" + str(uniformBlock.elementIndex) + "]";
}
strncpy(uniformBlockName, string.c_str(), bufSize);
uniformBlockName[bufSize - 1] = '\0';
if (length)
{
*length = strlen(uniformBlockName);
}
}
}
GLuint ProgramBinary::getActiveUniformBlockCount() const GLuint ProgramBinary::getActiveUniformBlockCount() const
{ {
return mUniformBlocks.size(); return mUniformBlocks.size();
......
...@@ -124,6 +124,7 @@ class ProgramBinary : public RefCountObject ...@@ -124,6 +124,7 @@ class ProgramBinary : public RefCountObject
GLint getActiveUniformMaxLength() const; GLint getActiveUniformMaxLength() const;
GLint getActiveUniformi(GLuint index, GLenum pname) const; GLint getActiveUniformi(GLuint index, GLenum pname) const;
void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
GLuint getActiveUniformBlockCount() const; GLuint getActiveUniformBlockCount() const;
void validate(InfoLog &infoLog); void validate(InfoLog &infoLog);
......
...@@ -9758,9 +9758,30 @@ void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIn ...@@ -9758,9 +9758,30 @@ void __stdcall glGetActiveUniformBlockName(GLuint program, GLuint uniformBlockIn
{ {
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
gl::Program *programObject = context->getProgram(program);
if (!programObject)
{
if (context->getShader(program))
{
return gl::error(GL_INVALID_OPERATION);
}
else
{
return gl::error(GL_INVALID_VALUE);
}
} }
UNIMPLEMENTED(); gl::ProgramBinary *programBinary = programObject->getProgramBinary();
if (!programBinary || uniformBlockIndex >= programBinary->getActiveUniformBlockCount())
{
return gl::error(GL_INVALID_VALUE);
}
programBinary->getActiveUniformBlockName(uniformBlockIndex, bufSize, length, uniformBlockName);
}
} }
catch(std::bad_alloc&) catch(std::bad_alloc&)
{ {
......
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