Blender V4.3
vk_storage_buffer.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8#include "vk_shader.hh"
10#include "vk_staging_buffer.hh"
11#include "vk_state_manager.hh"
12#include "vk_vertex_buffer.hh"
13
14#include "vk_storage_buffer.hh"
15
16namespace blender::gpu {
17
18VKStorageBuffer::VKStorageBuffer(size_t size, GPUUsageType usage, const char *name)
19 : StorageBuf(size, name), usage_(usage)
20{
21}
22
23void VKStorageBuffer::update(const void *data)
24{
25 VKContext &context = *VKContext::get();
28 staging_buffer.host_buffer_get().update_immediately(data);
29 staging_buffer.copy_to_device(context);
30}
31
33{
34 if (!buffer_.is_allocated()) {
35 allocate();
36 }
37}
38
39void VKStorageBuffer::allocate()
40{
41 const bool is_host_visible = false;
42 const VkBufferUsageFlags buffer_usage_flags = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT |
43 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
44 VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
45 VK_BUFFER_USAGE_TRANSFER_DST_BIT;
46 buffer_.create(size_in_bytes_, usage_, buffer_usage_flags, is_host_visible);
48}
49
51{
52 VKContext &context = *VKContext::get();
53 context.state_manager_get().storage_buffer_bind(
55}
56
58{
59 VKContext *context = VKContext::get();
60 if (context) {
61 context->state_manager_get().storage_buffer_unbind(this);
62 }
63}
64
66{
68 VKContext &context = *VKContext::get();
69 buffer_.clear(context, clear_value);
70}
71
72void VKStorageBuffer::copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size)
73{
75
76 VKVertexBuffer &src_vertex_buffer = *unwrap(src);
77 src_vertex_buffer.upload();
78
80 copy_buffer.src_buffer = src_vertex_buffer.vk_handle();
81 copy_buffer.dst_buffer = vk_handle();
82 copy_buffer.region.srcOffset = src_offset;
83 copy_buffer.region.dstOffset = dst_offset;
84 copy_buffer.region.size = copy_size;
85
86 VKContext &context = *VKContext::get();
87 context.render_graph.add_node(copy_buffer);
88}
89
94
95void VKStorageBuffer::read(void *data)
96{
98 VKContext &context = *VKContext::get();
100 staging_buffer.copy_from_device(context);
101 staging_buffer.host_buffer_get().read(context, data);
102}
103
104} // namespace blender::gpu
unsigned int uint
void GPU_memory_barrier(eGPUBarrier barrier)
Definition gpu_state.cc:374
@ GPU_BARRIER_BUFFER_UPDATE
Definition GPU_state.hh:56
void update_immediately(const void *data) const
Definition vk_buffer.cc:109
bool is_allocated() const
Definition vk_buffer.cc:22
bool create(size_t size, GPUUsageType usage, VkBufferUsageFlags buffer_usage, bool is_host_visible=true)
Definition vk_buffer.cc:53
void read(VKContext &context, void *data) const
Definition vk_buffer.cc:142
VkBuffer vk_handle() const
Definition vk_buffer.hh:69
void clear(VKContext &context, uint32_t clear_value)
Definition vk_buffer.cc:133
static VKContext * get()
Definition vk_context.hh:97
const VKBuffer & host_buffer_get() const
void copy_from_device(VKContext &context)
void copy_to_device(VKContext &context)
void update(const void *data) override
void clear(uint32_t clear_value) override
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override
void read(void *data) override
VKStorageBuffer(size_t size, GPUUsageType usage, const char *name)
void bind(int slot) override
void object_label(GLenum type, GLuint object, const char *name)
Definition gl_debug.cc:344
static Context * unwrap(GPUContext *ctx)
unsigned int uint32_t
Definition stdint.h:80