15 #include "vertexDataBuffer.h" 16 #include "config_gobj.h" 17 #include "pStatTimer.h" 26 void VertexDataBuffer::
31 if (_resident_data != (
unsigned char *)NULL) {
32 nassertv(_reserved_size != 0);
33 get_class_type().dec_memory_usage(TypeHandle::MC_array, (
int)_reserved_size);
34 PANDA_FREE_ARRAY(_resident_data);
35 _resident_data = NULL;
37 if (copy._resident_data != (
unsigned char *)NULL && copy._size != 0) {
40 get_class_type().inc_memory_usage(TypeHandle::MC_array, (
int)copy._size);
41 _resident_data = (
unsigned char *)PANDA_MALLOC_ARRAY(copy._size);
42 memcpy(_resident_data, copy._resident_data, copy._size);
45 _reserved_size = copy._size;
47 nassertv(_reserved_size >= _size);
61 unsigned char *resident_data = _resident_data;
63 size_t reserved_size = _reserved_size;
66 _resident_data = other._resident_data;
68 _reserved_size = other._reserved_size;
69 _block = other._block;
71 other._resident_data = resident_data;
73 other._reserved_size = reserved_size;
75 nassertv(_reserved_size >= _size);
88 void VertexDataBuffer::
89 do_clean_realloc(
size_t reserved_size) {
90 if (reserved_size != _reserved_size) {
91 if (reserved_size == 0 || _size == 0) {
92 do_unclean_realloc(reserved_size);
96 if (gobj_cat.is_debug()) {
98 <<
this <<
".clean_realloc(" << reserved_size <<
")\n";
102 if (_reserved_size != 0 && _resident_data == (
unsigned char *)NULL) {
106 get_class_type().inc_memory_usage(TypeHandle::MC_array, (
int)reserved_size - (
int)_reserved_size);
107 if (_reserved_size == 0) {
108 nassertv(_resident_data == (
unsigned char *)NULL);
109 _resident_data = (
unsigned char *)PANDA_MALLOC_ARRAY(reserved_size);
111 nassertv(_resident_data != (
unsigned char *)NULL);
112 _resident_data = (
unsigned char *)PANDA_REALLOC_ARRAY(_resident_data, reserved_size);
114 nassertv(_resident_data != (
unsigned char *)NULL);
115 _reserved_size = reserved_size;
118 _size = min(_size, _reserved_size);
130 void VertexDataBuffer::
131 do_unclean_realloc(
size_t reserved_size) {
132 if (reserved_size != _reserved_size || _resident_data == (
unsigned char *)NULL) {
133 if (gobj_cat.is_debug()) {
135 <<
this <<
".unclean_realloc(" << reserved_size <<
")\n";
141 if (_resident_data != (
unsigned char *)NULL) {
142 nassertv(_reserved_size != 0);
144 get_class_type().dec_memory_usage(TypeHandle::MC_array, (
int)_reserved_size);
145 PANDA_FREE_ARRAY(_resident_data);
146 _resident_data = NULL;
150 if (reserved_size != 0) {
151 get_class_type().inc_memory_usage(TypeHandle::MC_array, (
int)reserved_size);
152 nassertv(_resident_data == (
unsigned char *)NULL);
153 _resident_data = (
unsigned char *)PANDA_MALLOC_ARRAY(reserved_size);
156 _reserved_size = reserved_size;
174 void VertexDataBuffer::
180 nassertv(_resident_data != (
unsigned char *)NULL);
185 get_class_type().dec_memory_usage(TypeHandle::MC_array, (
int)_reserved_size);
186 PANDA_FREE_ARRAY(_resident_data);
187 _resident_data = NULL;
193 _block = book.
alloc(_size);
195 unsigned char *pointer = _block->get_pointer(
true);
196 nassertv(pointer != (
unsigned char *)NULL);
197 memcpy(pointer, _resident_data, _size);
199 get_class_type().dec_memory_usage(TypeHandle::MC_array, (
int)_reserved_size);
200 PANDA_FREE_ARRAY(_resident_data);
201 _resident_data = NULL;
203 _reserved_size = _size;
205 nassertv(_reserved_size >= _size);
217 void VertexDataBuffer::
219 if (_resident_data != (
unsigned char *)NULL || _reserved_size == 0) {
225 nassertv(_reserved_size == _size);
227 get_class_type().inc_memory_usage(TypeHandle::MC_array, (
int)_size);
228 _resident_data = (
unsigned char *)PANDA_MALLOC_ARRAY(_size);
229 nassertv(_resident_data != (
unsigned char *)NULL);
231 memcpy(_resident_data, _block->get_pointer(
true), _size);
A block of bytes that stores the actual raw vertex data referenced by a GeomVertexArrayData object...
Similar to MutexHolder, but for a light mutex.
void swap(VertexDataBuffer &other)
Swaps the data buffers between this one and the other one.
A block of bytes that stores the actual raw vertex data referenced by a GeomVertexArrayData object...
VertexDataBlock * alloc(size_t size)
Allocates and returns a new VertexDataBuffer of the requested size.
A collection of VertexDataPages, which can be used to allocate new VertexDataBlock objects...
TypeHandle is the identifier used to differentiate C++ class types.