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