[Mesa-dev] [RFC] Gallium constant handling speed improvements
Brian Paul
brianp at vmware.com
Fri Dec 3 16:06:41 PST 2010
On 12/03/2010 12:47 PM, Jakob Bornecrantz wrote:
> Hi all
>
> I have attached two patches that should help with speed on applications that
> causes a lot of constant buffers to be emitted or lot of constant state as in
> the case of the second patch as it eliminates a memcpy.
>
> The first patch just adds a offset and size argument to the set_constant_buffer
> call on the context, making it possible for the state tracker sub-allocate the
> buffers out a larger buffer. For ipers this is a pretty big win. Even if we did
> something similar inside the drivers various locks would have to be taken
> because since create buffer is a screen function.
>
> The second patch switches from a inline write to map buffer call and points the
> _mesa_load_state_parameters to it directly. For ipers this is a minor loss but
> for application that has a different ratio of number of constants vs number of
> times the constants changes it will probably be a win.
I don't see how this can work as-is. We need to put all the
parameters/constants into the buffer at the new offset, not just the
PROGRAM_STATE_VARs. Recall the the Mesa parameter/constant buffer
constains PROGRAM_STATE_VAR (i.e. fixed-function state) plus the
user's uniforms, program parameters, shader literals, etc.
You should test some GLSL programs too.
In _mesa_load_state_parameters_to() you might try adding an else
clause to the Type == PROGRAM_STATE_VAR conditional which copies the
current parameter value to the dest buffer.
> I have tested the patches on i915g only, unfortunately I based the i915 part
> of these patches on some other work I had laying around so there is no point
> in sending them out since they wont apply.
>
> Before I go and try and change the other drivers I would like to hear some input
> on these changes. So comment please, anyways have a nice weekend.
[...]
>
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index d6628b1..303b924 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -244,8 +244,8 @@ void st_destroy_context( struct st_context *st )
> pipe->set_index_buffer(pipe, NULL);
>
> for (i = 0; i < PIPE_SHADER_TYPES; i++) {
> - pipe->set_constant_buffer(pipe, PIPE_SHADER_VERTEX, 0, NULL);
> - pipe_resource_reference(&st->state.constants[PIPE_SHADER_VERTEX], NULL);
> + pipe->set_constant_buffer(pipe, i, 0, 0, 0, NULL);
> + pipe_resource_reference(&st->state.constants[i], NULL);
> }
This bug fix should be committed soon in any case. Looks like it
comes from Tilman's commit 646a8b7e1dfbd126819d577a94102e64748d0b9d
-Brian
More information about the mesa-dev
mailing list