diff options
author | Kenneth Graunke <[email protected]> | 2013-05-20 15:25:28 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2013-05-21 13:29:40 -0700 |
commit | b29381567a83b47ef92e6e4e8e7c402550f467cb (patch) | |
tree | e97e262d097573c72cb7c32b269e06fd6490d953 /src/mesa/drivers | |
parent | 64a87f29ce29d3c2e01b7fd79386bf6ace454f62 (diff) |
i965: Split BeginTransformFeedback hook into Gen6 and Gen7+ variants.
Most of the work in BeginTransformFeedback is only necessary on Gen6.
We may as well just skip it on Gen7+.
v2: Add an intel->gen == 6 assert.
Signed-off-by: Kenneth Graunke <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
Diffstat (limited to 'src/mesa/drivers')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 8 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.h | 3 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen6_sol.c | 43 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen7_sol_state.c | 17 |
4 files changed, 42 insertions, 29 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 405580f5310..56c42ba3378 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -94,12 +94,14 @@ static void brwInitDriverFunctions(struct intel_screen *screen, gen4_init_queryobj_functions(functions); functions->QuerySamplesForFormat = brw_query_samples_for_format; - functions->BeginTransformFeedback = brw_begin_transform_feedback; - if (screen->gen >= 7) + if (screen->gen >= 7) { + functions->BeginTransformFeedback = gen7_begin_transform_feedback; functions->EndTransformFeedback = gen7_end_transform_feedback; - else + } else { + functions->BeginTransformFeedback = brw_begin_transform_feedback; functions->EndTransformFeedback = brw_end_transform_feedback; + } if (screen->gen >= 6) functions->GetSamplePosition = gen6_get_sample_position; diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index be49078b1e3..60b713d37f6 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1228,6 +1228,9 @@ brw_end_transform_feedback(struct gl_context *ctx, /* gen7_sol_state.c */ void +gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode, + struct gl_transform_feedback_object *obj); +void gen7_end_transform_feedback(struct gl_context *ctx, struct gl_transform_feedback_object *obj); diff --git a/src/mesa/drivers/dri/i965/gen6_sol.c b/src/mesa/drivers/dri/i965/gen6_sol.c index cdd6e74c865..0215a9b2c7f 100644 --- a/src/mesa/drivers/dri/i965/gen6_sol.c +++ b/src/mesa/drivers/dri/i965/gen6_sol.c @@ -145,6 +145,8 @@ brw_begin_transform_feedback(struct gl_context *ctx, GLenum mode, struct gl_transform_feedback_object *xfb_obj = ctx->TransformFeedback.CurrentObject; + assert(intel->gen == 6); + /* Compute the maximum number of vertices that we can write without * overflowing any of the buffers currently being used for feedback. */ @@ -152,36 +154,25 @@ brw_begin_transform_feedback(struct gl_context *ctx, GLenum mode, = _mesa_compute_max_transform_feedback_vertices(xfb_obj, linked_xfb_info); - if (intel->gen == 6) { - /* Initialize the SVBI 0 register to zero and set the maximum index. */ + /* Initialize the SVBI 0 register to zero and set the maximum index. */ + BEGIN_BATCH(4); + OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); + OUT_BATCH(0); /* SVBI 0 */ + OUT_BATCH(0); /* starting index */ + OUT_BATCH(max_index); + ADVANCE_BATCH(); + + /* Initialize the rest of the unused streams to sane values. Otherwise, + * they may indicate that there is no room to write data and prevent + * anything from happening at all. + */ + for (int i = 1; i < 4; i++) { BEGIN_BATCH(4); OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); - OUT_BATCH(0); /* SVBI 0 */ + OUT_BATCH(i << SVB_INDEX_SHIFT); OUT_BATCH(0); /* starting index */ - OUT_BATCH(max_index); + OUT_BATCH(0xffffffff); ADVANCE_BATCH(); - - /* Initialize the rest of the unused streams to sane values. Otherwise, - * they may indicate that there is no room to write data and prevent - * anything from happening at all. - */ - for (int i = 1; i < 4; i++) { - BEGIN_BATCH(4); - OUT_BATCH(_3DSTATE_GS_SVB_INDEX << 16 | (4 - 2)); - OUT_BATCH(i << SVB_INDEX_SHIFT); - OUT_BATCH(0); /* starting index */ - OUT_BATCH(0xffffffff); - ADVANCE_BATCH(); - } - } else if (intel->gen >= 7) { - /* Reset the SOL buffer offset register. */ - for (int i = 0; i < 4; i++) { - BEGIN_BATCH(3); - OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2)); - OUT_BATCH(GEN7_SO_WRITE_OFFSET(i)); - OUT_BATCH(0); - ADVANCE_BATCH(); - } } } diff --git a/src/mesa/drivers/dri/i965/gen7_sol_state.c b/src/mesa/drivers/dri/i965/gen7_sol_state.c index 2c4b7f99a05..8dfac01ff02 100644 --- a/src/mesa/drivers/dri/i965/gen7_sol_state.c +++ b/src/mesa/drivers/dri/i965/gen7_sol_state.c @@ -254,6 +254,23 @@ const struct brw_tracked_state gen7_sol_state = { }; void +gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode, + struct gl_transform_feedback_object *obj) +{ + struct brw_context *brw = brw_context(ctx); + struct intel_context *intel = &brw->intel; + + /* Reset the SOL buffer offset register. */ + for (int i = 0; i < 4; i++) { + BEGIN_BATCH(3); + OUT_BATCH(MI_LOAD_REGISTER_IMM | (3 - 2)); + OUT_BATCH(GEN7_SO_WRITE_OFFSET(i)); + OUT_BATCH(0); + ADVANCE_BATCH(); + } +} + +void gen7_end_transform_feedback(struct gl_context *ctx, struct gl_transform_feedback_object *obj) { |