Zebediah Figura : wined3d: Move the blend operation to wined3d_blend_state.

Alexandre Julliard julliard at winehq.org
Thu Mar 12 17:09:06 CDT 2020


Module: wine
Branch: master
Commit: 936310585c533beb50188f4a5d1328983c2c10fb
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=936310585c533beb50188f4a5d1328983c2c10fb

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Mar 10 18:06:16 2020 -0500

wined3d: Move the blend operation to wined3d_blend_state.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/d3d11/device.c    |  1 -
 dlls/d3d11/state.c     |  1 +
 dlls/wined3d/device.c  |  2 ++
 dlls/wined3d/state.c   | 24 +++++++++++-------------
 include/wine/wined3d.h |  1 +
 5 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index 11265cf1b0..8193ec4cf4 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -740,7 +740,6 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetBlendState(ID3D11Devi
     {
         const D3D11_RENDER_TARGET_BLEND_DESC *d = &desc->RenderTarget[0];
 
-        wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_BLENDOP, d->BlendOp);
         wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_SEPARATEALPHABLENDENABLE, TRUE);
         wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_SRCBLENDALPHA, d->SrcBlendAlpha);
         wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_DESTBLENDALPHA, d->DestBlendAlpha);
diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c
index 4d5bd8d94e..693bb3df83 100644
--- a/dlls/d3d11/state.c
+++ b/dlls/d3d11/state.c
@@ -392,6 +392,7 @@ HRESULT d3d_blend_state_create(struct d3d_device *device, const D3D11_BLEND_DESC
     wined3d_desc.enable = desc->RenderTarget[0].BlendEnable;
     wined3d_desc.src = desc->RenderTarget[0].SrcBlend;
     wined3d_desc.dst = desc->RenderTarget[0].DestBlend;
+    wined3d_desc.op = desc->RenderTarget[0].BlendOp;
 
     /* We cannot fail after creating a wined3d_blend_state object. It
      * would lead to double free. */
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index d7175284cf..5bb9542891 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -3584,6 +3584,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
                 case WINED3D_RS_ALPHABLENDENABLE:
                 case WINED3D_RS_SRCBLEND:
                 case WINED3D_RS_DESTBLEND:
+                case WINED3D_RS_BLENDOP:
                     set_blend_state = TRUE;
                     break;
 
@@ -3657,6 +3658,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
         desc.enable = state->rs[WINED3D_RS_ALPHABLENDENABLE];
         desc.src = state->rs[WINED3D_RS_SRCBLEND];
         desc.dst = state->rs[WINED3D_RS_DESTBLEND];
+        desc.op = state->rs[WINED3D_RS_BLENDOP];
 
         if (wined3d_bitmap_is_set(changed->renderState, WINED3D_RS_BLENDFACTOR))
             wined3d_color_from_d3dcolor(&colour, state->rs[WINED3D_RS_BLENDFACTOR]);
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 8de2945bf5..8999ab1696 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -390,11 +390,6 @@ static void state_ambient(struct wined3d_context *context, const struct wined3d_
     checkGLcall("glLightModel for MODEL_AMBIENT");
 }
 
-static void state_blendop_w(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
-{
-    WARN("Unsupported in local OpenGL implementation: glBlendEquation\n");
-}
-
 static GLenum gl_blend_op(const struct wined3d_gl_info *gl_info, enum wined3d_blend_op op)
 {
     switch (op)
@@ -418,12 +413,18 @@ static GLenum gl_blend_op(const struct wined3d_gl_info *gl_info, enum wined3d_bl
     }
 }
 
-static void state_blendop(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
+static void blendop(const struct wined3d_state *state, const struct wined3d_gl_info *gl_info)
 {
-    const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info;
+    const struct wined3d_blend_state *b = state->blend_state;
     GLenum blend_equation_alpha = GL_FUNC_ADD_EXT;
     GLenum blend_equation = GL_FUNC_ADD_EXT;
 
+    if (!gl_info->supported[WINED3D_GL_BLEND_EQUATION])
+    {
+        WARN("Unsupported in local OpenGL implementation: glBlendEquation.\n");
+        return;
+    }
+
     /* BLENDOPALPHA requires GL_EXT_blend_equation_separate, so make sure it is around */
     if (state->render_states[WINED3D_RS_BLENDOPALPHA]
             && !gl_info->supported[EXT_BLEND_EQUATION_SEPARATE])
@@ -432,7 +433,7 @@ static void state_blendop(struct wined3d_context *context, const struct wined3d_
         return;
     }
 
-    blend_equation = gl_blend_op(gl_info, state->render_states[WINED3D_RS_BLENDOP]);
+    blend_equation = gl_blend_op(gl_info, b->desc.op);
     blend_equation_alpha = gl_blend_op(gl_info, state->render_states[WINED3D_RS_BLENDOPALPHA]);
     TRACE("blend_equation %#x, blend_equation_alpha %#x.\n", blend_equation, blend_equation_alpha);
 
@@ -559,9 +560,7 @@ static void state_blend(struct wined3d_context *context, const struct wined3d_st
 
     gl_blend_from_d3d(&src_blend, &dst_blend, b->desc.src, b->desc.dst, rt_format);
 
-    /* Re-apply BLENDOP(ALPHA) because of a possible SEPARATEALPHABLENDENABLE change */
-    if (!isStateDirty(context, STATE_RENDER(WINED3D_RS_BLENDOP)))
-        state_blendop(context, state, STATE_RENDER(WINED3D_RS_BLENDOPALPHA));
+    blendop(state, gl_info);
 
     if (state->render_states[WINED3D_RS_SEPARATEALPHABLENDENABLE])
     {
@@ -4649,8 +4648,6 @@ const struct wined3d_state_entry_template misc_state_template[] =
     { STATE_RENDER(WINED3D_RS_DEBUGMONITORTOKEN),         { STATE_RENDER(WINED3D_RS_DEBUGMONITORTOKEN),         state_debug_monitor }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          state_colorwrite0   }, EXT_DRAW_BUFFERS2               },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          state_colorwrite    }, WINED3D_GL_EXT_NONE             },
-    { STATE_RENDER(WINED3D_RS_BLENDOP),                   { STATE_RENDER(WINED3D_RS_BLENDOP),                   state_blendop       }, WINED3D_GL_BLEND_EQUATION       },
-    { STATE_RENDER(WINED3D_RS_BLENDOP),                   { STATE_RENDER(WINED3D_RS_BLENDOP),                   state_blendop_w     }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE1),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE1),         state_colorwrite1   }, EXT_DRAW_BUFFERS2               },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE1),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE),          NULL                }, WINED3D_GL_EXT_NONE             },
     { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE2),         { STATE_RENDER(WINED3D_RS_COLORWRITEENABLE2),         state_colorwrite2   }, EXT_DRAW_BUFFERS2               },
@@ -5422,6 +5419,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table)
         { 61, 127},
         {149, 150},
         {169, 169},
+        {171, 171},
         {174, 177},
         {193, 193},
         {195, 197},
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 3e43264a76..1bb8a8ee44 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2032,6 +2032,7 @@ struct wined3d_blend_state_desc
     BOOL enable;
     enum wined3d_blend src;
     enum wined3d_blend dst;
+    enum wined3d_blend_op op;
 };
 
 struct wined3d_rasterizer_state_desc




More information about the wine-cvs mailing list