diff options
Diffstat (limited to 'source/blender/gpu/intern/gpu_vertex_buffer_private.hh')
-rw-r--r-- | source/blender/gpu/intern/gpu_vertex_buffer_private.hh | 64 |
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. */ |