colorspacefix for aw2

This commit is contained in:
cdozdil
2024-03-26 01:36:49 +03:00
parent 942a78b932
commit e1e1fc50d6
10 changed files with 594 additions and 25 deletions
+1
View File
@@ -57,6 +57,7 @@ void Config::Reload()
// Color
AutoExposure = readBool("Color", "AutoExposure");
HDR = readBool("Color", "HDR");
ColorSpaceFix = readBool("Color", "ColorSpaceFix");
// MotionVectors
JitterCancellation = readBool("MotionVectors", "JitterCancellation");
+1
View File
@@ -23,6 +23,7 @@ public:
// Color
std::optional<bool> AutoExposure;
std::optional<bool> ColorSpaceFix;
std::optional<bool> HDR;
// Motion
+3 -3
View File
@@ -82,7 +82,7 @@
<IncludePath>$(SolutionDir)external\vulkan\include;$(SolutionDir)external\nvngx_dlss_sdk;$(SolutionDir)external\xess\inc\xess;$(SolutionDir)external\simpleini;$(SolutionDir)external\unordered_dense\include;$(SolutionDir)external\spdlog\include;$(IncludePath)</IncludePath>
<LibraryPath>$(SolutionDir)CyberXess\cas\lib;$(SolutionDir)CyberXess\fsr2\lib;$(SolutionDir)CyberXess\fsr2_212\lib;$(SolutionDir)CyberXess\vulkan;$(SolutionDir)external\xess\lib;$(LibraryPath)</LibraryPath>
<TargetName>nvngx</TargetName>
<OutDir>E:\Games\Deep Rock Galactic\FSD\Binaries\Win64\</OutDir>
<OutDir>D:\Games\Stranger of Paradise - Final Fantasy Origin\</OutDir>
<IntDir>.\x64\Debug</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -142,7 +142,7 @@
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalDependencies>dxgi.lib;d3d11.lib;d3d12.lib;vulkan-1.lib;dxguid.lib;libxess.lib;ffx_fsr2_api_x64d.lib;ffx_fsr2_api_dx11_x64d.lib;ffx_fsr2_api_dx12_x64d.lib;ffx_fsr2_api_vk_x64d.lib;ffx_cas_backend_dx12_x64d.lib;ffx_cas_x64d.lib;ffx_fsr2_212_api_dx12_x64d.lib;ffx_fsr2_212_api_vk_x64d.lib;ffx_fsr2_212_api_x64d.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>dxgi.lib;d3d11.lib;d3d12.lib;vulkan-1.lib;dxguid.lib;libxess.lib;ffx_fsr2_api_x64d.lib;ffx_fsr2_api_dx11_x64d.lib;ffx_fsr2_api_dx12_x64d.lib;ffx_fsr2_api_vk_x64d.lib;ffx_cas_backend_dx12_x64d.lib;ffx_cas_x64d.lib;ffx_fsr2_212_api_dx12_x64d.lib;ffx_fsr2_212_api_vk_x64d.lib;ffx_fsr2_212_api_x64d.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -164,7 +164,7 @@
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableUAC>false</EnableUAC>
<AdditionalDependencies>dxgi.lib;d3d11.lib;d3d12.lib;vulkan-1.lib;dxguid.lib;libxess.lib;ffx_fsr2_api_x64.lib;ffx_fsr2_api_dx11_x64.lib;ffx_fsr2_api_dx12_x64.lib;ffx_fsr2_api_vk_x64.lib;ffx_cas_backend_dx12_x64.lib;ffx_cas_x64.lib;ffx_fsr2_212_api_dx12_x64.lib;ffx_fsr2_212_api_vk_x64.lib;ffx_fsr2_212_api_x64.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>dxgi.lib;d3d11.lib;d3d12.lib;vulkan-1.lib;dxguid.lib;libxess.lib;ffx_fsr2_api_x64.lib;ffx_fsr2_api_dx11_x64.lib;ffx_fsr2_api_dx12_x64.lib;ffx_fsr2_api_vk_x64.lib;ffx_cas_backend_dx12_x64.lib;ffx_cas_x64.lib;ffx_fsr2_212_api_dx12_x64.lib;ffx_fsr2_212_api_vk_x64.lib;ffx_fsr2_212_api_x64.lib;d3dcompiler.lib;%(AdditionalDependencies)</AdditionalDependencies>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link>
<PostBuildEvent>
+10
View File
@@ -12,6 +12,16 @@ do { \
} \
} while((void)0, 0);
void IFeature_Dx11wDx12::ResourceBarrier(ID3D12GraphicsCommandList * commandList, ID3D12Resource * resource, D3D12_RESOURCE_STATES beforeState, D3D12_RESOURCE_STATES afterState)
{
D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Transition.pResource = resource;
barrier.Transition.StateBefore = beforeState;
barrier.Transition.StateAfter = afterState;
barrier.Transition.Subresource = 0;
commandList->ResourceBarrier(1, &barrier);
}
bool IFeature_Dx11wDx12::CopyTextureFrom11To12(ID3D11Resource* InResource, D3D11_TEXTURE2D_RESOURCE_C* OutResource, bool InCopy)
{
ID3D11Texture2D* originalTexture = nullptr;
+1
View File
@@ -58,6 +58,7 @@ protected:
HRESULT CreateDx12Device(D3D_FEATURE_LEVEL InFeatureLevel);
bool ProcessDx11Textures(const NVSDK_NGX_Parameter* InParameters);
bool CopyBackOutput();
void ResourceBarrier(ID3D12GraphicsCommandList* InCommandList, ID3D12Resource* InResource, D3D12_RESOURCE_STATES InBeforeState, D3D12_RESOURCE_STATES InAfterState);
public:
virtual bool Init(ID3D11Device* InDevice, ID3D11DeviceContext* InContext, const NVSDK_NGX_Parameter* InParameters) = 0;
+437 -1
View File
@@ -1,9 +1,46 @@
#pragma once
#include "../../pch.h"
#include "../../Config.h"
#include "../../imgui/d3dx12.h"
#include "XeSSFeature.h"
#include <d3dcompiler.h>
struct Constants
{
float Multiplier;
};
// pixel.rgb = pow(abs(pixel.rgb) * 4.0, 2.4) * sign(pixel.rgb);
const std::string _recEncodeShaderCode = R"(
Texture2D<float4> InputTexture : register(t0);
RWTexture2D<float4> OutputTexture : register(u0);
// Companding shader
[numthreads(16,16,1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
float4 pixel = InputTexture[DTid.xy];
pixel.rgb *= 10.0;
OutputTexture[DTid.xy] = pixel;
})";
//
// pixel.rgb = pow(abs(pixel.rgb), 0.4166666666666667) * sign(pixel.rgb) * 0.25;
const std::string _recDecodeShaderCode = R"(
Texture2D<float4> InputTexture : register(t0);
RWTexture2D<float4> OutputTexture : register(u0);
// Inverse companding shader
[numthreads(16,16,1)]
void main(uint3 DTid : SV_DispatchThreadID)
{
float4 pixel = InputTexture[DTid.xy];
pixel.rgb *= 0.1;
OutputTexture[DTid.xy] = pixel;
})";
inline static std::string ResultToString(FfxCas::FfxErrorCode result)
{
switch (result)
@@ -193,6 +230,52 @@ inline void XeSSLogCallback(const char* Message, xess_logging_level_t Level)
spdlog::log((spdlog::level::level_enum)((int)Level + 1), "FeatureContext::LogCallback XeSS Runtime ({0})", Message);
}
static ID3DBlob* CompileShader(const char* shaderCode, const char* entryPoint, const char* target)
{
ID3DBlob* shaderBlob = nullptr;
ID3DBlob* errorBlob = nullptr;
HRESULT hr = D3DCompile(shaderCode, strlen(shaderCode), nullptr, nullptr, nullptr, entryPoint, target, 0, 0, &shaderBlob, &errorBlob);
if (FAILED(hr))
{
if (errorBlob)
{
OutputDebugStringA((char*)errorBlob->GetBufferPointer());
errorBlob->Release();
}
if (shaderBlob)
shaderBlob->Release();
return nullptr;
}
if (errorBlob)
errorBlob->Release();
return shaderBlob;
}
static bool CreateComputeShader(ID3D12Device* device, ID3D12RootSignature* rootSignature, ID3D12PipelineState** pipelineState, ID3DBlob* shaderBlob)
{
D3D12_COMPUTE_PIPELINE_STATE_DESC psoDesc = {};
psoDesc.pRootSignature = rootSignature;
psoDesc.CS = CD3DX12_SHADER_BYTECODE(const_cast<void*>(shaderBlob->GetBufferPointer()), shaderBlob->GetBufferSize());
//psoDesc.CS = { reinterpret_cast<UINT8*>(shaderBlob->GetBufferPointer()), shaderBlob->GetBufferSize() };
psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
HRESULT hr = device->CreateComputePipelineState(&psoDesc, IID_PPV_ARGS(pipelineState));
if (FAILED(hr))
{
// Handle error
return false;
}
return true;
}
bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters)
{
spdlog::debug("XeSSFeature::InitXeSS!");
@@ -369,6 +452,8 @@ bool XeSSFeature::InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InPa
CasInit();
CreateCasContext(device);
RecInit(device);
SetInit(true);
return true;
@@ -502,6 +587,8 @@ bool XeSSFeature::CreateCasBufferResource(ID3D12Resource* source, ID3D12Device*
if (casBuffer != nullptr)
casBuffer->Release();
texDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
hr = device->CreateCommittedResource(&heapProperties, D3D12_HEAP_FLAG_NONE, &texDesc, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, nullptr, IID_PPV_ARGS(&casBuffer));
if (hr != S_OK)
@@ -541,7 +628,7 @@ bool XeSSFeature::CasDispatch(ID3D12CommandList* commandList, const NVSDK_NGX_Pa
dispatchParameters.sharpness = casSharpness;
dispatchParameters.color = FfxCas::ffxGetResourceDX12Cas(input, GetFfxResourceDescriptionDX12(input), nullptr, FfxCas::FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchParameters.output = FfxCas::ffxGetResourceDX12Cas(output, GetFfxResourceDescriptionDX12(output), nullptr, FfxCas::FFX_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchParameters.output = FfxCas::ffxGetResourceDX12Cas(output, GetFfxResourceDescriptionDX12(output), nullptr, FfxCas::FFX_RESOURCE_STATE_UNORDERED_ACCESS);
if (auto errorCode = FfxCas::ffxCasContextDispatch(&casContext, &dispatchParameters); errorCode != FfxCas::FFX_OK)
{
@@ -549,5 +636,354 @@ bool XeSSFeature::CasDispatch(ID3D12CommandList* commandList, const NVSDK_NGX_Pa
return false;
}
return true;
}
bool XeSSFeature::RecInit(ID3D12Device* InDevice)
{
// Describe and create the root signature
// ---------------------------------------------------
D3D12_DESCRIPTOR_RANGE descriptorRange[2];
// SRV Range (Input Texture)
descriptorRange[0].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV;
descriptorRange[0].NumDescriptors = 1;
descriptorRange[0].BaseShaderRegister = 0; // Assuming t0 register in HLSL for SRV
descriptorRange[0].RegisterSpace = 0;
descriptorRange[0].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
// UAV Range (Output Texture)
descriptorRange[1].RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_UAV;
descriptorRange[1].NumDescriptors = 1;
descriptorRange[1].BaseShaderRegister = 0; // Assuming u0 register in HLSL for UAV
descriptorRange[1].RegisterSpace = 0;
descriptorRange[1].OffsetInDescriptorsFromTableStart = D3D12_DESCRIPTOR_RANGE_OFFSET_APPEND;
// Define the root parameter (descriptor table)
// ---------------------------------------------------
D3D12_ROOT_PARAMETER rootParameters[2];
// Root Parameter for SRV
rootParameters[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[0].DescriptorTable.NumDescriptorRanges = 1; // One range (SRV)
rootParameters[0].DescriptorTable.pDescriptorRanges = &descriptorRange[0]; // Point to the SRV range
rootParameters[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
// Root Parameter for UAV
rootParameters[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE;
rootParameters[1].DescriptorTable.NumDescriptorRanges = 1; // One range (UAV)
rootParameters[1].DescriptorTable.pDescriptorRanges = &descriptorRange[1]; // Point to the UAV range
rootParameters[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
// A root signature is an array of root parameters
// ---------------------------------------------------
D3D12_ROOT_SIGNATURE_DESC rootSigDesc;
rootSigDesc.NumParameters = 2; // Two root parameters
rootSigDesc.pParameters = rootParameters;
rootSigDesc.NumStaticSamplers = 0;
rootSigDesc.pStaticSamplers = nullptr;
rootSigDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;
ID3DBlob* errorBlob;
ID3DBlob* signatureBlob;
do
{
auto hr = D3D12SerializeRootSignature(&rootSigDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signatureBlob, &errorBlob);
if (FAILED(hr))
{
break;
}
hr = InDevice->CreateRootSignature(0, signatureBlob->GetBufferPointer(), signatureBlob->GetBufferSize(), IID_PPV_ARGS(&_recRootSignatureDecode));
if (FAILED(hr))
{
break;
}
} while (false);
if (errorBlob != nullptr)
{
errorBlob->Release();
errorBlob = nullptr;
}
if (signatureBlob != nullptr)
{
signatureBlob->Release();
signatureBlob = nullptr;
}
if (_recRootSignatureDecode == nullptr)
return false;
ID3DBlob* errorBlob2;
ID3DBlob* signatureBlob2;
do
{
auto hr = D3D12SerializeRootSignature(&rootSigDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signatureBlob2, &errorBlob2);
if (FAILED(hr))
{
break;
}
hr = InDevice->CreateRootSignature(0, signatureBlob2->GetBufferPointer(), signatureBlob2->GetBufferSize(), IID_PPV_ARGS(&_recRootSignatureEncode));
if (FAILED(hr))
{
break;
}
} while (false);
if (errorBlob2 != nullptr)
{
errorBlob2->Release();
errorBlob2 = nullptr;
}
if (signatureBlob2 != nullptr)
{
signatureBlob2->Release();
signatureBlob2 = nullptr;
}
if (_recRootSignatureEncode == nullptr)
return false;
// Compile shader blobs
auto _recEncodeShader = CompileShader(_recEncodeShaderCode.c_str(), "main", "cs_5_0");
if (_recEncodeShader == nullptr)
{
return false;
}
auto _recDecodeShader = CompileShader(_recDecodeShaderCode.c_str(), "main", "cs_5_0");
if (_recDecodeShader == nullptr)
{
return false;
}
do
{
// create pso objects
if (!CreateComputeShader(InDevice, _recRootSignatureEncode, &_recPSOEncode, _recEncodeShader))
{
break;
}
if (!CreateComputeShader(InDevice, _recRootSignatureDecode, &_recPSODecode, _recDecodeShader))
{
break;
}
} while (false);
if (_recEncodeShader != nullptr)
{
_recEncodeShader->Release();
_recEncodeShader = nullptr;
}
if (_recDecodeShader != nullptr)
{
_recDecodeShader->Release();
_recDecodeShader = nullptr;
}
_recInit = _recPSOEncode != nullptr && _recPSODecode != nullptr;
return _recInit;
}
bool XeSSFeature::RecDecode(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdList, ID3D12Resource* input, ID3D12Resource* output)
{
if (!_recInit)
return false;
ID3D12DescriptorHeap* srvHeap;
D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};
heapDesc.NumDescriptors = 2; // One for SRV and one for UAV
heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
auto hr = InDevice->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&srvHeap));
if (FAILED(hr))
{
return false;
}
auto srvHandle = srvHeap->GetCPUDescriptorHandleForHeapStart();
auto uavHandle = srvHandle;
uavHandle.ptr += InDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
D3D12_GPU_DESCRIPTOR_HANDLE gpuSrvHandle = srvHeap->GetGPUDescriptorHandleForHeapStart();
D3D12_GPU_DESCRIPTOR_HANDLE gpuUavHandle = gpuSrvHandle;
gpuUavHandle.ptr += InDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
// Create SRV for Input Texture
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = input->GetDesc().Format;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
InDevice->CreateShaderResourceView(input, &srvDesc, srvHandle);
// Create UAV for Output Texture
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
uavDesc.Format = output->GetDesc().Format;
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
uavDesc.Texture2D.MipSlice = 0;
InDevice->CreateUnorderedAccessView(output, nullptr, &uavDesc, uavHandle);
ID3D12DescriptorHeap* heaps[] = { srvHeap };
InCmdList->SetDescriptorHeaps(_countof(heaps), heaps);
InCmdList->SetComputeRootSignature(_recRootSignatureDecode);
InCmdList->SetPipelineState(_recPSODecode);
InCmdList->SetComputeRootDescriptorTable(0, gpuSrvHandle);
InCmdList->SetComputeRootDescriptorTable(1, gpuUavHandle);
UINT dispatchWidth = (input->GetDesc().Width + 7) / 16;
UINT dispatchHeight = (input->GetDesc().Height + 7) / 16;
InCmdList->Dispatch(dispatchWidth, dispatchHeight, 1);
//ID3D12Fence* d3d12Fence;
//InDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&d3d12Fence));
//d3d12Fence->Signal(999);
//auto fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr);
//if (d3d12Fence->SetEventOnCompletion(999, fenceEvent) == S_OK)
//{
// WaitForSingleObject(fenceEvent, INFINITE);
// CloseHandle(fenceEvent);
//}
//else
// spdlog::warn("IFeature_Dx11wDx12::~IFeature_Dx11wDx12 can't get fenceEvent handle");
//d3d12Fence->Release();
return true;
}
bool XeSSFeature::RecEncode(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdList, ID3D12Resource* input, ID3D12Resource* output)
{
if (!_recInit)
return false;
ID3D12DescriptorHeap* srvHeap;
D3D12_DESCRIPTOR_HEAP_DESC heapDesc = {};
heapDesc.NumDescriptors = 2; // One for SRV and one for UAV
heapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
heapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
auto hr = InDevice->CreateDescriptorHeap(&heapDesc, IID_PPV_ARGS(&srvHeap));
if (FAILED(hr))
{
return false;
}
auto srvHandle = srvHeap->GetCPUDescriptorHandleForHeapStart();
auto uavHandle = srvHandle;
uavHandle.ptr += InDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
D3D12_GPU_DESCRIPTOR_HANDLE gpuSrvHandle = srvHeap->GetGPUDescriptorHandleForHeapStart();
D3D12_GPU_DESCRIPTOR_HANDLE gpuUavHandle = gpuSrvHandle;
gpuUavHandle.ptr += InDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
// Create SRV for Input Texture
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = input->GetDesc().Format;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Texture2D.MipLevels = 1;
InDevice->CreateShaderResourceView(input, &srvDesc, srvHandle);
// Create UAV for Output Texture
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
uavDesc.Format = output->GetDesc().Format;
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D;
uavDesc.Texture2D.MipSlice = 0;
InDevice->CreateUnorderedAccessView(output, nullptr, &uavDesc, uavHandle);
ID3D12DescriptorHeap* heaps[] = { srvHeap };
InCmdList->SetDescriptorHeaps(_countof(heaps), heaps);
InCmdList->SetComputeRootSignature(_recRootSignatureEncode);
InCmdList->SetPipelineState(_recPSOEncode);
InCmdList->SetComputeRootDescriptorTable(0, gpuSrvHandle);
InCmdList->SetComputeRootDescriptorTable(1, gpuUavHandle);
UINT dispatchWidth = (input->GetDesc().Width + 7) / 16;
UINT dispatchHeight = (input->GetDesc().Height + 7) / 16;
InCmdList->Dispatch(dispatchWidth, dispatchHeight, 1);
return true;
}
bool XeSSFeature::CreateRecBufferResource(ID3D12Resource* source, ID3D12Device* device, ID3D12Resource** output)
{
if (!_recInit)
return false;
if (source == nullptr)
return false;
D3D12_RESOURCE_DESC texDesc = source->GetDesc();
if (*output != nullptr)
{
D3D12_RESOURCE_DESC outDesc = (*output)->GetDesc();
if (outDesc.Width != texDesc.Width || outDesc.Height != texDesc.Height || outDesc.Format != texDesc.Format)
{
(*output)->Release();
(*output) = nullptr;
}
else
{
return true;
}
}
spdlog::debug("XeSSFeature::CreateRecBufferResource Start!");
D3D12_HEAP_PROPERTIES heapProperties;
D3D12_HEAP_FLAGS heapFlags;
HRESULT hr = source->GetHeapProperties(&heapProperties, &heapFlags);
if (hr != S_OK)
{
spdlog::error("XeSSFeature::CreateRecBufferResource GetHeapProperties result: {0:x}", hr);
return false;
}
if (*output != nullptr)
(*output)->Release();
texDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
hr = device->CreateCommittedResource(&heapProperties, D3D12_HEAP_FLAG_NONE, &texDesc, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, nullptr, IID_PPV_ARGS(output));
if (hr != S_OK)
{
spdlog::error("XeSSFeature::CreateRecBufferResource CreateCommittedResource result: {0:x}", hr);
return false;
}
return true;
}
+14
View File
@@ -51,6 +51,15 @@ protected:
ID3D12Resource* casBuffer = nullptr;
FfxCas::FfxCasContextDescription casContextDesc = {};
//rec709
bool _recInit = false;
ID3D12RootSignature* _recRootSignatureEncode = nullptr;
ID3D12RootSignature* _recRootSignatureDecode = nullptr;
ID3D12PipelineState* _recPSOEncode = nullptr;
ID3D12PipelineState* _recPSODecode = nullptr;
ID3D12Resource* _recBufferEncode = nullptr;
ID3D12Resource* _recBufferDecode = nullptr;
bool InitXeSS(ID3D12Device* device, const NVSDK_NGX_Parameter* InParameters);
void CasInit();
@@ -59,6 +68,11 @@ protected:
bool CreateCasBufferResource(ID3D12Resource* source, ID3D12Device* device);
bool CasDispatch(ID3D12CommandList* commandList, const NVSDK_NGX_Parameter* initParams, ID3D12Resource* input, ID3D12Resource* output);
bool RecInit(ID3D12Device* InDevice);
bool RecDecode(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdList, ID3D12Resource* input, ID3D12Resource* output);
bool RecEncode(ID3D12Device* InDevice, ID3D12GraphicsCommandList* InCmdList, ID3D12Resource* input, ID3D12Resource* output);
bool CreateRecBufferResource(ID3D12Resource* source, ID3D12Device* device, ID3D12Resource** output);
public:
XeSSFeature(unsigned int handleId, const NVSDK_NGX_Parameter* InParameters) : IFeature(handleId, InParameters)
+68 -11
View File
@@ -86,7 +86,19 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
return false;
}
params.pColorTexture = dx11Color.Dx12Resource;
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
CreateRecBufferResource(dx11Color.Dx12Resource, Dx12on11Device, &_recBufferDecode);
ResourceBarrier(Dx12CommandList, _recBufferDecode, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
if (RecDecode(Dx12on11Device, Dx12CommandList, dx11Color.Dx12Resource, _recBufferDecode))
params.pColorTexture = _recBufferDecode;
else
params.pColorTexture = dx11Color.Dx12Resource;
}
else
params.pColorTexture = dx11Color.Dx12Resource;
_hasColor = params.pColorTexture != nullptr;
params.pVelocityTexture = dx11Mv.Dx12Resource;
_hasMV = params.pVelocityTexture != nullptr;
@@ -110,8 +122,21 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
params.pOutputTexture = casBuffer;
}
else
params.pOutputTexture = dx11Out.Dx12Resource;
{
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
if (CreateRecBufferResource(dx11Out.Dx12Resource, Dx12on11Device, &_recBufferEncode))
{
ResourceBarrier(Dx12CommandList, dx11Out.Dx12Resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
params.pOutputTexture = _recBufferEncode;
}
else
params.pOutputTexture = dx11Out.Dx12Resource;
}
else
params.pOutputTexture = dx11Out.Dx12Resource;
}
_hasOutput = params.pOutputTexture != nullptr;
params.pDepthTexture = dx11Depth.Dx12Resource;
@@ -157,18 +182,43 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
}
//apply cas
if (Config::Instance()->CasEnabled.value_or(true) && !CasDispatch(Dx12CommandList, InParameters, casBuffer, dx11Out.Dx12Resource))
if (Config::Instance()->CasEnabled.value_or(true) && casSharpness > 0.0f)
{
Config::Instance()->CasEnabled = false;
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
CreateRecBufferResource(casBuffer, Dx12on11Device, &_recBufferEncode);
ResourceBarrier(Dx12CommandList, _recBufferEncode, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
if (!CasDispatch(Dx12CommandList, InParameters, casBuffer, _recBufferEncode))
{
Config::Instance()->CasEnabled = false;
Dx12CommandAllocator->Reset();
Dx12CommandList->Reset(Dx12CommandAllocator, nullptr);
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
return true;
Dx12CommandAllocator->Reset();
Dx12CommandList->Reset(Dx12CommandAllocator, nullptr);
return true;
}
}
else
{
if (!CasDispatch(Dx12CommandList, InParameters, casBuffer, dx11Out.Dx12Resource))
{
Config::Instance()->CasEnabled = false;
Dx12CommandList->Close();
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
Dx12CommandAllocator->Reset();
Dx12CommandList->Reset(Dx12CommandAllocator, nullptr);
return true;
}
}
}
// Execute dx12 commands to process xess
@@ -176,6 +226,13 @@ bool XeSSFeatureDx11::Evaluate(ID3D11DeviceContext* InDeviceContext, const NVSDK
ID3D12CommandList* ppCommandLists[] = { Dx12CommandList };
Dx12CommandQueue->ExecuteCommandLists(1, ppCommandLists);
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
ResourceBarrier(Dx12CommandList, _recBufferEncode, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
ResourceBarrier(Dx12CommandList, dx11Out.Dx12Resource, D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
RecEncode(Dx12on11Device, Dx12CommandList, _recBufferEncode, dx11Out.Dx12Resource);
}
if (!CopyBackOutput())
{
spdlog::error("XeSSFeatureDx11::Evaluate Can't copy output texture back!");
+57 -10
View File
@@ -44,25 +44,39 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, const N
spdlog::debug("XeSSFeatureDx12::Evaluate Input Resolution: {0}x{1}", params.inputWidth, params.inputHeight);
if (InParameters->Get(NVSDK_NGX_Parameter_Color, &params.pColorTexture) != NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_Color, (void**)&params.pColorTexture);
ID3D12Resource* paramColor;
if (InParameters->Get(NVSDK_NGX_Parameter_Color, &paramColor) != NVSDK_NGX_Result_Success)
InParameters->Get(NVSDK_NGX_Parameter_Color, (void**)&paramColor);
if (params.pColorTexture)
if (paramColor)
{
spdlog::debug("XeSSFeatureDx12::Evaluate Color exist..");
if (Config::Instance()->ColorResourceBarrier.has_value())
ResourceBarrier(InCommandList, params.pColorTexture,
ResourceBarrier(InCommandList, paramColor,
(D3D12_RESOURCE_STATES)Config::Instance()->ColorResourceBarrier.value(),
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
else if (Config::Instance()->NVNGX_Engine == NVSDK_NGX_ENGINE_TYPE_UNREAL)
{
Config::Instance()->ColorResourceBarrier = (int)D3D12_RESOURCE_STATE_RENDER_TARGET;
ResourceBarrier(InCommandList, params.pColorTexture,
ResourceBarrier(InCommandList, paramColor,
D3D12_RESOURCE_STATE_RENDER_TARGET,
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
}
if (Config::Instance()->ColorSpaceFix.value_or(false) &&
CreateRecBufferResource(paramColor, Device, &_recBufferDecode) &&
RecDecode(Device, InCommandList, paramColor, _recBufferDecode))
{
ResourceBarrier(InCommandList, _recBufferDecode,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
params.pColorTexture = _recBufferDecode;
}
else
params.pColorTexture = paramColor;
}
else
{
@@ -112,7 +126,15 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, const N
params.pOutputTexture = casBuffer;
}
else
params.pOutputTexture = paramOutput;
{
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
CreateRecBufferResource(paramOutput, Device, &_recBufferEncode);
params.pOutputTexture = _recBufferEncode;
}
else
params.pOutputTexture = paramOutput;
}
}
else
{
@@ -210,10 +232,24 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, const N
}
//apply cas
if (Config::Instance()->CasEnabled.value_or(true) && !CasDispatch(InCommandList, InParameters, casBuffer, paramOutput))
if (Config::Instance()->CasEnabled.value_or(true) && casSharpness > 0.0f)
{
Config::Instance()->CasEnabled = false;
return true;
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
if (!CreateRecBufferResource(casBuffer, Device, &_recBufferEncode) || !CasDispatch(InCommandList, InParameters, casBuffer, _recBufferEncode))
{
Config::Instance()->CasEnabled = false;
return true;
}
}
else
{
if (!CasDispatch(InCommandList, InParameters, casBuffer, paramOutput))
{
Config::Instance()->CasEnabled = false;
return true;
}
}
}
// imgui
@@ -222,11 +258,22 @@ bool XeSSFeatureDx12::Evaluate(ID3D12GraphicsCommandList* InCommandList, const N
if (Imgui->IsHandleDifferent())
Imgui.reset();
else
Imgui->Render(InCommandList, paramOutput);
{
if (Config::Instance()->ColorSpaceFix.value_or(false))
Imgui->Render(InCommandList, _recBufferEncode);
else
Imgui->Render(InCommandList, paramOutput);
}
}
else
Imgui = std::make_unique<Imgui_Dx12>(GetForegroundWindow(), Device);
if (Config::Instance()->ColorSpaceFix.value_or(false))
{
ResourceBarrier(InCommandList, _recBufferEncode, D3D12_RESOURCE_STATE_UNORDERED_ACCESS, D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE);
RecEncode(Device, InCommandList, _recBufferEncode, paramOutput);
}
// restore resource states
if (params.pColorTexture && Config::Instance()->ColorResourceBarrier.has_value())
ResourceBarrier(InCommandList, params.pColorTexture,
+2
View File
@@ -741,6 +741,7 @@ Imgui_Base::Imgui_Base(HWND handle)
context = ImGui::CreateContext();
ImGui::SetCurrentContext(context);
ImGui::StyleColorsDark();
auto style = ImGui::GetStyle();
style.Colors[ImGuiCol_WindowBg] = ImVec4(0.1f, 0.1f, 0.1f, 0.20f);
@@ -749,6 +750,7 @@ Imgui_Base::Imgui_Base(HWND handle)
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
io.ConfigFlags |= ImGuiConfigFlags_IsSRGB;
io.MouseDrawCursor = _isVisible;
io.WantCaptureKeyboard = _isVisible;