From cd5a2905cf0721b71bcc5a7ef41a540ab5deb675 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Wed, 27 Apr 2016 17:15:11 -0700 Subject: [PATCH] i965/blorp: Add a param array to prog_data This array allows the push constants to be re-arranged on upload. The actual arrangement will, eventually, come from the back-end compiler. Reviewed-by: Topi Pohjolainen --- src/mesa/drivers/dri/i965/brw_blorp.c | 4 ++++ src/mesa/drivers/dri/i965/brw_blorp.h | 11 +++++++++++ src/mesa/drivers/dri/i965/gen6_blorp.c | 12 +++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_blorp.c b/src/mesa/drivers/dri/i965/brw_blorp.c index 8fd936323c0..40c02e26773 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.c +++ b/src/mesa/drivers/dri/i965/brw_blorp.c @@ -139,6 +139,10 @@ brw_blorp_prog_data_init(struct brw_blorp_prog_data *prog_data) { prog_data->first_curbe_grf = 0; prog_data->persample_msaa_dispatch = false; + + prog_data->nr_params = BRW_BLORP_NUM_PUSH_CONSTANT_DWORDS; + for (unsigned i = 0; i < BRW_BLORP_NUM_PUSH_CONSTANT_DWORDS; i++) + prog_data->param[i] = i; } diff --git a/src/mesa/drivers/dri/i965/brw_blorp.h b/src/mesa/drivers/dri/i965/brw_blorp.h index 8c1f92bb59f..95e0e45ce39 100644 --- a/src/mesa/drivers/dri/i965/brw_blorp.h +++ b/src/mesa/drivers/dri/i965/brw_blorp.h @@ -199,6 +199,9 @@ struct brw_blorp_wm_push_constants uint32_t pad[5]; }; +#define BRW_BLORP_NUM_PUSH_CONSTANT_DWORDS \ + (sizeof(struct brw_blorp_wm_push_constants) / 4) + /* Every 32 bytes of push constant data constitutes one GEN register. */ static const unsigned int BRW_BLORP_NUM_PUSH_CONST_REGS = sizeof(struct brw_blorp_wm_push_constants) / 32; @@ -212,6 +215,14 @@ struct brw_blorp_prog_data * than one sample per pixel. */ bool persample_msaa_dispatch; + + /* The compiler will re-arrange push constants and store the upload order + * here. Given an index 'i' in the final upload buffer, param[i] gives the + * index in the uniform store. In other words, the value to be uploaded can + * be found by brw_blorp_params::wm_push_consts[param[i]]. + */ + uint8_t nr_params; + uint8_t param[BRW_BLORP_NUM_PUSH_CONSTANT_DWORDS]; }; void brw_blorp_prog_data_init(struct brw_blorp_prog_data *prog_data); diff --git a/src/mesa/drivers/dri/i965/gen6_blorp.c b/src/mesa/drivers/dri/i965/gen6_blorp.c index 1955811b002..fdd82869612 100644 --- a/src/mesa/drivers/dri/i965/gen6_blorp.c +++ b/src/mesa/drivers/dri/i965/gen6_blorp.c @@ -308,11 +308,13 @@ gen6_blorp_emit_wm_constants(struct brw_context *brw, { uint32_t wm_push_const_offset; - void *constants = brw_state_batch(brw, AUB_TRACE_WM_CONSTANTS, - sizeof(params->wm_push_consts), - 32, &wm_push_const_offset); - memcpy(constants, ¶ms->wm_push_consts, - sizeof(params->wm_push_consts)); + uint32_t *constants = brw_state_batch(brw, AUB_TRACE_WM_CONSTANTS, + sizeof(params->wm_push_consts), + 32, &wm_push_const_offset); + + const uint32_t *push_consts = (const uint32_t *)¶ms->wm_push_consts; + for (unsigned i = 0; i < params->wm_prog_data->nr_params; i++) + constants[i] = push_consts[params->wm_prog_data->param[i]]; return wm_push_const_offset; } -- 2.30.2