Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-09-07 02:20:55 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-07 14:59:51 +0300
commitc38debd39fac1e3d44b84e8092419da34f0b613d (patch)
treebba08fc983f7e18025f4e09fa346737053ba4ed0 /source/blender/gpu/intern/gpu_vertex_buffer_private.hh
parentbb2aeb4504907cab1cf8c4afc4dd1d6495c940e4 (diff)
GPUVertBuf: GL Backend Isolation
Part of the Vulkan port T68990 This makes a few changes in how the data is being handled by the backend to allow more flexibility in the future. The overall code logic is left unchanged.
Diffstat (limited to 'source/blender/gpu/intern/gpu_vertex_buffer_private.hh')
-rw-r--r--source/blender/gpu/intern/gpu_vertex_buffer_private.hh64
1 files changed, 57 insertions, 7 deletions
diff --git a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
index eb7e0bc8b9b..61af0a215a9 100644
--- a/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
+++ b/source/blender/gpu/intern/gpu_vertex_buffer_private.hh
@@ -29,7 +29,8 @@
namespace blender::gpu {
-struct VertBuf {
+class VertBuf {
+ public:
static size_t memory_usage;
GPUVertFormat format = {};
@@ -37,16 +38,65 @@ struct VertBuf {
uint vertex_len = 0;
/** Number of verts data. */
uint vertex_alloc = 0;
- /** 0 indicates not yet allocated. */
- uint32_t vbo_id = 0;
- /** Usage hint for GL optimisation. */
- GPUUsageType usage = GPU_USAGE_STATIC;
/** Status flag. */
GPUVertBufStatus flag = GPU_VERTBUF_INVALID;
- /** This counter will only avoid freeing the GPUVertBuf, not the data. */
- char handle_refcount = 0;
/** NULL indicates data in VRAM (unmapped) */
uchar *data = NULL;
+
+ protected:
+ /** Usage hint for GL optimisation. */
+ GPUUsageType usage_ = GPU_USAGE_STATIC;
+
+ private:
+ /** This counter will only avoid freeing the GPUVertBuf, not the data. */
+ int handle_refcount_ = 1;
+
+ public:
+ VertBuf();
+ virtual ~VertBuf();
+
+ void init(const GPUVertFormat *format, GPUUsageType usage);
+ void clear(void);
+
+ /* Data manament */
+ void allocate(uint vert_len);
+ void resize(uint vert_len);
+ void upload(void);
+
+ VertBuf *duplicate(void);
+
+ /* Size of the data allocated. */
+ size_t size_alloc_get(void) const
+ {
+ BLI_assert(format.packed);
+ return vertex_alloc * format.stride;
+ }
+ /* Size of the data uploaded to the GPU. */
+ size_t size_used_get(void) const
+ {
+ BLI_assert(format.packed);
+ return vertex_len * format.stride;
+ }
+
+ void reference_add(void)
+ {
+ handle_refcount_++;
+ }
+ void reference_remove(void)
+ {
+ BLI_assert(handle_refcount_ > 0);
+ handle_refcount_--;
+ if (handle_refcount_ == 0) {
+ delete this;
+ }
+ }
+
+ protected:
+ virtual void acquire_data(void) = 0;
+ virtual void resize_data(void) = 0;
+ virtual void release_data(void) = 0;
+ virtual void upload_data(void) = 0;
+ virtual void duplicate_data(VertBuf *dst) = 0;
};
/* Syntacting suggar. */