From 1b19f2c576a343aca946494cf3486395b03b3531 Mon Sep 17 00:00:00 2001 From: Paul Berry Date: Sat, 24 Aug 2013 13:08:57 -0700 Subject: [PATCH] i965: generalize brw_vs_pull_constants in preparation for GS. v2: Use GLbitfield instead of GLbitfield64 in brw_upload_vec4_pull_constants. Reviewed-by: Kenneth Graunke --- src/mesa/drivers/dri/i965/brw_state.h | 8 +++ .../drivers/dri/i965/brw_vs_surface_state.c | 69 ++++++++++++------- 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 481463991ae..695a84c473b 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, + GLbitfield brw_new_constbuf, + const struct gl_program *prog, + struct brw_stage_state *stage_state, + 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 f1e1a4e602c..b55febefda0 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,49 @@ #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_stage_state *stage_state = &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, + GLbitfield brw_new_constbuf, + const struct gl_program *prog, + struct brw_stage_state *stage_state, + 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 (stage_state->const_bo) { drm_intel_bo_unreference(stage_state->const_bo); stage_state->const_bo = NULL; stage_state->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(stage_state->const_bo); - uint32_t size = brw->vs.prog_data->base.nr_pull_params * 4; - stage_state->const_bo = drm_intel_bo_alloc(brw->bufmgr, "vp_const_buffer", - size, 64); + uint32_t size = prog_data->nr_pull_params * 4; + stage_state->const_bo = drm_intel_bo_alloc(brw->bufmgr, "vec4_const_buffer", + size, 64); drm_intel_gem_bo_map_gtt(stage_state->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(stage_state->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; - i++) { + for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) { float *row = (float *)stage_state->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 +88,31 @@ brw_upload_vs_pull_constants(struct brw_context *brw) brw->vtbl.create_constant_surface(brw, stage_state->const_bo, 0, size, &stage_state->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_stage_state *stage_state = &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, + stage_state, prog_data); } const struct brw_tracked_state brw_vs_pull_constants = { -- 2.30.2