From 141aae44cdfcfc6e67d0e3d1b435203886351d2b Mon Sep 17 00:00:00 2001 From: Minmin Gong Date: Wed, 12 Feb 2020 14:20:39 -0800 Subject: [PATCH] Fix the sRGB support in D3D12 renderer --- src/renderer_d3d12.cpp | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index fbb4b3533..d490283db 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -934,10 +934,7 @@ namespace bgfx { namespace d3d12 bx::memSet(&m_scd, 0, sizeof(m_scd) ); m_scd.width = _init.resolution.width; m_scd.height = _init.resolution.height; - m_scd.format = (_init.resolution.reset & BGFX_RESET_SRGB_BACKBUFFER) - ? s_textureFormat[_init.resolution.format].m_fmtSrgb - : s_textureFormat[_init.resolution.format].m_fmt - ; + m_scd.format = s_textureFormat[_init.resolution.format].m_fmt; m_scd.stereo = false; updateMsaa(m_scd.format); @@ -2073,11 +2070,32 @@ namespace bgfx { namespace d3d12 , IID_ID3D12Resource , (void**)&m_backBufferColor[ii] ) ); + + D3D12_RENDER_TARGET_VIEW_DESC rtvDesc; + rtvDesc.Format = (m_resolution.reset & BGFX_RESET_SRGB_BACKBUFFER) + ? s_textureFormat[m_resolution.format].m_fmtSrgb + : s_textureFormat[m_resolution.format].m_fmt; + + if (1 < m_backBufferColor[ii]->GetDesc().DepthOrArraySize) + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; + rtvDesc.Texture2DArray.FirstArraySlice = 0; + rtvDesc.Texture2DArray.ArraySize = m_backBufferColor[ii]->GetDesc().DepthOrArraySize; + rtvDesc.Texture2DArray.MipSlice = 0; + rtvDesc.Texture2DArray.PlaneSlice = 0; + } + else + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + rtvDesc.Texture2D.MipSlice = 0; + rtvDesc.Texture2D.PlaneSlice = 0; + } + m_device->CreateRenderTargetView( NULL == m_msaaRt ? m_backBufferColor[ii] : m_msaaRt - , NULL + , &rtvDesc , handle ); @@ -4746,16 +4764,16 @@ namespace bgfx { namespace d3d12 bx::memSet(&m_srvd, 0, sizeof(m_srvd) ); m_srvd.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - m_srvd.Format = s_textureFormat[m_textureFormat].m_fmtSrv; + m_srvd.Format = (m_flags & BGFX_TEXTURE_SRGB) ? s_textureFormat[m_textureFormat].m_fmtSrgb : s_textureFormat[m_textureFormat].m_fmtSrv; + m_uavd.Format = s_textureFormat[m_textureFormat].m_fmtSrv; DXGI_FORMAT format = s_textureFormat[m_textureFormat].m_fmt; if (swizzle) { format = DXGI_FORMAT_R8G8B8A8_UNORM; m_srvd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + m_uavd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; } - m_uavd.Format = m_srvd.Format; - ID3D12Device* device = s_renderD3D12->m_device; ID3D12GraphicsCommandList* commandList = s_renderD3D12->m_commandList;