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

#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, uint32_t width, uint32_t height, FSR3TextureDesc* outTextureDesc)
{
outTextureDesc->image = (intptr_t)m_GraphicsDevice->TextureFromNativeTexture(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;
}