aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAxel Davy <[email protected]>2016-10-20 21:59:01 +0200
committerAxel Davy <[email protected]>2016-12-20 23:44:22 +0100
commita0a18920c7cdba1ffc6d642aff039476755c1cae (patch)
tree848dac794b2219df085a81dfbaed977056c3a756 /src
parentc6ca7c747e47127bb0ced0c7ca38beaa760376a4 (diff)
st/nine: Back User Clip Planes to nine_context
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/state_trackers/nine/device9.c5
-rw-r--r--src/gallium/state_trackers/nine/nine_state.c30
-rw-r--r--src/gallium/state_trackers/nine/nine_state.h10
3 files changed, 38 insertions, 7 deletions
diff --git a/src/gallium/state_trackers/nine/device9.c b/src/gallium/state_trackers/nine/device9.c
index f25d5a94670..7863af9132d 100644
--- a/src/gallium/state_trackers/nine/device9.c
+++ b/src/gallium/state_trackers/nine/device9.c
@@ -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;
}
diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index a868f900cb9..af1968a24c4 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -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)) {
@@ -1616,6 +1616,17 @@ nine_context_set_texture_stage_state(struct NineDevice9 *device,
}
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);
diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
index acd9ac557e2..dd3331cd390 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -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];
@@ -439,6 +442,11 @@ 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);