From: Józef Kucia Subject: [PATCH 7/7] d3d11: Try to avoid spurious blend state FIXMEs(). Message-Id: <20170324161448.4503-7-jkucia@codeweavers.com> Date: Fri, 24 Mar 2017 17:14:48 +0100 In-Reply-To: <20170324161448.4503-1-jkucia@codeweavers.com> References: <20170324161448.4503-1-jkucia@codeweavers.com> Signed-off-by: Józef Kucia --- dlls/d3d11/device.c | 49 +++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c index d9c3a5a..515da0e 100644 --- a/dlls/d3d11/device.c +++ b/dlls/d3d11/device.c @@ -696,9 +696,6 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetBlendState(ID3D11Devi if (!blend_factor) blend_factor = default_blend_factor; - if (blend_factor[0] != 1.0f || blend_factor[1] != 1.0f || blend_factor[2] != 1.0f || blend_factor[3] != 1.0f) - FIXME("Ignoring blend factor %s.\n", debug_float4(blend_factor)); - wined3d_mutex_lock(); memcpy(device->blend_factor, blend_factor, 4 * sizeof(*blend_factor)); wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_MULTISAMPLEMASK, sample_mask); @@ -718,30 +715,27 @@ static void STDMETHODCALLTYPE d3d11_immediate_context_OMSetBlendState(ID3D11Devi } desc = &device->blend_state->desc; - /* glSampleCoverage() */ - if (desc->AlphaToCoverageEnable) - FIXME("Ignoring AlphaToCoverageEnable %#x.\n", desc->AlphaToCoverageEnable); - /* glEnableIndexedEXT(GL_BLEND, ...) */ - FIXME("Per-rendertarget blend not implemented.\n"); wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_ALPHABLENDENABLE, desc->RenderTarget[0].BlendEnable); if (desc->RenderTarget[0].BlendEnable) { - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_SRCBLEND, - desc->RenderTarget[0].SrcBlend); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_DESTBLEND, - desc->RenderTarget[0].DestBlend); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_BLENDOP, - desc->RenderTarget[0].BlendOp); + 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); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_SRCBLENDALPHA, - desc->RenderTarget[0].SrcBlendAlpha); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_DESTBLENDALPHA, - desc->RenderTarget[0].DestBlendAlpha); - wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_BLENDOPALPHA, - desc->RenderTarget[0].BlendOpAlpha); - } - FIXME("Color mask > 3 not implemented.\n"); + 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); + wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_BLENDOPALPHA, d->BlendOpAlpha); + + if (memcmp(blend_factor, default_blend_factor, sizeof(default_blend_factor)) + && (d->SrcBlend == D3D11_BLEND_BLEND_FACTOR || d->SrcBlend == D3D11_BLEND_INV_BLEND_FACTOR + || d->DestBlend == D3D11_BLEND_BLEND_FACTOR || d->DestBlend == D3D11_BLEND_INV_BLEND_FACTOR + || d->SrcBlendAlpha == D3D11_BLEND_BLEND_FACTOR || d->SrcBlendAlpha == D3D11_BLEND_INV_BLEND_FACTOR + || d->DestBlendAlpha == D3D11_BLEND_BLEND_FACTOR || d->DestBlendAlpha == D3D11_BLEND_INV_BLEND_FACTOR)) + FIXME("Ignoring blend factor %s.\n", debug_float4(blend_factor)); + } wined3d_device_set_render_state(device->wined3d_device, WINED3D_RS_COLORWRITEENABLE, desc->RenderTarget[0].RenderTargetWriteMask); wined3d_device_set_render_state(device->wined3d_device, @@ -2643,8 +2637,19 @@ static HRESULT STDMETHODCALLTYPE d3d11_device_CreateBlendState(ID3D11Device *ifa tmp_desc.RenderTarget[i].DestBlendAlpha = desc->RenderTarget[j].DestBlendAlpha; tmp_desc.RenderTarget[i].BlendOpAlpha = desc->RenderTarget[j].BlendOpAlpha; tmp_desc.RenderTarget[i].RenderTargetWriteMask = desc->RenderTarget[j].RenderTargetWriteMask; + + if (i > 3 && tmp_desc.RenderTarget[i].RenderTargetWriteMask != D3D11_COLOR_WRITE_ENABLE_ALL) + FIXME("Color mask %#x not supported for render target %u.\n", + tmp_desc.RenderTarget[i].RenderTargetWriteMask, i); } + /* glSampleCoverage() */ + if (tmp_desc.AlphaToCoverageEnable) + FIXME("Ignoring AlphaToCoverageEnable %#x.\n", tmp_desc.AlphaToCoverageEnable); + /* glEnableIndexedEXT(GL_BLEND, ...) */ + if (tmp_desc.IndependentBlendEnable) + FIXME("Per-rendertarget blend not implemented.\n"); + wined3d_mutex_lock(); if ((entry = wine_rb_get(&device->blend_states, &tmp_desc))) { -- 2.10.2