Skip to content

Commit 266a8bd

Browse files
GS/HW: Sync rt copy behaviour across renderers.
1 parent 70f6169 commit 266a8bd

4 files changed

Lines changed: 51 additions & 45 deletions

File tree

pcsx2/GS/Renderers/DX11/GSDevice11.cpp

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,8 +2944,11 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config)
29442944
draw_ds = m_state.current_ds;
29452945
}
29462946

2947-
if (draw_rt && (config.require_one_barrier || (config.require_full_barrier && m_features.multidraw_fb_copy) || (config.tex && config.tex == config.rt)))
2947+
const bool tex_is_fb = config.tex && config.tex == draw_rt;
2948+
if (draw_rt && (((config.require_one_barrier || (config.require_full_barrier && m_features.multidraw_fb_copy)) && config.ps.IsFeedbackLoopRT()) || tex_is_fb))
29482949
{
2950+
config.require_one_barrier |= (tex_is_fb && !config.require_full_barrier);
2951+
29492952
// Requires a copy of the RT.
29502953
draw_rt_clone = CreateTexture(rtsize.x, rtsize.y, 1, draw_rt->GetFormat(), true);
29512954
if (!draw_rt_clone)
@@ -2995,9 +2998,10 @@ void GSDevice11::RenderHW(GSHWDrawConfig& config)
29952998
SetupPS(config.alpha_second_pass.ps, nullptr, config.sampler);
29962999
}
29973000

3001+
const bool one_barrier = config.alpha_second_pass.require_one_barrier && m_features.multidraw_fb_copy;
29983002
SetupOM(config.alpha_second_pass.depth, OMBlendSelector(config.alpha_second_pass.colormask, config.blend), config.blend.constant);
29993003
SendHWDraw(config, draw_rt_clone, draw_rt, draw_ds_clone, draw_ds,
3000-
false, config.alpha_second_pass.require_full_barrier);
3004+
one_barrier, config.alpha_second_pass.require_full_barrier);
30013005
}
30023006

30033007
if (colclip_rt)
@@ -3021,58 +3025,55 @@ void GSDevice11::SendHWDraw(const GSHWDrawConfig& config,
30213025
GSTexture* draw_rt_clone, GSTexture* draw_rt, GSTexture* draw_ds_clone, GSTexture* draw_ds,
30223026
const bool one_barrier, const bool full_barrier)
30233027
{
3024-
if (draw_rt_clone || draw_ds_clone)
3025-
{
30263028
#ifdef PCSX2_DEVBUILD
3027-
if ((one_barrier || full_barrier) && !(config.ps.IsFeedbackLoopRT() || config.ps.IsFeedbackLoopDepth())) [[unlikely]]
3028-
Console.Warning("D3D11: Possible unnecessary copy detected.");
3029+
if ((one_barrier || full_barrier) && !(config.ps.IsFeedbackLoopRT() || config.ps.IsFeedbackLoopDepth())) [[unlikely]]
3030+
Console.Warning("D3D11: Possible unnecessary copy detected.");
30293031
#endif
30303032

3031-
auto CopyAndBind = [&](GSVector4i drawarea) {
3032-
if (draw_rt_clone)
3033-
{
3034-
CopyRect(draw_rt, draw_rt_clone, drawarea, drawarea.left, drawarea.top);
3035-
if ((one_barrier || full_barrier))
3036-
PSSetShaderResource(2, draw_rt_clone);
3037-
if (config.tex && config.tex == draw_rt)
3038-
PSSetShaderResource(0, draw_rt_clone);
3039-
}
3040-
if (draw_ds_clone)
3041-
{
3042-
CopyRect(draw_ds, draw_ds_clone, drawarea, drawarea.left, drawarea.top);
3043-
PSSetShaderResource(4, draw_ds_clone);
3044-
}
3045-
};
3033+
auto CopyAndBind = [&](GSVector4i drawarea) {
3034+
if (draw_rt_clone)
3035+
{
3036+
CopyRect(draw_rt, draw_rt_clone, drawarea, drawarea.left, drawarea.top);
3037+
if ((one_barrier || full_barrier))
3038+
PSSetShaderResource(2, draw_rt_clone);
3039+
if (config.tex && config.tex == draw_rt)
3040+
PSSetShaderResource(0, draw_rt_clone);
3041+
}
3042+
if (draw_ds_clone)
3043+
{
3044+
CopyRect(draw_ds, draw_ds_clone, drawarea, drawarea.left, drawarea.top);
3045+
PSSetShaderResource(4, draw_ds_clone);
3046+
}
3047+
};
30463048

3047-
const GSVector4i rtsize(0, 0, (draw_rt ? draw_rt : draw_ds)->GetWidth(), (draw_rt ? draw_rt : draw_ds)->GetHeight());
3049+
const GSVector4i rtsize(0, 0, (draw_rt ? draw_rt : draw_ds)->GetWidth(), (draw_rt ? draw_rt : draw_ds)->GetHeight());
30483050

3049-
if (full_barrier)
3050-
{
3051-
const u32 draw_list_size = static_cast<u32>(config.drawlist->size());
3052-
const u32 indices_per_prim = config.indices_per_prim;
3051+
if (full_barrier)
3052+
{
3053+
const u32 draw_list_size = static_cast<u32>(config.drawlist->size());
3054+
const u32 indices_per_prim = config.indices_per_prim;
30533055

3054-
pxAssert(config.drawlist && !config.drawlist->empty());
3055-
pxAssert(config.drawlist_bbox && static_cast<u32>(config.drawlist_bbox->size()) == draw_list_size);
3056+
pxAssert(config.drawlist && !config.drawlist->empty());
3057+
pxAssert(config.drawlist_bbox && static_cast<u32>(config.drawlist_bbox->size()) == draw_list_size);
30563058

3057-
for (u32 n = 0, p = 0; n < draw_list_size; n++)
3058-
{
3059-
const u32 count = (*config.drawlist)[n] * indices_per_prim;
3059+
for (u32 n = 0, p = 0; n < draw_list_size; n++)
3060+
{
3061+
const u32 count = (*config.drawlist)[n] * indices_per_prim;
30603062

3061-
const GSVector4i original_bbox = (*config.drawlist_bbox)[n].rintersect(config.drawarea);
3062-
CopyAndBind(ProcessCopyArea(rtsize, original_bbox));
3063+
const GSVector4i original_bbox = (*config.drawlist_bbox)[n].rintersect(config.drawarea);
3064+
CopyAndBind(ProcessCopyArea(rtsize, original_bbox));
30633065

3064-
Draw(config, p, count);
3065-
3066-
p += count;
3067-
}
3066+
Draw(config, p, count);
30683067

3069-
return;
3068+
p += count;
30703069
}
30713070

3072-
// Optimization: For alpha second pass we can reuse the copy snapshot from the first pass.
3073-
CopyAndBind(ProcessCopyArea(rtsize, config.drawarea));
3071+
return;
30743072
}
30753073

3074+
if (one_barrier)
3075+
CopyAndBind(ProcessCopyArea(rtsize, config.drawarea));
3076+
30763077
Draw(config);
30773078
}
30783079

pcsx2/GS/Renderers/DX12/GSDevice12.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4371,7 +4371,8 @@ void GSDevice12::RenderHW(GSHWDrawConfig& config)
43714371

43724372
GSTexture12* draw_ds_as_rt = static_cast<GSTexture12*>(m_ds_as_rt);
43734373

4374-
const bool feedback_rt = draw_rt && (config.require_one_barrier || (config.require_full_barrier && m_features.texture_barrier) || (config.tex && config.tex == config.rt));
4374+
const bool feedback_rt = draw_rt && (((config.require_one_barrier || (config.require_full_barrier && m_features.texture_barrier)) && config.ps.IsFeedbackLoopRT()) ||
4375+
(config.tex && config.tex == config.rt));
43754376
const bool feedback_depth = draw_ds_as_rt != nullptr;
43764377

43774378
if (feedback_rt && !m_features.texture_barrier)

pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2931,9 +2931,12 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config)
29312931
glTextureBarrier();
29322932
}
29332933

2934-
if (draw_rt && (config.require_one_barrier || (config.require_full_barrier && m_features.multidraw_fb_copy) || (config.tex && config.tex == config.rt)) &&
2935-
!m_features.texture_barrier)
2934+
const bool tex_is_fb = config.tex && config.tex == draw_rt;
2935+
if (draw_rt && (((config.require_one_barrier || (config.require_full_barrier && m_features.multidraw_fb_copy)) && config.ps.IsFeedbackLoopRT()) ||
2936+
tex_is_fb) && !m_features.texture_barrier)
29362937
{
2938+
config.require_one_barrier |= (tex_is_fb && !config.require_full_barrier);
2939+
29372940
// Requires a copy of the RT.
29382941
draw_rt_clone = CreateTexture(rtsize.x, rtsize.y, 1, draw_rt->GetFormat(), true);
29392942
if (!draw_rt_clone)
@@ -3006,9 +3009,10 @@ void GSDeviceOGL::RenderHW(GSHWDrawConfig& config)
30063009
{
30073010
OMSetBlendState();
30083011
}
3012+
const bool one_barrier = config.alpha_second_pass.require_one_barrier && m_features.feedback_loops();
30093013
SetupOM(config.alpha_second_pass.depth);
30103014
SendHWDraw(config, draw_rt_clone, draw_rt, draw_ds_clone, draw_ds,
3011-
m_features.texture_barrier ? config.alpha_second_pass.require_one_barrier : false, config.alpha_second_pass.require_full_barrier);
3015+
one_barrier, config.alpha_second_pass.require_full_barrier);
30123016
}
30133017

30143018
if (colclip_rt)

pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5992,7 +5992,7 @@ void GSDeviceVK::RenderHW(GSHWDrawConfig& config)
59925992
pipe.feedback_loop_flags |= m_current_framebuffer_feedback_loop;
59935993
}
59945994

5995-
if (draw_rt && (config.require_one_barrier || (config.tex && config.tex == config.rt)) && !m_features.texture_barrier)
5995+
if (draw_rt && ((config.require_one_barrier && config.ps.IsFeedbackLoopRT()) || (config.tex && config.tex == config.rt)) && !m_features.texture_barrier)
59965996
{
59975997
// Requires a copy of the RT.
59985998
draw_rt_clone = static_cast<GSTextureVK*>(CreateTexture(rtsize.x, rtsize.y, 1, draw_rt->GetFormat(), true));

0 commit comments

Comments
 (0)