4 changed files with 164 additions and 0 deletions
-
107FSR2Upscaler_DX11.cpp
-
49FSR2Upscaler_DX11.h
-
2FSR3UnityPlugin.vcxproj
-
6FSR3UnityPlugin.vcxproj.filters
@ -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; |
||||
|
} |
||||
@ -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; |
||||
|
}; |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue