[Mesa-dev] [PATCH v2 09/82] mesa: Add shader storage buffer support to struct gl_context
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Wed Jun 10 02:30:10 PDT 2015
On 09/06/15 19:34, Jordan Justen wrote:
> On 2015-06-09 00:30:45, Samuel Iglesias Gonsálvez wrote:
>> On 09/06/15 08:18, Samuel Iglesias Gonsálvez wrote:
>>> On 08/06/15 23:36, Jordan Justen wrote:
>>>> 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?
>>>>
>>>
>>> Yes, it is. We started copying the values from UBOs, like
>>> consts->MaxShaderStorageBufferBindings (copied from
>>> consts->MaxUniformBufferBindings) and similarly for others.
>>>
>>> We explained that in the cover letter of the first version of the patch
>>> series [0]:
>>>
>>> "Both Mesa and i965 need to give default values for certain things
>>> like the maximum allowed size of a shader storage buffer, the maximum
>>> number of buffer bindings, the maximum number of combined shader storage
>>> blocks, etc. We are not sure about what default values we should use
>>> for these in all cases and except in a few cases we generally copied the
>>> default values from uniforms. That may be fine or not, so let us know if
>>> we should use different values for any of these setting at the Mesa or
>>> i965 levels."
>>>
>>> [0] http://lists.freedesktop.org/archives/mesa-dev/2015-May/084196.html
>>>
>>>>> /* 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?
>>>
>>> As explained before, we picked it from uniforms:
>>> consts->MaxCombinedUniformBlocks = 36;
>>>
>>>>
>>>>> + consts->MaxShaderStorageBufferBindings = 36;
>>>>
>>>> Spec has 8. Same comment/question as above.
>>>
>>> Copied from consts->MaxUniformBufferBindings = 36;
>>>>
>>>>> + consts->MaxShaderStorageBlockSize = 16 * 1024 * 1024;
>>>>> + consts->ShaderStorageBufferOffsetAlignment = 1;
>>>>
>>>> Spec has 256.
>>>>
>>>
>>> Oh, right. We picked it from consts->UniformBufferOffsetAlignment = 1
>>> but, according to the spec, this is a mistake. We will fix it!
>>>
>>> So, just to confirm, we will pick the spec values (if available) for all
>>> cases. If you (or somebody else) think a better default value should be
>>> chosen for any constant, please say so :-)
>>>
>>
>> By the way, next patch "mesa: add MaxShaderStorageBlocks to struct
>> gl_program_constants" [0] sets prog->MaxShaderStorageBlocks = 12, which
>> is also copied from prog->MaxUniformBlocks = 12.
>> Because of that, one piglit test [1] starts to fail because
>> MaxCombinedUniformBlocks is now set to 8 but we have more shader storage
>> block per shader.
>>
>> I plan to modify patch [0] to set prog->MaxShaderStorageBlocks = 8 and
>> write a separate patch that makes i965 driver to set the following
>> constant values:
>>
>> * MaxShaderStorageBlocks = 12
>> * MaxCombinedUniformBlocks = 36 (12 * 3 different shader types: vertex,
>> geometry and fragment)
>
> Will it need to be '* 5' with the 2 tessellation stages? I wonder if
> we can somehow guard against it being missed later. I guess TS tests
> should be able to catch this.
>
There are two possibilities:
1) Add a FIXME comment in the separate patch for i965, where I am going
to modify the value of MaxCombinedUniformBlocks, saying that we don't
count tessellation stages yet.
2) Set MaxCombinedUniformBlocks = 12 * 5 in that separate patch and add
a comment saying that it counts tessellation stages, although they are
not supported yet.
I prefer 1) because future TS support will need to do similar changes in
other places. What do you think?
> Anyway, with the ShaderStorageBufferOffsetAlignment fix:
>
> Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
>
Summing up the list of changes:
1) Set the variables defined in this patch with the spec values.
2) Add your R-b to this patch after doing 1).
3) Modify patch [0] to set prog->MaxShaderStorageBlocks = 8
4) Add your R-b to patch [0] (as you stated in other email).
5) Write a separate patch for i965 driver that sets new values for
MaxShaderStorageBlocks, MaxCombinedUniformBlocks and
MaxShaderStorageBufferBindings.
If you don't agree with one or several points of this list of changes,
just tell me so :)
Thanks
Sam
[0] http://lists.freedesktop.org/archives/mesa-dev/2015-June/085570.html
>> * MaxShaderStorageBufferBindings = 36.
>>
>> Those values are arbitrary (picked from uniforms) but our tests seem to
>> work with them. As it was said in last email, if you think we should
>> change the values or this is not right, just say so.
>>
>> What do you think?
>>
>> Sam
>>
>> [0] http://lists.freedesktop.org/archives/mesa-dev/2015-June/085570.html
>> [1] bin/arb_shader_storage_buffer_object-maxblocks -auto -fbo
>>
>>> Thanks!
>>>
>>> Sam
>>>
>>>> -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
>>>> _______________________________________________
>>>> mesa-dev mailing list
>>>> mesa-dev at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>>
>>> _______________________________________________
>>> 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