From ef271d3bdf8fea29ab446f78d95c81319e730015 Mon Sep 17 00:00:00 2001 From: Jordan Justen Date: Thu, 28 Aug 2014 15:35:57 -0700 Subject: i965/cs: Upload brw_cs_state Signed-off-by: Jordan Justen --- src/mesa/drivers/dri/i965/brw_context.h | 2 +- src/mesa/drivers/dri/i965/brw_cs.cpp | 70 ++++++++++++++++++++++++++++ src/mesa/drivers/dri/i965/brw_defines.h | 3 ++ src/mesa/drivers/dri/i965/brw_state.h | 1 + src/mesa/drivers/dri/i965/brw_state_upload.c | 2 + 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index c4fc363117..6d5c8928af 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -1420,7 +1420,7 @@ struct brw_context int num_atoms[BRW_NUM_PIPELINES]; const struct brw_tracked_state render_atoms[57]; - const struct brw_tracked_state compute_atoms[0]; + const struct brw_tracked_state compute_atoms[1]; /* If (INTEL_DEBUG & DEBUG_BATCH) */ struct { diff --git a/src/mesa/drivers/dri/i965/brw_cs.cpp b/src/mesa/drivers/dri/i965/brw_cs.cpp index 61c35ae942..a913584ab1 100644 --- a/src/mesa/drivers/dri/i965/brw_cs.cpp +++ b/src/mesa/drivers/dri/i965/brw_cs.cpp @@ -288,3 +288,73 @@ brw_cs_precompile(struct gl_context *ctx, return success; } + + +static void +brw_upload_cs_state(struct brw_context *brw) +{ + if (!brw->cs.prog_data) + return; + + uint32_t offset; + uint32_t *desc = (uint32_t*) brw_state_batch(brw, AUB_TRACE_SURFACE_STATE, + 8 * 4, 64, &offset); + struct brw_stage_state *stage_state = &brw->cs.base; + struct brw_cs_prog_data *cs_prog_data = brw->cs.prog_data; + struct brw_stage_prog_data *prog_data = &cs_prog_data->base; + + uint32_t *bind = (uint32_t*) brw_state_batch(brw, AUB_TRACE_BINDING_TABLE, + prog_data->binding_table.size_bytes, + 32, &stage_state->bind_bo_offset); + + uint32_t dwords = brw->gen < 8 ? 8 : 9; + BEGIN_BATCH(dwords); + OUT_BATCH(MEDIA_VFE_STATE << 16 | (dwords - 2)); + if (brw->gen >= 8) { + OUT_BATCH(0); + OUT_BATCH(0); + } else + OUT_BATCH(0); + + OUT_BATCH(((brw->max_cs_threads - 1) << 16) | + (brw->gen >= 8 ? (2 << 8) : 0) | + (brw->gen >= 8 ? 0xc0 : 0xc4)); + + OUT_BATCH(0); + OUT_BATCH(brw->gen >= 8 ? (2 << 16) : 0); + OUT_BATCH(0); + OUT_BATCH(0); + OUT_BATCH(0); + ADVANCE_BATCH(); + + /* BRW_NEW_SURFACES and BRW_NEW_*_CONSTBUF */ + memcpy(bind, stage_state->surf_offset, + prog_data->binding_table.size_bytes); + + memset(desc, 0, 8 * 4); + + int dw = 0; + desc[dw++] = brw->cs.base.prog_offset; + if (brw->gen >= 8) + dw++; /* Kernel Start Pointer High */ + dw++; + dw++; + desc[dw++] = stage_state->bind_bo_offset; + + BEGIN_BATCH(4); + OUT_BATCH(MEDIA_INTERFACE_DESCRIPTOR_LOAD << 16 | (4 - 2)); + OUT_BATCH(0); + OUT_BATCH(8 * 4); + OUT_BATCH(offset); + ADVANCE_BATCH(); +} + + +extern "C" +const struct brw_tracked_state brw_cs_state = { + .dirty = { + .mesa = 0, + .brw = BRW_NEW_COMPUTE_PROGRAM, + }, + .emit = brw_upload_cs_state +}; diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index 9c7aafa013..e1addbdaae 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -2448,4 +2448,7 @@ enum brw_wm_barycentric_interp_mode { #define SKL_MOCS_WB 9 #define SKL_MOCS_WT 5 +#define MEDIA_VFE_STATE 0x7000 +#define MEDIA_INTERFACE_DESCRIPTOR_LOAD 0x7002 + #endif diff --git a/src/mesa/drivers/dri/i965/brw_state.h b/src/mesa/drivers/dri/i965/brw_state.h index 5e4599d878..8298600bce 100644 --- a/src/mesa/drivers/dri/i965/brw_state.h +++ b/src/mesa/drivers/dri/i965/brw_state.h @@ -93,6 +93,7 @@ extern const struct brw_tracked_state brw_drawing_rect; extern const struct brw_tracked_state brw_indices; extern const struct brw_tracked_state brw_vertices; extern const struct brw_tracked_state brw_index_buffer; +extern const struct brw_tracked_state brw_cs_state; extern const struct brw_tracked_state gen6_binding_table_pointers; extern const struct brw_tracked_state gen6_blend_state; extern const struct brw_tracked_state gen6_cc_state_pointers; diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c index 952d3c198e..5732317b98 100644 --- a/src/mesa/drivers/dri/i965/brw_state_upload.c +++ b/src/mesa/drivers/dri/i965/brw_state_upload.c @@ -249,6 +249,7 @@ static const struct brw_tracked_state *gen7_render_atoms[] = static const struct brw_tracked_state *gen7_compute_atoms[] = { + &brw_cs_state, }; static const struct brw_tracked_state *gen8_render_atoms[] = @@ -329,6 +330,7 @@ static const struct brw_tracked_state *gen8_render_atoms[] = static const struct brw_tracked_state *gen8_compute_atoms[] = { + &brw_cs_state, }; static void -- cgit v1.2.3