[PATCH 3/5] wined3d: Move the stencil enable state to wined3d_depth_stencil_state.

Zebediah Figura z.figura12 at gmail.com
Fri Sep 25 16:01:23 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/d3d11/device.c       |  2 --
 dlls/d3d11/state.c        |  1 +
 dlls/wined3d/adapter_vk.c |  1 -
 dlls/wined3d/context_gl.c |  5 ++-
 dlls/wined3d/context_vk.c | 66 ++++++++++++++++++++-------------------
 dlls/wined3d/cs.c         |  1 -
 dlls/wined3d/device.c     |  5 ++-
 dlls/wined3d/directx.c    |  1 -
 dlls/wined3d/state.c      | 46 +++++++++++++--------------
 include/wine/wined3d.h    |  1 +
 10 files changed, 63 insertions(+), 66 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index a8cba49e039..cac72e614e5 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -727,7 +727,6 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetBlendState(ID3D11Devi
 static void set_default_depth_stencil_state(struct wined3d_device *wined3d_device)
 {
     wined3d_device_set_render_state(wined3d_device, WINED3D_RS_ZFUNC, WINED3D_CMP_LESS);
-    wined3d_device_set_render_state(wined3d_device, WINED3D_RS_STENCILENABLE, FALSE);
 }
 
 static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetDepthStencilState(ID3D11DeviceContext1 *iface,
@@ -760,7 +759,6 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetDepthStencilState(ID3
     if (desc->DepthEnable)
         wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_ZFUNC, desc->DepthFunc);
 
-    wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_STENCILENABLE, desc->StencilEnable);
     if (desc->StencilEnable)
     {
         wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_STENCILMASK, desc->StencilReadMask);
diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c
index d0513543c80..609c5e4c103 100644
--- a/dlls/d3d11/state.c
+++ b/dlls/d3d11/state.c
@@ -796,6 +796,7 @@ HRESULT d3d_depthstencil_state_create(struct d3d_device *device, const D3D11_DEP
 
     wined3d_desc.depth = desc->DepthEnable;
     wined3d_desc.depth_write = desc->DepthWriteMask;
+    wined3d_desc.stencil = desc->StencilEnable;
 
     /* We cannot fail after creating a wined3d_depth_stencil_state object. It
      * would lead to double free. */
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 2045cf181cb..9c9da418406 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -117,7 +117,6 @@ static const struct wined3d_state_entry_template misc_state_template_vk[] =
     {STATE_RENDER(WINED3D_RS_ANISOTROPY),                 {STATE_RENDER(WINED3D_RS_ANISOTROPY),                 state_nop}},
     {STATE_RENDER(WINED3D_RS_FLUSHBATCH),                 {STATE_RENDER(WINED3D_RS_FLUSHBATCH),                 state_nop}},
     {STATE_RENDER(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT), {STATE_RENDER(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT), state_nop}},
-    {STATE_RENDER(WINED3D_RS_STENCILENABLE),              {STATE_RENDER(WINED3D_RS_ZFUNC)}},
     {STATE_RENDER(WINED3D_RS_STENCILFAIL),                {STATE_RENDER(WINED3D_RS_ZFUNC)}},
     {STATE_RENDER(WINED3D_RS_STENCILZFAIL),               {STATE_RENDER(WINED3D_RS_ZFUNC)}},
     {STATE_RENDER(WINED3D_RS_STENCILPASS),                {STATE_RENDER(WINED3D_RS_ZFUNC)}},
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c
index 8c247afa02a..73d520e5709 100644
--- a/dlls/wined3d/context_gl.c
+++ b/dlls/wined3d/context_gl.c
@@ -2817,16 +2817,15 @@ void wined3d_context_gl_apply_blit_state(struct wined3d_context_gl *context_gl,
         gl_info->gl_ops.gl.p_glDisable(GL_ALPHA_TEST);
         context_invalidate_state(context, STATE_RENDER(WINED3D_RS_ALPHATESTENABLE));
     }
-    gl_info->gl_ops.gl.p_glDisable(GL_DEPTH_TEST);
-    context_invalidate_state(context, STATE_DEPTH_STENCIL);
     gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
     gl_info->gl_ops.gl.p_glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
     context_invalidate_state(context, STATE_BLEND);
     gl_info->gl_ops.gl.p_glDisable(GL_CULL_FACE);
     gl_info->gl_ops.gl.p_glDisable(GL_SCISSOR_TEST);
     context_invalidate_state(context, STATE_RASTERIZER);
+    gl_info->gl_ops.gl.p_glDisable(GL_DEPTH_TEST);
     gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
-    context_invalidate_state(context, STATE_RENDER(WINED3D_RS_STENCILENABLE));
+    context_invalidate_state(context, STATE_DEPTH_STENCIL);
     if (gl_info->supported[ARB_POINT_SPRITE])
     {
         gl_info->gl_ops.gl.p_glDisable(GL_POINT_SPRITE_ARB);
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 4a646504b3e..6eaee71c54a 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -2043,45 +2043,47 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte
         {
             key->ds_desc.depthTestEnable = d->desc.depth;
             key->ds_desc.depthWriteEnable = d->desc.depth_write;
+            key->ds_desc.stencilTestEnable = state->fb.depth_stencil && d->desc.stencil;
+            if (key->ds_desc.stencilTestEnable)
+            {
+                key->ds_desc.front.failOp = vk_stencil_op_from_wined3d(state->render_states[WINED3D_RS_STENCILFAIL]);
+                key->ds_desc.front.passOp = vk_stencil_op_from_wined3d(state->render_states[WINED3D_RS_STENCILPASS]);
+                key->ds_desc.front.depthFailOp = vk_stencil_op_from_wined3d(
+                        state->render_states[WINED3D_RS_STENCILZFAIL]);
+                key->ds_desc.front.compareOp = vk_compare_op_from_wined3d(state->render_states[WINED3D_RS_STENCILFUNC]);
+                key->ds_desc.front.compareMask = state->render_states[WINED3D_RS_STENCILMASK];
+                key->ds_desc.front.writeMask = state->render_states[WINED3D_RS_STENCILWRITEMASK];
+                key->ds_desc.front.reference = state->render_states[WINED3D_RS_STENCILREF]
+                        & ((1 << state->fb.depth_stencil->format->stencil_size) - 1);
+
+                if (state->render_states[WINED3D_RS_TWOSIDEDSTENCILMODE])
+                {
+                    key->ds_desc.back.failOp = vk_stencil_op_from_wined3d(
+                            state->render_states[WINED3D_RS_BACK_STENCILFAIL]);
+                    key->ds_desc.back.passOp = vk_stencil_op_from_wined3d(
+                            state->render_states[WINED3D_RS_BACK_STENCILPASS]);
+                    key->ds_desc.back.depthFailOp = vk_stencil_op_from_wined3d(
+                            state->render_states[WINED3D_RS_BACK_STENCILZFAIL]);
+                    key->ds_desc.back.compareOp = vk_compare_op_from_wined3d(
+                            state->render_states[WINED3D_RS_BACK_STENCILFUNC]);
+                    key->ds_desc.back.compareMask = state->render_states[WINED3D_RS_STENCILMASK];
+                    key->ds_desc.back.writeMask = state->render_states[WINED3D_RS_STENCILWRITEMASK];
+                    key->ds_desc.back.reference = state->render_states[WINED3D_RS_STENCILREF]
+                            & ((1 << state->fb.depth_stencil->format->stencil_size) - 1);
+                }
+                else
+                {
+                    key->ds_desc.back = key->ds_desc.front;
+                }
+            }
         }
         else
         {
             key->ds_desc.depthTestEnable = VK_TRUE;
             key->ds_desc.depthWriteEnable = VK_TRUE;
+            key->ds_desc.stencilTestEnable = VK_FALSE;
         }
         key->ds_desc.depthCompareOp = vk_compare_op_from_wined3d(state->render_states[WINED3D_RS_ZFUNC]);
-        key->ds_desc.stencilTestEnable = state->fb.depth_stencil && state->render_states[WINED3D_RS_STENCILENABLE];
-        if (key->ds_desc.stencilTestEnable)
-        {
-            key->ds_desc.front.failOp = vk_stencil_op_from_wined3d(state->render_states[WINED3D_RS_STENCILFAIL]);
-            key->ds_desc.front.passOp = vk_stencil_op_from_wined3d(state->render_states[WINED3D_RS_STENCILPASS]);
-            key->ds_desc.front.depthFailOp = vk_stencil_op_from_wined3d(state->render_states[WINED3D_RS_STENCILZFAIL]);
-            key->ds_desc.front.compareOp = vk_compare_op_from_wined3d(state->render_states[WINED3D_RS_STENCILFUNC]);
-            key->ds_desc.front.compareMask = state->render_states[WINED3D_RS_STENCILMASK];
-            key->ds_desc.front.writeMask = state->render_states[WINED3D_RS_STENCILWRITEMASK];
-            key->ds_desc.front.reference = state->render_states[WINED3D_RS_STENCILREF]
-                    & ((1 << state->fb.depth_stencil->format->stencil_size) - 1);
-
-            if (state->render_states[WINED3D_RS_TWOSIDEDSTENCILMODE])
-            {
-                key->ds_desc.back.failOp = vk_stencil_op_from_wined3d(
-                        state->render_states[WINED3D_RS_BACK_STENCILFAIL]);
-                key->ds_desc.back.passOp = vk_stencil_op_from_wined3d(
-                        state->render_states[WINED3D_RS_BACK_STENCILPASS]);
-                key->ds_desc.back.depthFailOp = vk_stencil_op_from_wined3d(
-                        state->render_states[WINED3D_RS_BACK_STENCILZFAIL]);
-                key->ds_desc.back.compareOp = vk_compare_op_from_wined3d(
-                        state->render_states[WINED3D_RS_BACK_STENCILFUNC]);
-                key->ds_desc.back.compareMask = state->render_states[WINED3D_RS_STENCILMASK];
-                key->ds_desc.back.writeMask = state->render_states[WINED3D_RS_STENCILWRITEMASK];
-                key->ds_desc.back.reference = state->render_states[WINED3D_RS_STENCILREF]
-                        & ((1 << state->fb.depth_stencil->format->stencil_size) - 1);
-            }
-            else
-            {
-                key->ds_desc.back = key->ds_desc.front;
-            }
-        }
 
         update = true;
     }
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 6509887afa9..66a67ce239b 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1227,7 +1227,6 @@ static void wined3d_cs_exec_set_depth_stencil_view(struct wined3d_cs *cs, const
     {
         /* Swapping NULL / non NULL depth stencil affects the depth and tests */
         device_invalidate_state(device, STATE_DEPTH_STENCIL);
-        device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILENABLE));
         device_invalidate_state(device, STATE_RENDER(WINED3D_RS_STENCILWRITEMASK));
         device_invalidate_state(device, STATE_RASTERIZER);
     }
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 5c94fae0a98..1dcf4fcb93c 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3685,6 +3685,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
                     set_blend_state = TRUE;
                     break;
 
+                case WINED3D_RS_STENCILENABLE:
                 case WINED3D_RS_ZENABLE:
                 case WINED3D_RS_ZWRITEENABLE:
                     set_depth_stencil_state = TRUE;
@@ -3841,6 +3842,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
                 FIXME("Unrecognized depth buffer type %#x.\n", state->rs[WINED3D_RS_ZENABLE]);
         }
         desc.depth_write = state->rs[WINED3D_RS_ZWRITEENABLE];
+        desc.stencil = state->rs[WINED3D_RS_STENCILENABLE];
 
         if ((entry = wine_rb_get(&device->depth_stencil_states, &desc)))
         {
@@ -4360,7 +4362,8 @@ HRESULT CDECL wined3d_device_validate_device(const struct wined3d_device *device
         }
     }
 
-    if (wined3d_state_uses_depth_buffer(state) || state->render_states[WINED3D_RS_STENCILENABLE])
+    if (wined3d_state_uses_depth_buffer(state)
+            || (state->depth_stencil_state && state->depth_stencil_state->desc.stencil))
     {
         struct wined3d_rendertarget_view *rt = device->state.fb.render_targets[0];
         struct wined3d_rendertarget_view *ds = device->state.fb.depth_stencil;
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index cf355438c45..0395c8dc24b 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2439,7 +2439,6 @@ static const struct wined3d_state_entry_template misc_state_template_no3d[] =
     {STATE_RENDER(WINED3D_RS_ANISOTROPY),                 {STATE_VDECL}},
     {STATE_RENDER(WINED3D_RS_FLUSHBATCH),                 {STATE_VDECL}},
     {STATE_RENDER(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT), {STATE_VDECL}},
-    {STATE_RENDER(WINED3D_RS_STENCILENABLE),              {STATE_VDECL}},
     {STATE_RENDER(WINED3D_RS_STENCILFAIL),                {STATE_VDECL}},
     {STATE_RENDER(WINED3D_RS_STENCILZFAIL),               {STATE_VDECL}},
     {STATE_RENDER(WINED3D_RS_STENCILPASS),                {STATE_VDECL}},
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 7a9e69f775c..0f88b4a2677 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1053,10 +1053,10 @@ static GLenum gl_stencil_op(enum wined3d_stencil_op op)
     }
 }
 
-static void state_stencil(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
+static void state_stencil(struct wined3d_context *context, const struct wined3d_state *state)
 {
     const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
-    DWORD onesided_enable;
+    const struct wined3d_depth_stencil_state *d = state->depth_stencil_state;
     DWORD twosided_enable;
     GLint func;
     GLint func_back;
@@ -1070,14 +1070,13 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
     GLint depthFail_back;
 
     /* No stencil test without a stencil buffer. */
-    if (!state->fb.depth_stencil)
+    if (!state->fb.depth_stencil || !d || !d->desc.stencil)
     {
         gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
         checkGLcall("glDisable GL_STENCIL_TEST");
         return;
     }
 
-    onesided_enable = state->render_states[WINED3D_RS_STENCILENABLE];
     twosided_enable = state->render_states[WINED3D_RS_TWOSIDEDSTENCILMODE];
     if (!(func = wined3d_gl_compare_func(state->render_states[WINED3D_RS_STENCILFUNC])))
         func = GL_ALWAYS;
@@ -1092,14 +1091,14 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
     depthFail_back = gl_stencil_op(state->render_states[WINED3D_RS_BACK_STENCILZFAIL]);
     stencilPass_back = gl_stencil_op(state->render_states[WINED3D_RS_BACK_STENCILPASS]);
 
-    TRACE("(onesided %d, twosided %d, ref %x, mask %x, "
+    TRACE("(twosided %d, ref %x, mask %x, "
             "GL_FRONT: func: %x, fail %x, zfail %x, zpass %x "
             "GL_BACK: func: %x, fail %x, zfail %x, zpass %x)\n",
-            onesided_enable, twosided_enable, ref, mask,
+            twosided_enable, ref, mask,
             func, stencilFail, depthFail, stencilPass,
             func_back, stencilFail_back, depthFail_back, stencilPass_back);
 
-    if (twosided_enable && onesided_enable)
+    if (twosided_enable)
     {
         gl_info->gl_ops.gl.p_glEnable(GL_STENCIL_TEST);
         checkGLcall("glEnable GL_STENCIL_TEST");
@@ -1139,7 +1138,7 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
             FIXME("Separate (two sided) stencil not supported on this version of OpenGL. Caps weren't honored?\n");
         }
     }
-    else if(onesided_enable)
+    else
     {
         if (gl_info->supported[EXT_STENCIL_TWO_SIDE])
         {
@@ -1157,11 +1156,6 @@ static void state_stencil(struct wined3d_context *context, const struct wined3d_
         gl_info->gl_ops.gl.p_glStencilOp(stencilFail, depthFail, stencilPass);
         checkGLcall("glStencilOp(...)");
     }
-    else
-    {
-        gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
-        checkGLcall("glDisable GL_STENCIL_TEST");
-    }
 }
 
 static void state_stencilwrite2s_ext(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
@@ -1221,6 +1215,8 @@ static void depth_stencil(struct wined3d_context *context, const struct wined3d_
         checkGLcall("glDepthMask(GL_FALSE)");
     }
 
+    state_stencil(context, state);
+
     if (context->last_was_rhw && !isStateDirty(context, STATE_TRANSFORM(WINED3D_TS_PROJECTION)))
         context_apply_state(context, state, STATE_TRANSFORM(WINED3D_TS_PROJECTION));
 }
@@ -4757,20 +4753,19 @@ const struct wined3d_state_entry_template misc_state_template_gl[] =
     { STATE_RENDER(WINED3D_RS_ANISOTROPY),                { STATE_RENDER(WINED3D_RS_ANISOTROPY),                state_anisotropy    }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_FLUSHBATCH),                { STATE_RENDER(WINED3D_RS_FLUSHBATCH),                state_flushbatch    }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT),{ STATE_RENDER(WINED3D_RS_TRANSLUCENTSORTINDEPENDENT),state_translucentsi }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILENABLE),             { STATE_RENDER(WINED3D_RS_STENCILENABLE),             state_stencil       }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILFAIL),               { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILZFAIL),              { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILPASS),               { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILFUNC),               { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILREF),                { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_STENCILMASK),               { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILFAIL),               { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILZFAIL),              { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILPASS),               { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILFUNC),               { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILREF),                { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_STENCILMASK),               { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_STENCILWRITEMASK),          { STATE_RENDER(WINED3D_RS_STENCILWRITEMASK),          state_stencilwrite2s_ext}, EXT_STENCIL_TWO_SIDE        },
     { STATE_RENDER(WINED3D_RS_STENCILWRITEMASK),          { STATE_RENDER(WINED3D_RS_STENCILWRITEMASK),          state_stencilwrite  }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_TWOSIDEDSTENCILMODE),       { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BACK_STENCILFAIL),          { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BACK_STENCILZFAIL),         { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BACK_STENCILPASS),          { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BACK_STENCILFUNC),          { STATE_RENDER(WINED3D_RS_STENCILENABLE),             NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_TWOSIDEDSTENCILMODE),       { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_BACK_STENCILFAIL),          { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_BACK_STENCILZFAIL),         { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_BACK_STENCILPASS),          { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
+    { STATE_RENDER(WINED3D_RS_BACK_STENCILFUNC),          { STATE_DEPTH_STENCIL,                                NULL                }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_WRAP0),                     { STATE_RENDER(WINED3D_RS_WRAP0),                     state_wrap          }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_WRAP1),                     { STATE_RENDER(WINED3D_RS_WRAP0),                     NULL                }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_WRAP2),                     { STATE_RENDER(WINED3D_RS_WRAP0),                     NULL                }, WINED3D_GL_EXT_NONE             },
@@ -5569,6 +5564,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table)
         { 40,  40},
         { 42,  45},
         { 47,  47},
+        { 52,  52},
         { 61, 127},
         {149, 150},
         {162, 162},
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index ef2a7de4580..ad860a1eae2 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2040,6 +2040,7 @@ struct wined3d_depth_stencil_state_desc
 {
     BOOL depth;
     BOOL depth_write;
+    BOOL stencil;
 };
 
 struct wined3d_rasterizer_state_desc
-- 
2.28.0




More information about the wine-devel mailing list