summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2016-04-27 17:15:11 -0700
committerJason Ekstrand <[email protected]>2016-05-14 13:34:52 -0700
commitcd5a2905cf0721b71bcc5a7ef41a540ab5deb675 (patch)
tree11cf405d8121b01584b80e2bb673c087dc690748 /src
parentc46cbe19f455b27fec717d8a80b2b07995424048 (diff)
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_blorp.h11
-rw-r--r--src/mesa/drivers/dri/i965/gen6_blorp.c12
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, &params->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 *)&params->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;
}