50 if (vk_buffer_view_ != VK_NULL_HANDLE) {
54 VkBufferViewCreateInfo buffer_view_info = {};
55 buffer_view_info.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
56 buffer_view_info.buffer = buffer_.vk_handle();
58 buffer_view_info.range = buffer_.size_in_bytes();
61 vkCreateBufferView(device.
vk_handle(), &buffer_view_info,
nullptr, &vk_buffer_view_);
72 if (!buffer_.is_allocated()) {
76 BLI_assert_msg(start_offset + data_size_in_bytes <= buffer_.size_in_bytes(),
77 "Out of bound write to vertex buffer");
78 if (buffer_.is_mapped()) {
79 buffer_.update_sub_immediately(start_offset, data_size_in_bytes,
data);
93 if (buffer_.is_mapped()) {
94 buffer_.read(context,
data);
99 if (buffer_.is_allocated()) {
109 "Unable to read data from vertex buffer via a staging buffer as the staging buffer "
110 "could not be allocated. ");
138 if (vk_buffer_view_ != VK_NULL_HANDLE) {
140 vk_buffer_view_ = VK_NULL_HANDLE;
146void VKVertexBuffer::upload_data_direct(
const VKBuffer &host_buffer)
151void VKVertexBuffer::upload_data_via_staging_buffer(VKContext &context)
153 VKStagingBuffer staging_buffer(
155 VKBuffer &buffer = staging_buffer.host_buffer_get();
156 if (buffer.is_allocated()) {
157 upload_data_direct(buffer);
158 staging_buffer.copy_to_device(context);
162 "Unable to upload data to vertex buffer via a staging buffer as the staging buffer "
163 "could not be allocated. Vertex buffer will be filled with on zeros to reduce "
164 "drawing artifacts due to read from uninitialized memory.");
165 buffer_.
clear(context, 0u);
171 if (!buffer_.is_allocated()) {
174 if (!buffer_.is_allocated()) {
175 CLOG_ERROR(&
LOG,
"Unable to allocate vertex buffer. Most likely an out of memory issue.");
185 if (buffer_.is_mapped() && !data_uploaded_) {
186 upload_data_direct(buffer_);
190 upload_data_via_staging_buffer(context);
195 data_uploaded_ =
true;
202void VKVertexBuffer::allocate()
204 VkBufferUsageFlags vk_buffer_usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
205 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT |
206 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
207 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
208 VK_BUFFER_USAGE_TRANSFER_DST_BIT;
211 size_alloc_get(), vk_buffer_usage, VMA_MEMORY_USAGE_AUTO, VmaAllocationCreateFlags(0), 0.8f);
#define BLI_assert_msg(a, msg)
#define CLOG_ERROR(clg_ref,...)
@ GPU_VERTBUF_DATA_UPLOADED
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
unsigned long long int uint64_t
void update_immediately(const void *data) const
void read(VKContext &context, void *data) const
VkBuffer vk_handle() const
void clear(VKContext &context, uint32_t clear_value)
bool create(size_t size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage vma_memory_usage, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
void * mapped_memory_get() const
VkDevice vk_handle() const
void discard_buffer_view(VkBufferView vk_buffer_view)
static VKDiscardPool & discard_pool_get()
void copy_from_device(VKContext &context)
VKBuffer & host_buffer_get()
void copy_to_device(VKContext &context)
void texel_buffer_bind(VKVertexBuffer &vertex_buffer, int slot)
void storage_buffer_bind(BindSpaceStorageBuffers::Type resource_type, void *resource, int binding)
void release_data() override
void acquire_data() override
void update_sub(uint start, uint len, const void *data) override
void upload_data() override
void wrap_handle(uint64_t handle) override
void bind_as_ssbo(uint binding) override
void ensure_buffer_view()
void bind_as_texture(uint binding) override
void read(void *data) const override
void resize_data() override
size_t size_used_get() const
size_t size_alloc_get() const
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void object_label(GLenum type, GLuint object, const char *name)
#define NOT_YET_IMPLEMENTED