Browse Source

- Added an extra render event to allow setting all textures in one go, in a way that isn't stupid and inefficient

- Reverted texture table back to using intptr_t entries, so that all structs are render API-agnostic
fsr2
Nico de Poel 11 months ago
parent
commit
eeb43bac2a
  1. 26
      FSR3UnityPlugin.cpp
  2. 23
      FSR3UnityTypes.h

26
FSR3UnityPlugin.cpp

@ -110,11 +110,13 @@ static uint32_t AllocateFeatureSlot()
if (s_FeatureSlots.empty()) if (s_FeatureSlots.empty())
{ {
// Create a new feature if there are no free slots
uint32_t featureSlot = (uint32_t)s_Features.size(); uint32_t featureSlot = (uint32_t)s_Features.size();
s_Features.push_back(std::move(FSR3Feature())); s_Features.push_back(std::move(FSR3Feature()));
return featureSlot; return featureSlot;
} }
// Reallocate an existing free slot
uint32_t featureSlot = s_FeatureSlots.front(); uint32_t featureSlot = s_FeatureSlots.front();
s_FeatureSlots.pop(); s_FeatureSlots.pop();
return featureSlot; return featureSlot;
@ -247,13 +249,13 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data)
ffx::DispatchDescUpscale dispatchUpscale{}; ffx::DispatchDescUpscale dispatchUpscale{};
dispatchUpscale.commandList = state.commandList; dispatchUpscale.commandList = state.commandList;
dispatchUpscale.color = ffxApiGetResourceDX12(feature.textureTable.colorInput, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.depth = ffxApiGetResourceDX12(feature.textureTable.depth, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.motionVectors = ffxApiGetResourceDX12(feature.textureTable.motionVectors, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.exposure = ffxApiGetResourceDX12(feature.textureTable.exposureTexture, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.reactive = ffxApiGetResourceDX12(feature.textureTable.reactiveMask, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.transparencyAndComposition = ffxApiGetResourceDX12(feature.textureTable.transparencyMask, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.output = ffxApiGetResourceDX12(feature.textureTable.colorOutput, FFX_API_RESOURCE_STATE_UNORDERED_ACCESS);
dispatchUpscale.color = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.colorInput, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.depth = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.depth, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.motionVectors = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.motionVectors, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.exposure = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.exposureTexture, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.reactive = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.reactiveMask, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.transparencyAndComposition = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.transparencyMask, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
dispatchUpscale.output = ffxApiGetResourceDX12((ID3D12Resource*)feature.textureTable.colorOutput, FFX_API_RESOURCE_STATE_UNORDERED_ACCESS);
dispatchUpscale.jitterOffset.x = params->jitterOffsetX; dispatchUpscale.jitterOffset.x = params->jitterOffsetX;
dispatchUpscale.jitterOffset.y = params->jitterOffsetY; dispatchUpscale.jitterOffset.y = params->jitterOffsetY;
@ -308,6 +310,14 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data)
ffx::CreateContext(feature.upscalingContext, nullptr, createUpscaling, s_BackendDesc); ffx::CreateContext(feature.upscalingContext, nullptr, createUpscaling, s_BackendDesc);
break; break;
} }
case BaseEventId + FSR3PluginEvent::eSetTextures:
auto* params = (FSR3TextureTable*)data;
if (params->featureSlot < 0 || params->featureSlot >= s_Features.size())
return;
auto& feature = s_Features[params->featureSlot];
feature.textureTable = *params;
break;
} }
} }
@ -343,7 +353,7 @@ static void UNITY_INTERFACE_API OnSetTextureEvent(int eventID, void* data)
{ {
// We organized the texture table struct to be ordered the same as the texture slot enum // We organized the texture table struct to be ordered the same as the texture slot enum
// This way we can use the texture slot value simply as a pointer offset into the texture table // This way we can use the texture slot value simply as a pointer offset into the texture table
*(((ID3D12Resource**)&feature.textureTable) + textureSlot) = s_GraphicsD3D12->TextureFromNativeTexture((UnityTextureID)params->textureID);
*(((intptr_t*)&feature.textureTable) + textureSlot) = (intptr_t)s_GraphicsD3D12->TextureFromNativeTexture((UnityTextureID)params->textureID);
break; break;
} }
} }

23
FSR3UnityTypes.h

@ -5,7 +5,8 @@ enum FSR3PluginEvent : int32_t
eDestroyFeature, eDestroyFeature,
eExecute, eExecute,
ePostExecute, ePostExecute,
eInit
eInit,
eSetTextures
}; };
enum FSR3Quality: int32_t enum FSR3Quality: int32_t
@ -35,6 +36,7 @@ struct FSR3CommandInitializationData
uint32_t displaySizeWidth; uint32_t displaySizeWidth;
uint32_t displaySizeHeight; uint32_t displaySizeHeight;
int32_t flags; int32_t flags;
uint32_t featureSlot; uint32_t featureSlot;
}; };
@ -54,17 +56,20 @@ struct FSR3CommandExecutionData
float cameraNear; float cameraNear;
float cameraFar; float cameraFar;
float cameraFovAngleVertical; float cameraFovAngleVertical;
uint32_t featureSlot; uint32_t featureSlot;
}; };
struct FSR3TextureTable struct FSR3TextureTable
{ {
ID3D12Resource* colorInput;
ID3D12Resource* colorOutput;
ID3D12Resource* depth;
ID3D12Resource* motionVectors;
ID3D12Resource* transparencyMask;
ID3D12Resource* exposureTexture;
ID3D12Resource* reactiveMask;
ID3D12Resource* biasColorMask;
intptr_t colorInput;
intptr_t colorOutput;
intptr_t depth;
intptr_t motionVectors;
intptr_t transparencyMask;
intptr_t exposureTexture;
intptr_t reactiveMask;
intptr_t biasColorMask;
uint32_t featureSlot;
}; };
Loading…
Cancel
Save