[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