瀏覽代碼

Improve sizes of some structures

Panagiotis Christopoulos Charitos 6 年之前
父節點
當前提交
341ff44083

+ 12 - 12
src/anki/gr/GrObject.cpp

@@ -10,27 +10,27 @@ namespace anki
 {
 
 GrObject::GrObject(GrManager* manager, GrObjectType type, CString name)
-	: m_refcount(0)
-	, m_manager(manager)
+	: m_manager(manager)
 	, m_uuid(m_manager->getNewUuid())
+	, m_refcount(0)
 	, m_type(type)
 {
-	if(name && name.getLength())
+	if(!name || name.getLength() == 0)
 	{
-		ANKI_ASSERT(name.getLength() <= MAX_GR_OBJECT_NAME_LENGTH);
-		memcpy(&m_name[0], &name[0], name.getLength() + 1);
-	}
-	else
-	{
-		m_name[0] = 'N';
-		m_name[1] = '/';
-		m_name[2] = 'A';
-		m_name[3] = '\0';
+		name = "N/A";
 	}
+
+	m_name = static_cast<char*>(manager->getAllocator().getMemoryPool().allocate(name.getLength() + 1, alignof(char)));
+	memcpy(const_cast<char*>(&m_name[0]), &name[0], name.getLength() + 1);
 }
 
 GrObject::~GrObject()
 {
+	if(m_name)
+	{
+		char* ptr = const_cast<char*>(&m_name[0]);
+		m_manager->getAllocator().getMemoryPool().free(ptr);
+	}
 }
 
 GrAllocator<U8> GrObject::getAllocator() const

+ 3 - 3
src/anki/gr/GrObject.h

@@ -71,15 +71,15 @@ public:
 	/// Get its name.
 	CString getName() const
 	{
-		return &m_name[0];
+		return m_name;
 	}
 
 private:
-	Atomic<I32> m_refcount;
 	GrManager* m_manager;
+	CString m_name;
 	U64 m_uuid;
+	Atomic<I32> m_refcount;
 	GrObjectType m_type;
-	Array<char, MAX_GR_OBJECT_NAME_LENGTH + 1> m_name;
 };
 /// @}
 

+ 18 - 0
src/anki/gr/ShaderCompiler.cpp

@@ -412,6 +412,24 @@ Error ShaderCompiler::compile(CString source, const ShaderCompilerOptions& optio
 		}
 	}
 
+#if 0
+	// Dump
+	{
+		static I id = 0;
+
+		String homeDir;
+		ANKI_CHECK(getHomeDirectory(m_alloc, homeDir));
+
+		File file;
+		ANKI_CHECK(
+			file.open(StringAuto(m_alloc).sprintf("%s/.anki/cache/%d.dump.glsl", homeDir.cstr(), id++).toCString(),
+				FileOpenFlag::WRITE));
+		ANKI_CHECK(file.write(&fullSrc[0], fullSrc.getLength() + 1));
+
+		homeDir.destroy(m_alloc);
+	}
+#endif
+
 	return err;
 }
 

+ 6 - 4
src/anki/gr/vulkan/CommandBufferFactory.h

@@ -64,15 +64,17 @@ public:
 	}
 
 private:
-	CommandBufferThreadAllocator* m_threadAlloc;
-	Atomic<I32> m_refcount = {0};
 	StackAllocator<U8> m_fastAlloc;
 	VkCommandBuffer m_handle = {};
 
+	MicroFencePtr m_fence;
 	DynamicArray<IntrusivePtr<GrObject>> m_objectRefs;
-	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
 
-	MicroFencePtr m_fence;
+	// Cacheline boundary
+
+	CommandBufferThreadAllocator* m_threadAlloc;
+	Atomic<I32> m_refcount = {0};
+	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
 
 	void destroy();
 	void reset();

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

@@ -539,13 +539,13 @@ void CommandBufferImpl::flushQueryResets()
 
 void CommandBufferImpl::flushWriteQueryResults()
 {
-	if(m_writeQueryAtomCount == 0)
+	if(m_writeQueryAtoms.getSize() == 0)
 	{
 		return;
 	}
 
 	std::sort(&m_writeQueryAtoms[0],
-		&m_writeQueryAtoms[0] + m_writeQueryAtomCount,
+		&m_writeQueryAtoms[0] + m_writeQueryAtoms.getSize(),
 		[](const WriteQueryAtom& a, const WriteQueryAtom& b) -> Bool {
 			if(a.m_pool != b.m_pool)
 			{
@@ -571,7 +571,7 @@ void CommandBufferImpl::flushWriteQueryResults()
 	VkQueryPool pool = m_writeQueryAtoms[0].m_pool;
 	PtrSize offset = m_writeQueryAtoms[0].m_offset;
 	VkBuffer buff = m_writeQueryAtoms[0].m_buffer;
-	for(U i = 1; i < m_writeQueryAtomCount; ++i)
+	for(U i = 1; i < m_writeQueryAtoms.getSize(); ++i)
 	{
 		const WriteQueryAtom& crnt = m_writeQueryAtoms[i];
 		const WriteQueryAtom& prev = m_writeQueryAtoms[i - 1];
@@ -599,7 +599,7 @@ void CommandBufferImpl::flushWriteQueryResults()
 	vkCmdCopyQueryPoolResults(
 		m_handle, pool, firstQuery, queryCount, buff, offset, sizeof(U32), VK_QUERY_RESULT_PARTIAL_BIT);
 
-	m_writeQueryAtomCount = 0;
+	m_writeQueryAtoms.resize(m_alloc, 0);
 }
 
 void CommandBufferImpl::copyBufferToTextureViewInternal(

+ 2 - 3
src/anki/gr/vulkan/CommandBufferImpl.h

@@ -338,21 +338,21 @@ private:
 
 	MicroCommandBufferPtr m_microCmdb;
 	VkCommandBuffer m_handle = VK_NULL_HANDLE;
+	ThreadId m_tid = ~ThreadId(0);
 	CommandBufferFlag m_flags = CommandBufferFlag::NONE;
 	Bool m_renderedToDefaultFb = false;
 	Bool m_finalized = false;
 	Bool m_empty = true;
 	Bool m_beganRecording = false;
-	ThreadId m_tid = ~ThreadId(0);
 #if ANKI_EXTRA_CHECKS
 	U32 m_commandCount = 0;
 	U32 m_setPushConstantsSize = 0;
 #endif
 
-	U m_rpCommandCount = 0; ///< Number of drawcalls or pushed cmdbs in rp.
 	FramebufferPtr m_activeFb;
 	Array<U32, 4> m_renderArea = {{0, 0, MAX_U32, MAX_U32}};
 	Array<U32, 2> m_fbSize = {{0, 0}};
+	U32 m_rpCommandCount = 0; ///< Number of drawcalls or pushed cmdbs in rp.
 	Array<TextureUsageBit, MAX_COLOR_ATTACHMENTS> m_colorAttachmentUsages = {};
 	TextureUsageBit m_depthStencilAttachmentUsage = TextureUsageBit::NONE;
 
@@ -419,7 +419,6 @@ private:
 	};
 
 	DynamicArray<WriteQueryAtom> m_writeQueryAtoms;
-	U16 m_writeQueryAtomCount = 0;
 	/// @}
 
 	/// @name push_second_level_batch

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

@@ -652,18 +652,13 @@ inline void CommandBufferImpl::writeOcclusionQueryResultToBuffer(
 #if ANKI_BATCH_COMMANDS
 	flushBatches(CommandBufferCommandType::WRITE_QUERY_RESULT);
 
-	if(m_writeQueryAtoms.getSize() <= m_writeQueryAtomCount)
-	{
-		m_writeQueryAtoms.resize(m_alloc, max<U>(2, m_writeQueryAtomCount * 2));
-	}
-
 	WriteQueryAtom atom;
 	atom.m_pool = q.m_handle.m_pool;
 	atom.m_queryIdx = q.m_handle.m_queryIndex;
 	atom.m_buffer = impl.getHandle();
 	atom.m_offset = offset;
 
-	m_writeQueryAtoms[m_writeQueryAtomCount++] = atom;
+	m_writeQueryAtoms.emplaceBack(m_alloc, atom);
 #else
 	ANKI_CMD(vkCmdCopyQueryPoolResults(m_handle,
 				 q.m_handle.m_pool,

+ 13 - 10
src/anki/gr/vulkan/DescriptorSet.h

@@ -65,23 +65,23 @@ private:
 class TextureBinding
 {
 public:
-	const TextureViewImpl* m_texView = nullptr;
-	const MicroSampler* m_sampler = nullptr;
-	VkImageLayout m_layout = VK_IMAGE_LAYOUT_MAX_ENUM;
+	const TextureViewImpl* m_texView;
+	const MicroSampler* m_sampler;
+	VkImageLayout m_layout;
 };
 
 class BufferBinding
 {
 public:
-	const BufferImpl* m_buff = nullptr;
-	PtrSize m_offset = MAX_PTR_SIZE;
-	PtrSize m_range = 0;
+	const BufferImpl* m_buff;
+	PtrSize m_offset;
+	PtrSize m_range;
 };
 
 class ImageBinding
 {
 public:
-	const TextureViewImpl* m_texView = nullptr;
+	const TextureViewImpl* m_texView;
 };
 
 class AnyBinding
@@ -90,9 +90,12 @@ public:
 	DescriptorType m_type = DescriptorType::COUNT;
 	Array<U64, 2> m_uuids = {};
 
-	TextureBinding m_tex;
-	BufferBinding m_buff;
-	ImageBinding m_image;
+	union
+	{
+		TextureBinding m_tex;
+		BufferBinding m_buff;
+		ImageBinding m_image;
+	};
 };
 
 /// A state tracker of descriptors.

+ 24 - 24
src/anki/gr/vulkan/Pipeline.h

@@ -22,7 +22,7 @@ namespace anki
 class PPVertexBufferBinding : public NonCopyable
 {
 public:
-	PtrSize m_stride = MAX_PTR_SIZE; ///< Vertex stride.
+	U32 m_stride = MAX_U32; ///< Vertex stride.
 	VertexStepRate m_stepRate = VertexStepRate::VERTEX;
 
 	Bool operator==(const PPVertexBufferBinding& b) const
@@ -442,27 +442,6 @@ public:
 private:
 	PipelineInfoState m_state;
 
-	class Hashes
-	{
-	public:
-		U64 m_prog;
-		Array<U64, MAX_VERTEX_ATTRIBUTES> m_vertexAttribs;
-		U64 m_ia;
-		U64 m_raster;
-		U64 m_depth;
-		U64 m_stencil;
-		U64 m_color;
-		Array<U64, MAX_COLOR_ATTACHMENTS> m_colAttachments;
-
-		U64 m_superHash;
-		U64 m_lastSuperHash;
-
-		Hashes()
-		{
-			zeroMemory(*this);
-		}
-	} m_hashes;
-
 	enum class DirtyBit : U8
 	{
 		PROG = 1 << 0,
@@ -500,12 +479,33 @@ private:
 	BitSet<MAX_COLOR_ATTACHMENTS, U8> m_shaderColorAttachmentWritemask = {false};
 
 	// Renderpass info
+	VkRenderPass m_rpass = VK_NULL_HANDLE;
+	FramebufferPtr m_fb; ///< Hold the reference.
 	Bool m_fbDepth = false;
 	Bool m_fbStencil = false;
 	Bool m_defaultFb = false;
 	BitSet<MAX_COLOR_ATTACHMENTS, U8> m_fbColorAttachmentMask = {false};
-	VkRenderPass m_rpass = VK_NULL_HANDLE;
-	FramebufferPtr m_fb; ///< Hold the reference.
+
+	class Hashes
+	{
+	public:
+		U64 m_prog;
+		Array<U64, MAX_VERTEX_ATTRIBUTES> m_vertexAttribs;
+		U64 m_ia;
+		U64 m_raster;
+		U64 m_depth;
+		U64 m_stencil;
+		U64 m_color;
+		Array<U64, MAX_COLOR_ATTACHMENTS> m_colAttachments;
+
+		U64 m_superHash;
+		U64 m_lastSuperHash;
+
+		Hashes()
+		{
+			zeroMemory(*this);
+		}
+	} m_hashes;
 
 	// Create info
 	class CreateInfo