OSDN Git Service

radeonsi: add more state flags into si_state_dsa
authorMarek Olšák <marek.olsak@amd.com>
Tue, 29 Aug 2017 18:55:11 +0000 (20:55 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 5 Sep 2017 10:09:02 +0000 (12:09 +0200)
3 flags for primitive binning, 2 flags for out-of-order rasterization
(but that will be done some other time)

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_state.c
src/gallium/drivers/radeonsi/si_state.h

index 2edd982..076b583 100644 (file)
@@ -1044,6 +1044,14 @@ static uint32_t si_translate_stencil_op(int s_op)
        return 0;
 }
 
+static bool si_dsa_writes_stencil(const struct pipe_stencil_state *s)
+{
+       return s->enabled && s->writemask &&
+              (s->fail_op  != PIPE_STENCIL_OP_KEEP ||
+               s->zfail_op != PIPE_STENCIL_OP_KEEP ||
+               s->zpass_op != PIPE_STENCIL_OP_KEEP);
+}
+
 static void *si_create_dsa_state(struct pipe_context *ctx,
                                 const struct pipe_depth_stencil_alpha_state *state)
 {
@@ -1101,6 +1109,15 @@ static void *si_create_dsa_state(struct pipe_context *ctx,
                si_pm4_set_reg(pm4, R_028024_DB_DEPTH_BOUNDS_MAX, fui(state->depth.bounds_max));
        }
 
+       dsa->depth_enabled = state->depth.enabled;
+       dsa->depth_write_enabled = state->depth.enabled &&
+                                  state->depth.writemask;
+       dsa->stencil_enabled = state->stencil[0].enabled;
+       dsa->stencil_write_enabled = state->stencil[0].enabled &&
+                                    (si_dsa_writes_stencil(&state->stencil[0]) ||
+                                     si_dsa_writes_stencil(&state->stencil[1]));
+       dsa->db_can_write = dsa->depth_write_enabled ||
+                           dsa->stencil_write_enabled;
        return dsa;
 }
 
index 7b7d96c..9770960 100644 (file)
@@ -91,8 +91,13 @@ struct si_dsa_stencil_ref_part {
 
 struct si_state_dsa {
        struct si_pm4_state             pm4;
-       unsigned                        alpha_func;
        struct si_dsa_stencil_ref_part  stencil_ref;
+       ubyte                           alpha_func:3;
+       bool                            depth_enabled:1;
+       bool                            depth_write_enabled:1;
+       bool                            stencil_enabled:1;
+       bool                            stencil_write_enabled:1;
+       bool                            db_can_write:1;
 };
 
 struct si_stencil_ref {