summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_state_upload.c
diff options
context:
space:
mode:
authorJordan Justen <jordan.l.justen@intel.com>2015-03-07 22:44:39 -0800
committerJordan Justen <jordan.l.justen@intel.com>2015-03-31 16:40:23 -0700
commitdb119550725d438c928c50382a2a675b37c24a66 (patch)
tree736131a97ace090c8d5c61e7a0e489cdf4a453ed /src/mesa/drivers/dri/i965/brw_state_upload.c
parent736a31d46252187a04a7b5c0119e3ba9be2418cb (diff)
downloadexternal_mesa3d-db119550725d438c928c50382a2a675b37c24a66.zip
external_mesa3d-db119550725d438c928c50382a2a675b37c24a66.tar.gz
external_mesa3d-db119550725d438c928c50382a2a675b37c24a66.tar.bz2
i965/state: Support multiple pipelines in brw->num_atoms
brw->num_atoms is converted to an array, but currently just an array of length 1. Adds brw_copy_pipeline_atoms which copies the atoms for a pipeline, and sets brw->num_atoms[p] for pipeline p. v2: * Rename brw->atoms[] to render_atoms * Rename brw_add_pipeline_atoms to brw_copy_pipeline_atoms * Rename brw_pipeline_first_atom to brw_get_pipeline_atoms Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_state_upload.c')
-rw-r--r--src/mesa/drivers/dri/i965/brw_state_upload.c94
1 files changed, 57 insertions, 37 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
index f0d0bac..b15d8c5 100644
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
@@ -174,7 +174,7 @@ static const struct brw_tracked_state *gen6_atoms[] =
&brw_vertices,
};
-static const struct brw_tracked_state *gen7_atoms[] =
+static const struct brw_tracked_state *gen7_render_atoms[] =
{
/* Command packets: */
@@ -246,7 +246,7 @@ static const struct brw_tracked_state *gen7_atoms[] =
&haswell_cut_index,
};
-static const struct brw_tracked_state *gen8_atoms[] =
+static const struct brw_tracked_state *gen8_render_atoms[] =
{
/* Command packets: */
&gen8_state_base_address,
@@ -352,48 +352,68 @@ brw_upload_initial_gpu_state(struct brw_context *brw)
}
}
+static inline const struct brw_tracked_state *
+brw_get_pipeline_atoms(struct brw_context *brw,
+ enum brw_pipeline pipeline)
+{
+ switch (pipeline) {
+ case BRW_RENDER_PIPELINE:
+ return brw->render_atoms;
+ default:
+ STATIC_ASSERT(BRW_NUM_PIPELINES == 1);
+ unreachable("Unsupported pipeline");
+ return NULL;
+ }
+}
+
+static void
+brw_copy_pipeline_atoms(struct brw_context *brw,
+ enum brw_pipeline pipeline,
+ const struct brw_tracked_state **atoms,
+ int num_atoms)
+{
+ /* This is to work around brw_context::atoms being declared const. We want
+ * it to be const, but it needs to be initialized somehow!
+ */
+ struct brw_tracked_state *context_atoms =
+ (struct brw_tracked_state *) brw_get_pipeline_atoms(brw, pipeline);
+
+ for (int i = 0; i < num_atoms; i++) {
+ context_atoms[i] = *atoms[i];
+ assert(context_atoms[i].dirty.mesa | context_atoms[i].dirty.brw);
+ assert(context_atoms[i].emit);
+ }
+
+ brw->num_atoms[pipeline] = num_atoms;
+}
+
void brw_init_state( struct brw_context *brw )
{
struct gl_context *ctx = &brw->ctx;
- const struct brw_tracked_state **atoms;
- int num_atoms;
- STATIC_ASSERT(ARRAY_SIZE(gen4_atoms) <= ARRAY_SIZE(brw->atoms));
- STATIC_ASSERT(ARRAY_SIZE(gen6_atoms) <= ARRAY_SIZE(brw->atoms));
- STATIC_ASSERT(ARRAY_SIZE(gen7_atoms) <= ARRAY_SIZE(brw->atoms));
- STATIC_ASSERT(ARRAY_SIZE(gen8_atoms) <= ARRAY_SIZE(brw->atoms));
+ STATIC_ASSERT(ARRAY_SIZE(gen4_atoms) <= ARRAY_SIZE(brw->render_atoms));
+ STATIC_ASSERT(ARRAY_SIZE(gen6_atoms) <= ARRAY_SIZE(brw->render_atoms));
+ STATIC_ASSERT(ARRAY_SIZE(gen7_render_atoms) <=
+ ARRAY_SIZE(brw->render_atoms));
+ STATIC_ASSERT(ARRAY_SIZE(gen8_render_atoms) <=
+ ARRAY_SIZE(brw->render_atoms));
brw_init_caches(brw);
if (brw->gen >= 8) {
- atoms = gen8_atoms;
- num_atoms = ARRAY_SIZE(gen8_atoms);
+ brw_copy_pipeline_atoms(brw, BRW_RENDER_PIPELINE,
+ gen8_render_atoms,
+ ARRAY_SIZE(gen8_render_atoms));
} else if (brw->gen == 7) {
- atoms = gen7_atoms;
- num_atoms = ARRAY_SIZE(gen7_atoms);
+ brw_copy_pipeline_atoms(brw, BRW_RENDER_PIPELINE,
+ gen7_render_atoms,
+ ARRAY_SIZE(gen7_render_atoms));
} else if (brw->gen == 6) {
- atoms = gen6_atoms;
- num_atoms = ARRAY_SIZE(gen6_atoms);
+ brw_copy_pipeline_atoms(brw, BRW_RENDER_PIPELINE,
+ gen6_atoms, ARRAY_SIZE(gen6_atoms));
} else {
- atoms = gen4_atoms;
- num_atoms = ARRAY_SIZE(gen4_atoms);
- }
-
- brw->num_atoms = num_atoms;
-
- /* This is to work around brw_context::atoms being declared const. We want
- * it to be const, but it needs to be initialized somehow!
- */
- struct brw_tracked_state *context_atoms =
- (struct brw_tracked_state *) &brw->atoms[0];
-
- for (int i = 0; i < num_atoms; i++)
- context_atoms[i] = *atoms[i];
-
- while (num_atoms--) {
- assert((*atoms)->dirty.mesa | (*atoms)->dirty.brw);
- assert((*atoms)->emit);
- atoms++;
+ brw_copy_pipeline_atoms(brw, BRW_RENDER_PIPELINE,
+ gen4_atoms, ARRAY_SIZE(gen4_atoms));
}
brw_upload_initial_gpu_state(brw);
@@ -641,8 +661,8 @@ void brw_upload_render_state(struct brw_context *brw)
memset(&examined, 0, sizeof(examined));
prev = *state;
- for (i = 0; i < brw->num_atoms; i++) {
- const struct brw_tracked_state *atom = &brw->atoms[i];
+ for (i = 0; i < brw->num_atoms[BRW_RENDER_PIPELINE]; i++) {
+ const struct brw_tracked_state *atom = &brw->render_atoms[i];
struct brw_state_flags generated;
if (check_state(state, &atom->dirty)) {
@@ -661,8 +681,8 @@ void brw_upload_render_state(struct brw_context *brw)
}
}
else {
- for (i = 0; i < brw->num_atoms; i++) {
- const struct brw_tracked_state *atom = &brw->atoms[i];
+ for (i = 0; i < brw->num_atoms[BRW_RENDER_PIPELINE]; i++) {
+ const struct brw_tracked_state *atom = &brw->render_atoms[i];
if (check_state(state, &atom->dirty)) {
atom->emit(brw);