vk: Make batch chain code gen-agnostic
authorKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Wed, 19 Aug 2015 21:33:22 +0000 (14:33 -0700)
committerKristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
Mon, 24 Aug 2015 20:45:40 +0000 (13:45 -0700)
Since the extra dword in MI_BATCH_BUFFER_START added in gen8 is at the
end of the struct, we can emit the gen8 packet on all gens as long as we
set the instruction length correctly.

Signed-off-by: Kristian Høgsberg Kristensen <kristian.h.kristensen@intel.com>
src/vulkan/anv_batch_chain.c

index f1d7bea840a43f1cfdf0a0d146aa81c4e8f8cd69..af90fb7ae214fb18938a921f5c2af39fc092bfa4 100644 (file)
@@ -398,7 +398,21 @@ anv_cmd_buffer_current_surface_relocs(struct anv_cmd_buffer *cmd_buffer)
 static void
 emit_batch_buffer_start(struct anv_batch *batch, struct anv_bo *bo, uint32_t offset)
 {
+   /* In gen8+ the address field grew to two dwords to accomodate 48 bit
+    * offsets. The high 16 bits are in the last dword, so we can use the gen8
+    * version in either case, as long as we set the instruction length in the
+    * header accordingly.  This means that we always emit three dwords here
+    * and all the padding and adjustment we do in this file works for all
+    * gens.
+    */
+
+   const uint32_t gen7_length =
+      GEN7_MI_BATCH_BUFFER_START_length - GEN7_MI_BATCH_BUFFER_START_length_bias;
+   const uint32_t gen8_length =
+      GEN8_MI_BATCH_BUFFER_START_length - GEN8_MI_BATCH_BUFFER_START_length_bias;
+
    anv_batch_emit(batch, GEN8_MI_BATCH_BUFFER_START,
+      .DwordLength = batch->device->info.gen < 8 ? gen7_length : gen8_length,
       ._2ndLevelBatchBuffer = _1stlevelbatch,
       .AddressSpaceIndicator = ASI_PPGTT,
       .BatchBufferStartAddress = { bo, offset });