Re: [Mesa-dev] [PATCH 41/71] st/nine: Rework rasterizer states

2015-08-17 Thread Axel Davy

On Sun, 16 Aug 2015, Axel Davy wrote:


void
-nine_convert_rasterizer_state(struct cso_context *ctx, const DWORD *rs)
+nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const 
DWORD *rs)
{
struct pipe_rasterizer_state rast;

-memset(rast, 0, sizeof(rast)); /* memcmp safety */
+/* Note: we don't have a memset since we use a static copy that was memset 
once
+ * and we always rewrite all states we change. */



Sorry, this is a mistake, the memset has to stay.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 41/71] st/nine: Rework rasterizer states

2015-08-16 Thread Axel Davy
Separate state preparation and state commit

Signed-off-by: Axel Davy axel.d...@ens.fr
---
 src/gallium/state_trackers/nine/nine_pipe.c  |  8 
 src/gallium/state_trackers/nine/nine_pipe.h  |  2 +-
 src/gallium/state_trackers/nine/nine_state.c | 23 ---
 src/gallium/state_trackers/nine/nine_state.h |  2 ++
 4 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/gallium/state_trackers/nine/nine_pipe.c 
b/src/gallium/state_trackers/nine/nine_pipe.c
index 0538957..ff5ec60 100644
--- a/src/gallium/state_trackers/nine/nine_pipe.c
+++ b/src/gallium/state_trackers/nine/nine_pipe.c
@@ -69,13 +69,13 @@ nine_convert_dsa_state(struct 
pipe_depth_stencil_alpha_state *dsa_state,
 *dsa_state = dsa;
 }
 
-/* TODO: Keep a static copy in device so we don't have to memset every time ? 
*/
 void
-nine_convert_rasterizer_state(struct cso_context *ctx, const DWORD *rs)
+nine_convert_rasterizer_state(struct pipe_rasterizer_state *rast_state, const 
DWORD *rs)
 {
 struct pipe_rasterizer_state rast;
 
-memset(rast, 0, sizeof(rast)); /* memcmp safety */
+/* Note: we don't have a memset since we use a static copy that was memset 
once
+ * and we always rewrite all states we change. */
 
 rast.flatshade = rs[D3DRS_SHADEMODE] == D3DSHADE_FLAT;
  /* rast.light_twoside = 0; */
@@ -122,7 +122,7 @@ nine_convert_rasterizer_state(struct cso_context *ctx, 
const DWORD *rs)
 rast.offset_scale = asfloat(rs[D3DRS_SLOPESCALEDEPTHBIAS]);
  /* rast.offset_clamp = 0.0f; */
 
-cso_set_rasterizer(ctx, rast);
+*rast_state = rast;
 }
 
 static inline void
diff --git a/src/gallium/state_trackers/nine/nine_pipe.h 
b/src/gallium/state_trackers/nine/nine_pipe.h
index 2f2e9cb..e2680f6 100644
--- a/src/gallium/state_trackers/nine/nine_pipe.h
+++ b/src/gallium/state_trackers/nine/nine_pipe.h
@@ -38,7 +38,7 @@ 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 pipe_depth_stencil_alpha_state *, const 
DWORD *);
-void nine_convert_rasterizer_state(struct cso_context *, const DWORD *);
+void nine_convert_rasterizer_state(struct pipe_rasterizer_state *, const DWORD 
*);
 void nine_convert_blend_state(struct cso_context *, const DWORD *);
 void nine_convert_sampler_state(struct cso_context *, int idx, const DWORD *);
 
diff --git a/src/gallium/state_trackers/nine/nine_state.c 
b/src/gallium/state_trackers/nine/nine_state.c
index 7875d31..b29556b 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -46,6 +46,13 @@ prepare_dsa(struct NineDevice9 *device)
 device-state.commit |= NINE_STATE_COMMIT_DSA;
 }
 
+static inline void
+prepare_rasterizer(struct NineDevice9 *device)
+{
+nine_convert_rasterizer_state(device-state.pipe.rast, device-state.rs);
+device-state.commit |= NINE_STATE_COMMIT_RASTERIZER;
+}
+
 /* State preparation incremental */
 
 /* State preparation + State commit */
@@ -195,12 +202,6 @@ update_blend(struct NineDevice9 *device)
 nine_convert_blend_state(device-cso, device-state.rs);
 }
 
-static inline void
-update_rasterizer(struct NineDevice9 *device)
-{
-nine_convert_rasterizer_state(device-cso, device-state.rs);
-}
-
 /* Loop through VS inputs and pick the vertex elements with the declared
  * usage from the vertex declaration, then insert the instance divisor from
  * the stream source frequency setting.
@@ -859,6 +860,12 @@ commit_scissor(struct NineDevice9 *device)
 }
 
 static inline void
+commit_rasterizer(struct NineDevice9 *device)
+{
+cso_set_rasterizer(device-cso, device-state.pipe.rast);
+}
+
+static inline void
 commit_index_buffer(struct NineDevice9 *device)
 {
 struct pipe_context *pipe = device-pipe;
@@ -958,7 +965,7 @@ nine_update_state(struct NineDevice9 *device)
 group |= update_vs(device);
 
 if (group  NINE_STATE_RASTERIZER)
-update_rasterizer(device);
+prepare_rasterizer(device);
 
 if (group  NINE_STATE_PS)
 group |= update_ps(device);
@@ -1012,6 +1019,8 @@ nine_update_state(struct NineDevice9 *device)
 
 if (state-commit  NINE_STATE_COMMIT_DSA)
 commit_dsa(device);
+if (state-commit  NINE_STATE_COMMIT_RASTERIZER)
+commit_rasterizer(device);
 
 state-commit = 0;
 
diff --git a/src/gallium/state_trackers/nine/nine_state.h 
b/src/gallium/state_trackers/nine/nine_state.h
index e833225..bd2ad38 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -79,6 +79,7 @@
 #define NINE_STATE_UNHANDLED   (1  24)
 
 #define NINE_STATE_COMMIT_DSA  (1  0)
+#define NINE_STATE_COMMIT_RASTERIZER (1  1)
 
 
 #define NINE_MAX_SIMULTANEOUS_RENDERTARGETS 4
@@ -214,6 +215,7 @@ struct nine_state
 uint32_t commit;
 struct {
 struct pipe_depth_stencil_alpha_state dsa;
+struct pipe_rasterizer_state