[Mesa-dev] [PATCH 12/17] mesa/st: make sure the const buffer is large enough for packed uniforms

Timothy Arceri tarceri at itsqueeze.com
Mon Jun 26 10:27:27 UTC 2017


On 26/06/17 20:06, Nicolai Hähnle wrote:

> On 26.06.2017 11:56, Timothy Arceri wrote:
>> On 26/06/17 19:27, Nicolai Hähnle wrote:
>>
>>> On 25.06.2017 03:31, Timothy Arceri wrote:
>>>> ---
>>>>   src/mesa/state_tracker/st_atom_constbuf.c | 8 +++++++-
>>>>   1 file changed, 7 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/src/mesa/state_tracker/st_atom_constbuf.c 
>>>> b/src/mesa/state_tracker/st_atom_constbuf.c
>>>> index 7f17546..eb8f6b3 100644
>>>> --- a/src/mesa/state_tracker/st_atom_constbuf.c
>>>> +++ b/src/mesa/state_tracker/st_atom_constbuf.c
>>>> @@ -83,21 +83,27 @@ void st_upload_constants(struct st_context *st, 
>>>> struct gl_program *prog)
>>>>        /* Make all bindless samplers/images bound texture/image 
>>>> units resident in
>>>>       * the context.
>>>>       */
>>>>      st_make_bound_samplers_resident(st, prog);
>>>>      st_make_bound_images_resident(st, prog);
>>>>        /* update constants */
>>>>      if (params && params->NumParameters) {
>>>>         struct pipe_constant_buffer cb;
>>>> -      const uint paramBytes = params->NumParameters * 
>>>> sizeof(GLfloat) * 4;
>>>> +
>>>> +      /* We need to align to 4 as the driver will expect to load 
>>>> four values
>>>> +       * regardless of how many values the last param has. It's 
>>>> safe to do the
>>>> +       * align as the param list always allocates extra memory.
>>>> +       */
>>>> +      const uint paramBytes =
>>>> +         align((params->NumParameterValues * sizeof(GLfloat)) + 1, 
>>>> 4);
>>>
>>> This looks broken.
>>>
>>> First of all, I would say that it shouldn't actually be required. A 
>>> driver that supports packed uniforms should only load as much as the 
>>> shader actually requests.
>>
>> I recall you telling me on IRC that radeonsi needs to load vec4 
>> chunks for efficiency. Maybe I misinterpreted what you were saying?
>
> Right, we should try to merge loads in the backend, because loading a 
> vec4 (or even up to 16 consecutive constant!) in a single instruction 
> is faster than 4 or 16 loads of a single constant, assuming register 
> pressure isn't an issue. FWIW, we're not actually doing that right now.
>
> However, there's no reason for a vec4 load when you only need one or 
> two constants, as would be the case when loading from the end of the 
> constant buffer. So there's no reason to pad the buffer.

Ok, thanks for the clarification. I think I can see how this would work 
currently, you would need a swizzle xxxx to handle a single component 
passed the last block of 4.

>
> Cheers,
> Nicolai
>
>
>>>
>>> Second, even if it were needed, the code doesn't do what it says.
>>
>> :P I made some *simplifications* here at some point, not sure what I 
>> was thinking at the time.
>>
>>>
>>> Cheers,
>>> Nicolai
>>>
>>>
>>>>           /* Update the constants which come from fixed-function 
>>>> state, such as
>>>>          * transformation matrices, fog factors, etc.  The rest of 
>>>> the values in
>>>>          * the parameters list are explicitly set by the user with 
>>>> glUniform,
>>>>          * glProgramParameter(), etc.
>>>>          */
>>>>         if (params->StateFlags)
>>>>            _mesa_load_state_parameters(st->ctx, params);
>>>>           _mesa_shader_write_subroutine_indices(st->ctx, stage);
>>>>
>>>
>>>
>>
>
>



More information about the mesa-dev mailing list