--- 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, + 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++) { 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 = { -- 1.8.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev