mirror of https://github.com/PCSX2/pcsx2.git
GS/Vulkan: Fix incorrect clear colour for fast colclip
This commit is contained in:
parent
9de38e50e2
commit
085699f9de
|
@ -1600,14 +1600,14 @@ void GSDevice12::BeginRenderPassForStretchRect(
|
||||||
BeginRenderPass(load_op, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
BeginRenderPass(load_op, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
dTex->GetClearColor());
|
dTex->GetUNormClearColor());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, load_op, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, load_op, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
0, dTex->GetClearDepth());
|
GSVector4::zero(), dTex->GetClearDepth());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1724,7 +1724,7 @@ void GSDevice12::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex,
|
||||||
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR,
|
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, c);
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, GSVector4::unorm8(c));
|
||||||
SetUtilityRootSignature();
|
SetUtilityRootSignature();
|
||||||
SetPipeline(m_convert[static_cast<int>(ShaderConvert::COPY)].get());
|
SetPipeline(m_convert[static_cast<int>(ShaderConvert::COPY)].get());
|
||||||
DrawStretchRect(sRect[1], PMODE.SLBG ? dRect[2] : dRect[1], dsize);
|
DrawStretchRect(sRect[1], PMODE.SLBG ? dRect[2] : dRect[1], dsize);
|
||||||
|
@ -1766,7 +1766,8 @@ void GSDevice12::DoMerge(GSTexture* sTex[3], GSVector4* sRect, GSTexture* dTex,
|
||||||
OMSetRenderTargets(dTex, nullptr, darea);
|
OMSetRenderTargets(dTex, nullptr, darea);
|
||||||
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS, c);
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
|
GSVector4::unorm8(c));
|
||||||
dTex->SetState(GSTexture::State::Dirty);
|
dTex->SetState(GSTexture::State::Dirty);
|
||||||
}
|
}
|
||||||
else if (!InRenderPass())
|
else if (!InRenderPass())
|
||||||
|
@ -3370,7 +3371,7 @@ bool GSDevice12::InRenderPass()
|
||||||
void GSDevice12::BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE color_begin,
|
void GSDevice12::BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE color_begin,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE color_end, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE depth_begin,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE color_end, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE depth_begin,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE depth_end, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE stencil_begin,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE depth_end, D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE stencil_begin,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE stencil_end, u32 clear_color, float clear_depth, u8 clear_stencil)
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE stencil_end, GSVector4 clear_color, float clear_depth, u8 clear_stencil)
|
||||||
{
|
{
|
||||||
if (m_in_render_pass)
|
if (m_in_render_pass)
|
||||||
EndRenderPass();
|
EndRenderPass();
|
||||||
|
@ -3389,8 +3390,7 @@ void GSDevice12::BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE color_b
|
||||||
{
|
{
|
||||||
LookupNativeFormat(m_current_render_target->GetFormat(), nullptr,
|
LookupNativeFormat(m_current_render_target->GetFormat(), nullptr,
|
||||||
&rt.BeginningAccess.Clear.ClearValue.Format, nullptr, nullptr);
|
&rt.BeginningAccess.Clear.ClearValue.Format, nullptr, nullptr);
|
||||||
GSVector4::store<false>(rt.BeginningAccess.Clear.ClearValue.Color,
|
GSVector4::store<false>(rt.BeginningAccess.Clear.ClearValue.Color, clear_color);
|
||||||
GSVector4::unorm8(clear_color));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3685,7 +3685,8 @@ void GSDevice12::SetupDATE(GSTexture* rt, GSTexture* ds, SetDATM datm, const GSV
|
||||||
SetStencilRef(1);
|
SetStencilRef(1);
|
||||||
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
BeginRenderPass(D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_PRESERVE, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE, 0, 0.0f, 0);
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_CLEAR, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE,
|
||||||
|
GSVector4::zero(), 0.0f, 0);
|
||||||
if (ApplyUtilityState())
|
if (ApplyUtilityState())
|
||||||
DrawPrimitive();
|
DrawPrimitive();
|
||||||
|
|
||||||
|
@ -3720,7 +3721,7 @@ GSTexture12* GSDevice12::SetupPrimitiveTrackingDATE(GSHWDrawConfig& config, Pipe
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
config.ds ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
config.ds ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
0, config.ds ? config.ds->GetClearDepth() : 0.0f);
|
GSVector4::zero(), config.ds ? config.ds->GetClearDepth() : 0.0f);
|
||||||
|
|
||||||
// draw the quad to prefill the image
|
// draw the quad to prefill the image
|
||||||
const GSVector4 src = GSVector4(config.drawarea) / GSVector4(rtsize).xyxy();
|
const GSVector4 src = GSVector4(config.drawarea) / GSVector4(rtsize).xyxy();
|
||||||
|
@ -3902,6 +3903,12 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config)
|
||||||
// Begin render pass if new target or out of the area.
|
// Begin render pass if new target or out of the area.
|
||||||
if (!m_in_render_pass)
|
if (!m_in_render_pass)
|
||||||
{
|
{
|
||||||
|
GSVector4 clear_color = draw_rt ? draw_rt->GetUNormClearColor() : GSVector4::zero();
|
||||||
|
if (pipe.ps.hdr)
|
||||||
|
{
|
||||||
|
// Denormalize clear color for HDR.
|
||||||
|
clear_color *= GSVector4::cxpr(255.0f / 65535.0f, 255.0f / 65535.0f, 255.0f / 65535.0f, 1.0f);
|
||||||
|
}
|
||||||
BeginRenderPass(GetLoadOpForTexture(draw_rt),
|
BeginRenderPass(GetLoadOpForTexture(draw_rt),
|
||||||
draw_rt ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
draw_rt ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
GetLoadOpForTexture(draw_ds),
|
GetLoadOpForTexture(draw_ds),
|
||||||
|
@ -3910,7 +3917,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config)
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
stencil_DATE ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_DISCARD :
|
stencil_DATE ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_DISCARD :
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
draw_rt ? draw_rt->GetClearColor() : 0, draw_ds ? draw_ds->GetClearDepth() : 0.0f, 1);
|
clear_color, draw_ds ? draw_ds->GetClearDepth() : 0.0f, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// rt -> hdr blit if enabled
|
// rt -> hdr blit if enabled
|
||||||
|
@ -3975,7 +3982,7 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config)
|
||||||
GetLoadOpForTexture(draw_ds),
|
GetLoadOpForTexture(draw_ds),
|
||||||
draw_ds ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
draw_ds ? D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_PRESERVE : D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS, D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
draw_rt->GetClearColor(), 0.0f, 0);
|
draw_rt->GetUNormClearColor(), 0.0f, 0);
|
||||||
|
|
||||||
const GSVector4 sRect(GSVector4(render_area) / GSVector4(rtsize.x, rtsize.y).xyxy());
|
const GSVector4 sRect(GSVector4(render_area) / GSVector4(rtsize.x, rtsize.y).xyxy());
|
||||||
SetPipeline(m_hdr_finish_pipelines[pipe.ds].get());
|
SetPipeline(m_hdr_finish_pipelines[pipe.ds].get());
|
||||||
|
|
|
@ -510,7 +510,7 @@ public:
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE depth_end = D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE depth_end = D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE stencil_begin = D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE stencil_begin = D3D12_RENDER_PASS_BEGINNING_ACCESS_TYPE_NO_ACCESS,
|
||||||
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE stencil_end = D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
D3D12_RENDER_PASS_ENDING_ACCESS_TYPE stencil_end = D3D12_RENDER_PASS_ENDING_ACCESS_TYPE_NO_ACCESS,
|
||||||
const u32 clear_color = 0, float clear_depth = 0.0f, u8 clear_stencil = 0);
|
GSVector4 clear_color = GSVector4::zero(), float clear_depth = 0.0f, u8 clear_stencil = 0);
|
||||||
void EndRenderPass();
|
void EndRenderPass();
|
||||||
|
|
||||||
void SetViewport(const D3D12_VIEWPORT& viewport);
|
void SetViewport(const D3D12_VIEWPORT& viewport);
|
||||||
|
|
|
@ -5793,7 +5793,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::Stencil, pipe.IsRTFeedbackLoop(),
|
config.destination_alpha == GSHWDrawConfig::DestinationAlphaMode::Stencil, pipe.IsRTFeedbackLoop(),
|
||||||
pipe.IsTestingAndSamplingDepth(), rt_op, ds_op);
|
pipe.IsTestingAndSamplingDepth(), rt_op, ds_op);
|
||||||
const bool is_clearing_rt = (rt_op == VK_ATTACHMENT_LOAD_OP_CLEAR || ds_op == VK_ATTACHMENT_LOAD_OP_CLEAR);
|
const bool is_clearing_rt = (rt_op == VK_ATTACHMENT_LOAD_OP_CLEAR || ds_op == VK_ATTACHMENT_LOAD_OP_CLEAR);
|
||||||
const GSVector4i render_area = GSVector4i::loadh(rtsize);
|
const GSVector4i render_area = pipe.ps.hdr ? config.drawarea : GSVector4i::loadh(rtsize);
|
||||||
|
|
||||||
if (is_clearing_rt)
|
if (is_clearing_rt)
|
||||||
{
|
{
|
||||||
|
@ -5801,7 +5801,15 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
alignas(16) VkClearValue cvs[2];
|
alignas(16) VkClearValue cvs[2];
|
||||||
u32 cv_count = 0;
|
u32 cv_count = 0;
|
||||||
if (draw_rt)
|
if (draw_rt)
|
||||||
GSVector4::store<true>(&cvs[cv_count++].color, draw_rt->GetUNormClearColor());
|
{
|
||||||
|
GSVector4 clear_color = draw_rt->GetUNormClearColor();
|
||||||
|
if (pipe.ps.hdr)
|
||||||
|
{
|
||||||
|
// Denormalize clear color for HDR.
|
||||||
|
clear_color *= GSVector4::cxpr(255.0f / 65535.0f, 255.0f / 65535.0f, 255.0f / 65535.0f, 1.0f);
|
||||||
|
}
|
||||||
|
GSVector4::store<true>(&cvs[cv_count++].color, clear_color);
|
||||||
|
}
|
||||||
if (draw_ds)
|
if (draw_ds)
|
||||||
cvs[cv_count++].depthStencil = {draw_ds->GetClearDepth(), 0};
|
cvs[cv_count++].depthStencil = {draw_ds->GetClearDepth(), 0};
|
||||||
|
|
||||||
|
@ -5871,7 +5879,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
|
||||||
// now blit the hdr texture back to the original target
|
// now blit the hdr texture back to the original target
|
||||||
if (hdr_rt)
|
if (hdr_rt)
|
||||||
{
|
{
|
||||||
GL_INS("Blit HDR back to RT");
|
GL_PUSH("Blit HDR back to RT");
|
||||||
|
|
||||||
EndRenderPass();
|
EndRenderPass();
|
||||||
hdr_rt->TransitionToLayout(GSTextureVK::Layout::ShaderReadOnly);
|
hdr_rt->TransitionToLayout(GSTextureVK::Layout::ShaderReadOnly);
|
||||||
|
|
Loading…
Reference in New Issue