anv: Add flush_pipeline_before_pipeline_select
authorJordan Justen <jordan.l.justen@intel.com>
Fri, 11 Mar 2016 01:25:45 +0000 (17:25 -0800)
committerJordan Justen <jordan.l.justen@intel.com>
Sat, 12 Mar 2016 21:13:37 +0000 (13:13 -0800)
flush_pipeline_before_pipeline_select adds workarounds required before
switching the pipeline.

Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
src/intel/vulkan/genX_cmd_buffer.c

index d0a80f53e63470a06f5c6aed4a7ad2be101818ed..1ce53a81f1bd75b1c5088c7b61bf7cf9e3f5c5b7 100644 (file)
@@ -764,10 +764,31 @@ void genX(CmdDispatchIndirect)(
    anv_batch_emit(batch, GENX(MEDIA_STATE_FLUSH));
 }
 
+static void
+flush_pipeline_before_pipeline_select(struct anv_cmd_buffer *cmd_buffer,
+                                      uint32_t pipeline)
+{
+#if GEN_GEN >= 8 && GEN_GEN < 10
+   /* From the Broadwell PRM, Volume 2a: Instructions, PIPELINE_SELECT:
+    *
+    *   Software must clear the COLOR_CALC_STATE Valid field in
+    *   3DSTATE_CC_STATE_POINTERS command prior to send a PIPELINE_SELECT
+    *   with Pipeline Select set to GPGPU.
+    *
+    * The internal hardware docs recommend the same workaround for Gen9
+    * hardware too.
+    */
+   if (pipeline == GPGPU)
+      anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_CC_STATE_POINTERS));
+#endif
+}
+
 void
 genX(flush_pipeline_select_3d)(struct anv_cmd_buffer *cmd_buffer)
 {
    if (cmd_buffer->state.current_pipeline != _3D) {
+      flush_pipeline_before_pipeline_select(cmd_buffer, _3D);
+
       anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
 #if GEN_GEN >= 9
                      .MaskBits = 3,
@@ -781,19 +802,7 @@ void
 genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer)
 {
    if (cmd_buffer->state.current_pipeline != GPGPU) {
-#if GEN_GEN >= 8 && GEN_GEN < 10
-      /* From the Broadwell PRM, Volume 2a: Instructions, PIPELINE_SELECT:
-       *
-       *   Software must clear the COLOR_CALC_STATE Valid field in
-       *   3DSTATE_CC_STATE_POINTERS command prior to send a PIPELINE_SELECT
-       *   with Pipeline Select set to GPGPU.
-       *
-       * The internal hardware docs recommend the same workaround for Gen9
-       * hardware too.
-       */
-      anv_batch_emit(&cmd_buffer->batch,
-                     GENX(3DSTATE_CC_STATE_POINTERS));
-#endif
+      flush_pipeline_before_pipeline_select(cmd_buffer, GPGPU);
 
       anv_batch_emit(&cmd_buffer->batch, GENX(PIPELINE_SELECT),
 #if GEN_GEN >= 9