@@ -1073,9 +1073,10 @@ static bool ConvertShaderNotNeeded(ShaderConvert shader)
10731073
10741074 // Init metal stuff
10751075 m_fn_constants = MRCTransfer ([MTLFunctionConstantValues new ]);
1076- setFnConstantB (m_fn_constants, m_features.framebuffer_fetch , GSMTLConstantIndex_FRAMEBUFFER_FETCH);
1077- setFnConstantB (m_fn_constants, m_features.depth_feedback , GSMTLConstantIndex_DEPTH_FEEDBACK);
1078- setFnConstantB (m_fn_constants, m_dev.features .rov_requires_r32 , GSMTLConstantIndex_ROV_NEEDS_R32);
1076+ setFnConstantB (m_fn_constants, m_features.framebuffer_fetch , GSMTLConstantIndex_FRAMEBUFFER_FETCH);
1077+ setFnConstantB (m_fn_constants, m_features.depth_feedback , GSMTLConstantIndex_DEPTH_FEEDBACK);
1078+ setFnConstantB (m_fn_constants, m_dev.features .rov_requires_r32 , GSMTLConstantIndex_ROV_NEEDS_R32);
1079+ setFnConstantB (m_fn_constants, m_dev.features .broken_shader_depth , GSMTLConstantIndex_BROKEN_SHADER_DEPTH);
10791080
10801081 m_draw_sync_fence = MRCTransfer ([m_dev.dev newFence ]);
10811082 [m_draw_sync_fence setLabel: @" Draw Sync Fence" ];
@@ -2350,6 +2351,9 @@ static bool usesStencil(GSHWDrawConfig::DestinationAlphaMode dstalpha)
23502351 if (config.tex && (config.ds == config.tex || config.rt == config.tex ))
23512352 EndRenderPass (); // Barrier
23522353
2354+ if (m_dev.features .broken_shader_depth && (config.depth .ztst >= ZTST_GEQUAL || config.depth .zwe ))
2355+ config.ps .zfloor = true ; // Depth must always go through shader (see tfx vs for comment with details)
2356+
23532357 size_t vertsize = config.nverts * sizeof (*config.verts );
23542358 size_t idxsize = config.vs .UseFixedExpandIndexBuffer () ? 0 : (config.nindices * sizeof (*config.indices ));
23552359 Map allocation = Allocate (m_vertex_upload_buf, vertsize + idxsize);
0 commit comments