From f9450a8f7619916b27021299003f296d998ee973 Mon Sep 17 00:00:00 2001
From: Vanessa Karolek <vaka1997@uni-koblenz.de>
Date: Wed, 18 Aug 2021 10:54:58 +0200
Subject: [PATCH] [#92] add RTXModule, init RTX in main

---
 modules/rtx/CMakeLists.txt            |  6 ++--
 modules/rtx/include/vkcv/rtx/RTX.hpp  | 48 +++++++++++++++++++++++++++
 modules/rtx/include/vkcv/rtx/Test.hpp |  1 -
 modules/rtx/src/vkcv/rtx/RTX.cpp      | 46 +++++++++++++++++++++++++
 modules/rtx/src/vkcv/rtx/Test.cpp     |  1 -
 projects/rtx/src/main.cpp             | 29 +++++++---------
 6 files changed, 109 insertions(+), 22 deletions(-)
 create mode 100644 modules/rtx/include/vkcv/rtx/RTX.hpp
 delete mode 100644 modules/rtx/include/vkcv/rtx/Test.hpp
 create mode 100644 modules/rtx/src/vkcv/rtx/RTX.cpp
 delete mode 100644 modules/rtx/src/vkcv/rtx/Test.cpp

diff --git a/modules/rtx/CMakeLists.txt b/modules/rtx/CMakeLists.txt
index 7ee75e39..061687c4 100644
--- a/modules/rtx/CMakeLists.txt
+++ b/modules/rtx/CMakeLists.txt
@@ -9,12 +9,12 @@ set(vkcv_rtx_source ${PROJECT_SOURCE_DIR}/src)
 set(vkcv_rtx_include ${PROJECT_SOURCE_DIR}/include)
 
 set(vkcv_rtx_sources
-		${vkcv_rtx_include}/vkcv/rtx/Test.hpp	# todo: remove
-		${vkcv_rtx_source}/vkcv/rtx/Test.cpp	# todo: remove
+		${vkcv_rtx_include}/vkcv/rtx/RTX.hpp
+		${vkcv_rtx_source}/vkcv/rtx/RTX.cpp
 )
 
 # adding source files to the project
 add_library(vkcv_rtx STATIC ${vkcv_rtx_sources})
 
 # add the own include directory for public headers
-target_include_directories(vkcv_rtx BEFORE PUBLIC ${vkcv_rtx_include})
\ No newline at end of file
+target_include_directories(vkcv_rtx BEFORE PUBLIC ${vkcv_rtx_include} ${Vulkan_INCLUDE_DIR} ${Vulkan_LIBRARIES})
\ No newline at end of file
diff --git a/modules/rtx/include/vkcv/rtx/RTX.hpp b/modules/rtx/include/vkcv/rtx/RTX.hpp
new file mode 100644
index 00000000..d7c2e766
--- /dev/null
+++ b/modules/rtx/include/vkcv/rtx/RTX.hpp
@@ -0,0 +1,48 @@
+#pragma once
+
+#include <vector>
+#include "vulkan/vulkan.hpp"
+
+namespace vkcv::rtx {
+
+    class RTXModule {
+    private:
+
+        std::vector<const char*> m_instanceExtensions;
+        std::vector<const char*> m_deviceExtensions;
+        vk::PhysicalDevice m_physicalDevice;
+        vk::PhysicalDeviceRayTracingPipelinePropertiesKHR m_rtProperties{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR};
+
+    public:
+
+        /**
+         * @brief TODO
+         */
+        RTXModule();
+
+        /**
+         * @brief TODO
+         */
+        ~RTXModule() {};
+
+        /**
+         * @brief Returns the raytracing instance extensions.
+         * @return The raytracing instance extensions.
+         */
+        std::vector<const char*> getInstanceExtensions();
+
+        /**
+         * @brief Returns the raytracing device extensions.
+         * @return The raytracing device extensions.
+         */
+        std::vector<const char*> getDeviceExtensions();
+
+        /**
+         * @brief TODO
+         * @param physicalDevice
+         */
+        void init(vk::PhysicalDevice &physicalDevice);
+
+    };
+
+}
diff --git a/modules/rtx/include/vkcv/rtx/Test.hpp b/modules/rtx/include/vkcv/rtx/Test.hpp
deleted file mode 100644
index dffb5c9c..00000000
--- a/modules/rtx/include/vkcv/rtx/Test.hpp
+++ /dev/null
@@ -1 +0,0 @@
-// todo: remove
\ No newline at end of file
diff --git a/modules/rtx/src/vkcv/rtx/RTX.cpp b/modules/rtx/src/vkcv/rtx/RTX.cpp
new file mode 100644
index 00000000..48e8a05f
--- /dev/null
+++ b/modules/rtx/src/vkcv/rtx/RTX.cpp
@@ -0,0 +1,46 @@
+#include "vkcv/rtx/RTX.hpp"
+
+namespace vkcv::rtx {
+
+    RTXModule::RTXModule() {
+
+        // prepare needed raytracing extensions
+        m_instanceExtensions = {
+                "VK_KHR_get_physical_device_properties2"
+        };
+        m_deviceExtensions = {
+                "VK_KHR_maintenance3",
+                "VK_EXT_descriptor_indexing",
+                "VK_KHR_buffer_device_address",
+                "VK_KHR_deferred_host_operations",
+                "VK_KHR_acceleration_structure",
+                "VK_KHR_spirv_1_4",
+                "VK_KHR_ray_tracing_pipeline",
+                "VK_KHR_ray_query",
+                "VK_KHR_pipeline_library"
+        };
+
+        // enable raytracing features!
+        vk::PhysicalDeviceAccelerationStructureFeaturesKHR accelerationFeature(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_FEATURES_KHR);
+        vk::PhysicalDeviceRayTracingPipelineFeaturesKHR raytracingPipelineFeature(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_FEATURES_KHR);
+    }
+
+    void RTXModule::init(vk::PhysicalDevice &physicalDevice) {
+        m_physicalDevice = physicalDevice;
+
+        // Requesting ray tracing properties
+        vk::PhysicalDeviceProperties2 prop2{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2};
+        prop2.pNext = &m_rtProperties;
+        m_physicalDevice.getProperties2(&prop2);
+    }
+
+    std::vector<const char*> RTXModule::getInstanceExtensions() {
+        return m_instanceExtensions;
+    }
+
+    std::vector<const char*> RTXModule::getDeviceExtensions() {
+        return m_deviceExtensions;
+    }
+
+
+}
\ No newline at end of file
diff --git a/modules/rtx/src/vkcv/rtx/Test.cpp b/modules/rtx/src/vkcv/rtx/Test.cpp
deleted file mode 100644
index dffb5c9c..00000000
--- a/modules/rtx/src/vkcv/rtx/Test.cpp
+++ /dev/null
@@ -1 +0,0 @@
-// todo: remove
\ No newline at end of file
diff --git a/projects/rtx/src/main.cpp b/projects/rtx/src/main.cpp
index 3cfbbf03..92e1c0e8 100644
--- a/projects/rtx/src/main.cpp
+++ b/projects/rtx/src/main.cpp
@@ -6,6 +6,7 @@
 #include <vkcv/asset/asset_loader.hpp>
 #include <vkcv/shader/GLSLCompiler.hpp>
 #include <vkcv/scene/Scene.hpp>
+#include <vkcv/rtx/RTX.hpp>
 
 int main(int argc, const char** argv) {
 	const char* applicationName = "First Scene";
@@ -30,28 +31,18 @@ int main(int argc, const char** argv) {
 	cameraManager.getCamera(camIndex1).setNearFar(0.1f, 30.0f);
 
 	// prepare raytracing extensions. IMPORTANT: configure compiler to build in 64 bit mode
-	std::vector<const char*> raytracingInstanceExtensions = {
-        "VK_KHR_get_physical_device_properties2"
-	};
-    std::vector<const char*> raytracingDeviceExtensions = {
-        "VK_KHR_maintenance3",
-        "VK_EXT_descriptor_indexing",
-        "VK_KHR_buffer_device_address",
-        "VK_KHR_deferred_host_operations",
-        "VK_KHR_acceleration_structure",
-        "VK_KHR_spirv_1_4",
-        "VK_KHR_ray_tracing_pipeline",
-        "VK_KHR_ray_query",
-        "VK_KHR_pipeline_library"
-    };
+    vkcv::rtx::RTXModule rtxModule;
+    std::vector<const char*> raytracingInstanceExtensions = rtxModule.getInstanceExtensions();
+    std::vector<const char*> raytracingDeviceExtensions = rtxModule.getDeviceExtensions();
 
-    std::vector<const char*> instanceExtensions = {};
-    instanceExtensions.insert(instanceExtensions.end(), raytracingInstanceExtensions.begin(), raytracingInstanceExtensions.end());
+    std::vector<const char*> instanceExtensions = {};   // add some more instance extensions, if needed
+    instanceExtensions.insert(instanceExtensions.end(), raytracingInstanceExtensions.begin(), raytracingInstanceExtensions.end());  // merge together all instance extensions
 
     std::vector<const char*> deviceExtensions = {
         "VK_KHR_swapchain"
     };
-    deviceExtensions.insert(deviceExtensions.end(), raytracingDeviceExtensions.begin(), raytracingDeviceExtensions.end());
+    deviceExtensions.insert(deviceExtensions.end(), raytracingDeviceExtensions.begin(), raytracingDeviceExtensions.end());  // merge together all device extensions
+
 
 	vkcv::Core core = vkcv::Core::create(
 		window,
@@ -62,6 +53,10 @@ int main(int argc, const char** argv) {
 		deviceExtensions
 	);
 
+	// init RTXModule
+	vk::PhysicalDevice physicalDevice = core.getContext().getPhysicalDevice();
+	rtxModule.init(physicalDevice);
+
 	vkcv::scene::Scene scene = vkcv::scene::Scene::load(core, std::filesystem::path(
 			argc > 1 ? argv[1] : "resources/Sponza/Sponza.gltf"
 	));
-- 
GitLab