Panagiotis Christopoulos Charitos пре 8 година
родитељ
комит
003e68b9df

+ 3 - 4
CMakeLists.txt

@@ -176,7 +176,7 @@ if(${CMAKE_BUILD_TYPE} STREQUAL "Release")
 
 	set(CMAKE_CXX_FLAGS_RELEASE "")
 	set(CMAKE_C_FLAGS_RELEASE "")
-elseif(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDbgInfo")
+elseif(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
 	set(COMPILER_FLAGS "${COMPILER_FLAGS} -O3 -g3 ")
 
 	set(CMAKE_CXX_FLAGS_RELWITHDBGINFO "")
@@ -305,7 +305,7 @@ if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
 elseif(${CMAKE_BUILD_TYPE} STREQUAL "Release")
 	set(ANKI_DEBUG_SYMBOLS 0)
 	set(ANKI_OPTIMIZE 1)
-elseif(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDbgInfo")
+elseif(${CMAKE_BUILD_TYPE} STREQUAL "RelWithDebInfo")
 	set(ANKI_DEBUG_SYMBOLS 1)
 	set(ANKI_OPTIMIZE 1)
 else()
@@ -379,8 +379,7 @@ elseif(WINDOWS)
 		set(_SYS vulkan-1)
 	endif()
 
-	set(_SYS ${_SYS} version Imm32 Winmm)
-	add_definitions(-DGLEW_STATIC -D_NEWTON_STATIC_LIB)
+	set(_SYS ${_SYS} version Imm32 Winmm DbgHelp)
 else()
 	message(FATAL_ERROR "Unhandled case")
 endif()

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

@@ -49,6 +49,7 @@ CommandBufferImpl::~CommandBufferImpl()
 	m_buffBarriers.destroy(m_alloc);
 	m_queryResetAtoms.destroy(m_alloc);
 	m_writeQueryAtoms.destroy(m_alloc);
+	m_secondLevelAtoms.destroy(m_alloc);
 
 	m_texUsageTracker.destroy(m_alloc);
 }

+ 7 - 0
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -35,6 +35,7 @@ enum class CommandBufferCommandType : U8
 	SET_BARRIER,
 	RESET_OCCLUSION_QUERY,
 	WRITE_QUERY_RESULT,
+	PUSH_SECOND_LEVEL,
 	ANY_OTHER_COMMAND
 };
 
@@ -378,6 +379,12 @@ private:
 	U16 m_writeQueryAtomCount = 0;
 	/// @}
 
+	/// @name push_second_level_batch
+	/// @{
+	DynamicArray<VkCommandBuffer> m_secondLevelAtoms;
+	U16 m_secondLevelAtomCount = 0;
+	/// @}
+
 	/// Track texture usage.
 	class TextureUsageTracker
 	{

+ 15 - 0
src/anki/gr/vulkan/CommandBufferImpl.inl.h

@@ -407,7 +407,18 @@ inline void CommandBufferImpl::pushSecondLevelCommandBuffer(CommandBufferPtr cmd
 		beginRenderPassInternal();
 	}
 
+#if ANKI_BATCH_COMMANDS
+	flushBatches(CommandBufferCommandType::PUSH_SECOND_LEVEL);
+
+	if(m_secondLevelAtoms.getSize() <= m_secondLevelAtomCount)
+	{
+		m_secondLevelAtoms.resize(m_alloc, max<U>(8, m_secondLevelAtomCount * 2));
+	}
+
+	m_secondLevelAtoms[m_secondLevelAtomCount++] = cmdb->m_impl->m_handle;
+#else
 	ANKI_CMD(vkCmdExecuteCommands(m_handle, 1, &cmdb->m_impl->m_handle), ANY_OTHER_COMMAND);
+#endif
 
 	++m_rpCommandCount;
 	m_cmdbList.pushBack(m_alloc, cmdb);
@@ -538,6 +549,10 @@ inline void CommandBufferImpl::flushBatches(CommandBufferCommandType type)
 		case CommandBufferCommandType::WRITE_QUERY_RESULT:
 			flushWriteQueryResults();
 			break;
+		case CommandBufferCommandType::PUSH_SECOND_LEVEL:
+			ANKI_ASSERT(m_secondLevelAtomCount > 0);
+			vkCmdExecuteCommands(m_handle, m_secondLevelAtomCount, &m_secondLevelAtoms[0]);
+			break;
 		case CommandBufferCommandType::ANY_OTHER_COMMAND:
 			break;
 		default:

+ 11 - 6
src/anki/gr/vulkan/DescriptorSet.cpp

@@ -466,7 +466,7 @@ void DescriptorSetState::flush(Bool& stateDirty,
 
 	// Get cache entry
 	ANKI_ASSERT(m_layout.m_entry);
-	DSLayoutCacheEntry& entry = *m_layout.m_entry;
+	const DSLayoutCacheEntry& entry = *m_layout.m_entry;
 
 	// Early out if nothing happened
 	if(!m_anyBindingDirty && !m_layoutDirty)
@@ -475,8 +475,7 @@ void DescriptorSetState::flush(Bool& stateDirty,
 		return;
 	}
 
-	m_anyBindingDirty = false;
-	m_layoutDirty = false;
+	Bool dynamicOffsetsDirty = false;
 
 	// Compute the hash
 	Array<U64, MAX_BINDINGS_PER_DESCRIPTOR_SET * 2 * 2> toHash;
@@ -494,13 +493,15 @@ void DescriptorSetState::flush(Bool& stateDirty,
 			{
 			case DescriptorType::TEXTURE:
 				toHash[toHashCount++] = m_bindings[i].m_uuids[1];
-				toHash[toHashCount++] = U(m_bindings[i].m_tex.m_aspect);
-				toHash[toHashCount++] = U(m_bindings[i].m_tex.m_layout);
+				toHash[toHashCount++] = U64(m_bindings[i].m_tex.m_aspect);
+				toHash[toHashCount++] = U64(m_bindings[i].m_tex.m_layout);
 				break;
 			case DescriptorType::UNIFORM_BUFFER:
 			case DescriptorType::STORAGE_BUFFER:
 				toHash[toHashCount++] = m_bindings[i].m_buff.m_range;
+
 				dynamicOffsets[dynamicOffsetCount++] = m_bindings[i].m_buff.m_offset;
+				dynamicOffsetsDirty = dynamicOffsetsDirty || m_dynamicOffsetDirty.get(i);
 				break;
 			case DescriptorType::IMAGE:
 				toHash[toHashCount++] = m_bindings[i].m_image.m_level;
@@ -513,7 +514,7 @@ void DescriptorSetState::flush(Bool& stateDirty,
 
 	hash = (toHashCount == 1) ? toHash[0] : computeHash(&toHash[0], toHashCount * sizeof(U64));
 
-	if(hash != m_lastHash)
+	if(hash != m_lastHash || dynamicOffsetsDirty)
 	{
 		m_lastHash = hash;
 		stateDirty = true;
@@ -522,6 +523,10 @@ void DescriptorSetState::flush(Bool& stateDirty,
 	{
 		stateDirty = false;
 	}
+
+	m_anyBindingDirty = false;
+	m_layoutDirty = false;
+	m_dynamicOffsetDirty.unsetAll();
 }
 
 DescriptorSetFactory::~DescriptorSetFactory()

+ 6 - 2
src/anki/gr/vulkan/DescriptorSet.h

@@ -106,6 +106,7 @@ public:
 	void setLayout(const DescriptorSetLayout& layout)
 	{
 		m_layout = layout;
+		m_layoutDirty = true;
 	}
 
 	void bindTexture(U binding, Texture* tex, DepthStencilAspectBit aspect, VkImageLayout layout)
@@ -146,6 +147,7 @@ public:
 		m_bindings[binding].m_buff.m_range = range;
 
 		m_anyBindingDirty = true;
+		m_dynamicOffsetDirty.set(binding);
 	}
 
 	void bindStorageBuffer(U binding, Buffer* buff, PtrSize offset, PtrSize range)
@@ -158,6 +160,7 @@ public:
 		m_bindings[binding].m_buff.m_range = range;
 
 		m_anyBindingDirty = true;
+		m_dynamicOffsetDirty.set(binding);
 	}
 
 	void bindImage(U binding, Texture* tex, U32 level)
@@ -176,8 +179,9 @@ private:
 
 	Array<AnyBinding, MAX_BINDINGS_PER_DESCRIPTOR_SET> m_bindings;
 
-	Bool8 m_anyBindingDirty = false;
-	Bool8 m_layoutDirty = false;
+	Bool8 m_anyBindingDirty = true;
+	Bool8 m_layoutDirty = true;
+	BitSet<MAX_BINDINGS_PER_DESCRIPTOR_SET> m_dynamicOffsetDirty = {true};
 	U64 m_lastHash = 0;
 
 	/// Only DescriptorSetFactory should call this.

+ 2 - 0
src/anki/gr/vulkan/FramebufferImpl.cpp

@@ -28,6 +28,8 @@ FramebufferImpl::~FramebufferImpl()
 		vkDestroyRenderPass(getDevice(), rpass, nullptr);
 	}
 
+	m_rpasses.destroy(getAllocator());
+
 	if(m_compatibleOrDefaultRpass)
 	{
 		vkDestroyRenderPass(getDevice(), m_compatibleOrDefaultRpass, nullptr);

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

@@ -273,6 +273,7 @@ const VkGraphicsPipelineCreateInfo& PipelineStateTracker::updatePipelineCreateIn
 			dsCi.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
 			dsCi.depthTestEnable = m_state.m_depth.m_depthCompareFunction != CompareOperation::ALWAYS
 				|| m_state.m_depth.m_depthWriteEnabled;
+			dsCi.depthWriteEnable = m_state.m_depth.m_depthWriteEnabled;
 			dsCi.depthCompareOp = convertCompareOp(m_state.m_depth.m_depthCompareFunction);
 		}
 

+ 20 - 1
src/anki/util/Assert.cpp

@@ -26,7 +26,26 @@ void akassert(const char* exprTxt, const char* file, int line, const char* func)
 	fprintf(stderr, "(%s:%d %s) Assertion failed: %s\n", file, line, func, exprTxt);
 #endif
 
-	printBacktrace();
+	class BW : public BackTraceWalker
+	{
+	public:
+		BW()
+			: BackTraceWalker(10)
+		{
+		}
+
+		U m_c = 0;
+
+		void operator()(const char* symbol)
+		{
+			printf("%.2u: %s\n", unsigned(m_c++), symbol);
+		}
+	};
+
+	BW bw;
+	printf("Backtrace:\n");
+	bw.exec();
+
 	abort();
 }
 

+ 1 - 1
src/anki/util/StdTypes.h

@@ -5,7 +5,7 @@
 
 #pragma once
 
-#include <anki/Config.h>
+#include <anki/util/Common.h>
 #include <cstdint>
 #include <cstddef>
 #include <limits>

+ 24 - 10
src/anki/util/System.cpp

@@ -4,14 +4,14 @@
 // http://www.anki3d.org/LICENSE
 
 #include <anki/util/System.h>
-#include <anki/Config.h>
+#include <anki/util/Logger.h>
 #include <cstdio>
 
 #if ANKI_POSIX
 #include <unistd.h>
 #include <signal.h>
 #elif ANKI_OS == ANKI_OS_WINDOWS
-#include <Windows.h>
+#include <windows.h>
 #else
 #error "Unimplemented"
 #endif
@@ -19,6 +19,7 @@
 // For print backtrace
 #if ANKI_POSIX && ANKI_OS != ANKI_OS_ANDROID
 #include <execinfo.h>
+#include <cstdlib>
 #endif
 
 namespace anki
@@ -37,19 +38,32 @@ U32 getCpuCoresCount()
 #endif
 }
 
-void printBacktrace()
+void BackTraceWalker::exec()
 {
 #if ANKI_POSIX && ANKI_OS != ANKI_OS_ANDROID
-	void* array[10];
-	size_t size;
+	// Get addresses's for all entries on the stack
+	void** array = static_cast<void**>(malloc(m_stackSize * sizeof(void*)));
+	if(array)
+	{
+		size_t size = backtrace(array, m_stackSize);
 
-	// get void*'s for all entries on the stack
-	size = backtrace(array, 10);
+		// Get symbols
+		char** strings = backtrace_symbols(array, size);
 
-	// print out all the frames to stderr
-	backtrace_symbols_fd(array, size, 2);
+		if(strings)
+		{
+			for(size_t i = 0; i < size; ++i)
+			{
+				operator()(strings[i]);
+			}
+
+			free(strings);
+		}
+
+		free(array);
+	}
 #else
-	printf("TODO\n");
+	ANKI_UTIL_LOGW("BackTraceWalker::exec() Not supported in this platform");
 #endif
 }
 

+ 19 - 5
src/anki/util/System.h

@@ -14,14 +14,28 @@ namespace anki
 /// @{
 
 /// Get the number of CPU cores
-extern U32 getCpuCoresCount();
+U32 getCpuCoresCount();
 
-/// Print the backtrace
-extern void printBacktrace();
+/// Visit the program stack.
+class BackTraceWalker
+{
+public:
+	BackTraceWalker(U stackSize = 50)
+		: m_stackSize(stackSize)
+	{
+	}
+
+	virtual ~BackTraceWalker()
+	{
+	}
+
+	virtual void operator()(const char* symbol) = 0;
 
-/// Trap the sefaults.
-extern void trapSegfaults(void (*)(void*));
+	void exec();
 
+private:
+	U m_stackSize;
+};
 /// @}
 
 } // end namespace anki

+ 9 - 0
tests/gr/Gr.cpp

@@ -1020,8 +1020,17 @@ static void drawOffscreen(GrManager& gr, Bool useSecondLevel)
 			cinit.m_framebuffer = fb;
 			CommandBufferPtr cmdb2 = gr.newInstance<CommandBuffer>(cinit);
 
+			cmdb2->informTextureSurfaceCurrentUsage(
+				col0, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
+			cmdb2->informTextureSurfaceCurrentUsage(
+				col1, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::FRAMEBUFFER_ATTACHMENT_WRITE);
+			cmdb2->informTextureSurfaceCurrentUsage(
+				dp, TextureSurfaceInfo(0, 0, 0, 0), TextureUsageBit::FRAMEBUFFER_ATTACHMENT_READ_WRITE);
+
 			drawOffscreenDrawcalls(gr, prog, cmdb2, TEX_SIZE, indices, verts);
 
+			cmdb2->flush();
+
 			cmdb->pushSecondLevelCommandBuffer(cmdb2);
 		}