Add support for querying number of active uniform blocks/block name max length…

Add support for querying number of active uniform blocks/block name max length from a program object. 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@2311 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent e7317ca8
...@@ -525,6 +525,32 @@ bool Program::isValidated() const ...@@ -525,6 +525,32 @@ bool Program::isValidated() const
} }
} }
GLint Program::getActiveUniformBlockCount()
{
ProgramBinary *programBinary = getProgramBinary();
if (programBinary)
{
return static_cast<GLint>(programBinary->getActiveUniformBlockCount());
}
else
{
return 0;
}
}
GLint Program::getActiveUniformBlockMaxLength()
{
ProgramBinary *programBinary = getProgramBinary();
if (programBinary)
{
return static_cast<GLint>(programBinary->getActiveUniformBlockMaxLength());
}
else
{
return 0;
}
}
void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding) void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding)
{ {
mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding; mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding;
......
...@@ -92,6 +92,9 @@ class Program ...@@ -92,6 +92,9 @@ class Program
GLint getActiveUniformCount(); GLint getActiveUniformCount();
GLint getActiveUniformMaxLength(); GLint getActiveUniformMaxLength();
GLint getActiveUniformBlockCount();
GLint getActiveUniformBlockMaxLength();
void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding); void bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding);
GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const; GLuint getUniformBlockBinding(GLuint uniformBlockIndex) const;
......
...@@ -2421,6 +2421,28 @@ GLuint ProgramBinary::getActiveUniformBlockCount() const ...@@ -2421,6 +2421,28 @@ GLuint ProgramBinary::getActiveUniformBlockCount() const
return mUniformBlocks.size(); return mUniformBlocks.size();
} }
GLuint ProgramBinary::getActiveUniformBlockMaxLength() const
{
unsigned int maxLength = 0;
unsigned int numUniformBlocks = mUniformBlocks.size();
for (unsigned int uniformBlockIndex = 0; uniformBlockIndex < numUniformBlocks; uniformBlockIndex++)
{
const UniformBlock &uniformBlock = *mUniformBlocks[uniformBlockIndex];
if (!uniformBlock.name.empty())
{
const unsigned int length = uniformBlock.name.length() + 1;
// Counting in "[0]".
const unsigned int arrayLength = (uniformBlock.isArrayElement() ? 3 : 0);
maxLength = std::max(length + arrayLength, maxLength);
}
}
return maxLength;
}
void ProgramBinary::validate(InfoLog &infoLog) void ProgramBinary::validate(InfoLog &infoLog)
{ {
applyUniforms(); applyUniforms();
......
...@@ -127,6 +127,7 @@ class ProgramBinary : public RefCountObject ...@@ -127,6 +127,7 @@ class ProgramBinary : public RefCountObject
void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const; void getActiveUniformBlockName(GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName) const;
void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const; void getActiveUniformBlockiv(GLuint uniformBlockIndex, GLenum pname, GLint *params) const;
GLuint getActiveUniformBlockCount() const; GLuint getActiveUniformBlockCount() const;
GLuint getActiveUniformBlockMaxLength() const;
void validate(InfoLog &infoLog); void validate(InfoLog &infoLog);
bool validateSamplers(InfoLog *infoLog); bool validateSamplers(InfoLog *infoLog);
......
...@@ -3984,6 +3984,16 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) ...@@ -3984,6 +3984,16 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
if (context->getClientVersion() < 3)
{
switch (pname)
{
case GL_ACTIVE_UNIFORM_BLOCKS:
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
return gl::error(GL_INVALID_ENUM);
}
}
switch (pname) switch (pname)
{ {
case GL_DELETE_STATUS: case GL_DELETE_STATUS:
...@@ -4016,6 +4026,12 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params) ...@@ -4016,6 +4026,12 @@ void __stdcall glGetProgramiv(GLuint program, GLenum pname, GLint* params)
case GL_PROGRAM_BINARY_LENGTH_OES: case GL_PROGRAM_BINARY_LENGTH_OES:
*params = programObject->getProgramBinaryLength(); *params = programObject->getProgramBinaryLength();
return; return;
case GL_ACTIVE_UNIFORM_BLOCKS:
*params = programObject->getActiveUniformBlockCount();
return;
case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH:
*params = programObject->getActiveUniformBlockMaxLength();
break;
default: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
......
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