[Mesa-dev] [PATCH 11/22] i965: generalize brw_vs_pull_constants in preparation for GS.
Kenneth Graunke
kenneth at whitecape.org
Wed Aug 28 18:06:23 PDT 2013
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.
> + 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.
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 = {
>
More information about the mesa-dev
mailing list