vc4: Fix up statechange management for uncompiled/compiled FS/VS.
authorEric Anholt <eric@anholt.net>
Sun, 11 Jan 2015 01:52:26 +0000 (14:52 +1300)
committerEric Anholt <eric@anholt.net>
Sun, 11 Jan 2015 04:17:20 +0000 (17:17 +1300)
No need to recheck the FS compile when the VS source has changed, but
there *is* a need to recheck the VS compile when the compiled VS has
changed (since the live inputs may change).

Fixes es3conform's blend test.

src/gallium/drivers/vc4/vc4_context.h
src/gallium/drivers/vc4/vc4_program.c

index 90a68e5c28ee0f659d0e4839701d478d71f30bf7..e3d797e02b8c71653ae47d0a733d3d0d05ee01c6 100644 (file)
@@ -44,7 +44,7 @@
 #define VC4_DIRTY_FRAGTEX       (1 <<  3)
 #define VC4_DIRTY_VERTTEX       (1 <<  4)
 #define VC4_DIRTY_TEXSTATE      (1 <<  5)
-#define VC4_DIRTY_PROG          (1 <<  6)
+
 #define VC4_DIRTY_BLEND_COLOR   (1 <<  7)
 #define VC4_DIRTY_STENCIL_REF   (1 <<  8)
 #define VC4_DIRTY_SAMPLE_MASK   (1 <<  9)
@@ -59,9 +59,9 @@
 #define VC4_DIRTY_FLAT_SHADE_FLAGS (1 << 18)
 #define VC4_DIRTY_PRIM_MODE     (1 << 19)
 #define VC4_DIRTY_CLIP          (1 << 20)
-
-#define VC4_SHADER_DIRTY_VP     (1 << 0)
-#define VC4_SHADER_DIRTY_FP     (1 << 1)
+#define VC4_DIRTY_UNCOMPILED_VS (1 << 21)
+#define VC4_DIRTY_UNCOMPILED_FS (1 << 22)
+#define VC4_DIRTY_COMPILED_FS   (1 << 24)
 
 struct vc4_texture_stateobj {
         struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
@@ -139,7 +139,6 @@ struct vc4_compiled_shader {
 struct vc4_program_stateobj {
         struct vc4_uncompiled_shader *bind_vs, *bind_fs;
         struct vc4_compiled_shader *cs, *vs, *fs;
-        uint32_t dirty;
         uint8_t num_exports;
         /* Indexed by semantic name or TGSI_SEMANTIC_COUNT + semantic index
          * for TGSI_SEMANTIC_GENERIC.  Special vs exports (position and point-
index 581b9400957704ffbdd2765e1963e080d6b7b945..2ab7da90dd78e36cd0bd6bdbc3680508069536dd 100644 (file)
@@ -2364,7 +2364,7 @@ vc4_update_compiled_fs(struct vc4_context *vc4, uint8_t prim_mode)
                             VC4_DIRTY_RASTERIZER |
                             VC4_DIRTY_FRAGTEX |
                             VC4_DIRTY_TEXSTATE |
-                            VC4_DIRTY_PROG))) {
+                            VC4_DIRTY_UNCOMPILED_FS))) {
                 return;
         }
 
@@ -2408,6 +2408,7 @@ vc4_update_compiled_fs(struct vc4_context *vc4, uint8_t prim_mode)
         if (vc4->prog.fs == old_fs)
                 return;
 
+        vc4->dirty |= VC4_DIRTY_COMPILED_FS;
         if (vc4->rasterizer->base.flatshade &&
             old_fs && vc4->prog.fs->color_inputs != old_fs->color_inputs) {
                 vc4->dirty |= VC4_DIRTY_FLAT_SHADE_FLAGS;
@@ -2425,7 +2426,8 @@ vc4_update_compiled_vs(struct vc4_context *vc4, uint8_t prim_mode)
                             VC4_DIRTY_VERTTEX |
                             VC4_DIRTY_TEXSTATE |
                             VC4_DIRTY_VTXSTATE |
-                            VC4_DIRTY_PROG))) {
+                            VC4_DIRTY_UNCOMPILED_VS |
+                            VC4_DIRTY_COMPILED_FS))) {
                 return;
         }
 
@@ -2814,8 +2816,7 @@ vc4_fp_state_bind(struct pipe_context *pctx, void *hwcso)
 {
         struct vc4_context *vc4 = vc4_context(pctx);
         vc4->prog.bind_fs = hwcso;
-        vc4->prog.dirty |= VC4_SHADER_DIRTY_FP;
-        vc4->dirty |= VC4_DIRTY_PROG;
+        vc4->dirty |= VC4_DIRTY_UNCOMPILED_FS;
 }
 
 static void
@@ -2823,8 +2824,7 @@ vc4_vp_state_bind(struct pipe_context *pctx, void *hwcso)
 {
         struct vc4_context *vc4 = vc4_context(pctx);
         vc4->prog.bind_vs = hwcso;
-        vc4->prog.dirty |= VC4_SHADER_DIRTY_VP;
-        vc4->dirty |= VC4_DIRTY_PROG;
+        vc4->dirty |= VC4_DIRTY_UNCOMPILED_VS;
 }
 
 void