瀏覽代碼

Fix TextVideoMemBlitter staging buffer issue. (#3419)

* Fix TextVideoMemBlitter staging buffer issue, and broken vkFlushMappedMemoryRange.

* Merge flush and reset.

* Rename flush_and_reset() to flush(_reset=true).
Martijn Courteaux 8 月之前
父節點
當前提交
6e76442979
共有 2 個文件被更改,包括 9 次插入16 次删除
  1. 8 14
      src/renderer_vk.cpp
  2. 1 2
      src/renderer_vk.h

+ 8 - 14
src/renderer_vk.cpp

@@ -4454,15 +4454,14 @@ VK_IMPORT_DEVICE
 			return createHostBuffer(_size, flags, _buffer, _memory, _data);
 		}
 
-		StagingBufferVK allocFromScratchStagingBuffer(uint32_t _size, uint32_t _align, const void* _data = NULL, bool _tryScratch = true)
+		StagingBufferVK allocFromScratchStagingBuffer(uint32_t _size, uint32_t _align, const void* _data = NULL)
 		{
 			BGFX_PROFILER_SCOPE("allocFromScratchStagingBuffer", kColorResource);
 
 			StagingBufferVK result;
 			ScratchBufferVK &scratch = m_scratchStagingBuffer[m_cmd.m_currentFrameInFlight];
 
-			if (_tryScratch
-			&&  _size <= BGFX_CONFIG_MAX_STAGING_SIZE_FOR_SCRATCH_BUFFER)
+			if (_size <= BGFX_CONFIG_MAX_STAGING_SIZE_FOR_SCRATCH_BUFFER)
 			{
 				const uint32_t scratchOffset = scratch.alloc(_size, _align);
 
@@ -4734,18 +4733,12 @@ VK_DESTROY
 
 	void ScratchBufferVK::destroy()
 	{
-		reset();
-
 		vkUnmapMemory(s_renderVK->m_device, m_deviceMem);
 
 		s_renderVK->release(m_buffer);
 		s_renderVK->release(m_deviceMem);
 	}
 
-	void ScratchBufferVK::reset()
-	{
-		m_pos = 0;
-	}
 
 	uint32_t ScratchBufferVK::alloc(uint32_t _size, uint32_t _minAlign)
 	{
@@ -4775,7 +4768,7 @@ VK_DESTROY
 	}
 
 
-	void ScratchBufferVK::flush()
+	void ScratchBufferVK::flush(bool _reset)
 	{
 		const VkPhysicalDeviceLimits& deviceLimits = s_renderVK->m_deviceProperties.limits;
 		VkDevice device = s_renderVK->m_device;
@@ -4790,6 +4783,10 @@ VK_DESTROY
 		range.offset = 0;
 		range.size   = size;
 		VK_CHECK(vkFlushMappedMemoryRanges(device, 1, &range) );
+
+		if (_reset) {
+			m_pos = 0;
+		}
 	}
 
 	void BufferVK::create(VkCommandBuffer _commandBuffer, uint32_t _size, void* _data, uint16_t _flags, bool _vertex, uint32_t _stride)
@@ -4840,7 +4837,7 @@ VK_DESTROY
 		BGFX_PROFILER_SCOPE("BufferVK::update", kColorFrame);
 		BX_UNUSED(_discard);
 
-		StagingBufferVK stagingBuffer = s_renderVK->allocFromScratchStagingBuffer(_size, 8, _data, !_discard);
+		StagingBufferVK stagingBuffer = s_renderVK->allocFromScratchStagingBuffer(_size, 8, _data);
 
 		VkBufferCopy region;
 		region.srcOffset = stagingBuffer.m_offset;
@@ -8502,10 +8499,7 @@ VK_DESTROY
 		const uint64_t f3 = BGFX_STATE_BLEND_INV_FACTOR<<4;
 
 		ScratchBufferVK& scratchBuffer = m_scratchBuffer[m_cmd.m_currentFrameInFlight];
-		scratchBuffer.reset();
-
 		ScratchBufferVK& scratchStagingBuffer = m_scratchStagingBuffer[m_cmd.m_currentFrameInFlight];
-		scratchStagingBuffer.reset();
 
 		setMemoryBarrier(
 			  m_commandBuffer

+ 1 - 2
src/renderer_vk.h

@@ -398,10 +398,9 @@ VK_DESTROY_FUNC(DescriptorSet);
 		void createUniform(uint32_t _size, uint32_t _count);
 		void createStaging(uint32_t _size);
 		void destroy();
-		void reset();
 		uint32_t alloc(uint32_t _size, uint32_t _minAlign = 1);
 		uint32_t write(const void* _data, uint32_t _size, uint32_t _minAlign = 1);
-		void flush();
+		void flush(bool _reset = true);
 
 		VkBuffer m_buffer;
 		VkDeviceMemory m_deviceMem;