On Sunday, January 04, 2015 04:04:36 PM Abdiel Janulgue wrote: > Determine which shader stage changed their uniforms and only upload > uniforms which belong to it. > > Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com> > --- > src/mesa/drivers/dri/i965/brw_context.h | 2 ++ > src/mesa/drivers/dri/i965/brw_program.c | 9 +++++++++ > src/mesa/drivers/dri/i965/gen7_vs_state.c | 4 ++++ > 3 files changed, 15 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/brw_context.h > b/src/mesa/drivers/dri/i965/brw_context.h > index f384008..6706b4a 100644 > --- a/src/mesa/drivers/dri/i965/brw_context.h > +++ b/src/mesa/drivers/dri/i965/brw_context.h > @@ -1357,6 +1357,8 @@ struct brw_context > uint32_t next_offset; > } constants; > > + uint64_t uniformstagemap[MAX_UNIFORMS]; > + > struct { > uint32_t state_offset; > uint32_t blend_state_offset; > diff --git a/src/mesa/drivers/dri/i965/brw_program.c > b/src/mesa/drivers/dri/i965/brw_program.c > index d9a3f05..c1eec8a 100644 > --- a/src/mesa/drivers/dri/i965/brw_program.c > +++ b/src/mesa/drivers/dri/i965/brw_program.c > @@ -179,6 +179,14 @@ brwProgramStringNotify(struct gl_context *ctx, > return true; > } > > +static void > +brw_uniform_update(struct gl_context *ctx, GLint location) > +{ > + struct brw_context *brw = brw_context(ctx); > + > + brw->state.dirty.mesa |= brw->uniformstagemap[location]; > +} > + > void > brw_add_texrect_params(struct gl_program *prog) > { > @@ -236,6 +244,7 @@ void brwInitFragProgFuncs( struct dd_function_table > *functions ) > > functions->NewShader = brw_new_shader; > functions->LinkShader = brw_link_shader; > + functions->UniformUpdate = brw_uniform_update; > } > > void > diff --git a/src/mesa/drivers/dri/i965/gen7_vs_state.c > b/src/mesa/drivers/dri/i965/gen7_vs_state.c > index 85bd56f..269612b 100644 > --- a/src/mesa/drivers/dri/i965/gen7_vs_state.c > +++ b/src/mesa/drivers/dri/i965/gen7_vs_state.c > @@ -70,6 +70,10 @@ gen7_upload_constant_buffer_data(struct brw_context* brw, > _NEW_FRAGMENT_CONSTANTS > }; > > + if (!(brw->state.dirty.brw & BRW_NEW_BATCH) && > + (!prog_data->nr_params || !(brw->state.dirty.mesa & > const_state_stage[stage_state->stage]))) > + return; > + > /* If current constant data does not fit in current constant buffer bank, > * move to next slot. > */ >
I'm not a huge fan of how i965-centric this is, nor having a driver hook on every uniform update. I think we should just make core Mesa track whether a uniform exists in a particular stage or not. My attempt to implement that is here: http://cgit.freedesktop.org/~kwg/mesa/commit/?id=e4777f6b1baa7b1e32bc376ba140a3e827fb9808 Then in ctx->DriverFlags, I created a new field: uint64_t NewUniforms[MESA_SHADER_STAGES]; In update_program_constants, I flagged ctx->NewDriverState |= ctx->DriverFlags.NewUniforms[MESA_SHADER_FRAGMENT]; and so on... in _mesa_uniform, I added: for (int i = 0; i < MESA_SHADER_STAGES; i++) { if (uni->active[i]) ctx->NewDriverState |= ctx->DriverFlags.NewUniforms[i]; } That may be incomplete, but I think you get the idea. This is useful generic infrastructure to have for all drivers, IMO. --Ken
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev