From 864ddc524fbc9722c401173b836a71337c130c49 Mon Sep 17 00:00:00 2001
From: David Gilbert <gilbert@vr.rwth-aachen.de>
Date: Wed, 3 Apr 2024 12:22:46 +0200
Subject: [PATCH] feature(cave): Initial enabling of present barrier extension.
 Requires modified engine.

---
 RWTHVRCluster.uplugin                         |  2 +-
 .../RWTHVRCluster/Private/RWTHVRCluster.cpp   | 58 ++++++++++++++++++-
 Source/RWTHVRCluster/RWTHVRCluster.Build.cs   | 15 +++--
 3 files changed, 67 insertions(+), 8 deletions(-)

diff --git a/RWTHVRCluster.uplugin b/RWTHVRCluster.uplugin
index d5a51b0..7382e21 100644
--- a/RWTHVRCluster.uplugin
+++ b/RWTHVRCluster.uplugin
@@ -22,7 +22,7 @@
 		{
 			"Name": "RWTHVRCluster",
 			"Type": "Runtime",
-			"LoadingPhase": "Default",
+			"LoadingPhase": "PostConfigInit",
 			"WhitelistPlatforms": [
 				"Win64",
 				"Linux"
diff --git a/Source/RWTHVRCluster/Private/RWTHVRCluster.cpp b/Source/RWTHVRCluster/Private/RWTHVRCluster.cpp
index 5632551..104e2d0 100644
--- a/Source/RWTHVRCluster/Private/RWTHVRCluster.cpp
+++ b/Source/RWTHVRCluster/Private/RWTHVRCluster.cpp
@@ -1,8 +1,64 @@
 #include "RWTHVRCluster.h"
 
+
+#include "IVulkanDynamicRHI.h"
+
 #define LOCTEXT_NAMESPACE "FRWTHVRClusterModule"
 
-void FRWTHVRClusterModule::StartupModule() { ClusterConsole.Register(); }
+void FRWTHVRClusterModule::StartupModule()
+{
+	ClusterConsole.Register();
+
+	if (FApp::CanEverRender())
+	{
+#if PLATFORM_WINDOWS
+		TCHAR const* DynamicRHIModuleName = GetSelectedDynamicRHIModuleName(false);
+#elif PLATFORM_LINUX
+		TCHAR const* DynamicRHIModuleName = TEXT("VulkanRHI");
+#endif
+
+		if (FString("VulkanRHI") == FString(DynamicRHIModuleName))
+		{
+			TArray<ANSICHAR const*> const ExtensionsToAdd{VK_NV_PRESENT_BARRIER_EXTENSION_NAME};
+			TArray<ANSICHAR const*> const InstanceExtensionsToAdd{VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME};
+
+			IVulkanDynamicRHI::AddEnabledDeviceExtensionsAndLayers(ExtensionsToAdd, TArray<ANSICHAR const*>());
+			IVulkanDynamicRHI::AddEnabledInstanceExtensionsAndLayers({InstanceExtensionsToAdd}, TArray<ANSICHAR const*>());
+		}
+		/*
+		FCoreDelegates::OnPostEngineInit.AddLambda(
+			[]()
+			{
+				switch (GDynamicRHI->GetInterfaceType())
+				{
+				case ERHIInterfaceType::Vulkan:
+					FAVDevice::GetHardwareDevice()->SetContext<FVideoContextVulkan>(MakeShared<FVideoContextVulkan>(
+						GetIVulkanDynamicRHI()->RHIGetVkInstance(), GetIVulkanDynamicRHI()->RHIGetVkDevice(),
+						GetIVulkanDynamicRHI()->RHIGetVkPhysicalDevice(), [](char const* Name) -> PFN_vkVoidFunction
+						{ return (PFN_vkVoidFunction)GetIVulkanDynamicRHI()->RHIGetVkDeviceProcAddr(Name); }));
+
+					break;
+#if PLATFORM_WINDOWS
+				case ERHIInterfaceType::D3D11:
+					FAVDevice::GetHardwareDevice()->SetContext<FVideoContextD3D11>(
+						MakeShared<FVideoContextD3D11>(GetID3D11DynamicRHI()->RHIGetDevice()));
+
+					break;
+				case ERHIInterfaceType::D3D12:
+					FAVDevice::GetHardwareDevice()->SetContext<FVideoContextD3D12>(
+						MakeShared<FVideoContextD3D12>(GetID3D12DynamicRHI()->RHIGetDevice(0)));
+
+					break;
+#endif
+				default:
+					break;
+				}
+
+				FAVDevice::GetHardwareDevice()->SetContext<FVideoContextRHI>(MakeShared<FVideoContextRHI>());
+			});
+			*/
+	}
+}
 
 void FRWTHVRClusterModule::ShutdownModule() { ClusterConsole.Unregister(); }
 
diff --git a/Source/RWTHVRCluster/RWTHVRCluster.Build.cs b/Source/RWTHVRCluster/RWTHVRCluster.Build.cs
index 98f6200..f27ad3b 100644
--- a/Source/RWTHVRCluster/RWTHVRCluster.Build.cs
+++ b/Source/RWTHVRCluster/RWTHVRCluster.Build.cs
@@ -25,12 +25,19 @@ public class RWTHVRCluster : ModuleRules
 				"UMG",
 				"Slate",
 				"SlateCore",
-				"LiveLink", 
+				"LiveLink",
 				"HeadMountedDisplay", // required for MotionControllerComp
-				"DisplayCluster"
+				"DisplayCluster",
+				"RenderCore"
 			}
 		);
 
+		PrivateDependencyModuleNames.AddRange(
+			new string[]
+			{
+				"VulkanRHI", "RHI", "Vulkan"
+			}
+		);
 		if (IsPluginEnabledForTarget("DTrackPlugin", base.Target))
 		{
 			PublicDependencyModuleNames.AddRange(
@@ -42,10 +49,6 @@ public class RWTHVRCluster : ModuleRules
 			);
 		}
 
-		PrivateDependencyModuleNames.AddRange(
-			new string[] { }
-		);
-
 		DynamicallyLoadedModuleNames.AddRange(
 			new string[] { }
 		);
-- 
GitLab