[Mesa-dev] [PATCH 02/33] intel: Add an interface for saving/restoring the batchbuffer state.

Eric Anholt eric at anholt.net
Mon Oct 24 14:16:49 PDT 2011


This will be used to avoid the prepare() step in the i965 driver's
state setup.  Instead, we can just speculatively emit the primitive
into the batchbuffer, then check if the batch is too big, rollback and
flush, and replay the primitive.
---
 src/mesa/drivers/dri/intel/intel_batchbuffer.c |   21 +++++++++++++++++++++
 src/mesa/drivers/dri/intel/intel_batchbuffer.h |    2 ++
 src/mesa/drivers/dri/intel/intel_context.h     |    5 +++++
 3 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.c b/src/mesa/drivers/dri/intel/intel_batchbuffer.c
index 38cdeda..2d99eec 100644
--- a/src/mesa/drivers/dri/intel/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.c
@@ -88,6 +88,27 @@ intel_batchbuffer_reset(struct intel_context *intel)
 }
 
 void
+intel_batchbuffer_save_state(struct intel_context *intel)
+{
+   intel->batch.saved.used = intel->batch.used;
+   intel->batch.saved.reloc_count =
+      drm_intel_gem_bo_get_reloc_count(intel->batch.bo);
+}
+
+void
+intel_batchbuffer_reset_to_saved(struct intel_context *intel)
+{
+   drm_intel_gem_bo_clear_relocs(intel->batch.bo, intel->batch.saved.reloc_count);
+
+   intel->batch.used = intel->batch.saved.used;
+
+   /* Cached batch state is dead, since we just cleared some unknown part of the
+    * batchbuffer.  Assume that the caller resets any other state necessary.
+    */
+   clear_cache(intel);
+}
+
+void
 intel_batchbuffer_free(struct intel_context *intel)
 {
    drm_intel_bo_unreference(intel->batch.last_bo);
diff --git a/src/mesa/drivers/dri/intel/intel_batchbuffer.h b/src/mesa/drivers/dri/intel/intel_batchbuffer.h
index 0b2e5ea..228c32d 100644
--- a/src/mesa/drivers/dri/intel/intel_batchbuffer.h
+++ b/src/mesa/drivers/dri/intel/intel_batchbuffer.h
@@ -12,6 +12,8 @@
 void intel_batchbuffer_init(struct intel_context *intel);
 void intel_batchbuffer_reset(struct intel_context *intel);
 void intel_batchbuffer_free(struct intel_context *intel);
+void intel_batchbuffer_save_state(struct intel_context *intel);
+void intel_batchbuffer_reset_to_saved(struct intel_context *intel);
 
 void _intel_batchbuffer_flush(struct intel_context *intel,
 			      const char *file, int line);
diff --git a/src/mesa/drivers/dri/intel/intel_context.h b/src/mesa/drivers/dri/intel/intel_context.h
index 3994883..1b85415 100644
--- a/src/mesa/drivers/dri/intel/intel_context.h
+++ b/src/mesa/drivers/dri/intel/intel_context.h
@@ -210,6 +210,11 @@ struct intel_context
 
       uint32_t state_batch_offset;
       bool is_blit;
+
+      struct {
+	 uint16_t used;
+	 int reloc_count;
+      } saved;
    } batch;
 
    drm_intel_bo *first_post_swapbuffers_batch;
-- 
1.7.7



More information about the mesa-dev mailing list