From 6e764429790620fbd050a093318de07e2f268c30 Mon Sep 17 00:00:00 2001 From: Martijn Courteaux Date: Wed, 2 Apr 2025 00:00:06 +0200 Subject: [PATCH] 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). --- src/renderer_vk.cpp | 22 ++++++++-------------- src/renderer_vk.h | 3 +-- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index e6eb6748c..5193ac56e 100644 --- a/src/renderer_vk.cpp +++ b/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 diff --git a/src/renderer_vk.h b/src/renderer_vk.h index 3abbad1dd..43e8746ef 100644 --- a/src/renderer_vk.h +++ b/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;