[PATCH 5/6] wined3d: Remove WINED3D_RS_BLENDFACTOR use blend_state instead

Daniel Ansorregui mailszeros at gmail.com
Mon Oct 15 14:17:19 CDT 2018


* This patch is unifying the d3d 9/10/11 blend_factors
  Adding blend factor to savedstate so it passes all d3d9 tests

Signed-off-by: Daniel Ansorregui <mailszeros at gmail.com>
---
 dlls/d3d9/device.c             | 26 ++++++++++++++++++++++++--
 dlls/wined3d/device.c          |  6 +++++-
 dlls/wined3d/state.c           | 20 +-------------------
 dlls/wined3d/stateblock.c      | 24 ++++++++++++++++++++++--
 dlls/wined3d/utils.c           |  1 -
 dlls/wined3d/wined3d_private.h |  1 +
 include/wine/wined3d.h         |  1 -
 7 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index a31360886b..3e3e643c1f 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -2221,7 +2221,18 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH d3d9_device_SetRenderState(IDirect3DDevi
     TRACE("iface %p, state %#x, value %#x.\n", iface, state, value);
 
     wined3d_mutex_lock();
-    wined3d_device_set_render_state(device->wined3d_device, state, value);
+    switch (state)
+    {
+        case D3DRS_BLENDFACTOR:
+        {
+            struct wined3d_color factor;
+            wined3d_color_from_d3dcolor(&factor, value);
+            wined3d_device_set_blend_state(device->wined3d_device, NULL, &factor);
+            break;
+        }
+        default:
+            wined3d_device_set_render_state(device->wined3d_device, state, value);
+    }
     wined3d_mutex_unlock();
 
     return D3D_OK;
@@ -2235,7 +2246,18 @@ static HRESULT WINAPI d3d9_device_GetRenderState(IDirect3DDevice9Ex *iface,
     TRACE("iface %p, state %#x, value %p.\n", iface, state, value);
 
     wined3d_mutex_lock();
-    *value = wined3d_device_get_render_state(device->wined3d_device, state);
+    switch (state)
+    {
+        case D3DRS_BLENDFACTOR:
+        {
+            struct wined3d_color factor;
+            wined3d_device_get_blend_factor(device->wined3d_device, &factor);
+            *value = d3dcolor_from_wined3d_color(factor);
+            break;
+        }
+        default:
+            *value = wined3d_device_get_render_state(device->wined3d_device, state);
+    }
     wined3d_mutex_unlock();
 
     return D3D_OK;
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 365a46e9d6..9970078ac7 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1982,6 +1982,9 @@ void CDECL wined3d_device_set_blend_state(struct wined3d_device *device, struct
 
     TRACE("device %p, blend_state %p, blend_factor %s.\n", device, blend_state, debug_color(blend_factor));
 
+    if (device->recording)
+        device->recording->changed.blendState = TRUE;
+
     prev = device->update_state->blend_state;
     if (prev == blend_state && !memcmp(blend_factor, &device->update_state->blend_factor, sizeof(*blend_factor)))
         return;
@@ -1990,7 +1993,8 @@ void CDECL wined3d_device_set_blend_state(struct wined3d_device *device, struct
         wined3d_blend_state_incref(blend_state);
     device->update_state->blend_state = blend_state;
     device->update_state->blend_factor = *blend_factor;
-    wined3d_cs_emit_set_blend_state(device->cs, blend_state, blend_factor);
+    if (!device->recording)
+        wined3d_cs_emit_set_blend_state(device->cs, blend_state, blend_factor);
     if (prev)
         wined3d_blend_state_decref(prev);
 }
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index bbc2ddc9e1..38331a0df4 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -597,23 +597,6 @@ static void state_blend(struct wined3d_context *context, const struct wined3d_st
         context_apply_state(context, state, STATE_TEXTURESTAGE(0, WINED3D_TSS_ALPHA_OP));
 }
 
-static void state_blendfactor_w(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
-{
-    WARN("Unsupported in local OpenGL implementation: glBlendColor.\n");
-}
-
-static void state_blendfactor(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
-{
-    const struct wined3d_gl_info *gl_info = context->gl_info;
-    struct wined3d_color color;
-
-    TRACE("Setting blend factor to %#x.\n", state->render_states[WINED3D_RS_BLENDFACTOR]);
-
-    wined3d_color_from_d3dcolor(&color, state->render_states[WINED3D_RS_BLENDFACTOR]);
-    GL_EXTCALL(glBlendColor(color.r, color.g, color.b, color.a));
-    checkGLcall("glBlendColor");
-}
-
 static void state_blend_object(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
 {
     const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -4699,8 +4682,6 @@ const struct StateEntryTemplate misc_state_template[] =
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE2),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          NULL                }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE3),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE3),         state_colorwrite3   }, EXT_DRAW_BUFFERS2               },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE3),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          NULL                }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BLENDFACTOR),               { STATE_RENDER(WINED3D_RS_BLENDFACTOR),               state_blendfactor   }, EXT_BLEND_COLOR                 },
-    { STATE_RENDER(WINED3D_RS_BLENDFACTOR),               { STATE_RENDER(WINED3D_RS_BLENDFACTOR),               state_blendfactor_w }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_DEPTHBIAS),                 { STATE_RENDER(WINED3D_RS_DEPTHBIAS),                 state_depthbias     }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_ZVISIBLE),                  { STATE_RENDER(WINED3D_RS_ZVISIBLE),                  state_zvisible      }, WINED3D_GL_EXT_NONE             },
     /* Samplers */
@@ -5463,6 +5444,7 @@ static void validate_state_table(struct StateEntry *state_table)
         {149, 150},
         {169, 169},
         {177, 177},
+        {193, 193},
         {196, 197},
         {  0,   0},
     };
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index 213b120752..f9f55249f6 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -35,7 +35,6 @@ static const DWORD pixel_states_render[] =
     WINED3D_RS_ALPHAREF,
     WINED3D_RS_ALPHATESTENABLE,
     WINED3D_RS_ANTIALIASEDLINEENABLE,
-    WINED3D_RS_BLENDFACTOR,
     WINED3D_RS_BLENDOP,
     WINED3D_RS_BLENDOPALPHA,
     WINED3D_RS_BACK_STENCILFAIL,
@@ -209,6 +208,7 @@ static void stateblock_savedstates_set_all(struct wined3d_saved_states *states,
     states->pixelShader = 1;
     states->vertexShader = 1;
     states->scissorRect = 1;
+    states->blendState = 1;
 
     /* Fixed size arrays */
     states->streamSource = 0xffff;
@@ -236,6 +236,7 @@ static void stateblock_savedstates_set_pixel(struct wined3d_saved_states *states
     unsigned int i;
 
     states->pixelShader = 1;
+    states->blendState = 1;
 
     for (i = 0; i < ARRAY_SIZE(pixel_states_render); ++i)
     {
@@ -839,6 +840,21 @@ void CDECL wined3d_stateblock_capture(struct wined3d_stateblock *stateblock)
             SetRectEmpty(stateblock->state.scissor_rects);
     }
 
+    if (stateblock->changed.blendState
+            && (src_state->blend_state != stateblock->state.blend_state
+                || memcmp(&src_state->blend_factor, &stateblock->state.blend_factor,
+                           sizeof(stateblock->state.blend_factor))))
+    {
+        TRACE("Updating blend state.\n");
+
+        if (src_state->blend_state)
+                wined3d_blend_state_incref(src_state->blend_state);
+        if (stateblock->state.blend_state)
+                wined3d_blend_state_decref(stateblock->state.blend_state);
+        stateblock->state.blend_state = src_state->blend_state;
+        stateblock->state.blend_factor = src_state->blend_factor;
+    }
+
     map = stateblock->changed.streamSource;
     for (i = 0; map; map >>= 1, ++i)
     {
@@ -1074,6 +1090,11 @@ void CDECL wined3d_stateblock_apply(const struct wined3d_stateblock *stateblock)
         wined3d_device_set_scissor_rects(device, stateblock->state.scissor_rect_count,
                 stateblock->state.scissor_rects);
 
+    if (stateblock->changed.blendState){
+        wined3d_device_set_blend_state(device, stateblock->state.blend_state,
+                &stateblock->state.blend_factor);
+    }
+
     map = stateblock->changed.streamSource;
     for (i = 0; map; map >>= 1, ++i)
     {
@@ -1255,7 +1276,6 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d
     state->render_states[WINED3D_RS_COLORWRITEENABLE1] = 0x0000000f;
     state->render_states[WINED3D_RS_COLORWRITEENABLE2] = 0x0000000f;
     state->render_states[WINED3D_RS_COLORWRITEENABLE3] = 0x0000000f;
-    state->render_states[WINED3D_RS_BLENDFACTOR] = 0xffffffff;
     state->render_states[WINED3D_RS_SRGBWRITEENABLE] = 0;
     state->render_states[WINED3D_RS_DEPTHBIAS] = 0;
     state->render_states[WINED3D_RS_WRAP8] = 0;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index da01bbb0b6..3bae059a88 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -4762,7 +4762,6 @@ const char *debug_d3drenderstate(enum wined3d_render_state state)
         D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE1);
         D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE2);
         D3DSTATE_TO_STR(WINED3D_RS_COLORWRITEENABLE3);
-        D3DSTATE_TO_STR(WINED3D_RS_BLENDFACTOR);
         D3DSTATE_TO_STR(WINED3D_RS_SRGBWRITEENABLE);
         D3DSTATE_TO_STR(WINED3D_RS_DEPTHBIAS);
         D3DSTATE_TO_STR(WINED3D_RS_WRAP8);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index dbcf17e26c..64ae6f57e7 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3492,6 +3492,7 @@ struct wined3d_saved_states
     DWORD pixelShader : 1;
     DWORD vertexShader : 1;
     DWORD scissorRect : 1;
+    DWORD blendState : 1;
     DWORD padding : 5;
 };
 
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 3441fee16a..e8901a9568 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -388,7 +388,6 @@ enum wined3d_render_state
     WINED3D_RS_COLORWRITEENABLE1            = 190,
     WINED3D_RS_COLORWRITEENABLE2            = 191,
     WINED3D_RS_COLORWRITEENABLE3            = 192,
-    WINED3D_RS_BLENDFACTOR                  = 193,
     WINED3D_RS_SRGBWRITEENABLE              = 194,
     WINED3D_RS_DEPTHBIAS                    = 195,
     WINED3D_RS_WRAP8                        = 198,
-- 
2.17.1




More information about the wine-devel mailing list