diff options
| author | Triang3l <triang3l@yandex.ru> | 2026-01-20 12:53:20 +0300 |
|---|---|---|
| committer | Triang3l <triang3l@yandex.ru> | 2026-01-20 12:53:20 +0300 |
| commit | c7f61342d7061b8264e4b988b8d2e03351b6e088 (patch) | |
| tree | b75d12f441e134b895788c6c5cf8ac4a61378c2b | |
| parent | 0a19234b4e6905f2cd249b4af6172ca4656c92de (diff) | |
[GPU/D3D12] Convert gamma-as-linear red to gamma in transfers to stencil
Co-authored-by: Herman S. <429230+has207@users.noreply.github.com>
| -rw-r--r-- | src/xenia/gpu/d3d12/d3d12_render_target_cache.cc | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc b/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc index b7468e867..557d6624b 100644 --- a/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc +++ b/src/xenia/gpu/d3d12/d3d12_render_target_cache.cc @@ -3621,22 +3621,21 @@ D3D12RenderTargetCache::GetOrCreateTransferPipelines(TransferShaderKey key) { } a.OpMov(dxbc::Dest::O(0), dxbc::Src::R(1)); } else if (mode.output == TransferOutput::kDepth) { + // When need only depth, not stencil, skipping the red component. if (source_color_format == xenos::ColorRenderTargetFormat::k_8_8_8_8_GAMMA) { - for (uint32_t i = 1; i < 3; ++i) { + for (uint32_t i = shader_uses_stencil_reference_output ? 0 : 1; + i < 3; ++i) { DxbcShaderTranslator::PreSaturatedLinearToPWLGamma( a, 1, i, 1, i, 2, 0, 2, 1); } } - // When need only depth, not stencil, skip the red component. - a.OpMAd(dxbc::Dest::R( - 1, osgn_parameter_index_sv_stencil_ref != UINT32_MAX - ? 0b1111 - : 0b1110), - dxbc::Src::R(1), dxbc::Src::LF(255.0f), - dxbc::Src::LF(0.5f)); + a.OpMAd( + dxbc::Dest::R( + 1, shader_uses_stencil_reference_output ? 0b1111 : 0b1110), + dxbc::Src::R(1), dxbc::Src::LF(255.0f), dxbc::Src::LF(0.5f)); a.OpFToU(dxbc::Dest::R(1, 0b1110), dxbc::Src::R(1)); - if (osgn_parameter_index_sv_stencil_ref != UINT32_MAX) { + if (shader_uses_stencil_reference_output) { // Write the red component to the stencil reference. a.OpFToU(dxbc::Dest::OStencilRef(), dxbc::Src::R(1, dxbc::Src::kXXXX)); |
