Browse Source

Created separate class for DX11 implementation of FSR 2.2

master
Nico de Poel 10 months ago
parent
commit
ae7d966f1d
  1. 107
      FSR2Upscaler_DX11.cpp
  2. 49
      FSR2Upscaler_DX11.h
  3. 2
      FSR3UnityPlugin.vcxproj
  4. 6
      FSR3UnityPlugin.vcxproj.filters

107
FSR2Upscaler_DX11.cpp

@ -0,0 +1,107 @@
#include "FSR2Upscaler_DX11.h"
#include "ffx-fsr2-api/dx11/ffx_fsr2_dx11.h"
bool FSR2Upscaler_DX11::Init()
{
ID3D11Device* device = m_GraphicsDevice->GetDevice();
if (device == nullptr)
return false;
m_DX11Device = ffxGetDeviceDX11(device);
size_t scratchBufferSize = ffxFsr2GetScratchMemorySizeDX11();
void* scratchBuffer = malloc(scratchBufferSize);
ffxFsr2GetInterfaceDX11(&m_Fsr2Interface, device, scratchBuffer, scratchBufferSize);
return true;
}
bool FSR2Upscaler_DX11::IsValidFeature(FSR2Feature& feature)
{
return feature.isValid;
}
bool FSR2Upscaler_DX11::InitFeature(FSR2Feature& feature, const FSR3CommandInitializationData* initData)
{
FfxFsr2ContextDescription contextDescription{};
contextDescription.callbacks = m_Fsr2Interface;
contextDescription.device = m_DX11Device;
contextDescription.displaySize = { initData->displaySizeWidth, initData->displaySizeHeight };
contextDescription.maxRenderSize = { initData->maxRenderSizeWidth, initData->maxRenderSizeHeight };
contextDescription.flags = initData->flags;
feature.isValid = FFX_OK == ffxFsr2ContextCreate(&feature.fsr2Context, &contextDescription);
return feature.isValid;
}
void FSR2Upscaler_DX11::SetTexture(FSR3Texture textureType, UnityTextureID textureID, const UnityRenderingExtTextureUpdateParamsV2* params, FSR3TextureDesc* outTextureDesc)
{
outTextureDesc->image = (intptr_t)m_GraphicsDevice->TextureFromNativeTexture((UnityTextureID)params->textureID);
}
void FSR2Upscaler_DX11::Execute(FSR2Feature& feature, const FSR3CommandExecutionData* execData)
{
FfxFsr2DispatchDescription dispatchDescription{};
ID3D11DeviceContext* ctx = nullptr;
m_GraphicsDevice->GetDevice()->GetImmediateContext(&ctx);
dispatchDescription.commandList = ctx;
dispatchDescription.color = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.colorInput.image);
dispatchDescription.depth = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.depth.image);
dispatchDescription.motionVectors = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.motionVectors.image);
dispatchDescription.exposure = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.exposureTexture.image);
dispatchDescription.reactive = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.reactiveMask.image);
dispatchDescription.transparencyAndComposition = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.transparencyMask.image);
dispatchDescription.output = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.colorOutput.image, nullptr, FFX_RESOURCE_STATE_UNORDERED_ACCESS);
if (dispatchDescription.reactive.resource == nullptr)
dispatchDescription.reactive = ffxGetResourceDX11(&feature.fsr2Context, (ID3D11Resource*)feature.textureTable.biasColorMask.image);
dispatchDescription.jitterOffset.x = execData->jitterOffsetX;
dispatchDescription.jitterOffset.y = execData->jitterOffsetY;
dispatchDescription.motionVectorScale.x = execData->MVScaleX;
dispatchDescription.motionVectorScale.y = execData->MVScaleY;
dispatchDescription.reset = execData->reset;
dispatchDescription.enableSharpening = execData->enableSharpening;
dispatchDescription.sharpness = execData->sharpness;
dispatchDescription.frameTimeDelta = execData->frameTimeDelta;
dispatchDescription.preExposure = execData->preExposure;
dispatchDescription.renderSize.width = execData->renderSizeWidth;
dispatchDescription.renderSize.height = execData->renderSizeHeight;
dispatchDescription.cameraFovAngleVertical = execData->cameraFovAngleVertical;
if (feature.flags & FFX_FSR2_ENABLE_DEPTH_INVERTED)
{
dispatchDescription.cameraFar = execData->cameraNear;
dispatchDescription.cameraNear = execData->cameraFar;
}
else
{
dispatchDescription.cameraFar = execData->cameraFar;
dispatchDescription.cameraNear = execData->cameraNear;
}
ffxFsr2ContextDispatch(&feature.fsr2Context, &dispatchDescription);
}
void FSR2Upscaler_DX11::AwaitEndOfFrame(uint64_t frameValue)
{
// Nothing to do
}
void FSR2Upscaler_DX11::DestroyContext(FSR2Feature& feature)
{
ffxFsr2ContextDestroy(&feature.fsr2Context);
}
void FSR2Upscaler_DX11::DoShutdown()
{
if (m_Fsr2Interface.scratchBuffer != nullptr)
{
free(m_Fsr2Interface.scratchBuffer);
m_Fsr2Interface.scratchBuffer = nullptr;
}
m_DX11Device = nullptr;
}

49
FSR2Upscaler_DX11.h

@ -0,0 +1,49 @@
#pragma once
#include "UpscalerGraphicsDevice.h"
#include "ffx-fsr2-api/ffx_fsr2.h"
#include <d3d11.h>
#include "UnityPluginAPI/IUnityGraphicsD3D11.h"
struct FSR2Feature
{
FfxFsr2Context fsr2Context;
bool isValid;
uint32_t upscaleSizeWidth;
uint32_t upscaleSizeHeight;
uint32_t flags;
uint64_t dispatchFrameValue;
FSR3TextureTable textureTable;
};
class FSR2Upscaler_DX11 : UpscalerGraphicsDevice<FSR2Feature>
{
public:
FSR2Upscaler_DX11(IUnityInterfaces* unityInterfaces, IUnityGraphicsD3D11* graphicsDevice) :
m_GraphicsDevice(graphicsDevice), m_DX11Device(nullptr), m_Fsr2Interface()
{
}
bool Init() override;
protected:
bool IsValidFeature(FSR2Feature& feature);
bool InitFeature(FSR2Feature& feature, const FSR3CommandInitializationData* initData);
void SetTexture(FSR3Texture textureType, UnityTextureID textureID, const UnityRenderingExtTextureUpdateParamsV2* params, FSR3TextureDesc* outTextureDesc);
void Execute(FSR2Feature& feature, const FSR3CommandExecutionData* execData);
void AwaitEndOfFrame(uint64_t frameValue);
void DestroyContext(FSR2Feature& feature);
void DoShutdown();
private:
IUnityGraphicsD3D11* m_GraphicsDevice;
FfxDevice m_DX11Device;
FfxFsr2Interface m_Fsr2Interface;
};

2
FSR3UnityPlugin.vcxproj

@ -151,11 +151,13 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="FSR2Upscaler_DX11.cpp" />
<ClCompile Include="FSR3UnityPlugin.cpp" /> <ClCompile Include="FSR3UnityPlugin.cpp" />
<ClCompile Include="FSR3Upscaler_DX12.cpp" /> <ClCompile Include="FSR3Upscaler_DX12.cpp" />
<ClCompile Include="FSR3Upscaler_Vulkan.cpp" /> <ClCompile Include="FSR3Upscaler_Vulkan.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="FSR2Upscaler_DX11.h" />
<ClInclude Include="FSR3UnityTypes.h" /> <ClInclude Include="FSR3UnityTypes.h" />
<ClInclude Include="FSR3Upscaler_DX12.h" /> <ClInclude Include="FSR3Upscaler_DX12.h" />
<ClInclude Include="FSR3Upscaler_FFXBase.h" /> <ClInclude Include="FSR3Upscaler_FFXBase.h" />

6
FSR3UnityPlugin.vcxproj.filters

@ -24,6 +24,9 @@
<ClCompile Include="FSR3Upscaler_Vulkan.cpp"> <ClCompile Include="FSR3Upscaler_Vulkan.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="FSR2Upscaler_DX11.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="FSR3UnityTypes.h"> <ClInclude Include="FSR3UnityTypes.h">
@ -41,5 +44,8 @@
<ClInclude Include="FSR3Upscaler_Vulkan.h"> <ClInclude Include="FSR3Upscaler_Vulkan.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="FSR2Upscaler_DX11.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
Loading…
Cancel
Save