On 28 August 2013 18:06, Kenneth Graunke <kenn...@whitecape.org> wrote:
> On 08/26/2013 03:12 PM, Paul Berry wrote: > >> --- >> src/mesa/drivers/dri/i965/brw_**state.h | 8 +++ >> src/mesa/drivers/dri/i965/brw_**vs_surface_state.c | 66 >> +++++++++++++++--------- >> 2 files changed, 50 insertions(+), 24 deletions(-) >> >> diff --git a/src/mesa/drivers/dri/i965/**brw_state.h >> b/src/mesa/drivers/dri/i965/**brw_state.h >> index 4814639..e7a1b40 100644 >> --- a/src/mesa/drivers/dri/i965/**brw_state.h >> +++ b/src/mesa/drivers/dri/i965/**brw_state.h >> @@ -221,6 +221,14 @@ uint32_t >> get_attr_override(const struct brw_vue_map *vue_map, int >> urb_entry_read_offset, >> int fs_attr, bool two_side_color, uint32_t >> *max_source_attr); >> >> +/* brw_vs_surface_state.c */ >> +void >> +brw_upload_vec4_pull_**constants(struct brw_context *brw, >> + GLbitfield64 brw_new_constbuf, >> > > FWIW, brw->state.dirty.brw is only 32-bits currently. That said, it's > probably going to change in the not-too-distant future, so using > GLbitfield64 preemptively isn't crazy. Oops, I didn't even realize I did that. I think I'll change it back to GLbitfield, just so that it doesn't cause any confusion for people. > > > + const struct gl_program *prog, >> + struct brw_vec4_context_base *vec4_ctx, >> + const struct brw_vec4_prog_data >> *prog_data); >> + >> #ifdef __cplusplus >> } >> #endif >> diff --git a/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c >> b/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c >> index 629eb96..48124bf 100644 >> --- a/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c >> +++ b/src/mesa/drivers/dri/i965/**brw_vs_surface_state.c >> @@ -35,56 +35,50 @@ >> #include "brw_context.h" >> #include "brw_state.h" >> >> -/* Creates a new VS constant buffer reflecting the current VS program's >> - * constants, if needed by the VS program. >> - * >> - * Otherwise, constants go through the CURBEs using the >> brw_constant_buffer >> - * state atom. >> - */ >> -static void >> -brw_upload_vs_pull_constants(**struct brw_context *brw) >> -{ >> - struct brw_vec4_context_base *vec4_ctx = &brw->vs.base; >> >> - /* BRW_NEW_VERTEX_PROGRAM */ >> - struct brw_vertex_program *vp = >> - (struct brw_vertex_program *) brw->vertex_program; >> +void >> +brw_upload_vec4_pull_**constants(struct brw_context *brw, >> + GLbitfield64 brw_new_constbuf, >> + const struct gl_program *prog, >> + struct brw_vec4_context_base *vec4_ctx, >> + const struct brw_vec4_prog_data >> *prog_data) >> +{ >> int i; >> >> /* Updates the ParamaterValues[i] pointers for all parameters of the >> * basic type of PROGRAM_STATE_VAR. >> */ >> - _mesa_load_state_parameters(&**brw->ctx, >> vp->program.Base.Parameters); >> + _mesa_load_state_parameters(&**brw->ctx, prog->Parameters); >> >> - /* CACHE_NEW_VS_PROG */ >> - if (!brw->vs.prog_data->base.nr_**pull_params) { >> + if (!prog_data->nr_pull_params) { >> if (vec4_ctx->const_bo) { >> drm_intel_bo_unreference(vec4_**ctx->const_bo); >> vec4_ctx->const_bo = NULL; >> vec4_ctx->surf_offset[SURF_**INDEX_VEC4_CONST_BUFFER] = 0; >> - brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF; >> + brw->state.dirty.brw |= brw_new_constbuf; >> } >> return; >> } >> >> /* _NEW_PROGRAM_CONSTANTS */ >> drm_intel_bo_unreference(vec4_**ctx->const_bo); >> - uint32_t size = brw->vs.prog_data->base.nr_**pull_params * 4; >> - vec4_ctx->const_bo = drm_intel_bo_alloc(brw->**bufmgr, >> "vp_const_buffer", >> + uint32_t size = prog_data->nr_pull_params * 4; >> + vec4_ctx->const_bo = drm_intel_bo_alloc(brw->**bufmgr, >> "vec4_const_buffer", >> size, 64); >> >> drm_intel_gem_bo_map_gtt(vec4_**ctx->const_bo); >> - for (i = 0; i < brw->vs.prog_data->base.nr_**pull_params; i++) { >> + >> + for (i = 0; i < prog_data->nr_pull_params; i++) { >> memcpy(vec4_ctx->const_bo->**virtual + i * 4, >> - brw->vs.prog_data->base.pull_**param[i], >> + prog_data->pull_param[i], >> 4); >> } >> >> if (0) { >> - for (i = 0; i < ALIGN(brw->vs.prog_data->base.**nr_pull_params, >> 4) / 4; >> + for (i = 0; i < ALIGN(prog_data->nr_pull_**params, 4) / 4; >> i++) { >> > > You could probably move the i++ up a line since it's shorter now. > Done. > > This patch is great. > > > float *row = (float *)vec4_ctx->const_bo->virtual + i * 4; >> - printf("vs const surface %3d: %4.3f %4.3f %4.3f %4.3f\n", >> + printf("const surface %3d: %4.3f %4.3f %4.3f %4.3f\n", >> i, row[0], row[1], row[2], row[3]); >> } >> } >> @@ -95,7 +89,31 @@ brw_upload_vs_pull_constants(**struct brw_context >> *brw) >> brw->vtbl.create_constant_**surface(brw, vec4_ctx->const_bo, 0, >> size, >> &vec4_ctx->surf_offset[surf], >> false); >> >> - brw->state.dirty.brw |= BRW_NEW_VS_CONSTBUF; >> + brw->state.dirty.brw |= brw_new_constbuf; >> +} >> + >> + >> +/* Creates a new VS constant buffer reflecting the current VS program's >> + * constants, if needed by the VS program. >> + * >> + * Otherwise, constants go through the CURBEs using the >> brw_constant_buffer >> + * state atom. >> + */ >> +static void >> +brw_upload_vs_pull_constants(**struct brw_context *brw) >> +{ >> + struct brw_vec4_context_base *vec4_ctx = &brw->vs.base; >> + >> + /* BRW_NEW_VERTEX_PROGRAM */ >> + struct brw_vertex_program *vp = >> + (struct brw_vertex_program *) brw->vertex_program; >> + >> + /* CACHE_NEW_VS_PROG */ >> + const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base; >> + >> + /* _NEW_PROGRAM_CONSTANTS */ >> + brw_upload_vec4_pull_**constants(brw, BRW_NEW_VS_CONSTBUF, >> &vp->program.Base, >> + vec4_ctx, prog_data); >> } >> >> const struct brw_tracked_state brw_vs_pull_constants = { >> >> >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev