intel: Reserve enough space to finish occlusion queries on Gen6.
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 10 Aug 2012 17:26:04 +0000 (10:26 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 13 Aug 2012 03:12:28 +0000 (20:12 -0700)
After realizing that brw_finish_batch emitted some final PIPE_CONTROLs
to record occlusion queries, Chris noted that we probably hadn't
reserved enough space to actually emit them.

Reserving a full 60 bytes seems a bit harsh, since we only need that
much if occlusion queries are actually active.  Plus, 28 bytes would be
sufficient for Gen7, and 24 for Gen4-5.

We could optimize this in the future, but it doesn't seem too critical.

NOTE: This is a candidate for stable release branches.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=53311
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_vtbl.c
src/mesa/drivers/dri/intel/intel_batchbuffer.h

index e76b264141e79fd6283745dd1a23da92bc59e1d4..9951e7da2cc16126a8d4b0cd3ebc47b9b85de5da 100644 (file)
@@ -147,6 +147,10 @@ brw_update_draw_buffer(struct intel_context *intel)
 /**
  * called from intel_batchbuffer_flush and children before sending a
  * batchbuffer off.
+ *
+ * Note that ALL state emitted here must fit in the reserved space
+ * at the end of a batchbuffer.  If you add more GPU state, increase
+ * the BATCH_RESERVED macro.
  */
 static void brw_finish_batch(struct intel_context *intel)
 {
index d2744e44ac22a9d7f7fe42596134c3276de8a589..b8b60cd862ba206cb5a785c4c849dee5692ab2b6 100644 (file)
 extern "C" {
 #endif
 
-#define BATCH_RESERVED 16
+/**
+ * Number of bytes to reserve for commands necessary to complete a batch.
+ *
+ * This includes:
+ * - MI_BATCHBUFFER_END (4 bytes)
+ * - Optional MI_NOOP for ensuring the batch length is qword aligned (4 bytes)
+ * - Any state emitted by vtbl->finish_batch()
+ *   - On 965+, this means ending occlusion queries (on Gen6, which has the
+ *     most workaround flushes, this can be as much as (4+4+5)*4 = 52 bytes)
+ */
+#define BATCH_RESERVED 60
 
 struct intel_batchbuffer;