Blender V4.5
gpu_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
9#include "MEM_guardedalloc.h"
10#include <cstring>
11
12#include "BLI_string.h"
13
14#include "BKE_global.hh"
15
16#include "gpu_backend.hh"
17
18#include "GPU_storage_buffer.hh"
19#include "GPU_vertex_buffer.hh" /* For GPUUsageType. */
20
23
24/* -------------------------------------------------------------------- */
27
28namespace blender::gpu {
29
30StorageBuf::StorageBuf(size_t size, const char *name)
31{
33 STRNCPY(name_, name);
34}
35
40
41} // namespace blender::gpu
42
44
45/* -------------------------------------------------------------------- */
48
49using namespace blender::gpu;
50
51GPUStorageBuf *GPU_storagebuf_create_ex(size_t size,
52 const void *data,
53 GPUUsageType usage,
54 const char *name)
55{
56 StorageBuf *ssbo = GPUBackend::get()->storagebuf_alloc(size, usage, name);
57 /* Direct init. */
58 if (data != nullptr) {
59 ssbo->update(data);
60 }
61 else if (G.debug & G_DEBUG_GPU) {
62 /* Fill the buffer with poison values.
63 * (NaN for floats, -1 for `int` and "max value" for `uint`). */
64 blender::Vector<uchar> uninitialized_data(size, 0xFF);
65 ssbo->update(uninitialized_data.data());
66 }
67
68 return wrap(ssbo);
69}
70
71void GPU_storagebuf_free(GPUStorageBuf *ssbo)
72{
73 delete unwrap(ssbo);
74}
75
76void GPU_storagebuf_update(GPUStorageBuf *ssbo, const void *data)
77{
78 unwrap(ssbo)->update(data);
79}
80
81void GPU_storagebuf_bind(GPUStorageBuf *ssbo, int slot)
82{
83 unwrap(ssbo)->bind(slot);
84}
85
86void GPU_storagebuf_unbind(GPUStorageBuf *ssbo)
87{
88 unwrap(ssbo)->unbind();
89}
90
95
96void GPU_storagebuf_clear_to_zero(GPUStorageBuf *ssbo)
97{
98 GPU_storagebuf_clear(ssbo, 0);
99}
100
101void GPU_storagebuf_clear(GPUStorageBuf *ssbo, uint32_t clear_value)
102{
103 unwrap(ssbo)->clear(clear_value);
104}
105
108 uint dst_offset,
109 uint src_offset,
110 uint copy_size)
111{
112 unwrap(ssbo)->copy_sub(src, dst_offset, src_offset, copy_size);
113}
114
115void GPU_storagebuf_sync_to_host(GPUStorageBuf *ssbo)
116{
117 unwrap(ssbo)->async_flush_to_host();
118}
119
120void GPU_storagebuf_read(GPUStorageBuf *ssbo, void *data)
121{
122 unwrap(ssbo)->read(data);
123}
124
126{
127 unwrap(ssbo)->sync_as_indirect_buffer();
128}
129
@ G_DEBUG_GPU
char * STRNCPY(char(&dst)[N], const char *src)
Definition BLI_string.h:688
unsigned int uint
void GPU_storagebuf_bind(GPUStorageBuf *ssbo, int slot)
void GPU_storagebuf_sync_to_host(GPUStorageBuf *ssbo)
GPUStorageBuf * GPU_storagebuf_create_ex(size_t size, const void *data, GPUUsageType usage, const char *name)
void GPU_storagebuf_copy_sub_from_vertbuf(GPUStorageBuf *ssbo, blender::gpu::VertBuf *src, uint dst_offset, uint src_offset, uint copy_size)
Copy a part of a vertex buffer to a storage buffer.
void GPU_storagebuf_unbind(GPUStorageBuf *ssbo)
void GPU_storagebuf_sync_as_indirect_buffer(GPUStorageBuf *ssbo)
void GPU_storagebuf_clear_to_zero(GPUStorageBuf *ssbo)
void GPU_storagebuf_free(GPUStorageBuf *ssbo)
void GPU_storagebuf_update(GPUStorageBuf *ssbo, const void *data)
void GPU_storagebuf_read(GPUStorageBuf *ssbo, void *data)
void GPU_storagebuf_debug_unbind_all()
void GPU_storagebuf_clear(GPUStorageBuf *ssbo, uint32_t clear_value)
Read Guarded memory(de)allocation.
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
virtual void debug_unbind_all_ssbo()=0
static Context * get()
static GPUBackend * get()
virtual StorageBuf * storagebuf_alloc(size_t size, GPUUsageType usage, const char *name)=0
StorageBuf(size_t size, const char *name)
virtual void update(const void *data)=0
#define MEM_SAFE_FREE(v)
#define G(x, y, z)
static Context * unwrap(GPUContext *ctx)
static GPUContext * wrap(Context *ctx)