[Mesa-dev] [PATCH 8/9] mesa: add Uniform Buffer Object API implementation

Brian Paul brianp at vmware.com
Fri Sep 23 13:45:12 PDT 2011


On 09/23/2011 07:53 AM, vlj wrote:
> ---
>   src/mesa/main/bufferobj.c |    2 +
>   src/mesa/main/uniforms.c  |   99 +++++++++++++++++++++++++++++++++++++++++++++
>   2 files changed, 101 insertions(+), 0 deletions(-)
>
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index c453f9c..794cde5 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -98,6 +98,8 @@ get_buffer_target(struct gl_context *ctx, GLenum target)
>            return&ctx->Texture.BufferObject;
>         }
>         break;
> +   case GL_UNIFORM_BUFFER:
> +      return&ctx->Uniform_Buffer_Object.UniformObj;
>      default:
>         return NULL;
>      }
> diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
> index fe1ce6d..b923aef 100644
> --- a/src/mesa/main/uniforms.c
> +++ b/src/mesa/main/uniforms.c
> @@ -1064,6 +1064,76 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
>      uniform->Initialized = GL_TRUE;
>   }
>
> +#include<main/hash.h>
> +
> +void _mesa_query_ubo_general(struct gl_context *ctx, struct gl_shader_program *shProg,GLint ubo_index,GLenum query, int* data)

If a function is non-static, it should be prototyped in the 
corresponding header file.


> +{
> +    if(ubo_index>  shProg->ubo_count || ubo_index<  0)
> +        _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformBlock(uniformBlockIndex)");
> +
> +    struct ubo current_ubo = *(shProg->UniformBufferObjects[ubo_index]);
> +
> +    switch(query)
> +    {
> +    case GL_UNIFORM_BLOCK_BINDING:
> +        *data = current_ubo.bound_buffer;
> +        break;
> +    case GL_UNIFORM_BLOCK_DATA_SIZE:
> +        *data = 0;
> +       break;
> +    case GL_UNIFORM_BLOCK_NAME_LENGTH:
> +        *data = strlen(current_ubo.name);
> +        break;
> +    case GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS:
> +        *data = current_ubo.number_of_variables;
> +        break;
> +    case GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER:
> +    case GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER:
> +    case GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER:
> +        *data = 0;
> +        break;
> +    default:
> +        break;
> +    }
> +}
> +
> +GLint _mesa_get_ubo_id_from_name(struct gl_context *ctx, struct gl_shader_program *shProg,const char* name)
> +{
> +   GLint id;
> +   //id = _mesa_HashLookup(shProg->name_to_id,name);
> +   return id;
> +}
> +
> +void _mesa_get_ubo_name(struct gl_context *ctx, struct gl_shader_program *shProg,GLint index,GLsizei bufsize,GLsizei* length,char* buffer)
> +{
> +   if(index>= shProg->ubo_count || index<  0) {
> +       _mesa_error(ctx, GL_INVALID_VALUE, "GetActiveUniformBlockName(uniformBlockIndex)");
> +       return;
> +   }
> +
> +   struct ubo current_ubo = *(shProg->UniformBufferObjects[index]);
> +   GLsizei temp_length = strlen(current_ubo.name);
> +   if(bufsize - 1<  temp_length) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "GetActiveUniformBlockName(bufSize)");
> +      return;
> +   }
> +
> +   memcpy(buffer,current_ubo.name,temp_length);
> +   buffer[temp_length] = '\0';
> +   if(length != NULL)
> +      *length = temp_length;
> +}
> +
> +void _mesa_link_buffer_uniform(struct gl_context* ctx,struct gl_shader_program *shProg, GLint ubo_index, GLint buffer_index)
> +{
> +   if(ubo_index>  shProg->ubo_count || ubo_index<  0)
> +       _mesa_error(ctx, GL_INVALID_VALUE, "UniformBlockBinding(uniformBlockIndex)");

We should return after recording an error.  The indentation looks 
incorrect.


> +
> +   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
> +
> +   shProg->UniformBufferObjects[ubo_index]->bound_buffer = buffer_index;
> +}
> +
>
>   void GLAPIENTRY
>   _mesa_Uniform1fARB(GLint location, GLfloat v0)
> @@ -1453,6 +1523,35 @@ _mesa_GetActiveUniformARB(GLhandleARB program, GLuint index,
>   }
>
>
> +GLuint get_indice(struct gl_shader_program* prog, const char* name)

Is this function used outside of this file?  If not, declare it as 
static.  It also looks like the parameters can be const-qualified.


> +{
> +
> +   for(int k = 0;k<  prog->Uniforms->Size; k++)
> +   {
> +      struct gl_uniform* current_uniform =&(prog->Uniforms->Uniforms[k]);
> +      printf("current uniform:%s\n",current_uniform->Name);

Left-over debug code.


> +      if(strcmp(name,current_uniform->Name)==0)
> +      {
> +         return k;
> +      }
> +   }
> +   return GL_INVALID_INDEX;
> +}
> +
> +/* Note : location and index are the same */
> +void GLAPIENTRY
> +_mesa_GetUniformIndices(GLint program,GLsizei number_of_variables,const char** names, GLuint* indices)
> +{
> +   GET_CURRENT_CONTEXT(ctx);
> +
> +   struct gl_shader_program *shProg =
> +      _mesa_lookup_shader_program_err(ctx, program, "GetUniformIndices");
> +   for(unsigned i=0;i<number_of_variables;i++)

Move declaration of 'i' before the loop.


> +   {
> +      indices[i] = get_indice(shProg,names[i]);
> +   }
> +}
> +
>   /**
>    * Plug in shader uniform-related functions into API dispatch table.
>    */



More information about the mesa-dev mailing list