浏览代码

Add atomic buffers

Panagiotis Christopoulos Charitos 10 年之前
父节点
当前提交
f4d7e04193

+ 3 - 0
include/anki/gr/Common.h

@@ -39,6 +39,8 @@ ANKI_GR_CLASS(Framebuffer)
 ANKI_GR_CLASS(OcclusionQuery)
 ANKI_GR_CLASS(ResourceGroup)
 
+#undef ANKI_GR_CLASS
+
 /// @addtogroup graphics
 /// @{
 
@@ -69,6 +71,7 @@ const U MAX_TEXTURE_LAYERS = 32;
 const U MAX_TEXTURE_BINDINGS = 8;
 const U MAX_UNIFORM_BUFFER_BINDINGS = 1;
 const U MAX_STORAGE_BUFFER_BINDINGS = 8;
+const U MAX_ATOMIC_BUFFER_BINDINGS = 1;
 const U MAX_FRAMES_IN_FLIGHT = 3;
 const U MAX_RESOURCE_GROUPS = 2;
 

+ 3 - 1
include/anki/gr/Enums.h

@@ -280,7 +280,8 @@ enum class BufferUsageBit : U8
 	STORAGE = 1 << 1,
 	INDEX = 1 << 2,
 	VERTEX = 1 << 3,
-	INDIRECT = 1 << 4
+	INDIRECT = 1 << 4,
+	ATOMIC = 1 << 5
 };
 ANKI_ENUM_ALLOW_NUMERIC_OPERATIONS(BufferUsageBit, inline)
 
@@ -292,6 +293,7 @@ enum class BufferUsage : U8
 	INDEX,
 	VERTEX,
 	INDIRECT,
+	ATOMIC,
 	TRANSFER, ///< For texture upload and buffer write.
 
 	COUNT,

+ 1 - 0
include/anki/gr/ResourceGroup.h

@@ -41,6 +41,7 @@ public:
 	Array<TextureBinding, MAX_TEXTURE_BINDINGS> m_textures;
 	Array<BufferBinding, MAX_UNIFORM_BUFFER_BINDINGS> m_uniformBuffers;
 	Array<BufferBinding, MAX_STORAGE_BUFFER_BINDINGS> m_storageBuffers;
+	Array<BufferBinding, MAX_ATOMIC_BUFFER_BINDINGS> m_atomicBuffers;
 	Array<BufferBinding, MAX_VERTEX_ATTRIBUTES> m_vertexBuffers;
 	BufferBinding m_indexBuffer;
 	I8 m_indexSize = -1; ///< Index size in bytes. 2 or 4

+ 3 - 0
include/anki/gr/gl/ResourceGroupImpl.h

@@ -54,6 +54,9 @@ private:
 	Array<InternalBufferBinding, MAX_STORAGE_BUFFER_BINDINGS> m_ssbos;
 	U8 m_ssbosCount = 0;
 
+	Array<InternalBufferBinding, MAX_ATOMIC_BUFFER_BINDINGS> m_atomics;
+	U8 m_atomicsCount = 0;
+
 	Array<GLuint, MAX_VERTEX_ATTRIBUTES> m_vertBuffNames;
 	Array<GLintptr, MAX_VERTEX_ATTRIBUTES> m_vertBuffOffsets;
 	Bool8 m_hasDynamicVertexBuff = false;

+ 1 - 0
shaders/Common.glsl

@@ -32,6 +32,7 @@ const float PI = 3.14159265358979323846;
 #define UBO_BINDING(slot_, binding_) binding = slot_ * 1 + binding_
 #define SS_BINDING(slot_, binding_) binding = slot_ * 8 + binding_
 #define TEX_BINDING(slot_, binding_) binding = slot_ * 8 + binding_
+#define ATOMIC_BINDING(slot_, binding_) binding = slot_ * 1 + binding_
 
 // Common locations
 #define POSITION_LOCATION 0

+ 12 - 0
shaders/GaussianBlurGeneric.frag.glsl

@@ -68,6 +68,18 @@ const float OFFSETS[STEP_COUNT] = {0.64434, 2.37885, 4.29111, 6.21661};
 const uint STEP_COUNT = 5u;
 const float WEIGHTS[STEP_COUNT] = {0.19955, 0.18945, 0.08376, 0.02321, 0.00403};
 const float OFFSETS[STEP_COUNT] = {0.65319, 2.42547, 4.36803, 6.31412, 8.26479};
+#elif KERNEL_SIZE == 23
+const uint STEP_COUNT = 6u;
+const float WEIGHTS[STEP_COUNT] = {
+	0.16501, 0.17507, 0.10112, 0.04268, 0.01316, 0.00296};
+const float OFFSETS[STEP_COUNT] = {
+	0.65772, 2.45017, 4.41096, 6.37285, 8.33626, 10.30153};
+#elif KERNEL_SIZE == 27
+const int STEP_COUNT = 7;
+const float WEIGHTS[STEP_COUNT] = {
+	0.14090, 0.15927, 0.10715, 0.05747, 0.02457, 0.00837, 0.00228};
+const float OFFSETS[STEP_COUNT] = {
+	0.66025, 2.46415, 4.43572, 6.40771, 8.38028, 10.35359, 12.32779};
 #else
 #error See file
 #endif

+ 31 - 0
src/gr/gl/ResourceGroupImpl.cpp

@@ -103,6 +103,8 @@ 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);
 
 	// Init vert buffers
 	m_vertBindingsCount = 0;
@@ -200,6 +202,15 @@ void ResourceGroupImpl::initResourceReferences(
 		}
 	}
 
+	for(U i = 0; i < init.m_atomicBuffers.getSize(); ++i)
+	{
+		const BufferBinding& binding = init.m_atomicBuffers[i];
+		if(binding.m_buffer.isCreated())
+		{
+			m_refs[count++] = binding.m_buffer;
+		}
+	}
+
 	for(U i = 0; i < init.m_vertexBuffers.getSize(); ++i)
 	{
 		const BufferBinding& binding = init.m_vertexBuffers[i];
@@ -311,6 +322,26 @@ void ResourceGroupImpl::bind(
 		}
 	}
 
+	// Atomic
+	for(U i = 0; i < m_atomicsCount; ++i)
+	{
+		const auto& binding = m_atomics[i];
+		if(binding.m_name == MAX_U32)
+		{
+			// Dynamic
+			ANKI_ASSERT(0);
+		}
+		else if(binding.m_name != 0)
+		{
+			// Static
+			glBindBufferRange(GL_ATOMIC_COUNTER_BUFFER,
+				MAX_ATOMIC_BUFFER_BINDINGS * slot + i,
+				binding.m_name,
+				binding.m_offset,
+				binding.m_range);
+		}
+	}
+
 	// Vertex buffers
 	if(m_vertBindingsCount)
 	{