Signed-off-by: Zebediah Figura z.figura12@gmail.com --- 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 2a764897a9..3ed4c704fc 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 4473da13dd..858440960b 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