iris: Skip double-disabling TCS/TES/GS after BLORP operations
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 19 Sep 2019 07:33:28 +0000 (00:33 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 19 Sep 2019 14:56:15 +0000 (07:56 -0700)
BLORP always turns off TCS/TES/GS.  If regular drawing also has them
disabled (the overwhelmingly common case), then leaving them disabled
is just fine by us and we can skip dirtying them, as that would just
re-disable them a second time on the next draw.

If they are actually enabled, however, we do need to flag them.

Cuts 52% of the 3DSTATE_HS packets in an Aztec Ruins trace.

src/gallium/drivers/iris/iris_blorp.c

index f357b92..fa46daf 100644 (file)
@@ -342,6 +342,23 @@ iris_blorp_exec(struct blorp_batch *blorp_batch,
                          IRIS_DIRTY_SAMPLER_STATES_TES |
                          IRIS_DIRTY_SAMPLER_STATES_GS);
 
+   if (!ice->shaders.uncompiled[MESA_SHADER_TESS_EVAL]) {
+      /* BLORP disabled tessellation, that's fine for the next draw */
+      skip_bits |= IRIS_DIRTY_TCS |
+                   IRIS_DIRTY_TES |
+                   IRIS_DIRTY_CONSTANTS_TCS |
+                   IRIS_DIRTY_CONSTANTS_TES |
+                   IRIS_DIRTY_BINDINGS_TCS |
+                   IRIS_DIRTY_BINDINGS_TES;
+   }
+
+   if (!ice->shaders.uncompiled[MESA_SHADER_GEOMETRY]) {
+      /* BLORP disabled geometry shaders, that's fine for the next draw */
+      skip_bits |= IRIS_DIRTY_GS |
+                   IRIS_DIRTY_CONSTANTS_GS |
+                   IRIS_DIRTY_BINDINGS_GS;
+   }
+
    /* we can skip flagging IRIS_DIRTY_DEPTH_BUFFER, if
     * BLORP_BATCH_NO_EMIT_DEPTH_STENCIL is set.
     */