@@ -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
0 commit comments