Переглянути джерело

i965: Go back to using the kernel SOL reset feature.

It turns out the MI_LOAD_REGISTER_IMM approach doesn't work on Haswell,
and regressed essentially all the transform feedback Piglit tests.

This morally reverts eaa6fbe6d5.  However,
the code is still simpler than it was.  On BeginTransformFeedback, we
simply flush the batch and set the SOL reset flag so that the next batch
will start with zeroed offsets.  There's still no software counting.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=64887
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
tags/mesa-9.2-rc1
Kenneth Graunke 12 роки тому
джерело
коміт
062317d667

+ 2
- 8
src/mesa/drivers/dri/i965/gen7_sol_state.c Переглянути файл

@@ -260,14 +260,8 @@ gen7_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
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();
}
intel_batchbuffer_flush(intel);
intel->batch.needs_sol_reset = true;
}

void

+ 4
- 0
src/mesa/drivers/dri/intel/intel_batchbuffer.c Переглянути файл

@@ -96,6 +96,7 @@ intel_batchbuffer_reset(struct intel_context *intel)
intel->batch.reserved_space = BATCH_RESERVED;
intel->batch.state_batch_offset = intel->batch.bo->size;
intel->batch.used = 0;
intel->batch.needs_sol_reset = false;
}

void
@@ -198,6 +199,9 @@ do_flush_locked(struct intel_context *intel)
flags = I915_EXEC_BLT;
}

if (batch->needs_sol_reset)
flags |= I915_EXEC_GEN7_SOL_RESET;

if (ret == 0) {
if (unlikely(INTEL_DEBUG & DEBUG_AUB) && intel->vtbl.annotate_aub)
intel->vtbl.annotate_aub(intel);

+ 1
- 0
src/mesa/drivers/dri/intel/intel_context.h Переглянути файл

@@ -135,6 +135,7 @@ struct intel_batchbuffer {

uint32_t state_batch_offset;
bool is_blit;
bool needs_sol_reset;

struct {
uint16_t used;

Завантаження…
Відмінити
Зберегти