diff --git a/FSR3UnityPlugin.cpp b/FSR3UnityPlugin.cpp index da2c33e..b7da845 100644 --- a/FSR3UnityPlugin.cpp +++ b/FSR3UnityPlugin.cpp @@ -110,11 +110,13 @@ static uint32_t AllocateFeatureSlot() if (s_FeatureSlots.empty()) { + // Create a new feature if there are no free slots uint32_t featureSlot = (uint32_t)s_Features.size(); s_Features.push_back(std::move(FSR3Feature())); return featureSlot; } + // Reallocate an existing free slot uint32_t featureSlot = s_FeatureSlots.front(); s_FeatureSlots.pop(); return featureSlot; @@ -247,13 +249,13 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) ffx::DispatchDescUpscale dispatchUpscale{}; 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.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); 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 // 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; } } diff --git a/FSR3UnityTypes.h b/FSR3UnityTypes.h index 7621894..5ac657c 100644 --- a/FSR3UnityTypes.h +++ b/FSR3UnityTypes.h @@ -5,7 +5,8 @@ enum FSR3PluginEvent : int32_t eDestroyFeature, eExecute, ePostExecute, - eInit + eInit, + eSetTextures }; enum FSR3Quality: int32_t @@ -35,6 +36,7 @@ struct FSR3CommandInitializationData uint32_t displaySizeWidth; uint32_t displaySizeHeight; int32_t flags; + uint32_t featureSlot; }; @@ -54,17 +56,20 @@ struct FSR3CommandExecutionData float cameraNear; float cameraFar; float cameraFovAngleVertical; + uint32_t featureSlot; }; 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; };