diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index 76f8c821a1c..e09527d5a7b 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_SRCBLEND, d->SrcBlend); wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_DESTBLEND, d->DestBlend); 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); diff --git a/dlls/d3d11/state.c b/dlls/d3d11/state.c index 269ec5eb124..1cc579c86a8 100644 --- a/dlls/d3d11/state.c +++ b/dlls/d3d11/state.c @@ -390,6 +390,7 @@ HRESULT d3d_blend_state_create(struct d3d_device *device, const D3D11_BLEND_DESC wined3d_desc.alpha_to_coverage = desc->AlphaToCoverageEnable; wined3d_desc.enable = desc->RenderTarget[0].BlendEnable; + wined3d_desc.src = desc->RenderTarget[0].SrcBlend; /* 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 3f8bd02d1df..54efdb05a73 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -3582,6 +3582,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, { case WINED3D_RS_BLENDFACTOR: case WINED3D_RS_ALPHABLENDENABLE: + case WINED3D_RS_SRCBLEND: set_blend_state = TRUE; break; @@ -3653,6 +3654,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, if (state->rs[WINED3D_RS_ADAPTIVETESS_Y] == WINED3DFMT_ATOC) desc.alpha_to_coverage = TRUE; desc.enable = state->rs[WINED3D_RS_ALPHABLENDENABLE]; + desc.src = state->rs[WINED3D_RS_SRCBLEND]; 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 0931d60fe85..aa85193bdd7 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -557,8 +557,7 @@ static void state_blend(struct wined3d_context *context, const struct wined3d_st gl_info->gl_ops.gl.p_glEnable(GL_BLEND); checkGLcall("glEnable(GL_BLEND)"); - gl_blend_from_d3d(&src_blend, &dst_blend, - state->render_states[WINED3D_RS_SRCBLEND], + gl_blend_from_d3d(&src_blend, &dst_blend, b->desc.src, state->render_states[WINED3D_RS_DESTBLEND], rt_format); /* Re-apply BLENDOP(ALPHA) because of a possible SEPARATEALPHABLENDENABLE change */ @@ -4504,7 +4503,6 @@ const struct wined3d_state_entry_template misc_state_template[] = { STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING, { STATE_COMPUTE_UNORDERED_ACCESS_VIEW_BINDING, state_uav_warn }, WINED3D_GL_EXT_NONE }, { STATE_STREAM_OUTPUT, { STATE_STREAM_OUTPUT, state_so, }, WINED3D_GL_VERSION_3_2 }, { STATE_STREAM_OUTPUT, { STATE_STREAM_OUTPUT, state_so_warn, }, WINED3D_GL_EXT_NONE }, - { STATE_RENDER(WINED3D_RS_SRCBLEND), { STATE_BLEND, NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3D_RS_DESTBLEND), { STATE_BLEND, NULL }, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3D_RS_EDGEANTIALIAS), { STATE_RENDER(WINED3D_RS_EDGEANTIALIAS), state_line_antialias}, WINED3D_GL_EXT_NONE }, { STATE_RENDER(WINED3D_RS_SEPARATEALPHABLENDENABLE), { STATE_BLEND, NULL }, WINED3D_GL_EXT_NONE }, @@ -5419,7 +5417,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { 1, 1}, { 3, 3}, { 8, 8}, - { 17, 18}, + { 17, 19}, { 21, 22}, { 27, 27}, { 42, 45}, diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h index f6353bed328..923f184d96d 100644 --- a/include/wine/wined3d.h +++ b/include/wine/wined3d.h @@ -2030,6 +2030,7 @@ struct wined3d_blend_state_desc { BOOL alpha_to_coverage; BOOL enable; + enum wined3d_blend src; }; struct wined3d_rasterizer_state_desc