[Mesa-dev] [PATCH 03/11] mesa: Add support for glUniformBlockBinding() and the API to get it back.
Kenneth Graunke
kenneth at whitecape.org
Tue Jul 31 01:16:28 PDT 2012
On 07/20/2012 03:33 PM, Eric Anholt wrote:
> Fixes piglit ARB_uniform_buffer_object/uniformbufferbinding.
> ---
> src/mesa/main/uniforms.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 95 insertions(+)
>
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index ccbd753..940cb07 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -41,6 +41,7 @@
> #include "main/shaderapi.h"
> #include "main/shaderobj.h"
> #include "main/uniforms.h"
> +#include "main/enums.h"
> #include "ir_uniform.h"
> #include "glsl_types.h"
>
> @@ -583,6 +584,98 @@ _mesa_GetUniformIndices(GLuint program,
> }
> }
>
> +static void GLAPIENTRY
> +_mesa_UniformBlockBinding(GLuint program,
> + GLuint uniformBlockIndex,
> + GLuint uniformBlockBinding)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg;
> +
> + if (!ctx->Extensions.ARB_uniform_buffer_object) {
> + _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformBlockBinding");
> + return;
> + }
> +
> + shProg = _mesa_lookup_shader_program_err(ctx, program,
> + "glUniformBlockBinding");
> + if (!shProg)
> + return;
> +
> + if (uniformBlockIndex >= shProg->NumUniformBlocks) {
> + _mesa_error(ctx, GL_INVALID_VALUE,
> + "glUniformBlockBinding(block index %d >= %d)",
> + uniformBlockIndex, shProg->NumUniformBlocks);
> + return;
> + }
> +
> + if (uniformBlockBinding >= ctx->Const.MaxUniformBufferBindings) {
> + _mesa_error(ctx, GL_INVALID_VALUE,
> + "glUniformBlockBinding(block binding %d >= %d)",
> + uniformBlockBinding, ctx->Const.MaxUniformBufferBindings);
> + return;
> + }
> +
> + if (shProg->UniformBlocks[uniformBlockIndex].Binding !=
> + uniformBlockBinding) {
> + int i;
> +
> + FLUSH_VERTICES(ctx, _NEW_BUFFER_OBJECT);
> + shProg->UniformBlocks[uniformBlockIndex].Binding = uniformBlockBinding;
I'd almost expect to see a _NEW_PROGRAM_CONSTANTS when a new uniform
buffer gets bound. Then again, that would cause re-uploading of all the
non-UBO uniforms, which is pointless and expensive. Looking at the i965
backend, it looks like _NEW_PROGRAM_CONSTANTS mostly deals with push
constants, and your new patch for UBOs properly uses this flag. So it
should be fine.
Everything else looks good. For the series:
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
> +
> + for (i = 0; i < MESA_SHADER_TYPES; i++) {
> + int stage_index = shProg->UniformBlockStageIndex[i][uniformBlockIndex];
> +
> + if (stage_index != -1) {
> + struct gl_shader *sh = shProg->_LinkedShaders[i];
> + sh->UniformBlocks[stage_index].Binding = uniformBlockBinding;
> + }
> + }
> + }
> +}
> +
> +static void GLAPIENTRY
> +_mesa_GetActiveUniformBlockiv(GLuint program,
> + GLuint uniformBlockIndex,
> + GLenum pname,
> + GLint *params)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + struct gl_shader_program *shProg;
> + struct gl_uniform_block *block;
> +
> + if (!ctx->Extensions.ARB_uniform_buffer_object) {
> + _mesa_error(ctx, GL_INVALID_OPERATION, "glGetActiveUniformBlockiv");
> + return;
> + }
> +
> + shProg = _mesa_lookup_shader_program_err(ctx, program,
> + "glGetActiveUniformBlockiv");
> + if (!shProg)
> + return;
> +
> + if (uniformBlockIndex >= shProg->NumUniformBlocks) {
> + _mesa_error(ctx, GL_INVALID_VALUE,
> + "glGetActiveUniformBlockiv(block index %d >= %d)",
> + uniformBlockIndex, shProg->NumUniformBlocks);
> + return;
> + }
> +
> + block = &shProg->UniformBlocks[uniformBlockIndex];
> +
> + switch (pname) {
> + case GL_UNIFORM_BLOCK_BINDING:
> + params[0] = block->Binding;
> + return;
> +
> + default:
> + _mesa_error(ctx, GL_INVALID_ENUM,
> + "glGetActiveUniformBlockiv(pname 0x%x (%s))",
> + pname, _mesa_lookup_enum_by_nr(pname));
> + return;
> + }
> +}
> +
> /**
> * Plug in shader uniform-related functions into API dispatch table.
> */
> @@ -644,6 +737,8 @@ _mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
> SET_GetUniformBlockIndex(exec, _mesa_GetUniformBlockIndex);
> SET_GetUniformIndices(exec, _mesa_GetUniformIndices);
> SET_GetActiveUniformsiv(exec, _mesa_GetActiveUniformsiv);
> + SET_GetActiveUniformBlockiv(exec, _mesa_GetActiveUniformBlockiv);
> + SET_UniformBlockBinding(exec, _mesa_UniformBlockBinding);
>
> #endif /* FEATURE_GL */
> }
>
More information about the mesa-dev
mailing list