Browse Source

More RT bug fixes

Panagiotis Christopoulos Charitos 5 years ago
parent
commit
fc0aabd7a4

+ 7 - 1
src/anki/gr/vulkan/AccelerationStructureImpl.cpp

@@ -20,6 +20,8 @@ AccelerationStructureImpl::~AccelerationStructureImpl()
 	{
 		getGrManagerImpl().getGpuMemoryManager().freeMemory(m_memHandle);
 	}
+
+	m_topLevelInfo.m_instances.destroy(getAllocator());
 }
 
 Error AccelerationStructureImpl::init(const AccelerationStructureInitInfo& inf)
@@ -201,6 +203,10 @@ void AccelerationStructureImpl::initBuildInfo()
 			m_topLevelInfo.m_instancesBuff->unmap();
 		}
 
+		m_geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
+		m_geometry.geometryType = VK_GEOMETRY_TYPE_INSTANCES_KHR;
+		m_geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR; // TODO
+
 		VkAccelerationStructureGeometryInstancesDataKHR& inst = m_geometry.geometry.instances;
 		inst.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR;
 		inst.arrayOfPointers = false;
@@ -238,7 +244,7 @@ void AccelerationStructureImpl::computeBarrierInfo(AccelerationStructureUsageBit
 {
 	// Before
 	srcStages = 0;
-	dstStages = 0;
+	srcAccesses = 0;
 
 	if(before == AccelerationStructureUsageBit::NONE)
 	{

+ 3 - 3
src/anki/gr/vulkan/AccelerationStructureImpl.h

@@ -76,10 +76,10 @@ private:
 
 	U32 m_scratchBufferSize = 0;
 
-	VkAccelerationStructureBuildGeometryInfoKHR m_buildInfo{};
-	VkAccelerationStructureGeometryKHR m_geometry{};
+	VkAccelerationStructureBuildGeometryInfoKHR m_buildInfo = {};
+	VkAccelerationStructureGeometryKHR m_geometry = {};
 	VkAccelerationStructureGeometryKHR* m_geometryPtr = &m_geometry;
-	VkAccelerationStructureBuildOffsetInfoKHR m_offsetInfo{};
+	VkAccelerationStructureBuildOffsetInfoKHR m_offsetInfo = {};
 
 	void initBuildInfo();
 };

+ 1 - 1
src/anki/gr/vulkan/CommandBufferImpl.cpp

@@ -346,7 +346,7 @@ void CommandBufferImpl::generateMipmaps2d(TextureViewPtr texView)
 
 void CommandBufferImpl::flushBarriers()
 {
-	if(m_imgBarrierCount == 0 && m_buffBarrierCount == 0)
+	if(m_imgBarrierCount == 0 && m_buffBarrierCount == 0 && m_memBarrierCount == 0)
 	{
 		return;
 	}

+ 1 - 1
src/anki/gr/vulkan/CommandBufferImpl.inl.h

@@ -269,7 +269,7 @@ inline void CommandBufferImpl::setAccelerationStructureBarrierInternal(Accelerat
 #if ANKI_BATCH_COMMANDS
 	flushBatches(CommandBufferCommandType::SET_BARRIER);
 
-	VkMemoryBarrier memBarrier{};
+	VkMemoryBarrier memBarrier = {};
 	memBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
 	memBarrier.srcAccessMask = srcAccess;
 	memBarrier.dstAccessMask = dstAccess;

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

@@ -525,6 +525,16 @@ Error GrManagerImpl::initDevice(const GrManagerInitInfo& init)
 				extensionsToEnable[extensionsToEnableCount++] = VK_KHR_RAY_TRACING_EXTENSION_NAME;
 				m_capabilities.m_rayTracingEnabled = true;
 			}
+			else if(CString(extensionInfos[extCount].extensionName) == VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME
+					&& init.m_config->getBool("gr_rayTracing"))
+			{
+				extensionsToEnable[extensionsToEnableCount++] = VK_KHR_DEFERRED_HOST_OPERATIONS_EXTENSION_NAME;
+			}
+			else if(CString(extensionInfos[extCount].extensionName) == VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME
+					&& init.m_config->getBool("gr_rayTracing"))
+			{
+				extensionsToEnable[extensionsToEnableCount++] = VK_KHR_PIPELINE_LIBRARY_EXTENSION_NAME;
+			}
 		}
 
 		// Enable the bindless features required

+ 14 - 15
tests/gr/Gr.cpp

@@ -302,9 +302,11 @@ static StagingGpuMemoryManager* stagingMem = nullptr;
 	ANKI_TEST_EXPECT_NO_ERR(stagingMem->init(gr, cfg)); \
 	TransferGpuAllocator* transfAlloc = new TransferGpuAllocator(); \
 	ANKI_TEST_EXPECT_NO_ERR(transfAlloc->init(128_MB, gr, gr->getAllocator())); \
+	while(true) \
 	{
 
 #define COMMON_END() \
+	break; \
 	} \
 	gr->finish(); \
 	delete transfAlloc; \
@@ -2362,7 +2364,7 @@ ANKI_TEST(Gr, RayQuery)
 	BufferPtr idxBuffer;
 	if(useRayTracing)
 	{
-		Array<U16, 3> indices{0, 1, 2};
+		Array<U16, 3> indices = {0, 1, 2};
 		BufferInitInfo init;
 		init.m_access = BufferMapAccessBit::WRITE;
 		init.m_usage = BufferUsageBit::INDEX;
@@ -2378,7 +2380,7 @@ ANKI_TEST(Gr, RayQuery)
 	BufferPtr vertBuffer;
 	if(useRayTracing)
 	{
-		Array<Vec4, 3> verts{{{-1.0f, 0.0f, 0.0f, 100.0f}, {1.0f, 0.0f, 0.0f, 100.0f}, {0.0f, 2.0f, 0.0f, 100.0f}}};
+		Array<Vec4, 3> verts = {{{-1.0f, 0.0f, 0.0f, 100.0f}, {1.0f, 0.0f, 0.0f, 100.0f}, {0.0f, 2.0f, 0.0f, 100.0f}}};
 
 		BufferInitInfo init;
 		init.m_access = BufferMapAccessBit::WRITE;
@@ -2414,7 +2416,7 @@ ANKI_TEST(Gr, RayQuery)
 	{
 		AccelerationStructureInitInfo init;
 		init.m_type = AccelerationStructureType::TOP_LEVEL;
-		Array<AccelerationStructureInstance, 1> instances{{{blas, Mat3x4::getIdentity()}}};
+		Array<AccelerationStructureInstance, 1> instances = {{{blas, Mat3x4::getIdentity()}}};
 		init.m_topLevel.m_instances = instances;
 
 		tlas = gr->newAccelerationStructure(init);
@@ -2486,15 +2488,16 @@ void main()
 	const Vec3 rayOrigin = u_cameraPos;
 
 #if USE_RAY_TRACING
+	Bool hit = false;
+	F32 u = 0.0;
+	F32 v = 0.0;
+
 	rayQueryEXT rayQuery;
 	rayQueryInitializeEXT(rayQuery, u_tlas, gl_RayFlagsOpaqueEXT | gl_RayFlagsTerminateOnFirstHitEXT, 0xFFu, rayOrigin,
 		0.01, rayDir, 1000.0);
 
 	rayQueryProceedEXT(rayQuery);
 
-	Bool hit;
-	F32 u;
-	F32 v;
 	const U32 committedStatus = rayQueryGetIntersectionTypeEXT(rayQuery, true);
 	if(committedStatus == gl_RayQueryCommittedIntersectionTriangleEXT)
 	{
@@ -2503,10 +2506,6 @@ void main()
 		v = bary.y;
 		hit = true;
 	}
-	else
-	{
-		hit = false;
-	}
 #else
 	// Manual trace
 	Vec3 arr[3] = Vec3[](Vec3(-1.0f, 0.0f, 0.0f), Vec3(1.0f, 0.0f, 0.0f), Vec3(0.0f, 2.0f, 0.0f));
@@ -2522,7 +2521,7 @@ void main()
 	}
 	else
 	{
-		out_color = Vec3(0.5);
+		out_color = Vec3(mix(0.5, 0.2, in_uv.x));
 	}
 }
 		)";
@@ -2555,21 +2554,21 @@ void main()
 
 		cmdb->setAccelerationStructureBarrier(tlas, AccelerationStructureUsageBit::NONE,
 											  AccelerationStructureUsageBit::BUILD);
-		cmdb->buildAccelerationStructure(blas);
-		cmdb->setAccelerationStructureBarrier(blas, AccelerationStructureUsageBit::BUILD,
+		cmdb->buildAccelerationStructure(tlas);
+		cmdb->setAccelerationStructureBarrier(tlas, AccelerationStructureUsageBit::BUILD,
 											  AccelerationStructureUsageBit::FRAGMENT_READ);
 
 		cmdb->flush();
 	}
 
 	// Draw
-	constexpr U32 ITERATIONS = 300;
+	constexpr U32 ITERATIONS = 200;
 	for(U i = 0; i < ITERATIONS; ++i)
 	{
 		HighRezTimer timer;
 		timer.start();
 
-		const Vec4 cameraPos{0.0f, 0.0f, 3.0f, 0.0f};
+		const Vec4 cameraPos = {0.0f, 0.0f, 3.0f, 0.0f};
 		const Mat4 viewMat = Mat4{Transform{cameraPos, Mat3x4::getIdentity(), 1.0f}}.getInverse();
 		const Mat4 projMat = Mat4::calculatePerspectiveProjectionMatrix(toRad(90.0f), toRad(90.0f), 0.01f, 1000.0f);
 

+ 1 - 1
tools/count_lines.sh

@@ -1 +1 @@
-wc -l `find ./src ./tests ./sandbox ./tools ./shaders ./samples -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.glsl' -o -name '*.py' -o -name '*.glslp' -o -name '*.xml' `
+wc -l `find ./src ./tests ./sandbox ./tools ./shaders ./samples -name '*.h' -o -name '*.hpp' -o -name '*.c' -o -name '*.cpp' -o -name '*.glsl' -o -name '*.py' -o -name '*.ankiprog' -o -name '*.xml' `