[Mesa-dev] [PATCH v2 09/82] mesa: Add shader storage buffer support to struct gl_context

Jordan Justen jordan.l.justen at intel.com
Mon Jun 8 14:36:45 PDT 2015


On 2015-06-03 00:00:59, Iago Toral Quiroga wrote:
> This includes the array of bindings, the current buffer bound to the
> GL_SHADER_STORAGE_BUFFER target and a set of general limits and default
> values for shader storage buffers.
> ---
>  src/mesa/main/bufferobj.c |  5 +++++
>  src/mesa/main/config.h    |  2 ++
>  src/mesa/main/context.c   |  6 ++++++
>  src/mesa/main/mtypes.h    | 38 ++++++++++++++++++++++++++++++++++++++
>  4 files changed, 51 insertions(+)
> 
> diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
> index 66dee68..c5d4ada 100644
> --- a/src/mesa/main/bufferobj.c
> +++ b/src/mesa/main/bufferobj.c
> @@ -112,6 +112,11 @@ get_buffer_target(struct gl_context *ctx, GLenum target)
>           return &ctx->UniformBuffer;
>        }
>        break;
> +   case GL_SHADER_STORAGE_BUFFER:
> +      if (ctx->Extensions.ARB_shader_storage_buffer_object) {
> +         return &ctx->ShaderStorageBuffer;
> +      }
> +      break;
>     case GL_ATOMIC_COUNTER_BUFFER:
>        if (ctx->Extensions.ARB_shader_atomic_counters) {
>           return &ctx->AtomicBuffer;
> diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
> index 5a66a4e..551aad1 100644
> --- a/src/mesa/main/config.h
> +++ b/src/mesa/main/config.h
> @@ -171,8 +171,10 @@
>  #define MAX_PROGRAM_LOCAL_PARAMS       4096
>  #define MAX_UNIFORMS                   4096
>  #define MAX_UNIFORM_BUFFERS            15 /* + 1 default uniform buffer */
> +#define MAX_SHADER_STORAGE_BUFFERS     15

This is just to copy the ubo value?

>  /* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */
>  #define MAX_COMBINED_UNIFORM_BUFFERS   (MAX_UNIFORM_BUFFERS * 6)
> +#define MAX_COMBINED_SHADER_STORAGE_BUFFERS   (MAX_SHADER_STORAGE_BUFFERS * 6)
>  #define MAX_ATOMIC_COUNTERS            4096
>  /* 6 is for vertex, hull, domain, geometry, fragment, and compute shader. */
>  #define MAX_COMBINED_ATOMIC_BUFFERS    (MAX_UNIFORM_BUFFERS * 6)
> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
> index 8a59b5e..8577e43 100644
> --- a/src/mesa/main/context.c
> +++ b/src/mesa/main/context.c
> @@ -615,6 +615,12 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api)
>     consts->MaxUniformBlockSize = 16384;
>     consts->UniformBufferOffsetAlignment = 1;
>  
> +   /** GL_ARB_shader_storage_buffer_object */
> +   consts->MaxCombinedShaderStorageBlocks = 36;

Spec has 8. I guess 36 > 8, so this may be okay, but where is 36 from?

> +   consts->MaxShaderStorageBufferBindings = 36;

Spec has 8. Same comment/question as above.

> +   consts->MaxShaderStorageBlockSize = 16 * 1024 * 1024;
> +   consts->ShaderStorageBufferOffsetAlignment = 1;

Spec has 256.

-Jordan

> +
>     /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
>     consts->MaxUserAssignableUniformLocations =
>        4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 03b8e48..741930d 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3370,6 +3370,15 @@ struct gl_constants
>     GLuint UniformBufferOffsetAlignment;
>     /** @} */
>  
> +   /** @{
> +    * GL_ARB_shader_storage_buffer_object
> +    */
> +   GLuint MaxCombinedShaderStorageBlocks;
> +   GLuint MaxShaderStorageBufferBindings;
> +   GLuint MaxShaderStorageBlockSize;
> +   GLuint ShaderStorageBufferOffsetAlignment;
> +   /** @} */
> +
>     /**
>      * GL_ARB_explicit_uniform_location
>      */
> @@ -4015,6 +4024,20 @@ struct gl_uniform_buffer_binding
>     GLboolean AutomaticSize;
>  };
>  
> +struct gl_shader_storage_buffer_binding
> +{
> +   struct gl_buffer_object *BufferObject;
> +   /** Start of shader storage block data in the buffer */
> +   GLintptr Offset;
> +   /** Size of data allowed to be referenced from the buffer (in bytes) */
> +   GLsizeiptr Size;
> +   /**
> +    * glBindBufferBase() indicates that the Size should be ignored and only
> +    * limited by the current size of the BufferObject.
> +    */
> +   GLboolean AutomaticSize;
> +};
> +
>  /**
>   * ARB_shader_image_load_store image unit.
>   */
> @@ -4262,6 +4285,12 @@ struct gl_context
>     struct gl_buffer_object *UniformBuffer;
>  
>     /**
> +    * Current GL_ARB_shader_storage_buffer_object binding referenced by
> +    * GL_SHADER_STORAGE_BUFFER target for glBufferData, glMapBuffer, etc.
> +    */
> +   struct gl_buffer_object *ShaderStorageBuffer;
> +
> +   /**
>      * Array of uniform buffers for GL_ARB_uniform_buffer_object and GL 3.1.
>      * This is set up using glBindBufferRange() or glBindBufferBase().  They are
>      * associated with uniform blocks by glUniformBlockBinding()'s state in the
> @@ -4271,6 +4300,15 @@ struct gl_context
>        UniformBufferBindings[MAX_COMBINED_UNIFORM_BUFFERS];
>  
>     /**
> +    * Array of shader storage buffers for ARB_shader_storage_buffer_object
> +    * and GL 4.3. This is set up using glBindBufferRange() or
> +    * glBindBufferBase().  They are associated with shader storage blocks by
> +    * glShaderStorageBlockBinding()'s state in the shader program.
> +    */
> +   struct gl_shader_storage_buffer_binding
> +      ShaderStorageBufferBindings[MAX_COMBINED_SHADER_STORAGE_BUFFERS];
> +
> +   /**
>      * Object currently associated with the GL_ATOMIC_COUNTER_BUFFER
>      * target.
>      */
> -- 
> 1.9.1
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list