st/nine: Reorder DSA state settings
authorAxel Davy <axel.davy@ens.fr>
Fri, 15 May 2015 21:52:09 +0000 (23:52 +0200)
committerAxel Davy <axel.davy@ens.fr>
Fri, 21 Aug 2015 20:21:47 +0000 (22:21 +0200)
Separate state preparation and state commit

Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/nine_pipe.c
src/gallium/state_trackers/nine/nine_pipe.h
src/gallium/state_trackers/nine/nine_state.c
src/gallium/state_trackers/nine/nine_state.h

index ddf8e8b3b666a10cb57f5c67aff11715179ce63d..0538957e9af0b7f31e0c1aee33eb07f03f43e1d0 100644 (file)
@@ -27,7 +27,8 @@
 #include "cso_cache/cso_context.h"
 
 void
-nine_convert_dsa_state(struct cso_context *ctx, const DWORD *rs)
+nine_convert_dsa_state(struct pipe_depth_stencil_alpha_state *dsa_state,
+                       const DWORD *rs)
 {
     struct pipe_depth_stencil_alpha_state dsa;
 
@@ -65,7 +66,7 @@ nine_convert_dsa_state(struct cso_context *ctx, const DWORD *rs)
         dsa.alpha.ref_value = (float)rs[D3DRS_ALPHAREF] / 255.0f;
     }
 
-    cso_set_depth_stencil_alpha(ctx, &dsa);
+    *dsa_state = dsa;
 }
 
 /* TODO: Keep a static copy in device so we don't have to memset every time ? */
index 9fde06d45bfce42bb4fc2df901e177c59254c1f8..2f2e9cb815b245ccb555e85d7a221fdeb90405e1 100644 (file)
@@ -37,7 +37,7 @@ struct cso_context;
 extern const enum pipe_format nine_d3d9_to_pipe_format_map[120];
 extern const D3DFORMAT nine_pipe_to_d3d9_format_map[PIPE_FORMAT_COUNT];
 
-void nine_convert_dsa_state(struct cso_context *, const DWORD *);
+void nine_convert_dsa_state(struct pipe_depth_stencil_alpha_state *, const DWORD *);
 void nine_convert_rasterizer_state(struct cso_context *, const DWORD *);
 void nine_convert_blend_state(struct cso_context *, const DWORD *);
 void nine_convert_sampler_state(struct cso_context *, int idx, const DWORD *);
index 47e4148b8f6a1f884521781787d7b27aa5f776cb..7875d31d9b4ba7ebc2ffc6d1bb0ec9bb6329803f 100644 (file)
 
 /* State preparation only */
 
+static inline void
+prepare_dsa(struct NineDevice9 *device)
+{
+    nine_convert_dsa_state(&device->state.pipe.dsa, device->state.rs);
+    device->state.commit |= NINE_STATE_COMMIT_DSA;
+}
+
 /* State preparation incremental */
 
 /* State preparation + State commit */
@@ -188,12 +195,6 @@ update_blend(struct NineDevice9 *device)
     nine_convert_blend_state(device->cso, device->state.rs);
 }
 
-static inline void
-update_dsa(struct NineDevice9 *device)
-{
-    nine_convert_dsa_state(device->cso, device->state.rs);
-}
-
 static inline void
 update_rasterizer(struct NineDevice9 *device)
 {
@@ -843,6 +844,12 @@ update_textures_and_samplers(struct NineDevice9 *device)
 
 /* State commit only */
 
+static inline void
+commit_dsa(struct NineDevice9 *device)
+{
+    cso_set_depth_stencil_alpha(device->cso, &device->state.pipe.dsa);
+}
+
 static inline void
 commit_scissor(struct NineDevice9 *device)
 {
@@ -943,7 +950,7 @@ nine_update_state(struct NineDevice9 *device)
             commit_scissor(device);
 
         if (group & NINE_STATE_DSA)
-            update_dsa(device);
+            prepare_dsa(device);
         if (group & NINE_STATE_BLEND)
             update_blend(device);
 
@@ -1003,6 +1010,11 @@ nine_update_state(struct NineDevice9 *device)
     if (state->changed.vtxbuf)
         update_vertex_buffers(device);
 
+    if (state->commit & NINE_STATE_COMMIT_DSA)
+        commit_dsa(device);
+
+    state->commit = 0;
+
     device->state.changed.group &=
         (NINE_STATE_FF | NINE_STATE_VS_CONST | NINE_STATE_PS_CONST);
 
@@ -1636,4 +1648,3 @@ const char *nine_d3drs_to_string(DWORD State)
         return "(invalid)";
     }
 }
-
index 452b4f2c0418c4c0e6c0211940d69eb9df0a9891..e833225d35efa6b95e496de308e8d99c6174475f 100644 (file)
@@ -78,6 +78,8 @@
 #define NINE_STATE_ALL          0x0ffffff
 #define NINE_STATE_UNHANDLED   (1 << 24)
 
+#define NINE_STATE_COMMIT_DSA  (1 << 0)
+
 
 #define NINE_MAX_SIMULTANEOUS_RENDERTARGETS 4
 #define NINE_MAX_CONST_F_PS3 224
@@ -208,6 +210,11 @@ struct nine_state
 
         DWORD tex_stage[NINE_MAX_SAMPLERS][NINED3DTSS_COUNT];
     } ff;
+
+    uint32_t commit;
+    struct {
+        struct pipe_depth_stencil_alpha_state dsa;
+    } pipe;
 };
 
 /* map D3DRS -> NINE_STATE_x