diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap.cs b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap.cs index 4e82479b0..4901ca2e3 100644 --- a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap.cs +++ b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap.cs @@ -26,7 +26,10 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, private ComPtr tex; private ComPtr srv; private ComPtr rtv; - private ComPtr uav; + + private ComPtr texPremultiplied; + private ComPtr srvPremultiplied; + private ComPtr rtvPremultiplied; private int width; private int height; @@ -138,7 +141,9 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, this.srv.Reset(); this.tex.Reset(); this.rtv.Reset(); - this.uav.Reset(); + this.srvPremultiplied.Reset(); + this.texPremultiplied.Reset(); + this.rtvPremultiplied.Reset(); this.device.Reset(); this.deviceContext.Reset(); @@ -180,7 +185,7 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, // Clear the texture first, as the texture exists. var clearColor = this.ClearColor; - this.deviceContext.Get()->ClearRenderTargetView(this.rtv.Get(), (float*)&clearColor); + this.deviceContext.Get()->ClearRenderTargetView(this.rtvPremultiplied.Get(), (float*)&clearColor); // If there is nothing to draw, then stop. if (!drawData.Valid @@ -196,8 +201,8 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, using (new DeviceContextStateBackup(this.device.Get()->GetFeatureLevel(), this.deviceContext)) { - Service.Get().RenderDrawData(this.rtv.Get(), drawData); - Service.Get().MakeStraight(this.uav.Get()); + Service.Get().RenderDrawData(this.rtvPremultiplied.Get(), drawData); + Service.Get().MakeStraight(this.srvPremultiplied.Get(), this.rtv.Get()); } } @@ -217,7 +222,9 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, this.tex.Reset(); this.srv.Reset(); this.rtv.Reset(); - this.uav.Reset(); + this.texPremultiplied.Reset(); + this.srvPremultiplied.Reset(); + this.rtvPremultiplied.Reset(); this.width = newWidth; this.Height = newHeight; this.srv = new((ID3D11ShaderResourceView*)this.emptyTexture.ImGuiHandle); @@ -231,7 +238,9 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, using var tmptex = default(ComPtr); using var tmpsrv = default(ComPtr); using var tmprtv = default(ComPtr); - using var tmpuav = default(ComPtr); + using var tmptexPremultiplied = default(ComPtr); + using var tmpsrvPremultiplied = default(ComPtr); + using var tmprtvPremultiplied = default(ComPtr); var tmpTexDesc = new D3D11_TEXTURE2D_DESC { @@ -243,8 +252,7 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, SampleDesc = new(1, 0), Usage = D3D11_USAGE.D3D11_USAGE_DEFAULT, BindFlags = (uint)(D3D11_BIND_FLAG.D3D11_BIND_SHADER_RESOURCE | - D3D11_BIND_FLAG.D3D11_BIND_RENDER_TARGET | - D3D11_BIND_FLAG.D3D11_BIND_UNORDERED_ACCESS), + D3D11_BIND_FLAG.D3D11_BIND_RENDER_TARGET), CPUAccessFlags = 0u, MiscFlags = 0u, }; @@ -263,15 +271,27 @@ internal sealed unsafe partial class DrawListTextureWrap : IDrawListTextureWrap, if (hr.FAILED) return hr; - var uavDesc = new D3D11_UNORDERED_ACCESS_VIEW_DESC(tmptex, D3D11_UAV_DIMENSION.D3D11_UAV_DIMENSION_TEXTURE2D); - hr = this.device.Get()->CreateUnorderedAccessView(tmpres, &uavDesc, tmpuav.GetAddressOf()); + hr = this.device.Get()->CreateTexture2D(&tmpTexDesc, null, tmptexPremultiplied.GetAddressOf()); + if (hr.FAILED) + return hr; + + tmpres = (ID3D11Resource*)tmptexPremultiplied.Get(); + srvDesc = new(tmptexPremultiplied, D3D_SRV_DIMENSION.D3D11_SRV_DIMENSION_TEXTURE2D); + hr = this.device.Get()->CreateShaderResourceView(tmpres, &srvDesc, tmpsrvPremultiplied.GetAddressOf()); + if (hr.FAILED) + return hr; + + rtvDesc = new(tmptexPremultiplied, D3D11_RTV_DIMENSION.D3D11_RTV_DIMENSION_TEXTURE2D); + hr = this.device.Get()->CreateRenderTargetView(tmpres, &rtvDesc, tmprtvPremultiplied.GetAddressOf()); if (hr.FAILED) return hr; tmptex.Swap(ref this.tex); tmpsrv.Swap(ref this.srv); tmprtv.Swap(ref this.rtv); - tmpuav.Swap(ref this.uav); + tmptexPremultiplied.Swap(ref this.texPremultiplied); + tmpsrvPremultiplied.Swap(ref this.srvPremultiplied); + tmprtvPremultiplied.Swap(ref this.rtvPremultiplied); this.width = newWidth; this.height = newHeight; this.format = newFormat; diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.hlsl b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.hlsl index 171d3e73b..b1cdf2fd0 100644 --- a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.hlsl +++ b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.hlsl @@ -1,4 +1,4 @@ -#include "DrawListTexture.Renderer.Common.hlsl" +#include "Renderer.Common.hlsl" struct ImDrawVert { float2 position : POSITION; @@ -18,7 +18,6 @@ struct PsData { Texture2D s_texture : register(t0); SamplerState s_sampler : register(s0); -RWTexture2D s_output : register(u1); VsData vs_main(const ImDrawVert idv) { VsData result; @@ -34,7 +33,7 @@ float4 ps_main(const VsData vd) : SV_TARGET { /* -fxc /Zi /T vs_5_0 /E vs_main /Fo DrawListTexture.Renderer.DrawToPremul.vs.bin DrawListTexture.Renderer.DrawToPremul.hlsl -fxc /Zi /T ps_5_0 /E ps_main /Fo DrawListTexture.Renderer.DrawToPremul.ps.bin DrawListTexture.Renderer.DrawToPremul.hlsl +fxc /Zi /T vs_5_0 /E vs_main /Fo Renderer.DrawToPremul.vs.bin Renderer.DrawToPremul.hlsl +fxc /Zi /T ps_5_0 /E ps_main /Fo Renderer.DrawToPremul.ps.bin Renderer.DrawToPremul.hlsl */ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.ps.bin b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.ps.bin index e3c68edf3..80c297ce6 100644 Binary files a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.ps.bin and b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.ps.bin differ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.vs.bin b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.vs.bin index 0079755c0..8549c1d65 100644 Binary files a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.vs.bin and b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.DrawToPremul.vs.bin differ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.hlsl b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.hlsl index b8423697a..bce235d7f 100644 --- a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.hlsl +++ b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.hlsl @@ -1,22 +1,19 @@ -RWTexture2D s_output : register(u1); +Texture2D s_texture : register(t0); float4 vs_main(const float2 position : POSITION) : SV_POSITION { return float4(position, 0, 1); } float4 ps_main(const float4 position : SV_POSITION) : SV_TARGET { - const float4 src = s_output[position.xy]; - s_output[position.xy] = - src.a > 0 + const float4 src = s_texture[position.xy]; + return src.a > 0 ? float4(src.rgb / src.a, src.a) : float4(0, 0, 0, 0); - - return float4(0, 0, 0, 0); // unused } /* -fxc /Zi /T vs_5_0 /E vs_main /Fo DrawListTexture.Renderer.MakeStraight.vs.bin DrawListTexture.Renderer.MakeStraight.hlsl -fxc /Zi /T ps_5_0 /E ps_main /Fo DrawListTexture.Renderer.MakeStraight.ps.bin DrawListTexture.Renderer.MakeStraight.hlsl +fxc /Zi /T vs_5_0 /E vs_main /Fo Renderer.MakeStraight.vs.bin Renderer.MakeStraight.hlsl +fxc /Zi /T ps_5_0 /E ps_main /Fo Renderer.MakeStraight.ps.bin Renderer.MakeStraight.hlsl */ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.ps.bin b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.ps.bin index 0b979f6b6..2892c7361 100644 Binary files a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.ps.bin and b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.ps.bin differ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.vs.bin b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.vs.bin index 1baeecdae..1bbe7e592 100644 Binary files a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.vs.bin and b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.MakeStraight.vs.bin differ diff --git a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.cs b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.cs index cc6cfd000..1243c8754 100644 --- a/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.cs +++ b/Dalamud/Interface/Textures/TextureWraps/Internal/DrawListTextureWrap/Renderer.cs @@ -259,15 +259,16 @@ internal sealed unsafe partial class DrawListTextureWrap } /// Renders draw data. - /// The pointer to a Texture2D UAV to make straight. - public void MakeStraight(ID3D11UnorderedAccessView* puav) + /// The pointer to a Texture2D SRV to read premultiplied data from. + /// The pointer to a Texture2D RTV to write straightened data. + public void MakeStraight(ID3D11ShaderResourceView* psrv, ID3D11RenderTargetView* prtv) { ThreadSafety.AssertMainThread(); D3D11_TEXTURE2D_DESC texDesc; using (var texRes = default(ComPtr)) { - puav->GetResource(texRes.GetAddressOf()); + prtv->GetResource(texRes.GetAddressOf()); using var tex = default(ComPtr); texRes.As(&tex).ThrowOnError(); @@ -292,10 +293,9 @@ internal sealed unsafe partial class DrawListTextureWrap var viewport = new D3D11_VIEWPORT(0, 0, texDesc.Width, texDesc.Height); this.deviceContext.Get()->RSSetViewports(1, &viewport); - this.deviceContext.Get()->OMSetBlendState(null, null, 0xFFFFFFFF); + this.deviceContext.Get()->OMSetBlendState(null, null, 0xffffffff); this.deviceContext.Get()->OMSetDepthStencilState(this.depthStencilState, 0); - var nullrtv = default(ID3D11RenderTargetView*); - this.deviceContext.Get()->OMSetRenderTargetsAndUnorderedAccessViews(1, &nullrtv, null, 1, 1, &puav, null); + this.deviceContext.Get()->OMSetRenderTargets(1, &prtv, null); this.deviceContext.Get()->VSSetShader(this.makeStraightVertexShader.Get(), null, 0); this.deviceContext.Get()->PSSetShader(this.makeStraightPixelShader.Get(), null, 0); @@ -304,6 +304,7 @@ internal sealed unsafe partial class DrawListTextureWrap this.deviceContext.Get()->DSSetShader(null, null, 0); this.deviceContext.Get()->CSSetShader(null, null, 0); + this.deviceContext.Get()->PSSetShaderResources(0, 1, &psrv); this.deviceContext.Get()->DrawIndexed(6, 0, 0); }