Blender V5.0
gpu_vertex_buffer_wrapper.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2025 Blender Foundation
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
7#include "GPU_context.hh"
9
10namespace blender::opensubdiv {
11
19 gpu::VertBuf &gpu_vertex_buffer_;
20
22 int element_count_;
23
25 bool use_update_sub_;
26
27 public:
28 GPUVertexBuffer(gpu::VertBuf &gpu_vertex_buffer, int element_count, bool use_update_sub)
29 : gpu_vertex_buffer_(gpu_vertex_buffer),
30 element_count_(element_count),
31 use_update_sub_(use_update_sub)
32 {
33 }
34
42
43 static GPUVertexBuffer *Create(int element_count, int vertex_len, void *device_context = nullptr)
44 {
45 using namespace blender::gpu;
46 (void)device_context;
49 switch (element_count) {
50 case 4:
51 GPU_vertformat_attr_add(&format, "elements", VertAttrType::SFLOAT_32_32_32_32);
52 break;
53 case 3:
54 GPU_vertformat_attr_add(&format, "elements", VertAttrType::SFLOAT_32_32_32);
55 break;
56 case 2:
57 GPU_vertformat_attr_add(&format, "elements", VertAttrType::SFLOAT_32_32);
58 break;
59 case 1:
60 GPU_vertformat_attr_add(&format, "elements", VertAttrType::SFLOAT_32);
61 break;
62 default:
63 assert(0);
64 break;
65 }
66 const bool use_update_sub = GPU_backend_get_type() != GPU_BACKEND_VULKAN;
67 gpu::VertBuf *vertex_buffer = nullptr;
68 if (use_update_sub) {
69 vertex_buffer = GPU_vertbuf_calloc();
70 GPU_vertbuf_init_build_on_device(*vertex_buffer, format, vertex_len);
71 }
72 else {
74 GPU_vertbuf_data_alloc(*vertex_buffer, vertex_len);
75 }
76 return new GPUVertexBuffer(*vertex_buffer, element_count, use_update_sub);
77 }
78
81 {
82 GPU_vertbuf_discard(&gpu_vertex_buffer_);
83 }
84
87 void UpdateData(const float *src,
88 int start_vertex,
89 int num_vertices,
90 void *device_context = NULL)
91 {
92 (void)device_context;
93 if (use_update_sub_) {
94 GPU_vertbuf_use(&gpu_vertex_buffer_);
95 size_t offset = start_vertex * element_count_ * sizeof(float);
96 size_t data_len = num_vertices * element_count_ * sizeof(float);
97 GPU_vertbuf_update_sub(&gpu_vertex_buffer_, offset, data_len, src);
98 }
99 else {
100 MutableSpan<float> buffer_nodes = gpu_vertex_buffer_.data<float>();
101 buffer_nodes = buffer_nodes.drop_front(start_vertex * element_count_);
102 memcpy(buffer_nodes.data(), src, sizeof(float) * element_count_ * num_vertices);
103 GPU_vertbuf_tag_dirty(&gpu_vertex_buffer_);
104 }
105 }
106
108 int GetNumVertices() const
109 {
110 return GPU_vertbuf_get_vertex_len(&gpu_vertex_buffer_);
111 }
112
114 {
115 return &gpu_vertex_buffer_;
116 }
117};
118
119} // namespace blender::opensubdiv
GPUBackendType GPU_backend_get_type()
void GPU_vertbuf_init_build_on_device(blender::gpu::VertBuf &verts, const GPUVertFormat &format, uint v_len)
void GPU_vertbuf_use(blender::gpu::VertBuf *)
blender::gpu::VertBuf * GPU_vertbuf_create_with_format_ex(const GPUVertFormat &format, GPUUsageType usage)
void GPU_vertbuf_tag_dirty(blender::gpu::VertBuf *verts)
blender::gpu::VertBuf * GPU_vertbuf_calloc()
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_update_sub(blender::gpu::VertBuf *verts, uint start, uint len, const void *data)
uint GPU_vertbuf_get_vertex_len(const blender::gpu::VertBuf *verts)
void GPU_vertbuf_discard(blender::gpu::VertBuf *)
@ GPU_USAGE_DYNAMIC
void GPU_vertformat_clear(GPUVertFormat *)
uint GPU_vertformat_attr_add(GPUVertFormat *format, blender::StringRef name, blender::gpu::VertAttrType type)
constexpr T * data() const
Definition BLI_span.hh:539
constexpr MutableSpan drop_front(const int64_t n) const
Definition BLI_span.hh:607
GPUVertexBuffer(gpu::VertBuf &gpu_vertex_buffer, int element_count, bool use_update_sub)
void UpdateData(const float *src, int start_vertex, int num_vertices, void *device_context=NULL)
static GPUVertexBuffer * Create(int element_count, int vertex_len, void *device_context=nullptr)
int GetNumVertices() const
Returns how many vertices allocated in this vertex buffer.
nullptr float
#define assert(assertion)
format