Browse Source

Buffer view is working

Panagiotis Christopoulos Charitos 3 years ago
parent
commit
cbd43a837d

+ 15 - 0
AnKi/Gr/Vulkan/BufferImpl.cpp

@@ -15,6 +15,19 @@ BufferImpl::~BufferImpl()
 	BufferGarbage* garbage = getAllocator().newInstance<BufferGarbage>();
 	BufferGarbage* garbage = getAllocator().newInstance<BufferGarbage>();
 	garbage->m_bufferHandle = m_handle;
 	garbage->m_bufferHandle = m_handle;
 	garbage->m_memoryHandle = m_memHandle;
 	garbage->m_memoryHandle = m_memHandle;
+
+	if(m_views.getSize())
+	{
+		garbage->m_viewHandles.create(getAllocator(), U32(m_views.getSize()));
+
+		U32 count = 0;
+		for(auto it : m_views)
+		{
+			const VkBufferView view = it;
+			garbage->m_viewHandles[count++] = view;
+		}
+	}
+
 	getGrManagerImpl().getFrameGarbageCollector().newBufferGarbage(garbage);
 	getGrManagerImpl().getFrameGarbageCollector().newBufferGarbage(garbage);
 
 
 #if ANKI_EXTRA_CHECKS
 #if ANKI_EXTRA_CHECKS
@@ -28,6 +41,8 @@ BufferImpl::~BufferImpl()
 		ANKI_VK_LOGW("Buffer needed invalidation but you never invalidated: %s", getName().cstr());
 		ANKI_VK_LOGW("Buffer needed invalidation but you never invalidated: %s", getName().cstr());
 	}
 	}
 #endif
 #endif
+
+	m_views.destroy(getAllocator());
 }
 }
 
 
 Error BufferImpl::init(const BufferInitInfo& inf)
 Error BufferImpl::init(const BufferInitInfo& inf)

+ 6 - 0
AnKi/Gr/Vulkan/FrameGarbageCollector.cpp

@@ -73,6 +73,12 @@ void FrameGarbageCollector::collectGarbage()
 		{
 		{
 			BufferGarbage* bufferGarbage = frame.m_bufferGarbage.popBack();
 			BufferGarbage* bufferGarbage = frame.m_bufferGarbage.popBack();
 
 
+			for(VkBufferView view : bufferGarbage->m_viewHandles)
+			{
+				vkDestroyBufferView(dev, view, nullptr);
+			}
+			bufferGarbage->m_viewHandles.destroy(alloc);
+
 			if(bufferGarbage->m_bufferHandle)
 			if(bufferGarbage->m_bufferHandle)
 			{
 			{
 				vkDestroyBuffer(dev, bufferGarbage->m_bufferHandle, nullptr);
 				vkDestroyBuffer(dev, bufferGarbage->m_bufferHandle, nullptr);

+ 1 - 0
AnKi/Gr/Vulkan/FrameGarbageCollector.h

@@ -31,6 +31,7 @@ class BufferGarbage : public IntrusiveListEnabled<BufferGarbage>
 {
 {
 public:
 public:
 	VkBuffer m_bufferHandle = VK_NULL_HANDLE;
 	VkBuffer m_bufferHandle = VK_NULL_HANDLE;
+	DynamicArray<VkBufferView> m_viewHandles;
 	GpuMemoryHandle m_memoryHandle;
 	GpuMemoryHandle m_memoryHandle;
 };
 };
 
 

+ 48 - 2
Tests/Gr/GrTextureBuffer.cpp

@@ -20,15 +20,61 @@ ANKI_TEST(Gr, TextureBuffer)
 	{
 	{
 		const CString shaderSrc = R"(
 		const CString shaderSrc = R"(
 layout(binding = 0) uniform textureBuffer u_tbuff;
 layout(binding = 0) uniform textureBuffer u_tbuff;
-layout(binding = 1) uniform image2D u_img;
+layout(binding = 1) buffer b_buff
+{
+	Vec4 u_buff[];
+};
 
 
 void main()
 void main()
 {
 {
-	imageStore(u_img, IVec2(0), texelFetch(u_tbuff, I32(gl_GlobalInvocationID.x)));
+	u_buff[0] = texelFetch(u_tbuff, I32(gl_GlobalInvocationID.x));
 }
 }
 	)";
 	)";
 
 
 		ShaderPtr shader = createShader(shaderSrc, ShaderType::COMPUTE, *gr);
 		ShaderPtr shader = createShader(shaderSrc, ShaderType::COMPUTE, *gr);
+
+		ShaderProgramInitInfo progInit;
+		progInit.m_computeShader = shader;
+		ShaderProgramPtr prog = gr->newShaderProgram(progInit);
+
+		BufferInitInfo buffInit;
+		buffInit.m_mapAccess = BufferMapAccessBit::WRITE;
+		buffInit.m_size = sizeof(U8) * 4;
+		buffInit.m_usage = BufferUsageBit::ALL_TEXTURE;
+		BufferPtr texBuff = gr->newBuffer(buffInit);
+
+		I8* data = static_cast<I8*>(texBuff->map(0, MAX_PTR_SIZE, BufferMapAccessBit::WRITE));
+		const Vec4 values(-1.0f, -0.25f, 0.1345f, 0.8952f);
+		for(U i = 0; i < 4; ++i)
+		{
+			data[i] = I8(values[i] * 127.0f);
+		}
+
+		texBuff->unmap();
+
+		buffInit.m_mapAccess = BufferMapAccessBit::READ;
+		buffInit.m_size = sizeof(F32) * 4;
+		buffInit.m_usage = BufferUsageBit::ALL_STORAGE;
+		BufferPtr storageBuff = gr->newBuffer(buffInit);
+
+		CommandBufferInitInfo cmdbInit;
+		cmdbInit.m_flags = CommandBufferFlag::SMALL_BATCH | CommandBufferFlag::GENERAL_WORK;
+		CommandBufferPtr cmdb = gr->newCommandBuffer(cmdbInit);
+
+		cmdb->bindReadOnlyTextureBuffer(0, 0, texBuff, 0, MAX_PTR_SIZE, Format::R8G8B8A8_SNORM);
+		cmdb->bindStorageBuffer(0, 1, storageBuff, 0, MAX_PTR_SIZE);
+		cmdb->bindShaderProgram(prog);
+		cmdb->dispatchCompute(1, 1, 1);
+		cmdb->flush();
+		gr->finish();
+
+		const Vec4* inData = static_cast<const Vec4*>(storageBuff->map(0, MAX_PTR_SIZE, BufferMapAccessBit::READ));
+		for(U i = 0; i < 4; ++i)
+		{
+			ANKI_TEST_EXPECT_NEAR(values[i], (*inData)[i], 0.01f);
+		}
+
+		storageBuff->unmap();
 	}
 	}
 
 
 	GrManager::deleteInstance(gr);
 	GrManager::deleteInstance(gr);