i965/blorp: Factor gen6_blorp_emit_batch_head into separate functions.
authorPaul Berry <stereotype441@gmail.com>
Tue, 8 May 2012 23:00:25 +0000 (16:00 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 25 May 2012 15:45:11 +0000 (08:45 -0700)
This patch separates out the portions of gen6_blorp_emit_batch_head()
that emit 3DSTATE_MULTISAMPLE, 3DSTATE_SAMPLE_MASK, and
STATE_BASE_ADDRESS.  This paves the way for making the blorp code work
on Gen7, where additional command packets
(3DSTATE_PUSH_CONSTANT_ALLOC_VS and 3DSTATE_PUSH_CONSTANT_ALLOC_PS)
need to be emitted before 3DSTATE_MULTISAMPLE.

Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_blorp.h
src/mesa/drivers/dri/i965/gen6_blorp.cpp
src/mesa/drivers/dri/i965/gen7_blorp.cpp

index 951492f..6af5f67 100644 (file)
@@ -257,6 +257,10 @@ gen6_blorp_emit_batch_head(struct brw_context *brw,
                            const brw_blorp_params *params);
 
 void
+gen6_blorp_emit_state_base_address(struct brw_context *brw,
+                                   const brw_blorp_params *params);
+
+void
 gen6_blorp_emit_vertices(struct brw_context *brw,
                          const brw_blorp_params *params);
 
index b77a3b4..4e21ddf 100644 (file)
@@ -99,45 +99,50 @@ gen6_blorp_emit_batch_head(struct brw_context *brw,
       OUT_BATCH(brw->CMD_PIPELINE_SELECT << 16);
       ADVANCE_BATCH();
    }
+}
 
-   gen6_emit_3dstate_multisample(brw, params->num_samples);
-   gen6_emit_3dstate_sample_mask(brw, params->num_samples);
 
-   /* CMD_STATE_BASE_ADDRESS
-    *
-    * From the Sandy Bridge PRM, Volume 1, Part 1, Table STATE_BASE_ADDRESS:
-    *     The following commands must be reissued following any change to the
-    *     base addresses:
-    *         3DSTATE_CC_POINTERS
   *         3DSTATE_BINDING_TABLE_POINTERS
   *         3DSTATE_SAMPLER_STATE_POINTERS
   *         3DSTATE_VIEWPORT_STATE_POINTERS
   *         MEDIA_STATE_POINTERS
-    */
-   {
-      BEGIN_BATCH(10);
-      OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (10 - 2));
-      OUT_BATCH(1); /* GeneralStateBaseAddressModifyEnable */
-      /* SurfaceStateBaseAddress */
-      OUT_RELOC(intel->batch.bo, I915_GEM_DOMAIN_SAMPLER, 0, 1);
-      /* DynamicStateBaseAddress */
-      OUT_RELOC(intel->batch.bo, (I915_GEM_DOMAIN_RENDER |
-                                  I915_GEM_DOMAIN_INSTRUCTION), 0, 1);
-      OUT_BATCH(1); /* IndirectObjectBaseAddress */
-      if (params->use_wm_prog) {
-         OUT_RELOC(brw->cache.bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
-                   1); /* Instruction base address: shader kernels */
-      } else {
-         OUT_BATCH(1); /* InstructionBaseAddress */
-      }
-      OUT_BATCH(1); /* GeneralStateUpperBound */
-      OUT_BATCH(1); /* DynamicStateUpperBound */
-      OUT_BATCH(1); /* IndirectObjectUpperBound*/
-      OUT_BATCH(1); /* InstructionAccessUpperBound */
-      ADVANCE_BATCH();
+/**
+ * CMD_STATE_BASE_ADDRESS
+ *
+ * From the Sandy Bridge PRM, Volume 1, Part 1, Table STATE_BASE_ADDRESS:
+ *     The following commands must be reissued following any change to the
+ *     base addresses:
*         3DSTATE_CC_POINTERS
*         3DSTATE_BINDING_TABLE_POINTERS
*         3DSTATE_SAMPLER_STATE_POINTERS
*         3DSTATE_VIEWPORT_STATE_POINTERS
+ *         MEDIA_STATE_POINTERS
+ */
+void
+gen6_blorp_emit_state_base_address(struct brw_context *brw,
+                                   const brw_blorp_params *params)
+{
+   struct intel_context *intel = &brw->intel;
+
+   BEGIN_BATCH(10);
+   OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (10 - 2));
+   OUT_BATCH(1); /* GeneralStateBaseAddressModifyEnable */
+   /* SurfaceStateBaseAddress */
+   OUT_RELOC(intel->batch.bo, I915_GEM_DOMAIN_SAMPLER, 0, 1);
+   /* DynamicStateBaseAddress */
+   OUT_RELOC(intel->batch.bo, (I915_GEM_DOMAIN_RENDER |
+                               I915_GEM_DOMAIN_INSTRUCTION), 0, 1);
+   OUT_BATCH(1); /* IndirectObjectBaseAddress */
+   if (params->use_wm_prog) {
+      OUT_RELOC(brw->cache.bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
+                1); /* Instruction base address: shader kernels */
+   } else {
+      OUT_BATCH(1); /* InstructionBaseAddress */
    }
+   OUT_BATCH(1); /* GeneralStateUpperBound */
+   OUT_BATCH(1); /* DynamicStateUpperBound */
+   OUT_BATCH(1); /* IndirectObjectUpperBound*/
+   OUT_BATCH(1); /* InstructionAccessUpperBound */
+   ADVANCE_BATCH();
 }
 
+
 void
 gen6_blorp_emit_vertices(struct brw_context *brw,
                          const brw_blorp_params *params)
@@ -1035,6 +1040,9 @@ gen6_blorp_exec(struct intel_context *intel,
 
    uint32_t prog_offset = params->get_wm_prog(brw, &prog_data);
    gen6_blorp_emit_batch_head(brw, params);
+   gen6_emit_3dstate_multisample(brw, params->num_samples);
+   gen6_emit_3dstate_sample_mask(brw, params->num_samples);
+   gen6_blorp_emit_state_base_address(brw, params);
    gen6_blorp_emit_vertices(brw, params);
    gen6_blorp_emit_urb_config(brw, params);
    if (params->use_wm_prog) {
index 1112e79..d6eff00 100644 (file)
@@ -744,6 +744,9 @@ gen7_blorp_exec(struct intel_context *intel,
 
    uint32_t prog_offset = params->get_wm_prog(brw, &prog_data);
    gen6_blorp_emit_batch_head(brw, params);
+   gen6_emit_3dstate_multisample(brw, params->num_samples);
+   gen6_emit_3dstate_sample_mask(brw, params->num_samples);
+   gen6_blorp_emit_state_base_address(brw, params);
    gen6_blorp_emit_vertices(brw, params);
    gen7_blorp_emit_urb_config(brw, params);
    if (params->use_wm_prog) {