diff options
author | Eric Anholt <eric@anholt.net> | 2014-05-21 14:22:47 -0700 |
---|---|---|
committer | Kenneth Graunke <kenneth@whitecape.org> | 2014-07-02 12:45:59 -0700 |
commit | e24ef5ab189a962722bff7c6bc2ee574296e0953 (patch) | |
tree | cc24959eed09bad196f4e20238c790a9cc2b4efa /src/mesa/drivers/dri/i965/brw_vs_surface_state.c | |
parent | 34f4e614dd28983a3e5dd5a3b34721ca4d0a8162 (diff) | |
download | external_mesa3d-e24ef5ab189a962722bff7c6bc2ee574296e0953.zip external_mesa3d-e24ef5ab189a962722bff7c6bc2ee574296e0953.tar.gz external_mesa3d-e24ef5ab189a962722bff7c6bc2ee574296e0953.tar.bz2 |
i965: Merge VS/GS and WM pull constant buffer upload paths.
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_vs_surface_state.c')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_vs_surface_state.c | 45 |
1 files changed, 29 insertions, 16 deletions
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 cbe88ea..ef4a77a 100644 --- a/src/mesa/drivers/dri/i965/brw_vs_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_vs_surface_state.c @@ -36,22 +36,35 @@ #include "brw_state.h" #include "intel_buffer_objects.h" +/** + * Creates a temporary BO containing the pull constant data for the shader + * stage, and the SURFACE_STATE struct that points at it. + * + * Pull constants are GLSL uniforms (and other constant data) beyond what we + * could fit as push constants, or that have variable-index array access + * (which is easiest to support using pull constants, and avoids filling + * register space with mostly-unused data). + * + * Compare this path to brw_curbe.c for gen4/5 push constants, and + * gen6_vs_state.c for gen6+ push constants. + */ 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) +brw_upload_pull_constants(struct brw_context *brw, + GLbitfield brw_new_constbuf, + const struct gl_program *prog, + struct brw_stage_state *stage_state, + const struct brw_stage_prog_data *prog_data, + bool dword_pitch) { int i; - uint32_t surf_index = prog_data->base.binding_table.pull_constants_start; + uint32_t surf_index = prog_data->binding_table.pull_constants_start; /* Updates the ParamaterValues[i] pointers for all parameters of the * basic type of PROGRAM_STATE_VAR. */ _mesa_load_state_parameters(&brw->ctx, prog->Parameters); - if (!prog_data->base.nr_pull_params) { + if (!prog_data->nr_pull_params) { if (stage_state->surf_offset[surf_index]) { stage_state->surf_offset[surf_index] = 0; brw->state.dirty.brw |= brw_new_constbuf; @@ -59,19 +72,19 @@ brw_upload_vec4_pull_constants(struct brw_context *brw, return; } - /* _NEW_PROGRAM_CONSTANTS */ - uint32_t size = prog_data->base.nr_pull_params * 4; + /* CACHE_NEW_*_PROG | _NEW_PROGRAM_CONSTANTS */ + uint32_t size = prog_data->nr_pull_params * 4; drm_intel_bo *const_bo = NULL; uint32_t const_offset; float *constants = intel_upload_space(brw, size, 64, &const_bo, &const_offset); - for (i = 0; i < prog_data->base.nr_pull_params; i++) { - constants[i] = *prog_data->base.pull_param[i]; + for (i = 0; i < prog_data->nr_pull_params; i++) { + constants[i] = *prog_data->pull_param[i]; } if (0) { - for (i = 0; i < ALIGN(prog_data->base.nr_pull_params, 4) / 4; i++) { + for (i = 0; i < ALIGN(prog_data->nr_pull_params, 4) / 4; i++) { float *row = &constants[i * 4]; fprintf(stderr, "const surface %3d: %4.3f %4.3f %4.3f %4.3f\n", i, row[0], row[1], row[2], row[3]); @@ -80,7 +93,7 @@ brw_upload_vec4_pull_constants(struct brw_context *brw, brw_create_constant_surface(brw, const_bo, const_offset, size, &stage_state->surf_offset[surf_index], - false); + dword_pitch); drm_intel_bo_unreference(const_bo); brw->state.dirty.brw |= brw_new_constbuf; @@ -103,11 +116,11 @@ brw_upload_vs_pull_constants(struct brw_context *brw) (struct brw_vertex_program *) brw->vertex_program; /* CACHE_NEW_VS_PROG */ - const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base; + const struct brw_stage_prog_data *prog_data = &brw->vs.prog_data->base.base; /* _NEW_PROGRAM_CONSTANTS */ - brw_upload_vec4_pull_constants(brw, BRW_NEW_VS_CONSTBUF, &vp->program.Base, - stage_state, prog_data); + brw_upload_pull_constants(brw, BRW_NEW_VS_CONSTBUF, &vp->program.Base, + stage_state, prog_data, false); } const struct brw_tracked_state brw_vs_pull_constants = { |