Vulkan: Implement GPU_storagebuf_copy_sub_from_vertbuf

This PR implements `GPU_storagebuf_copy_sub_from_vertbuf`. It can be
used to copy a part of a vertex buffer to a storage buffer.

Pull Request: https://projects.blender.org/blender/blender/pulls/112516
This commit is contained in:
Jeroen Bakker
2023-09-18 13:44:03 +02:00
parent a54495b347
commit 231f1a6076
3 changed files with 23 additions and 5 deletions

View File

@@ -216,6 +216,13 @@ void VKCommandBuffer::copy(VKTexture &dst_texture,
regions.data());
}
void VKCommandBuffer::copy(VKBuffer &dst_buffer, VkBuffer src_buffer, Span<VkBufferCopy> regions)
{
ensure_no_active_framebuffer();
vkCmdCopyBuffer(
vk_command_buffer_, src_buffer, dst_buffer.vk_handle(), regions.size(), regions.data());
}
void VKCommandBuffer::blit(VKTexture &dst_texture,
VKTexture &src_texture,
Span<VkImageBlit> regions)

View File

@@ -168,6 +168,7 @@ class VKCommandBuffer : NonCopyable, NonMovable {
void copy(VKBuffer &dst_buffer, VKTexture &src_texture, Span<VkBufferImageCopy> regions);
void copy(VKTexture &dst_texture, VKBuffer &src_buffer, Span<VkBufferImageCopy> regions);
void copy(VKTexture &dst_texture, VKTexture &src_texture, Span<VkImageCopy> regions);
void copy(VKBuffer &dst_buffer, VkBuffer src_buffer, Span<VkBufferCopy> regions);
void blit(VKTexture &dst_texture, VKTexture &src_texture, Span<VkImageBlit> regions);
void blit(VKTexture &dst_texture,
VkImageLayout dst_layout,

View File

@@ -73,12 +73,22 @@ void VKStorageBuffer::clear(uint32_t clear_value)
buffer_.clear(context, clear_value);
}
void VKStorageBuffer::copy_sub(VertBuf * /*src*/,
uint /*dst_offset*/,
uint /*src_offset*/,
uint /*copy_size*/)
void VKStorageBuffer::copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size)
{
NOT_YET_IMPLEMENTED;
ensure_allocated();
VKVertexBuffer &src_vertex_buffer = *unwrap(src);
src_vertex_buffer.upload();
VkBufferCopy region = {};
region.srcOffset = src_offset;
region.dstOffset = dst_offset;
region.size = copy_size;
VKContext &context = *VKContext::get();
VKCommandBuffer &command_buffer = context.command_buffer_get();
command_buffer.copy(buffer_, src_vertex_buffer.vk_handle(), Span<VkBufferCopy>(&region, 1));
command_buffer.submit();
}
void VKStorageBuffer::read(void *data)