st/nine: Back User Clip Planes to nine_context
authorAxel Davy <axel.davy@ens.fr>
Thu, 20 Oct 2016 19:59:01 +0000 (21:59 +0200)
committerAxel Davy <axel.davy@ens.fr>
Tue, 20 Dec 2016 22:44:22 +0000 (23:44 +0100)
Part of the refactor to move all gallium calls to
nine_state.c, and have all internal states required
for those calls in nine_context.

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

index f25d5a946707e54d9a5927c5369b452dd3a15a91..7863af9132de57e07bc640e67220924c58dd2e8c 100644 (file)
@@ -2193,7 +2193,10 @@ NineDevice9_SetClipPlane( struct NineDevice9 *This,
     user_assert(Index < PIPE_MAX_CLIP_PLANES, D3DERR_INVALIDCALL);
 
     memcpy(&state->clip.ucp[Index][0], pPlane, sizeof(state->clip.ucp[0]));
-    state->changed.ucp |= 1 << Index;
+    if (unlikely(This->is_recording))
+        state->changed.ucp |= 1 << Index;
+    else
+        nine_context_set_clip_plane(This, Index, pPlane);
 
     return D3D_OK;
 }
index a868f900cb992179a97e84b54dbfb4dac93ab9bc..af1968a24c4950569524065906bc90438abc747c 100644 (file)
@@ -1026,9 +1026,9 @@ nine_update_state(struct NineDevice9 *device)
 
     context->commit = 0;
 
-    if (unlikely(state->changed.ucp)) {
-        pipe->set_clip_state(pipe, &state->clip);
-        state->changed.ucp = 0;
+    if (unlikely(context->changed.ucp)) {
+        pipe->set_clip_state(pipe, &context->clip);
+        context->changed.ucp = FALSE;
     }
 
     if (unlikely(group & NINE_STATE_RARE)) {
@@ -1615,6 +1615,17 @@ nine_context_set_texture_stage_state(struct NineDevice9 *device,
     context->ff.changed.tex_stage[Stage][Type / 32] |= 1 << (Type % 32);
 }
 
+void
+nine_context_set_clip_plane(struct NineDevice9 *device,
+                            DWORD Index,
+                            const float *pPlane)
+{
+    struct nine_context *context = &device->context;
+
+    memcpy(&context->clip.ucp[Index][0], pPlane, sizeof(context->clip.ucp[0]));
+    context->changed.ucp = TRUE;
+}
+
 void
 nine_context_apply_stateblock(struct NineDevice9 *device,
                               const struct nine_state *src)
@@ -1777,6 +1788,15 @@ nine_context_apply_stateblock(struct NineDevice9 *device,
     if (src->changed.group & NINE_STATE_SCISSOR)
         context->scissor = src->scissor;
 
+    /* User Clip Planes */
+    if (src->changed.ucp) {
+        for (i = 0; i < PIPE_MAX_CLIP_PLANES; ++i)
+            if (src->changed.ucp & (1 << i))
+                memcpy(context->clip.ucp[i],
+                       src->clip.ucp[i], sizeof(src->clip.ucp[0]));
+        context->changed.ucp = TRUE;
+    }
+
     if (!(src->changed.group & NINE_STATE_FF))
         return;
 
@@ -2263,7 +2283,7 @@ void nine_state_restore_non_cso(struct NineDevice9 *device)
 
     state->changed.group = NINE_STATE_ALL;
     context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1;
-    state->changed.ucp = (1 << PIPE_MAX_CLIP_PLANES) - 1;
+    context->changed.ucp = TRUE;
     context->commit |= NINE_STATE_COMMIT_CONST_VS | NINE_STATE_COMMIT_CONST_PS;
 }
 
@@ -2325,7 +2345,7 @@ nine_state_set_defaults(struct NineDevice9 *device, const D3DCAPS9 *caps,
      */
     state->changed.group = NINE_STATE_ALL;
     context->changed.vtxbuf = (1ULL << device->caps.MaxStreams) - 1;
-    state->changed.ucp = (1 << PIPE_MAX_CLIP_PLANES) - 1;
+    context->changed.ucp = TRUE;
 
     context->ff.changed.transform[0] = ~0;
     context->ff.changed.transform[D3DTS_WORLD / 32] |= 1 << (D3DTS_WORLD % 32);
index acd9ac557e2e9f49de618d1eea151a41828a3f3f..dd3331cd3901525c031d6bd4854976bf89452195 100644 (file)
@@ -174,7 +174,7 @@ struct nine_state
         uint16_t ps_const_i; /* NINE_MAX_CONST_I == 16 */
         struct nine_range *vs_const_b; /* stateblocks only */
         uint16_t ps_const_b; /* NINE_MAX_CONST_B == 16 */
-        uint8_t ucp;
+        uint8_t ucp; /* stateblocks only */
     } changed;
 
     struct NineSurface9 *rt[NINE_MAX_SIMULTANEOUS_RENDERTARGETS];
@@ -227,6 +227,7 @@ struct nine_context {
         BOOL ps_const_f;
         BOOL ps_const_i;
         BOOL ps_const_b;
+        BOOL ucp;
     } changed;
 
     uint32_t bumpmap_vars[6 * NINE_MAX_TEXTURE_STAGES];
@@ -268,6 +269,8 @@ struct nine_context {
 
     struct pipe_index_buffer idxbuf;
 
+    struct pipe_clip_state clip;
+
     DWORD rs[NINED3DRS_COUNT];
 
     struct NineBaseTexture9 *texture[NINE_MAX_SAMPLERS];
@@ -438,6 +441,11 @@ void
 nine_context_set_depth_stencil(struct NineDevice9 *device,
                                struct NineSurface9 *ds);
 
+void
+nine_context_set_clip_plane(struct NineDevice9 *device,
+                            DWORD Index,
+                            const float *pPlane);
+
 void
 nine_context_apply_stateblock(struct NineDevice9 *device,
                               const struct nine_state *src);