Просмотр исходного кода

Add some code in acceleration structures

Panagiotis Christopoulos Charitos 5 лет назад
Родитель
Сommit
a6ca9adf34

+ 1 - 0
src/anki/Gr.h

@@ -16,6 +16,7 @@
 #include <anki/gr/OcclusionQuery.h>
 #include <anki/gr/TimestampQuery.h>
 #include <anki/gr/Fence.h>
+#include <anki/gr/AccelerationStructure.h>
 #include <anki/gr/GrManager.h>
 #include <anki/gr/RenderGraph.h>
 

+ 79 - 0
src/anki/gr/AccelerationStructure.h

@@ -0,0 +1,79 @@
+// Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma once
+
+#include <anki/gr/GrObject.h>
+
+namespace anki
+{
+
+/// @addtogroup graphics
+/// @{
+
+/// Acceleration struture init info.
+/// @memberof AccelerationStructure
+class AccelerationStructureInitInfo : public GrBaseInitInfo
+{
+public:
+	AccelerationStructureType m_type = AccelerationStructureType::COUNT;
+
+	class
+	{
+	public:
+		IndexType m_indexType = IndexType::COUNT;
+		Format m_positionsFormat = Format::NONE;
+		U32 m_indexCount = 0;
+		U32 m_vertexCount = 0;
+	} m_bottomLevel;
+
+	class
+	{
+	public:
+		U32 m_bottomLevelCount = 0;
+	} m_topLevel;
+
+	AccelerationStructureInitInfo(CString name = {})
+		: GrBaseInitInfo(name)
+	{
+	}
+
+	Bool isValid() const
+	{
+		ANKI_ASSERT(!"TODO");
+		return false;
+	}
+};
+
+/// Acceleration structure GPU object.
+class AccelerationStructure : public GrObject
+{
+	ANKI_GR_OBJECT
+
+public:
+	static const GrObjectType CLASS_TYPE = GrObjectType::ACCELERATION_STRUCTURE;
+
+protected:
+	AccelerationStructureType m_type = AccelerationStructureType::COUNT;
+
+	/// Construct.
+	AccelerationStructure(GrManager* manager, CString name)
+		: GrObject(manager, CLASS_TYPE, name)
+	{
+	}
+
+	/// Destroy.
+	~AccelerationStructure()
+	{
+	}
+
+private:
+	/// Allocate and initialize new instance.
+	static ANKI_USE_RESULT AccelerationStructure* newInstance(
+		GrManager* manager, const AccelerationStructureInitInfo& init);
+};
+/// @}
+
+} // end namespace anki

+ 1 - 0
src/anki/gr/Buffer.h

@@ -14,6 +14,7 @@ namespace anki
 /// @{
 
 /// Buffer init info.
+/// @memberof Buffer
 class BufferInitInfo : public GrBaseInitInfo
 {
 public:

+ 2 - 0
src/anki/gr/Common.h

@@ -27,6 +27,7 @@ class BufferInitInfo;
 class ShaderInitInfo;
 class ShaderProgramInitInfo;
 class CommandBufferInitInfo;
+class AccelerationStructureInitInfo;
 
 /// @addtogroup graphics
 /// @{
@@ -70,6 +71,7 @@ ANKI_GR_CLASS(TimestampQuery)
 ANKI_GR_CLASS(ShaderProgram)
 ANKI_GR_CLASS(Fence)
 ANKI_GR_CLASS(RenderGraph)
+ANKI_GR_CLASS(AccelerationStructure)
 
 #undef ANKI_GR_CLASS
 

+ 1 - 0
src/anki/gr/ConfigDefs.h

@@ -8,6 +8,7 @@ ANKI_CONFIG_OPTION(gr_vsync, 0, 0, 1)
 ANKI_CONFIG_OPTION(gr_debugMarkers, 0, 0, 1)
 ANKI_CONFIG_OPTION(gr_maxBindlessTextures, 256, 8, 1024)
 ANKI_CONFIG_OPTION(gr_maxBindlessImages, 32, 8, 1024)
+ANKI_CONFIG_OPTION(gr_rayTracing, 0, 0, 1, "Try enabling ray tracing")
 
 // Vulkan
 ANKI_CONFIG_OPTION(gr_diskShaderCacheMaxSize, 128_MB, 1_MB, 1_GB)

+ 8 - 0
src/anki/gr/Enums.h

@@ -652,6 +652,14 @@ enum class RasterizationOrder : U8
 	RELAXED,
 	COUNT
 };
+
+/// Acceleration structure type.
+enum class AccelerationStructureType : U8
+{
+	TOP_LEVEL,
+	BOTTOM_LEVEL,
+	COUNT
+};
 /// @}
 
 } // end namespace anki

+ 1 - 0
src/anki/gr/GrManager.h

@@ -84,6 +84,7 @@ public:
 	ANKI_USE_RESULT OcclusionQueryPtr newOcclusionQuery();
 	ANKI_USE_RESULT TimestampQueryPtr newTimestampQuery();
 	ANKI_USE_RESULT RenderGraphPtr newRenderGraph();
+	ANKI_USE_RESULT AccelerationStructurePtr newAccelerationStructure(const AccelerationStructureInitInfo& init);
 	/// @}
 
 	GrManagerStats getStats() const;

+ 1 - 0
src/anki/gr/GrObject.h

@@ -30,6 +30,7 @@ enum GrObjectType : U8
 	SHADER_PROGRAM,
 	FENCE,
 	RENDER_GRAPH,
+	ACCELERATION_STRUCTURE,
 	COUNT
 };
 

+ 2 - 0
src/anki/gr/utils/InstantiationMacros.h

@@ -26,3 +26,5 @@ ANKI_INSTANTIATE_GR_OBJECT_DELIMITER()
 ANKI_INSTANTIATE_GR_OBJECT(Texture)
 ANKI_INSTANTIATE_GR_OBJECT_DELIMITER()
 ANKI_INSTANTIATE_GR_OBJECT(TextureView)
+ANKI_INSTANTIATE_GR_OBJECT_DELIMITER()
+ANKI_INSTANTIATE_GR_OBJECT(AccelerationStructure)

+ 26 - 0
src/anki/gr/vulkan/AccelerationStructure.cpp

@@ -0,0 +1,26 @@
+// Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <anki/gr/AccelerationStructure.h>
+#include <anki/gr/vulkan/AccelerationStructureImpl.h>
+#include <anki/gr/GrManager.h>
+
+namespace anki
+{
+
+AccelerationStructure* AccelerationStructure::newInstance(GrManager* manager, const AccelerationStructureInitInfo& init)
+{
+	AccelerationStructureImpl* impl =
+		manager->getAllocator().newInstance<AccelerationStructureImpl>(manager, init.getName());
+	const Error err = impl->init(init);
+	if(err)
+	{
+		manager->getAllocator().deleteInstance(impl);
+		impl = nullptr;
+	}
+	return impl;
+}
+
+} // end namespace anki

+ 65 - 0
src/anki/gr/vulkan/AccelerationStructureImpl.cpp

@@ -0,0 +1,65 @@
+// Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#include <anki/gr/vulkan/AccelerationStructureImpl.h>
+#include <anki/gr/vulkan/GrManagerImpl.h>
+
+namespace anki
+{
+
+AccelerationStructureImpl::~AccelerationStructureImpl()
+{
+	ANKI_ASSERT(!"TODO");
+}
+
+Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
+{
+	ANKI_ASSERT(inf.isValid());
+	m_type = inf.m_type;
+
+	// Create the handle
+	{
+		VkAccelerationStructureCreateGeometryTypeInfoKHR geom{};
+		geom.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR;
+		geom.maxPrimitiveCount = 1;
+
+		if(m_type == AccelerationStructureType::BOTTOM_LEVEL)
+		{
+			geom.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
+			geom.indexType = convertIndexType(inf.m_bottomLevel.m_indexType);
+			geom.vertexFormat = convertFormat(inf.m_bottomLevel.m_positionsFormat);
+			geom.maxPrimitiveCount = inf.m_bottomLevel.m_indexCount / 3;
+			geom.maxVertexCount = inf.m_bottomLevel.m_vertexCount;
+			geom.allowsTransforms = false;
+		}
+		else
+		{
+			geom.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
+			geom.maxPrimitiveCount = inf.m_topLevel.m_bottomLevelCount;
+			geom.allowsTransforms = true;
+		}
+
+		VkAccelerationStructureCreateInfoKHR ci{};
+		ci.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
+
+		ci.type = convertAccelerationStructureType(m_type);
+		ci.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
+		ci.maxGeometryCount = 1;
+		ci.pGeometryInfos = &geom;
+
+		ANKI_VK_CHECK(vkCreateAccelerationStructureKHR(getDevice(), &ci, nullptr, &m_handle));
+		getGrManagerImpl().trySetVulkanHandleName(
+			inf.getName(), VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT, m_handle);
+	}
+
+	// Allocate memory
+	{
+		// TODO
+	}
+
+	return Error::NONE;
+}
+
+} // end namespace anki

+ 37 - 0
src/anki/gr/vulkan/AccelerationStructureImpl.h

@@ -0,0 +1,37 @@
+// Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
+// All rights reserved.
+// Code licensed under the BSD License.
+// http://www.anki3d.org/LICENSE
+
+#pragma once
+
+#include <anki/gr/AccelerationStructure.h>
+#include <anki/gr/vulkan/VulkanObject.h>
+#include <anki/gr/vulkan/GpuMemoryManager.h>
+
+namespace anki
+{
+
+/// @addtogroup vulkan
+/// @{
+
+/// AccelerationStructure implementation.
+class AccelerationStructureImpl final : public AccelerationStructure,
+										public VulkanObject<AccelerationStructure, AccelerationStructureImpl>
+{
+public:
+	AccelerationStructureImpl(GrManager* manager, CString name)
+		: AccelerationStructure(manager, name)
+	{
+	}
+
+	~AccelerationStructureImpl();
+
+	ANKI_USE_RESULT Error init(const AccelerationStructureInitInfo& inf);
+
+private:
+	VkAccelerationStructureKHR m_handle = VK_NULL_HANDLE;
+};
+/// @}
+
+} // end namespace anki

+ 21 - 0
src/anki/gr/vulkan/Common.h

@@ -15,6 +15,7 @@
 #else
 #	error TODO
 #endif
+#define VK_ENABLE_BETA_EXTENSIONS
 #include <volk/volk.h>
 
 // Cleanup global namespace from these dirty libaries
@@ -66,6 +67,7 @@ enum class VulkanExtensions : U16
 	EXT_DEBUG_REPORT = 1 << 9,
 	AMD_SHADER_INFO = 1 << 10,
 	AMD_RASTERIZATION_ORDER = 1 << 11,
+	KHR_RAY_TRACING = 1 << 12
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(VulkanExtensions, inline)
 
@@ -280,6 +282,25 @@ ANKI_USE_RESULT inline VkRasterizationOrderAMD convertRasterizationOrder(Rasteri
 	return out;
 }
 
+ANKI_USE_RESULT inline VkAccelerationStructureTypeKHR convertAccelerationStructureType(AccelerationStructureType ak)
+{
+	VkAccelerationStructureTypeKHR out;
+	switch(ak)
+	{
+	case AccelerationStructureType::BOTTOM_LEVEL:
+		out = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
+		break;
+	case AccelerationStructureType::TOP_LEVEL:
+		out = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
+		break;
+	default:
+		ANKI_ASSERT(0);
+		out = VK_ACCELERATION_STRUCTURE_TYPE_TOP_LEVEL_KHR;
+	}
+
+	return out;
+}
+
 ANKI_USE_RESULT const char* vkResultToString(VkResult res);
 /// @}
 

+ 6 - 0
src/anki/gr/vulkan/GrManager.cpp

@@ -17,6 +17,7 @@
 #include <anki/gr/OcclusionQuery.h>
 #include <anki/gr/TimestampQuery.h>
 #include <anki/gr/RenderGraph.h>
+#include <anki/gr/AccelerationStructure.h>
 
 namespace anki
 {
@@ -151,4 +152,9 @@ RenderGraphPtr GrManager::newRenderGraph()
 	return RenderGraphPtr(RenderGraph::newInstance(this));
 }
 
+AccelerationStructurePtr GrManager::newAccelerationStructure(const AccelerationStructureInitInfo& init)
+{
+	return AccelerationStructurePtr(AccelerationStructure::newInstance(this, init));
+}
+
 } // end namespace anki

+ 31 - 0
src/anki/gr/vulkan/GrManagerImpl.cpp

@@ -530,6 +530,12 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				m_extensions |= VulkanExtensions::AMD_RASTERIZATION_ORDER;
 				extensionsToEnable[extensionsToEnableCount++] = VK_AMD_RASTERIZATION_ORDER_EXTENSION_NAME;
 			}
+			else if(CString(extensionInfos[extCount].extensionName) == VK_KHR_RAY_TRACING_EXTENSION_NAME
+					&& init.m_config->getBool("gr_rayTracing"))
+			{
+				m_extensions |= VulkanExtensions::KHR_RAY_TRACING;
+				extensionsToEnable[extensionsToEnableCount++] = VK_KHR_RAY_TRACING_EXTENSION_NAME;
+			}
 		}
 
 		// Enable the bindless features required
@@ -587,6 +593,31 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 			m_descriptorIndexingFeatures.pNext = &m_bufferDeviceAddressFeatures;
 		}
 
+		// Set RT features
+		if(!!(m_extensions & VulkanExtensions::KHR_RAY_TRACING))
+		{
+			m_rtFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR;
+
+			VkPhysicalDeviceFeatures2 features = {};
+			features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
+			features.pNext = &m_rtFeatures;
+			vkGetPhysicalDeviceFeatures2(m_physicalDevice, &features);
+
+			if(!m_rtFeatures.rayTracing || m_rtFeatures.rayQuery)
+			{
+				ANKI_VK_LOGE("Ray tracing and ray query are both required");
+				return Error::FUNCTION_FAILED;
+			}
+
+			// Only enable what's necessary
+			m_rtFeatures = {};
+			m_rtFeatures.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR;
+			m_rtFeatures.rayTracing = true;
+			m_rtFeatures.rayQuery = true;
+
+			m_bufferDeviceAddressFeatures.pNext = &m_rtFeatures;
+		}
+
 		ANKI_VK_LOGI("Will enable the following device extensions:");
 		for(U32 i = 0; i < extensionsToEnableCount; ++i)
 		{

+ 5 - 4
src/anki/gr/vulkan/GrManagerImpl.h

@@ -246,10 +246,11 @@ private:
 	VkQueue m_queue = VK_NULL_HANDLE;
 	Mutex m_globalMtx;
 
-	VkPhysicalDeviceProperties m_devProps = {};
-	VkPhysicalDeviceFeatures m_devFeatures = {};
-	VkPhysicalDeviceDescriptorIndexingFeatures m_descriptorIndexingFeatures = {};
-	VkPhysicalDeviceBufferDeviceAddressFeatures m_bufferDeviceAddressFeatures = {};
+	VkPhysicalDeviceProperties m_devProps{};
+	VkPhysicalDeviceFeatures m_devFeatures{};
+	VkPhysicalDeviceDescriptorIndexingFeatures m_descriptorIndexingFeatures{};
+	VkPhysicalDeviceBufferDeviceAddressFeatures m_bufferDeviceAddressFeatures{};
+	VkPhysicalDeviceRayTracingFeaturesKHR m_rtFeatures{};
 
 	PFN_vkDebugMarkerSetObjectNameEXT m_pfnDebugMarkerSetObjectNameEXT = nullptr;
 	PFN_vkCmdDebugMarkerBeginEXT m_pfnCmdDebugMarkerBeginEXT = nullptr;

+ 1 - 0
src/anki/gr/vulkan/VulkanObject.cpp

@@ -17,6 +17,7 @@
 #include <anki/gr/vulkan/OcclusionQueryImpl.h>
 #include <anki/gr/vulkan/TimestampQueryImpl.h>
 #include <anki/gr/vulkan/FenceImpl.h>
+#include <anki/gr/vulkan/AccelerationStructureImpl.h>
 
 namespace anki
 {

+ 1 - 1
thirdparty

@@ -1 +1 @@
-Subproject commit 21057dacf51dddfb7417d5651eda05094a630776
+Subproject commit 7c2bf60bb3829ff35d2f1f8baaa3d4fae74e2429