Changeset View
Changeset View
Standalone View
Standalone View
source/blender/gpu/intern/gpu_vertex_buffer_private.hh
| Show All 21 Lines | |||||
| * | * | ||||
| * GPU vertex buffer | * GPU vertex buffer | ||||
| */ | */ | ||||
| #pragma once | #pragma once | ||||
| #include "GPU_vertex_buffer.h" | #include "GPU_vertex_buffer.h" | ||||
| struct GPUVertBuf { | namespace blender::gpu { | ||||
| GPUVertFormat format; | |||||
| class VertBuf { | |||||
| public: | |||||
| static size_t memory_usage; | |||||
| GPUVertFormat format = {}; | |||||
| /** Number of verts we want to draw. */ | /** Number of verts we want to draw. */ | ||||
| uint vertex_len; | uint vertex_len = 0; | ||||
| /** Number of verts data. */ | /** Number of verts data. */ | ||||
| uint vertex_alloc; | uint vertex_alloc = 0; | ||||
| /** 0 indicates not yet allocated. */ | |||||
| uint32_t vbo_id; | |||||
| /** Usage hint for GL optimisation. */ | |||||
| GPUUsageType usage; | |||||
| /** Status flag. */ | /** Status flag. */ | ||||
| GPUVertBufStatus flag; | GPUVertBufStatus flag = GPU_VERTBUF_INVALID; | ||||
| /** This counter will only avoid freeing the GPUVertBuf, not the data. */ | |||||
| char handle_refcount; | |||||
| /** NULL indicates data in VRAM (unmapped) */ | /** NULL indicates data in VRAM (unmapped) */ | ||||
| uchar *data; | uchar *data = NULL; | ||||
| }; | |||||
| No newline at end of file | 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. */ | |||||
| static inline GPUVertBuf *wrap(VertBuf *vert) | |||||
| { | |||||
| return reinterpret_cast<GPUVertBuf *>(vert); | |||||
| } | |||||
| static inline VertBuf *unwrap(GPUVertBuf *vert) | |||||
| { | |||||
| return reinterpret_cast<VertBuf *>(vert); | |||||
| } | |||||
| static inline const VertBuf *unwrap(const GPUVertBuf *vert) | |||||
| { | |||||
| return reinterpret_cast<const VertBuf *>(vert); | |||||
| } | |||||
| } // namespace blender::gpu | |||||
| No newline at end of file | |||||