[Mesa-dev] [PATCH 29/30] i965/vs: generalize push const upload in preparation for GS.
Paul Berry
stereotype441 at gmail.com
Tue Aug 20 11:30:44 PDT 2013
---
src/mesa/drivers/dri/i965/brw_context.h | 20 +++++++++--
src/mesa/drivers/dri/i965/gen6_vs_state.c | 56 +++++++++++++++++++------------
src/mesa/drivers/dri/i965/gen7_vs_state.c | 6 ++--
3 files changed, 56 insertions(+), 26 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index 301552f..b4e1e45 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -835,6 +835,16 @@ struct brw_query_object {
/**
+ * Info that is common to the configuration of VS and GS push constants.
+ */
+struct brw_push_const_info
+{
+ uint32_t offset; /* Offset in the batchbuffer */
+ int size; /* in 256-bit register increments */
+};
+
+
+/**
* brw_context is derived from gl_context.
*/
struct brw_context
@@ -1146,8 +1156,7 @@ struct brw_context
uint32_t prog_offset;
uint32_t state_offset;
- uint32_t push_const_offset; /* Offset in the batchbuffer */
- int push_const_size; /* in 256-bit register increments */
+ struct brw_push_const_info push_const;
/** @{ register allocator */
@@ -1631,6 +1640,13 @@ brw_setup_vec4_key_clip_info(struct brw_context *brw,
struct brw_vec4_prog_key *key,
bool program_uses_clip_distance);
+void
+gen6_upload_vec4_push_constants(struct brw_context *brw,
+ const struct gl_program *prog,
+ const struct brw_vec4_prog_data *prog_data,
+ struct brw_push_const_info *const_info,
+ enum state_struct_type type);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c
index d511fe9..cb6ed71 100644
--- a/src/mesa/drivers/dri/i965/gen6_vs_state.c
+++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c
@@ -33,31 +33,31 @@
#include "program/prog_statevars.h"
#include "intel_batchbuffer.h"
-static void
-gen6_upload_vs_push_constants(struct brw_context *brw)
+void
+gen6_upload_vec4_push_constants(struct brw_context *brw,
+ const struct gl_program *prog,
+ const struct brw_vec4_prog_data *prog_data,
+ struct brw_push_const_info *const_info,
+ enum state_struct_type type)
{
struct gl_context *ctx = &brw->ctx;
- /* _BRW_NEW_VERTEX_PROGRAM */
- const struct brw_vertex_program *vp =
- brw_vertex_program_const(brw->vertex_program);
/* Updates the ParamaterValues[i] pointers for all parameters of the
* basic type of PROGRAM_STATE_VAR.
*/
/* XXX: Should this happen somewhere before to get our state flag set? */
- _mesa_load_state_parameters(ctx, vp->program.Base.Parameters);
+ _mesa_load_state_parameters(ctx, prog->Parameters);
- /* CACHE_NEW_VS_PROG */
- if (brw->vs.prog_data->base.nr_params == 0) {
- brw->vs.push_const_size = 0;
+ if (prog_data->nr_params == 0) {
+ const_info->size = 0;
} else {
int params_uploaded;
float *param;
int i;
- param = brw_state_batch(brw, AUB_TRACE_VS_CONSTANTS,
- brw->vs.prog_data->base.nr_params * sizeof(float),
- 32, &brw->vs.push_const_offset);
+ param = brw_state_batch(brw, type,
+ prog_data->nr_params * sizeof(float),
+ 32, &const_info->offset);
/* _NEW_PROGRAM_CONSTANTS
*
@@ -65,13 +65,13 @@ gen6_upload_vs_push_constants(struct brw_context *brw)
* side effect of dereferencing uniforms, so _NEW_PROGRAM_CONSTANTS
* wouldn't be set for them.
*/
- for (i = 0; i < brw->vs.prog_data->base.nr_params; i++) {
- param[i] = *brw->vs.prog_data->base.param[i];
+ for (i = 0; i < prog_data->nr_params; i++) {
+ param[i] = *prog_data->param[i];
}
- params_uploaded = brw->vs.prog_data->base.nr_params / 4;
+ params_uploaded = prog_data->nr_params / 4;
if (0) {
- printf("VS constant buffer:\n");
+ printf("Constant buffer:\n");
for (i = 0; i < params_uploaded; i++) {
float *buf = param + i * 4;
printf("%d: %f %f %f %f\n",
@@ -79,12 +79,26 @@ gen6_upload_vs_push_constants(struct brw_context *brw)
}
}
- brw->vs.push_const_size = (params_uploaded + 1) / 2;
+ const_info->size = (params_uploaded + 1) / 2;
/* We can only push 32 registers of constants at a time. */
- assert(brw->vs.push_const_size <= 32);
+ assert(const_info->size <= 32);
}
}
+static void
+gen6_upload_vs_push_constants(struct brw_context *brw)
+{
+ /* _BRW_NEW_VERTEX_PROGRAM */
+ const struct brw_vertex_program *vp =
+ brw_vertex_program_const(brw->vertex_program);
+ /* CACHE_NEW_VS_PROG */
+ const struct brw_vec4_prog_data *prog_data = &brw->vs.prog_data->base;
+ struct brw_push_const_info *const_info = &brw->vs.push_const;
+
+ gen6_upload_vec4_push_constants(brw, &vp->program.Base, prog_data,
+ const_info, AUB_TRACE_VS_CONSTANTS);
+}
+
const struct brw_tracked_state gen6_vs_push_constants = {
.dirty = {
.mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS,
@@ -114,7 +128,7 @@ upload_vs_state(struct brw_context *brw)
*/
intel_emit_post_sync_nonzero_flush(brw);
- if (brw->vs.push_const_size == 0) {
+ if (brw->vs.push_const.size == 0) {
/* Disable the push constant buffers. */
BEGIN_BATCH(5);
OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (5 - 2));
@@ -131,8 +145,8 @@ upload_vs_state(struct brw_context *brw)
/* Pointer to the VS constant buffer. Covered by the set of
* state flags from gen6_upload_vs_constants
*/
- OUT_BATCH(brw->vs.push_const_offset +
- brw->vs.push_const_size - 1);
+ OUT_BATCH(brw->vs.push_const.offset +
+ brw->vs.push_const.size - 1);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
diff --git a/src/mesa/drivers/dri/i965/gen7_vs_state.c b/src/mesa/drivers/dri/i965/gen7_vs_state.c
index 07f0931..9dd7078 100644
--- a/src/mesa/drivers/dri/i965/gen7_vs_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_vs_state.c
@@ -51,7 +51,7 @@ upload_vs_state(struct brw_context *brw)
OUT_BATCH(brw->vs.sampler_offset);
ADVANCE_BATCH();
- if (brw->vs.push_const_size == 0) {
+ if (brw->vs.push_const.size == 0) {
/* Disable the push constant buffers. */
BEGIN_BATCH(7);
OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2));
@@ -67,12 +67,12 @@ upload_vs_state(struct brw_context *brw)
BEGIN_BATCH(7);
OUT_BATCH(_3DSTATE_CONSTANT_VS << 16 | (7 - 2));
- OUT_BATCH(brw->vs.push_const_size);
+ OUT_BATCH(brw->vs.push_const.size);
OUT_BATCH(0);
/* Pointer to the VS constant buffer. Covered by the set of
* state flags from gen6_prepare_wm_contants
*/
- OUT_BATCH(brw->vs.push_const_offset | mocs);
+ OUT_BATCH(brw->vs.push_const.offset | mocs);
OUT_BATCH(0);
OUT_BATCH(0);
OUT_BATCH(0);
--
1.8.3.4
More information about the mesa-dev
mailing list