[Mesa-dev] [PATCH 25/51] i965: Move HW context into brw_batch
Chris Wilson
chris at chris-wilson.co.uk
Tue Jan 10 21:23:48 UTC 2017
To reduce churn later, move the HW context variable from brw_context to
brw_batch.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
src/mesa/drivers/dri/i965/brw_batch.h | 2 ++
src/mesa/drivers/dri/i965/brw_context.c | 23 ++++--------------
src/mesa/drivers/dri/i965/brw_context.h | 2 --
src/mesa/drivers/dri/i965/brw_queryobj.c | 4 ++--
src/mesa/drivers/dri/i965/brw_reset.c | 8 +++----
src/mesa/drivers/dri/i965/brw_state_upload.c | 2 +-
src/mesa/drivers/dri/i965/gen7_misc_state.c | 2 +-
src/mesa/drivers/dri/i965/gen8_depth_state.c | 2 +-
src/mesa/drivers/dri/i965/intel_batchbuffer.c | 34 +++++++++++++++++++++------
src/mesa/drivers/dri/i965/intel_batchbuffer.h | 4 ++--
10 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_batch.h b/src/mesa/drivers/dri/i965/brw_batch.h
index 6c207b8a9b..38d83bc92b 100644
--- a/src/mesa/drivers/dri/i965/brw_batch.h
+++ b/src/mesa/drivers/dri/i965/brw_batch.h
@@ -90,6 +90,8 @@ typedef struct brw_batch {
bool always_flush;
bool disable_throttling;
+ drm_intel_context *hw_ctx;
+
/**
* Set of brw_bo* that have been rendered to within this batchbuffer
* and would need flushing before being used from another cache domain that
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
index f680371f76..641a2f533e 100644
--- a/src/mesa/drivers/dri/i965/brw_context.c
+++ b/src/mesa/drivers/dri/i965/brw_context.c
@@ -1062,23 +1062,10 @@ brwCreateContext(gl_api api,
intel_fbo_init(brw);
- intel_batchbuffer_init(&brw->batch, screen->bufmgr, brw->has_llc);
-
- if (brw->gen >= 6) {
- /* Create a new hardware context. Using a hardware context means that
- * our GPU state will be saved/restored on context switch, allowing us
- * to assume that the GPU is in the same state we left it in.
- *
- * This is required for transform feedback buffer offsets, query objects,
- * and also allows us to reduce how much state we have to emit.
- */
- brw->hw_ctx = drm_intel_gem_context_create(brw->batch.bufmgr);
-
- if (!brw->hw_ctx) {
- fprintf(stderr, "Gen6+ requires Kernel 3.6 or later.\n");
- intelDestroyContext(driContextPriv);
- return false;
- }
+ if (!intel_batchbuffer_init(&brw->batch,
+ screen->bufmgr, brw->gen, brw->has_llc)) {
+ intelDestroyContext(driContextPriv);
+ return false;
}
if (brw_init_pipe_control(brw, devinfo)) {
@@ -1183,8 +1170,6 @@ intelDestroyContext(__DRIcontext * driContextPriv)
gen7_reset_hw_bt_pool_offsets(brw);
brw_bo_put(brw->hw_bt_pool.bo);
- drm_intel_gem_context_destroy(brw->hw_ctx);
-
if (ctx->swrast_context) {
_swsetup_DestroyContext(&brw->ctx);
_tnl_DestroyContext(&brw->ctx);
diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index e602c413c2..e1141ab568 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -695,8 +695,6 @@ struct brw_context
brw_batch batch;
bool no_batch_wrap;
- drm_intel_context *hw_ctx;
-
/** BO for post-sync nonzero writes for gen6 workaround. */
brw_bo *workaround_bo;
uint8_t pipe_controls_since_last_cs_stall;
diff --git a/src/mesa/drivers/dri/i965/brw_queryobj.c b/src/mesa/drivers/dri/i965/brw_queryobj.c
index a55751c0d3..52a99ab918 100644
--- a/src/mesa/drivers/dri/i965/brw_queryobj.c
+++ b/src/mesa/drivers/dri/i965/brw_queryobj.c
@@ -422,7 +422,7 @@ brw_emit_query_begin(struct brw_context *brw)
struct gl_context *ctx = &brw->ctx;
struct brw_query_object *query = brw->query.obj;
- if (brw->hw_ctx)
+ if (brw->batch.hw_ctx)
return;
/* Skip if we're not doing any queries, or we've already recorded the
@@ -449,7 +449,7 @@ brw_emit_query_end(struct brw_context *brw)
{
struct brw_query_object *query = brw->query.obj;
- if (brw->hw_ctx)
+ if (brw->batch.hw_ctx)
return;
if (!brw->query.begin_emitted)
diff --git a/src/mesa/drivers/dri/i965/brw_reset.c b/src/mesa/drivers/dri/i965/brw_reset.c
index df734e5f0f..69b21d1cff 100644
--- a/src/mesa/drivers/dri/i965/brw_reset.c
+++ b/src/mesa/drivers/dri/i965/brw_reset.c
@@ -43,7 +43,7 @@ brw_get_graphics_reset_status(struct gl_context *ctx)
* DRM_IOCTL_I915_GET_RESET_STATS is not supported), this function should
* not be accessible.
*/
- assert(brw->hw_ctx != NULL);
+ assert(brw->batch.hw_ctx);
/* A reset status other than NO_ERROR was returned last time. I915 returns
* nonzero active/pending only if reset has been encountered and completed.
@@ -52,8 +52,8 @@ brw_get_graphics_reset_status(struct gl_context *ctx)
if (brw->reset_count != 0)
return GL_NO_ERROR;
- err = drm_intel_get_reset_stats(brw->hw_ctx, &reset_count, &active,
- &pending);
+ err = drm_intel_get_reset_stats(brw->batch.hw_ctx,
+ &reset_count, &active, &pending);
if (err)
return GL_NO_ERROR;
@@ -85,7 +85,7 @@ brw_check_for_reset(struct brw_context *brw)
uint32_t pending;
int err;
- err = drm_intel_get_reset_stats(brw->hw_ctx, &reset_count, &active,
+ err = drm_intel_get_reset_stats(brw->batch.hw_ctx, &reset_count, &active,
&pending);
if (err)
return;
diff --git a/src/mesa/drivers/dri/i965/brw_state_upload.c b/src/mesa/drivers/dri/i965/brw_state_upload.c
index 1f45da07bc..232558ade6 100644
--- a/src/mesa/drivers/dri/i965/brw_state_upload.c
+++ b/src/mesa/drivers/dri/i965/brw_state_upload.c
@@ -390,7 +390,7 @@ brw_upload_initial_gpu_state(struct brw_context *brw)
* right away rather than doing it via state atoms. This saves a small
* amount of overhead on every draw call.
*/
- if (!brw->hw_ctx)
+ if (!brw->batch.hw_ctx)
return;
if (brw->gen == 6)
diff --git a/src/mesa/drivers/dri/i965/gen7_misc_state.c b/src/mesa/drivers/dri/i965/gen7_misc_state.c
index 6e12789ea5..c46eb72206 100644
--- a/src/mesa/drivers/dri/i965/gen7_misc_state.c
+++ b/src/mesa/drivers/dri/i965/gen7_misc_state.c
@@ -52,7 +52,7 @@ gen7_emit_depth_stencil_hiz(struct brw_context *brw,
/* Skip repeated NULL depth/stencil emits (think 2D rendering). */
if (!mt && brw->no_depth_or_stencil) {
- assert(brw->hw_ctx);
+ assert(brw->batch.hw_ctx);
return;
}
diff --git a/src/mesa/drivers/dri/i965/gen8_depth_state.c b/src/mesa/drivers/dri/i965/gen8_depth_state.c
index cfc9e7ab6e..3cd4e87fda 100644
--- a/src/mesa/drivers/dri/i965/gen8_depth_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_depth_state.c
@@ -53,7 +53,7 @@ emit_depth_packets(struct brw_context *brw,
/* Skip repeated NULL depth/stencil emits (think 2D rendering). */
if (!depth_mt && !stencil_mt && brw->no_depth_or_stencil) {
- assert(brw->hw_ctx);
+ assert(brw->batch.hw_ctx);
return;
}
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index d62fd06a72..230d1763dc 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -39,9 +39,9 @@
static void
intel_batchbuffer_reset(struct brw_batch *batch, bool has_llc);
-void
+int
intel_batchbuffer_init(struct brw_batch *batch, dri_bufmgr *bufmgr,
- bool has_llc)
+ int gen, bool has_llc)
{
batch->bufmgr = bufmgr;
@@ -52,6 +52,24 @@ intel_batchbuffer_init(struct brw_batch *batch, dri_bufmgr *bufmgr,
batch->map = batch->cpu_map;
batch->map_next = batch->cpu_map;
}
+
+ if (gen >= 6) {
+ /* Create a new hardware context. Using a hardware context means that
+ * our GPU state will be saved/restored on context switch, allowing us
+ * to assume that the GPU is in the same state we left it in.
+ *
+ * This is required for transform feedback buffer offsets, query objects,
+ * and also allows us to reduce how much state we have to emit.
+ */
+ batch->hw_ctx = drm_intel_gem_context_create(bufmgr);
+
+ if (!batch->hw_ctx) {
+ fprintf(stderr, "Gen6+ requires Kernel 3.6 or later.\n");
+ return false;
+ }
+ }
+
+ return true;
}
static void
@@ -107,6 +125,8 @@ intel_batchbuffer_free(struct brw_batch *batch)
brw_bo_put(batch->throttle_batch[1]);
brw_bo_put(batch->throttle_batch[0]);
+
+ drm_intel_gem_context_destroy(batch->hw_ctx);
}
void
@@ -197,7 +217,7 @@ brw_new_batch(struct brw_context *brw)
* would otherwise be stored in the context (which for all intents and
* purposes means everything).
*/
- if (brw->hw_ctx == NULL)
+ if (!brw->batch.hw_ctx)
brw->ctx.NewDriverState |= BRW_NEW_CONTEXT;
brw->ctx.NewDriverState |= BRW_NEW_BATCH;
@@ -348,13 +368,13 @@ do_flush_locked(struct brw_context *brw)
if (unlikely(INTEL_DEBUG & DEBUG_AUB))
brw_annotate_aub(brw);
- if (brw->hw_ctx == NULL || batch->ring != RENDER_RING) {
+ if (batch->hw_ctx == NULL || batch->ring != RENDER_RING) {
ret = drm_intel_bo_mrb_exec(batch->bo, 4 * USED_BATCH(*batch),
NULL, 0, 0, flags);
- } else {
- ret = drm_intel_gem_bo_context_exec(batch->bo, brw->hw_ctx,
+ } else {
+ ret = drm_intel_gem_bo_context_exec(batch->bo, batch->hw_ctx,
4 * USED_BATCH(*batch), flags);
- }
+ }
}
throttle(brw);
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.h b/src/mesa/drivers/dri/i965/intel_batchbuffer.h
index eb8be9657c..df57bcaf25 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.h
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.h
@@ -45,8 +45,8 @@ struct brw_context;
enum brw_gpu_ring;
void intel_batchbuffer_emit_render_ring_prelude(struct brw_context *brw);
-void intel_batchbuffer_init(struct brw_batch *batch, dri_bufmgr *bufmgr,
- bool has_llc);
+int intel_batchbuffer_init(struct brw_batch *batch, dri_bufmgr *bufmgr,
+ int gen, bool has_llc);
void intel_batchbuffer_free(struct brw_batch *batch);
void intel_batchbuffer_save_state(struct brw_context *brw);
void intel_batchbuffer_reset_to_saved(struct brw_context *brw);
--
2.11.0
More information about the mesa-dev
mailing list