iris: track depth/stencil writes enabled
authorKenneth Graunke <kenneth@whitecape.org>
Sun, 19 Aug 2018 06:21:41 +0000 (23:21 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:08 +0000 (10:26 -0800)
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_state.c

index 5111d59de7577946572241e4ebdc2ffcb0a74a0b..8567b81e65dc1220d017e23a35a06d00a3fabc64 100644 (file)
@@ -345,6 +345,12 @@ struct iris_context {
       struct pipe_stencil_ref stencil_ref;
       struct pipe_framebuffer_state framebuffer;
 
+      /** Are depth writes enabled?  (Depth buffer may or may not exist.) */
+      bool depth_writes_enabled;
+
+      /** Are stencil writes enabled?  (Stencil buffer may or may not exist.) */
+      bool stencil_writes_enabled;
+
       /** GenX-specific current state */
       struct iris_genx_state *genx;
 
index ff81ffa9f78f0752ef8367eb7aa559a659c27f4d..268fa4a7e85cc940336cc68f3ebf75e0130b8a49 100644 (file)
@@ -707,6 +707,10 @@ struct iris_depth_stencil_alpha_state {
 
    /** Outbound to BLEND_STATE, 3DSTATE_PS_BLEND, COLOR_CALC_STATE. */
    struct pipe_alpha_state alpha;
+
+   /** Outbound to resolve and cache set tracking. */
+   bool depth_writes_enabled;
+   bool stencil_writes_enabled;
 };
 
 /**
@@ -722,10 +726,14 @@ iris_create_zsa_state(struct pipe_context *ctx,
    struct iris_depth_stencil_alpha_state *cso =
       malloc(sizeof(struct iris_depth_stencil_alpha_state));
 
-   cso->alpha = state->alpha;
-
    bool two_sided_stencil = state->stencil[1].enabled;
 
+   cso->alpha = state->alpha;
+   cso->depth_writes_enabled = state->depth.writemask;
+   cso->stencil_writes_enabled =
+      state->stencil[0].writemask != 0 ||
+      (two_sided_stencil && state->stencil[1].writemask != 1);
+
    /* The state tracker needs to optimize away EQUAL writes for us. */
    assert(!(state->depth.func == PIPE_FUNC_EQUAL && state->depth.writemask));
 
@@ -779,6 +787,9 @@ iris_bind_zsa_state(struct pipe_context *ctx, void *state)
 
       if (cso_changed(alpha.func))
          ice->state.dirty |= IRIS_DIRTY_BLEND_STATE;
+
+      ice->state.depth_writes_enabled = new_cso->depth_writes_enabled;
+      ice->state.stencil_writes_enabled = new_cso->stencil_writes_enabled;
    }
 
    ice->state.cso_zsa = new_cso;