From 57e8f05234f2cf8ee29cffd3ab8fe57de38479b8 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Tue, 29 Jan 2019 14:39:04 +0300 Subject: [PATCH] [D3D12] Make RG16/RGBA16 RTVs range switchable --- src/xenia/gpu/d3d12/d3d12_command_processor.cc | 5 +++-- src/xenia/gpu/d3d12/render_target_cache.cc | 8 +++++++- src/xenia/gpu/d3d12/render_target_cache.h | 4 ++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/xenia/gpu/d3d12/d3d12_command_processor.cc b/src/xenia/gpu/d3d12/d3d12_command_processor.cc index 429680790..956e54b7b 100644 --- a/src/xenia/gpu/d3d12/d3d12_command_processor.cc +++ b/src/xenia/gpu/d3d12/d3d12_command_processor.cc @@ -2319,9 +2319,10 @@ void D3D12CommandProcessor::UpdateSystemConstantValues( // -32...32 range and expect shaders to give -32...32 values, but they're // emulated using normalized RG16/RGBA16 when not using the ROV, so the // value returned from the shader needs to be divided by 32 (blending will - // be incorrect in this case, but there's no other way without using ROV). + // be incorrect in this case, but there's no other way without using ROV, + // though there's an option to limit the range to -1...1). // http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf - if (!IsROVUsedForEDRAM()) { + if (!IsROVUsedForEDRAM() && FLAGS_d3d12_16bit_rtv_full_range) { color_exp_bias -= 5; } } diff --git a/src/xenia/gpu/d3d12/render_target_cache.cc b/src/xenia/gpu/d3d12/render_target_cache.cc index 4399116a1..c53cf4271 100644 --- a/src/xenia/gpu/d3d12/render_target_cache.cc +++ b/src/xenia/gpu/d3d12/render_target_cache.cc @@ -25,6 +25,9 @@ #include "xenia/gpu/texture_util.h" #include "xenia/ui/d3d12/d3d12_util.h" +DEFINE_bool(d3d12_16bit_rtv_full_range, true, + "Use full -32...32 range for RG16 and RGBA16 render targets " + "(at the expense of blending correctness) without ROV."); DEFINE_bool(d3d12_resolution_scale_resolve_edge_clamp, true, "When using resolution scale, apply the hack that duplicates the " "right/lower subpixel in the left and top sides of render target " @@ -1171,7 +1174,10 @@ bool RenderTargetCache::ResolveCopy(SharedMemory* shared_memory, // sampling the host render target gives 1/32 of what is actually stored // there on the guest side. // http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf - dest_exp_bias += 5; + if (command_processor_->IsROVUsedForEDRAM() || + FLAGS_d3d12_16bit_rtv_full_range) { + dest_exp_bias += 5; + } } } bool dest_swap = !is_depth && ((dest_info >> 24) & 0x1); diff --git a/src/xenia/gpu/d3d12/render_target_cache.h b/src/xenia/gpu/d3d12/render_target_cache.h index 38bddc32b..f3baf49b3 100644 --- a/src/xenia/gpu/d3d12/render_target_cache.h +++ b/src/xenia/gpu/d3d12/render_target_cache.h @@ -10,6 +10,8 @@ #ifndef XENIA_GPU_D3D12_RENDER_TARGET_CACHE_H_ #define XENIA_GPU_D3D12_RENDER_TARGET_CACHE_H_ +#include + #include #include "xenia/gpu/d3d12/d3d12_shader.h" @@ -20,6 +22,8 @@ #include "xenia/memory.h" #include "xenia/ui/d3d12/d3d12_api.h" +DECLARE_bool(d3d12_16bit_rtv_full_range); + namespace xe { namespace gpu { namespace d3d12 {