diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-09-07 02:20:55 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-09-07 14:59:51 +0300 |
commit | c38debd39fac1e3d44b84e8092419da34f0b613d (patch) | |
tree | bba08fc983f7e18025f4e09fa346737053ba4ed0 /source/blender/gpu/intern/gpu_vertex_buffer_private.hh | |
parent | bb2aeb4504907cab1cf8c4afc4dd1d6495c940e4 (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.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. */ |