You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.5 KiB
107 lines
4.5 KiB
#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;
|
|
}
|