Ver Fonte

Memory barrier support work

Panagiotis Christopoulos Charitos há 10 anos atrás
pai
commit
07c3575427

+ 1 - 1
include/anki/gr/CommandBuffer.h

@@ -181,7 +181,7 @@ public:
 
 	/// @name Sync
 	/// @{
-	
+
 	void setPipelineBarrier(PipelineStageBit src, PipelineStageBit dst);
 
 	void setBufferMemoryBarrier(

+ 34 - 13
include/anki/gr/Enums.h

@@ -315,10 +315,10 @@ ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(BufferAccessBit, inline)
 enum class PipelineStageBit : U8
 {
 	NONE = 0,
-    VERTEX = 1 << 0,
-    FRAGMENT = 1 << 1,
-    COMPUTE = 1 << 2,
-    TRANSFER = 1 << 3,
+	VERTEX = 1 << 0,
+	FRAGMENT = 1 << 1,
+	COMPUTE = 1 << 2,
+	TRANSFER = 1 << 3,
 	CLIENT = 1 << 4
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(PipelineStageBit, inline)
@@ -326,15 +326,36 @@ ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(PipelineStageBit, inline)
 enum class ResourceAccessBit : U16
 {
 	NONE = 0,
-	INDIRECT_OR_INDEX_OR_VERTEX_OR_UNIFORM_READ = 1 << 0,
-	ATTACHMENT_READ = 1 << 1,
-	ATTACHMENT_WRITE = 1 << 2,
-	SHADER_READ = 1 << 3,
-	SHADER_WRITE = 1 << 4,
-	CLIENT_READ = 1 << 5,
-	CLIENT_WRITE = 1 << 6,
-	HOST_READ = 1 << 7,
-	HOST_WRITE = 1 << 8
+
+	/// Read from any of the bellow.
+	INDIRECT_OR_INDEX_OR_VERTEX_READ = 1 << 0,
+
+	/// Read from a uniform buffer.
+	UNIFORM_READ = 1 << 1,
+
+	/// Read an attachment (eg blending).
+	ATTACHMENT_READ = 1 << 2,
+
+	/// Write to an attachment.
+	ATTACHMENT_WRITE = 1 << 3,
+
+	/// Any resource is read from any shader.
+	SHADER_READ = 1 << 4,
+
+	/// Any resource is written from any shader.
+	SHADER_WRITE = 1 << 5,
+
+	/// Client read.
+	CLIENT_READ = 1 << 6,
+
+	/// Client write.
+	CLIENT_WRITE = 1 << 7,
+
+	/// Read as part of texture upload or buffer write commands.
+	TRANSFER_READ = 1 << 8,
+
+	/// Written as part of texture upload or buffer write commands.
+	TRANSFER_WRITE = 1 << 9
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(ResourceAccessBit, inline)
 /// @}

+ 1 - 5
include/anki/util/Functions.h

@@ -59,11 +59,7 @@ inline T clamp(T v, T minv, T maxv)
 template<typename Int>
 inline Bool isPowerOfTwo(Int x)
 {
-	while(((x % 2) == 0) && x > 1)
-	{
-		x /= 2;
-	}
-	return (x == 1);
+	return !(x == 0) && !(x & (x - 1));
 }
 
 /// Get the next power of two number. For example if x is 130 this will return

+ 66 - 0
src/gr/gl/CommandBuffer.cpp

@@ -578,4 +578,70 @@ void CommandBuffer::copyTextureToTexture(TexturePtr src,
 		src, srcSlice, srcLevel, dest, destSlice, destLevel);
 }
 
+//==============================================================================
+class SetBufferMemBarrierCommand final : public GlCommand
+{
+public:
+	GLenum m_barrier;
+
+	SetBufferMemBarrierCommand(GLenum barrier)
+		: m_barrier(barrier)
+	{
+	}
+
+	Error operator()(GlState&)
+	{
+		glMemoryBarrier(m_barrier);
+		return ErrorCode::NONE;
+	}
+};
+
+void CommandBuffer::setBufferMemoryBarrier(
+	BufferPtr buff, ResourceAccessBit src, ResourceAccessBit dst)
+{
+	const ResourceAccessBit c = dst;
+	GLenum d = GL_NONE;
+
+	if((c & ResourceAccessBit::INDIRECT_OR_INDEX_OR_VERTEX_READ)
+		!= ResourceAccessBit::NONE)
+	{
+		d |= GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT | GL_ELEMENT_ARRAY_BARRIER_BIT
+			| GL_COMMAND_BARRIER_BIT;
+	}
+
+	if((c & ResourceAccessBit::UNIFORM_READ)
+		!= ResourceAccessBit::NONE)
+	{
+		d |= GL_UNIFORM_BARRIER_BIT;
+	}
+
+	if((c & ResourceAccessBit::ATTACHMENT_READ) != ResourceAccessBit::NONE
+		|| (c & ResourceAccessBit::ATTACHMENT_WRITE) != ResourceAccessBit::NONE)
+	{
+		d |= GL_FRAMEBUFFER_BARRIER_BIT;
+	}
+
+	if((c & ResourceAccessBit::SHADER_READ) != ResourceAccessBit::NONE
+		|| (c & ResourceAccessBit::SHADER_WRITE) != ResourceAccessBit::NONE)
+	{
+		d |= GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT
+			| GL_TEXTURE_FETCH_BARRIER_BIT;
+	}
+
+	if((c & ResourceAccessBit::CLIENT_READ) != ResourceAccessBit::NONE
+		|| (c & ResourceAccessBit::CLIENT_WRITE) != ResourceAccessBit::NONE)
+	{
+		d |= GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT;
+	}
+
+	if((c & ResourceAccessBit::TRANSFER_READ) != ResourceAccessBit::NONE
+		|| (c & ResourceAccessBit::TRANSFER_WRITE) != ResourceAccessBit::NONE)
+	{
+		d |= GL_BUFFER_UPDATE_BARRIER_BIT | GL_TEXTURE_UPDATE_BARRIER_BIT;
+	}
+
+	ANKI_ASSERT(d != GL_NONE);
+	m_impl->pushBackNewCommand<SetBufferMemBarrierCommand>(d);
+}
+
 } // end namespace anki

+ 5 - 2
src/gr/gl/ResourceGroupImpl.cpp

@@ -103,8 +103,11 @@ void ResourceGroupImpl::create(const ResourceGroupInitializer& init)
 		init.m_uniformBuffers, m_ubos, m_ubosCount, resourcesCount, dynCount);
 	initBuffers(
 		init.m_storageBuffers, m_ssbos, m_ssbosCount, resourcesCount, dynCount);
-	initBuffers(
-		init.m_atomicBuffers, m_atomics, m_atomicsCount, resourcesCount, dynCount);
+	initBuffers(init.m_atomicBuffers,
+		m_atomics,
+		m_atomicsCount,
+		resourcesCount,
+		dynCount);
 
 	// Init vert buffers
 	m_vertBindingsCount = 0;

+ 3 - 0
src/renderer/Tm.cpp

@@ -65,6 +65,9 @@ void Tm::run(CommandBufferPtr& cmdb)
 	cmdb->bindResourceGroup(m_rcGroup, 0, nullptr);
 
 	cmdb->dispatchCompute(1, 1, 1);
+	cmdb->setBufferMemoryBarrier(m_luminanceBuff,
+		ResourceAccessBit::SHADER_WRITE,
+		ResourceAccessBit::SHADER_READ | ResourceAccessBit::UNIFORM_READ);
 }
 
 } // end namespace anki