diff --git a/OptiScaler/shaders/Shader_Dx12.cpp b/OptiScaler/shaders/Shader_Dx12.cpp index 10322d21..6977c76f 100644 --- a/OptiScaler/shaders/Shader_Dx12.cpp +++ b/OptiScaler/shaders/Shader_Dx12.cpp @@ -153,3 +153,315 @@ void Shader_Dx12::SetBufferState(ID3D12GraphicsCommandList* InCommandList, D3D12 *BufferState = InState; } + +// From DirectXHelpers.cpp licensed under MIT +void Shader_Dx12::CreateShaderResourceView(ID3D12Device* device, ID3D12Resource* tex, + D3D12_CPU_DESCRIPTOR_HANDLE srvDescriptor, bool isCubeMap) +{ + if (!device || !tex) + throw std::invalid_argument("Direct3D device and resource must be valid"); + +#if defined(_MSC_VER) || !defined(_WIN32) + const auto desc = tex->GetDesc(); +#else + D3D12_RESOURCE_DESC tmpDesc; + const auto& desc = *tex->GetDesc(&tmpDesc); +#endif + + if ((desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) != 0) + { + LOG_ERROR("ERROR: CreateShaderResourceView called on a resource created without support for SRV"); + throw std::runtime_error("Can't have D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE"); + } + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = TranslateTypelessFormats(desc.Format); + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + + const UINT mipLevels = (desc.MipLevels) ? static_cast(desc.MipLevels) : static_cast(-1); + + switch (desc.Dimension) + { + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: + if (desc.DepthOrArraySize > 1) + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1DARRAY; + srvDesc.Texture1DArray.MipLevels = mipLevels; + srvDesc.Texture1DArray.ArraySize = static_cast(desc.DepthOrArraySize); + } + else + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D; + srvDesc.Texture1D.MipLevels = mipLevels; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: + if (isCubeMap) + { + if (desc.DepthOrArraySize > 6) + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBEARRAY; + srvDesc.TextureCubeArray.MipLevels = mipLevels; + srvDesc.TextureCubeArray.NumCubes = static_cast(desc.DepthOrArraySize / 6); + } + else + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURECUBE; + srvDesc.TextureCube.MipLevels = mipLevels; + } + } + else if (desc.DepthOrArraySize > 1) + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2DARRAY; + srvDesc.Texture2DArray.MipLevels = mipLevels; + srvDesc.Texture2DArray.ArraySize = static_cast(desc.DepthOrArraySize); + } + else + { + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = mipLevels; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; + srvDesc.Texture3D.MipLevels = mipLevels; + break; + + case D3D12_RESOURCE_DIMENSION_BUFFER: + LOG_ERROR("ERROR: CreateShaderResourceView cannot be used with DIMENSION_BUFFER. Use " + "CreateBufferShaderResourceView."); + throw std::invalid_argument("buffer resources not supported"); + + case D3D12_RESOURCE_DIMENSION_UNKNOWN: + default: + LOG_ERROR("ERROR: CreateShaderResourceView cannot be used with DIMENSION_UNKNOWN ({}).", + (uint32_t) desc.Dimension); + throw std::invalid_argument("unknown resource dimension"); + } + + device->CreateShaderResourceView(tex, &srvDesc, srvDescriptor); +} + +void Shader_Dx12::CreateUnorderedAccessView(ID3D12Device* device, ID3D12Resource* tex, + D3D12_CPU_DESCRIPTOR_HANDLE uavDescriptor, uint32_t mipLevel) +{ + if (!device || !tex) + throw std::invalid_argument("Direct3D device and resource must be valid"); + +#if defined(_MSC_VER) || !defined(_WIN32) + const auto desc = tex->GetDesc(); +#else + D3D12_RESOURCE_DESC tmpDesc; + const auto& desc = *tex->GetDesc(&tmpDesc); +#endif + + if ((desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) == 0) + { + LOG_ERROR("ERROR: CreateUnorderedResourceView called on a resource created without support for UAV."); + throw std::runtime_error("Requires D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS"); + } + + D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; + uavDesc.Format = TranslateTypelessFormats(desc.Format); + + switch (desc.Dimension) + { + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: + if (desc.DepthOrArraySize > 1) + { + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1DARRAY; + uavDesc.Texture1DArray.MipSlice = mipLevel; + uavDesc.Texture1DArray.FirstArraySlice = 0; + uavDesc.Texture1DArray.ArraySize = desc.DepthOrArraySize; + } + else + { + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D; + uavDesc.Texture1D.MipSlice = mipLevel; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: + if (desc.DepthOrArraySize > 1) + { + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2DARRAY; + uavDesc.Texture2DArray.MipSlice = mipLevel; + uavDesc.Texture2DArray.ArraySize = desc.DepthOrArraySize; + } + else + { + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; + uavDesc.Texture2D.MipSlice = mipLevel; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D; + uavDesc.Texture3D.MipSlice = mipLevel; + uavDesc.Texture3D.WSize = desc.DepthOrArraySize; + break; + + case D3D12_RESOURCE_DIMENSION_BUFFER: + LOG_ERROR("ERROR: CreateUnorderedResourceView cannot be used with DIMENSION_BUFFER. Use " + "CreateBufferUnorderedAccessView."); + throw std::invalid_argument("buffer resources not supported"); + + case D3D12_RESOURCE_DIMENSION_UNKNOWN: + default: + LOG_ERROR("ERROR: CreateUnorderedResourceView cannot be used with DIMENSION_UNKNOWN ({}).", + (uint32_t) desc.Dimension); + throw std::invalid_argument("unknown resource dimension"); + } + device->CreateUnorderedAccessView(tex, nullptr, &uavDesc, uavDescriptor); +} + +void Shader_Dx12::CreateRenderTargetView(ID3D12Device* device, ID3D12Resource* tex, + D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor, uint32_t mipLevel) +{ + if (!device || !tex) + throw std::invalid_argument("Direct3D device and resource must be valid"); + +#if defined(_MSC_VER) || !defined(_WIN32) + const auto desc = tex->GetDesc(); +#else + D3D12_RESOURCE_DESC tmpDesc; + const auto& desc = *tex->GetDesc(&tmpDesc); +#endif + + if ((desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET) == 0) + { + LOG_ERROR("ERROR: CreateRenderTargetView called on a resource created without support for RTV."); + throw std::runtime_error("Requires D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET"); + } + + D3D12_RENDER_TARGET_VIEW_DESC rtvDesc = {}; + rtvDesc.Format = TranslateTypelessFormats(desc.Format); + + switch (desc.Dimension) + { + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: + if (desc.DepthOrArraySize > 1) + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1DARRAY; + rtvDesc.Texture1DArray.MipSlice = mipLevel; + rtvDesc.Texture1DArray.FirstArraySlice = 0; + rtvDesc.Texture1DArray.ArraySize = desc.DepthOrArraySize; + } + else + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE1D; + rtvDesc.Texture1D.MipSlice = mipLevel; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: + if (desc.SampleDesc.Count > 1) + { + if (desc.DepthOrArraySize > 1) + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMSARRAY; + rtvDesc.Texture2DMSArray.ArraySize = desc.DepthOrArraySize; + } + else + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DMS; + } + } + else if (desc.DepthOrArraySize > 1) + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2DARRAY; + rtvDesc.Texture2DArray.MipSlice = mipLevel; + rtvDesc.Texture2DArray.ArraySize = desc.DepthOrArraySize; + } + else + { + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; + rtvDesc.Texture2D.MipSlice = mipLevel; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: + rtvDesc.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE3D; + rtvDesc.Texture3D.MipSlice = mipLevel; + rtvDesc.Texture3D.WSize = desc.DepthOrArraySize; + break; + + case D3D12_RESOURCE_DIMENSION_BUFFER: + LOG_ERROR("ERROR: CreateRenderTargetView cannot be used with DIMENSION_BUFFER."); + throw std::invalid_argument("buffer resources not supported"); + + case D3D12_RESOURCE_DIMENSION_UNKNOWN: + default: + LOG_ERROR("ERROR: CreateRenderTargetView cannot be used with DIMENSION_UNKNOWN ({}).", + (uint32_t) desc.Dimension); + throw std::invalid_argument("unknown resource dimension"); + } + device->CreateRenderTargetView(tex, &rtvDesc, rtvDescriptor); +} + +void Shader_Dx12::CreateBufferShaderResourceView(ID3D12Device* device, ID3D12Resource* buffer, + D3D12_CPU_DESCRIPTOR_HANDLE srvDescriptor, uint32_t stride) +{ + if (!device || !buffer) + throw std::invalid_argument("Direct3D device and resource must be valid"); + +#if defined(_MSC_VER) || !defined(_WIN32) + const auto desc = buffer->GetDesc(); +#else + D3D12_RESOURCE_DESC tmpDesc; + const auto& desc = *buffer->GetDesc(&tmpDesc); +#endif + + if (desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || + (desc.Flags & D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE) != 0) + { + LOG_ERROR("ERROR: CreateBufferShaderResourceView called on an unsupported resource."); + throw std::runtime_error("invalid buffer resource"); + } + + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = DXGI_FORMAT_UNKNOWN; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + srvDesc.Buffer.FirstElement = 0; + srvDesc.Buffer.NumElements = (stride > 0) ? static_cast(desc.Width / stride) : static_cast(desc.Width); + srvDesc.Buffer.StructureByteStride = stride; + + device->CreateShaderResourceView(buffer, &srvDesc, srvDescriptor); +} + +void Shader_Dx12::CreateBufferUnorderedAccessView(ID3D12Device* device, ID3D12Resource* buffer, + D3D12_CPU_DESCRIPTOR_HANDLE uavDescriptor, uint32_t stride, + D3D12_BUFFER_UAV_FLAGS flag, uint32_t counterOffset, + ID3D12Resource* counterResource) +{ + if (!device || !buffer) + throw std::invalid_argument("Direct3D device and resource must be valid"); + +#if defined(_MSC_VER) || !defined(_WIN32) + const auto desc = buffer->GetDesc(); +#else + D3D12_RESOURCE_DESC tmpDesc; + const auto& desc = *buffer->GetDesc(&tmpDesc); +#endif + + if (desc.Dimension != D3D12_RESOURCE_DIMENSION_BUFFER || + (desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) == 0) + { + LOG_ERROR("ERROR: CreateBufferUnorderedAccessView called on an unsupported resource."); + throw std::runtime_error("invalid buffer resource"); + } + + D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; + uavDesc.Format = DXGI_FORMAT_UNKNOWN; + uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; + uavDesc.Buffer.FirstElement = 0; + uavDesc.Buffer.NumElements = (stride > 0) ? static_cast(desc.Width / stride) : static_cast(desc.Width); + uavDesc.Buffer.StructureByteStride = stride; + uavDesc.Buffer.CounterOffsetInBytes = counterOffset; + uavDesc.Buffer.Flags = flag; + + device->CreateUnorderedAccessView(buffer, counterResource, &uavDesc, uavDescriptor); +} diff --git a/OptiScaler/shaders/Shader_Dx12.h b/OptiScaler/shaders/Shader_Dx12.h index 73a7a86e..9c7323e2 100644 --- a/OptiScaler/shaders/Shader_Dx12.h +++ b/OptiScaler/shaders/Shader_Dx12.h @@ -25,6 +25,23 @@ class Shader_Dx12 static void SetBufferState(ID3D12GraphicsCommandList* InCommandList, D3D12_RESOURCE_STATES InState, ID3D12Resource* Buffer, D3D12_RESOURCE_STATES* BufferState); + void CreateShaderResourceView(ID3D12Device* device, ID3D12Resource* tex, D3D12_CPU_DESCRIPTOR_HANDLE srvDescriptor, + bool isCubeMap); + + void CreateUnorderedAccessView(ID3D12Device* device, ID3D12Resource* tex, D3D12_CPU_DESCRIPTOR_HANDLE uavDescriptor, + uint32_t mipLevel); + + void CreateRenderTargetView(ID3D12Device* device, ID3D12Resource* tex, D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor, + uint32_t mipLevel); + + void CreateBufferShaderResourceView(ID3D12Device* device, ID3D12Resource* buffer, + D3D12_CPU_DESCRIPTOR_HANDLE srvDescriptor, uint32_t stride); + + void CreateBufferUnorderedAccessView(ID3D12Device* device, ID3D12Resource* buffer, + D3D12_CPU_DESCRIPTOR_HANDLE uavDescriptor, uint32_t stride, + D3D12_BUFFER_UAV_FLAGS flag, uint32_t counterOffset, + ID3D12Resource* counterResource); + public: bool IsInit() const { return _init; } diff --git a/OptiScaler/shaders/bias/Bias_Dx12.cpp b/OptiScaler/shaders/bias/Bias_Dx12.cpp index 4e5fb770..e6a13510 100644 --- a/OptiScaler/shaders/bias/Bias_Dx12.cpp +++ b/OptiScaler/shaders/bias/Bias_Dx12.cpp @@ -39,25 +39,8 @@ bool Bias_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCm _counter = _counter % BIAS_NUM_OF_HEAPS; FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; - auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(outDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); InternalConstants constants {}; @@ -109,6 +92,7 @@ bool Bias_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCm UINT dispatchWidth = 0; UINT dispatchHeight = 0; + auto inDesc = InResource->GetDesc(); dispatchWidth = static_cast((inDesc.Width + InNumThreadsX - 1) / InNumThreadsX); dispatchHeight = (inDesc.Height + InNumThreadsY - 1) / InNumThreadsY; diff --git a/OptiScaler/shaders/depth_invert/DI_Dx12.cpp b/OptiScaler/shaders/depth_invert/DI_Dx12.cpp index c3302721..05fef916 100644 --- a/OptiScaler/shaders/depth_invert/DI_Dx12.cpp +++ b/OptiScaler/shaders/depth_invert/DI_Dx12.cpp @@ -44,23 +44,8 @@ bool DI_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL _counter = _counter % DI_NUM_OF_HEAPS; FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; - auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = DXGI_FORMAT_R32_FLOAT; - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); ID3D12DescriptorHeap* heaps[] = { currentHeap.GetHeapCSU() }; InCmdList->SetDescriptorHeaps(_countof(heaps), heaps); @@ -73,6 +58,7 @@ bool DI_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL UINT dispatchWidth = 0; UINT dispatchHeight = 0; + auto outDesc = OutResource->GetDesc(); dispatchWidth = static_cast((outDesc.Width + InNumThreadsX - 1) / InNumThreadsX); dispatchHeight = (outDesc.Height + InNumThreadsY - 1) / InNumThreadsY; diff --git a/OptiScaler/shaders/depth_scale/DS_Dx12.cpp b/OptiScaler/shaders/depth_scale/DS_Dx12.cpp index b32c3f94..75a61720 100644 --- a/OptiScaler/shaders/depth_scale/DS_Dx12.cpp +++ b/OptiScaler/shaders/depth_scale/DS_Dx12.cpp @@ -47,23 +47,8 @@ bool DS_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL _counter = _counter % DS_NUM_OF_HEAPS; FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; - auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = DXGI_FORMAT_R32_FLOAT; - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); DSConstants constants {}; diff --git a/OptiScaler/shaders/format_transfer/FT_Dx12.cpp b/OptiScaler/shaders/format_transfer/FT_Dx12.cpp index 71e53995..32734bcc 100644 --- a/OptiScaler/shaders/format_transfer/FT_Dx12.cpp +++ b/OptiScaler/shaders/format_transfer/FT_Dx12.cpp @@ -75,25 +75,8 @@ bool FT_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL _counter = _counter % FT_NUM_OF_HEAPS; FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; - auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - srvDesc.Texture2D.MostDetailedMip = 0; - srvDesc.Texture2D.ResourceMinLODClamp = 0.0f; - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(outDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); ID3D12DescriptorHeap* heaps[] = { currentHeap.GetHeapCSU() }; InCmdList->SetDescriptorHeaps(_countof(heaps), heaps); @@ -106,6 +89,7 @@ bool FT_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL UINT dispatchWidth = 0; UINT dispatchHeight = 0; + auto inDesc = InResource->GetDesc(); dispatchWidth = static_cast((inDesc.Width + InNumThreadsX - 1) / InNumThreadsX); dispatchHeight = (inDesc.Height + InNumThreadsY - 1) / InNumThreadsY; diff --git a/OptiScaler/shaders/hud_copy/HudCopy_Dx12.cpp b/OptiScaler/shaders/hud_copy/HudCopy_Dx12.cpp index 78a28ee1..70645d0e 100644 --- a/OptiScaler/shaders/hud_copy/HudCopy_Dx12.cpp +++ b/OptiScaler/shaders/hud_copy/HudCopy_Dx12.cpp @@ -61,28 +61,10 @@ bool HudCopy_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* c ResourceBarrier(cmdList, hudless, hudlessState, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE); - auto presentCopyDesc = _buffer->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc1 = {}; - srvDesc1.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc1.Format = Shader_Dx12::TranslateTypelessFormats(hudlessDesc.Format); - srvDesc1.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc1.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(hudless, &srvDesc1, currentHeap.GetSrvCPU(0)); - - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc2 = {}; - srvDesc2.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc2.Format = Shader_Dx12::TranslateTypelessFormats(presentDesc.Format); - srvDesc2.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc2.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(present, &srvDesc2, currentHeap.GetSrvCPU(1)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(presentCopyDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - InDevice->CreateUnorderedAccessView(_buffer, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + // Create views + CreateShaderResourceView(InDevice, hudless, currentHeap.GetSrvCPU(0), false); + CreateShaderResourceView(InDevice, present, currentHeap.GetSrvCPU(1), false); + CreateUnorderedAccessView(InDevice, _buffer, currentHeap.GetUavCPU(0), 0); InternalCompareParams constants {}; constants.DiffThreshold = hudDetectionThreshold; diff --git a/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp b/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp index b62551ed..f1ee178c 100644 --- a/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp +++ b/OptiScaler/shaders/hudless_compare/HC_Dx12.cpp @@ -260,30 +260,9 @@ bool HC_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; // Create views - { - D3D12_SHADER_RESOURCE_VIEW_DESC srv {}; - srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srv.Texture2D.MipLevels = 1; - srv.Format = Shader_Dx12::TranslateTypelessFormats(hudlessDesc.Format); - _device->CreateShaderResourceView(hudless, &srv, currentHeap.GetSrvCPU(0)); - } - - { - D3D12_SHADER_RESOURCE_VIEW_DESC srv {}; - srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srv.Texture2D.MipLevels = 1; - srv.Format = Shader_Dx12::TranslateTypelessFormats(scDesc.BufferDesc.Format); - _device->CreateShaderResourceView(_buffer[_counter], &srv, currentHeap.GetSrvCPU(1)); - } - - { - D3D12_RENDER_TARGET_VIEW_DESC rtv {}; - rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; - rtv.Format = Shader_Dx12::TranslateTypelessFormats(scDesc.BufferDesc.Format); - _device->CreateRenderTargetView(scBuffer, &rtv, currentHeap.GetRtvCPU(0)); - } + CreateShaderResourceView(_device, hudless, currentHeap.GetSrvCPU(0), false); + CreateShaderResourceView(_device, _buffer[_counter], currentHeap.GetSrvCPU(1), false); + CreateRenderTargetView(_device, scBuffer, currentHeap.GetRtvCPU(0), 0); InternalCompareParams constants {}; constants.DiffThreshold = 0.003f; diff --git a/OptiScaler/shaders/output_scaling/OS_Dx12.cpp b/OptiScaler/shaders/output_scaling/OS_Dx12.cpp index 38055f0e..aee62b33 100644 --- a/OptiScaler/shaders/output_scaling/OS_Dx12.cpp +++ b/OptiScaler/shaders/output_scaling/OS_Dx12.cpp @@ -61,25 +61,8 @@ bool OS_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL _counter = _counter % OS_NUM_OF_HEAPS; FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; - auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(outDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); FsrEasuCon(fsr1Constants.const0, fsr1Constants.const1, fsr1Constants.const2, fsr1Constants.const3, State::Instance().currentFeature->TargetWidth(), State::Instance().currentFeature->TargetHeight(), diff --git a/OptiScaler/shaders/rcas/RCAS_Dx12.cpp b/OptiScaler/shaders/rcas/RCAS_Dx12.cpp index 1988204c..5025fb69 100644 --- a/OptiScaler/shaders/rcas/RCAS_Dx12.cpp +++ b/OptiScaler/shaders/rcas/RCAS_Dx12.cpp @@ -191,37 +191,10 @@ bool RCAS_Dx12::DispatchDepthAdaptive(ID3D12Device* InDevice, ID3D12GraphicsComm if (InDepth == nullptr || _pipelineStateDA == nullptr) return false; - auto inDesc = InResource->GetDesc(); - auto mvDesc = InMotionVectors->GetDesc(); - auto depthDesc = InDepth->GetDesc(); - auto outDesc = OutResource->GetDesc(); - - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - D3D12_SHADER_RESOURCE_VIEW_DESC mvSrvDesc = {}; - mvSrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - mvSrvDesc.Format = Shader_Dx12::TranslateTypelessFormats(mvDesc.Format); - mvSrvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - mvSrvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InMotionVectors, &mvSrvDesc, currentHeap.GetSrvCPU(1)); - - D3D12_SHADER_RESOURCE_VIEW_DESC depthSrvDesc = {}; - depthSrvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - depthSrvDesc.Format = Shader_Dx12::TranslateTypelessFormats(depthDesc.Format); - depthSrvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - depthSrvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InDepth, &depthSrvDesc, currentHeap.GetSrvCPU(2)); - - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(outDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateShaderResourceView(InDevice, InMotionVectors, currentHeap.GetSrvCPU(1), false); + CreateShaderResourceView(InDevice, InDepth, currentHeap.GetSrvCPU(2), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); InternalConstantsDA constants {}; FillMotionConstants(constants, InConstants); @@ -261,6 +234,7 @@ bool RCAS_Dx12::DispatchDepthAdaptive(ID3D12Device* InDevice, ID3D12GraphicsComm InCmdList->SetPipelineState(_pipelineStateDA); InCmdList->SetComputeRootDescriptorTable(0, currentHeap.GetTableGPUStart()); + auto inDesc = InResource->GetDesc(); UINT dispatchWidth = static_cast((inDesc.Width + InNumThreadsX - 1) / InNumThreadsX); UINT dispatchHeight = (inDesc.Height + InNumThreadsY - 1) / InNumThreadsY; InCmdList->Dispatch(dispatchWidth, dispatchHeight, 1); diff --git a/OptiScaler/shaders/render_ui/RUI_Dx12.cpp b/OptiScaler/shaders/render_ui/RUI_Dx12.cpp index 10b5053d..7265cc46 100644 --- a/OptiScaler/shaders/render_ui/RUI_Dx12.cpp +++ b/OptiScaler/shaders/render_ui/RUI_Dx12.cpp @@ -275,30 +275,9 @@ bool RUI_Dx12::Dispatch(IDXGISwapChain3* sc, ID3D12GraphicsCommandList* cmdList, FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; // Create views - { - D3D12_SHADER_RESOURCE_VIEW_DESC srv {}; - srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srv.Texture2D.MipLevels = 1; - srv.Format = Shader_Dx12::TranslateTypelessFormats(hudlessDesc.Format); - _device->CreateShaderResourceView(hudless, &srv, currentHeap.GetSrvCPU(0)); - } - - { - D3D12_SHADER_RESOURCE_VIEW_DESC srv {}; - srv.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srv.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srv.Texture2D.MipLevels = 1; - srv.Format = Shader_Dx12::TranslateTypelessFormats(scDesc.BufferDesc.Format); - _device->CreateShaderResourceView(_buffer[_counter], &srv, currentHeap.GetSrvCPU(1)); - } - - { - D3D12_RENDER_TARGET_VIEW_DESC rtv {}; - rtv.ViewDimension = D3D12_RTV_DIMENSION_TEXTURE2D; - rtv.Format = Shader_Dx12::TranslateTypelessFormats(scDesc.BufferDesc.Format); - _device->CreateRenderTargetView(scBuffer, &rtv, currentHeap.GetRtvCPU(0)); - } + CreateShaderResourceView(_device, hudless, currentHeap.GetSrvCPU(0), false); + CreateShaderResourceView(_device, _buffer[_counter], currentHeap.GetSrvCPU(1), false); + CreateRenderTargetView(_device, scBuffer, currentHeap.GetRtvCPU(0), 0); ID3D12DescriptorHeap* heaps[] = { currentHeap.GetHeapCSU() }; cmdList->SetDescriptorHeaps(_countof(heaps), heaps); diff --git a/OptiScaler/shaders/resource_flip/RF_Dx12.cpp b/OptiScaler/shaders/resource_flip/RF_Dx12.cpp index 6c4edfe6..9c006186 100644 --- a/OptiScaler/shaders/resource_flip/RF_Dx12.cpp +++ b/OptiScaler/shaders/resource_flip/RF_Dx12.cpp @@ -21,22 +21,9 @@ bool RF_Dx12::Dispatch(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdL FrameDescriptorHeap& currentHeap = _frameHeaps[_counter]; auto inDesc = InResource->GetDesc(); - auto outDesc = OutResource->GetDesc(); - // Create SRV for Input Texture - D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; - srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srvDesc.Format = Shader_Dx12::TranslateTypelessFormats(inDesc.Format); - srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srvDesc.Texture2D.MipLevels = 1; - InDevice->CreateShaderResourceView(InResource, &srvDesc, currentHeap.GetSrvCPU(0)); - - // Create UAV for Output Texture - D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {}; - uavDesc.Format = Shader_Dx12::TranslateTypelessFormats(outDesc.Format); - uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uavDesc.Texture2D.MipSlice = 0; - InDevice->CreateUnorderedAccessView(OutResource, nullptr, &uavDesc, currentHeap.GetUavCPU(0)); + CreateShaderResourceView(InDevice, InResource, currentHeap.GetSrvCPU(0), false); + CreateUnorderedAccessView(InDevice, OutResource, currentHeap.GetUavCPU(0), 0); RFConstants constants {};