diff --git a/FSR2UnityPlugin.cpp b/FSR2UnityPlugin.cpp index 5d3ee75..ee8424e 100644 --- a/FSR2UnityPlugin.cpp +++ b/FSR2UnityPlugin.cpp @@ -23,8 +23,6 @@ #include "FSR2UnityTypes.h" -static const int32_t BaseEventId = 212; - static IUnityInterfaces* s_UnityInterfaces = nullptr; static IUnityLog* s_Log = nullptr; static IUnityGraphics* s_Graphics = nullptr; @@ -33,6 +31,7 @@ static IUnityGraphicsD3D12v7* s_GraphicsD3D12 = nullptr; static IUnityGraphicsVulkanV2* s_GraphicsVulkan = nullptr; static UnityGfxRenderer s_RendererType = kUnityGfxRendererNull; +static int32_t s_BaseEventId = 0; static FfxDevice s_Device = nullptr; static FfxFsr2Interface s_Fsr2Interface; @@ -64,6 +63,8 @@ extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnit s_Log = unityInterfaces->Get(); s_Graphics = unityInterfaces->Get(); + s_BaseEventId = s_Graphics->ReserveEventIDRange((int)ePluginEventCount); + s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); // Run OnGraphicsDeviceEvent(initialize) manually on plugin load @@ -111,7 +112,7 @@ static void UNITY_INTERFACE_API OnGraphicsDeviceEvent(UnityGfxDeviceEventType ev eventConfig.graphicsQueueAccess = kUnityD3D12GraphicsQueueAccess_DontCare; eventConfig.flags = kUnityD3D12EventConfigFlag_EnsurePreviousFrameSubmission | kUnityD3D12EventConfigFlag_FlushCommandBuffers | kUnityD3D12EventConfigFlag_SyncWorkerThreads | kUnityD3D12EventConfigFlag_ModifiesCommandBuffersState; eventConfig.ensureActiveRenderTextureIsBound = false; - s_GraphicsD3D12->ConfigureEvent(BaseEventId + FSR2PluginEvent::eExecute, &eventConfig); + s_GraphicsD3D12->ConfigureEvent(s_BaseEventId + FSR2PluginEvent::eExecute, &eventConfig); break; } case kUnityGfxRendererVulkan: @@ -127,7 +128,7 @@ static void UNITY_INTERFACE_API OnGraphicsDeviceEvent(UnityGfxDeviceEventType ev eventConfig.graphicsQueueAccess = kUnityVulkanGraphicsQueueAccess_DontCare; eventConfig.flags = kUnityVulkanEventConfigFlag_EnsurePreviousFrameSubmission | kUnityVulkanEventConfigFlag_FlushCommandBuffers | kUnityVulkanEventConfigFlag_SyncWorkerThreads | kUnityVulkanEventConfigFlag_ModifiesCommandBuffersState; eventConfig.renderPassPrecondition = kUnityVulkanRenderPass_EnsureInside; - s_GraphicsVulkan->ConfigureEvent(BaseEventId + FSR2PluginEvent::eExecute, &eventConfig); + s_GraphicsVulkan->ConfigureEvent(s_BaseEventId + FSR2PluginEvent::eExecute, &eventConfig); break; } }; @@ -360,7 +361,7 @@ extern "C" bool UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API AMDUP_GetRenderResolu extern "C" int32_t UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API AMDUP_GetBaseEventId() { - return BaseEventId; + return s_BaseEventId; } static FfxResource GetVulkanTextureResource(UnityVulkanInstance& instance, FSR2Feature& feature, FSR2TextureDesc& texture, FfxResourceStates state = FFX_RESOURCE_STATE_COMPUTE_READ) @@ -401,9 +402,9 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) return; // User rendering code - switch (eventID) + switch (eventID - s_BaseEventId) { - case BaseEventId + FSR2PluginEvent::eDestroyFeature: + case FSR2PluginEvent::eDestroyFeature: { uint32_t featureSlot = (uint32_t)(int64_t)data; if (featureSlot < 0 || featureSlot >= s_Features.size()) @@ -412,7 +413,7 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) DestroyFeature(featureSlot); break; } - case BaseEventId + FSR2PluginEvent::eExecute: + case FSR2PluginEvent::eExecute: { std::lock_guard lock(s_FeatureMutex); @@ -512,7 +513,7 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) ffxFsr2ContextDispatch(&feature.upscalingContext, &dispatchDescription); break; } - case BaseEventId + FSR2PluginEvent::ePostExecute: + case FSR2PluginEvent::ePostExecute: { std::lock_guard lock(s_FeatureMutex); @@ -536,7 +537,7 @@ static void UNITY_INTERFACE_API OnRenderEventAndData(int eventID, void* data) break; } - case BaseEventId + FSR2PluginEvent::eInit: + case FSR2PluginEvent::eInit: { std::lock_guard lock(s_FeatureMutex); diff --git a/FSR2UnityTypes.h b/FSR2UnityTypes.h index 7b219ac..282ab2e 100644 --- a/FSR2UnityTypes.h +++ b/FSR2UnityTypes.h @@ -5,7 +5,9 @@ enum FSR2PluginEvent : int32_t eDestroyFeature, eExecute, ePostExecute, - eInit + eInit, + + ePluginEventCount }; enum FSR2Quality: int32_t