|
|
@@ -17,7 +17,9 @@
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "vertexDataBuffer.h"
|
|
|
+#include "pStatTimer.h"
|
|
|
|
|
|
+PStatCollector VertexDataBuffer::_vdata_reread_pcollector("*:Vertex Data:Reread");
|
|
|
TypeHandle VertexDataBuffer::_type_handle;
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
@@ -31,36 +33,34 @@ TypeHandle VertexDataBuffer::_type_handle;
|
|
|
void VertexDataBuffer::
|
|
|
clean_realloc(size_t size) {
|
|
|
if (size != _size) {
|
|
|
+ _source_file.clear();
|
|
|
+
|
|
|
if (size == 0) {
|
|
|
// If we're going to size 0, we don't necessarily need to page
|
|
|
- // in first.
|
|
|
- if (_block != (VertexDataBlock *)NULL) {
|
|
|
- // We're currently paged out. Discard the page.
|
|
|
- _block = NULL;
|
|
|
- } else {
|
|
|
- // We're currently paged in. Decrement the global total.
|
|
|
- get_class_type().dec_memory_usage(TypeHandle::MC_array, _size);
|
|
|
- }
|
|
|
+ // in first. But if we're paged out, discard the page.
|
|
|
+ _block = NULL;
|
|
|
|
|
|
if (_resident_data != (unsigned char *)NULL) {
|
|
|
free(_resident_data);
|
|
|
_resident_data = NULL;
|
|
|
+ get_class_type().dec_memory_usage(TypeHandle::MC_array, _size);
|
|
|
}
|
|
|
_block = NULL;
|
|
|
|
|
|
} else {
|
|
|
- // Page if if we're currently paged out.
|
|
|
- if (_block != (VertexDataBlock *)NULL) {
|
|
|
+ // Page in if we're currently paged out.
|
|
|
+ if (_block != (VertexDataBlock *)NULL ||
|
|
|
+ _resident_data == (unsigned char *)NULL) {
|
|
|
page_in();
|
|
|
}
|
|
|
|
|
|
- get_class_type().dec_memory_usage(TypeHandle::MC_array, _size);
|
|
|
- get_class_type().inc_memory_usage(TypeHandle::MC_array, size);
|
|
|
-
|
|
|
if (_resident_data == (unsigned char *)NULL) {
|
|
|
_resident_data = (unsigned char *)malloc(size);
|
|
|
+ get_class_type().inc_memory_usage(TypeHandle::MC_array, size);
|
|
|
} else {
|
|
|
_resident_data = (unsigned char *)::realloc(_resident_data, size);
|
|
|
+ get_class_type().dec_memory_usage(TypeHandle::MC_array, _size);
|
|
|
+ get_class_type().inc_memory_usage(TypeHandle::MC_array, size);
|
|
|
}
|
|
|
nassertv(_resident_data != (unsigned char *)NULL);
|
|
|
}
|
|
|
@@ -87,11 +87,15 @@ page_out(VertexDataBook &book) {
|
|
|
}
|
|
|
nassertv(_resident_data != (unsigned char *)NULL);
|
|
|
|
|
|
- _block = book.alloc(_size);
|
|
|
- memcpy(_block->get_pointer(), _resident_data, _size);
|
|
|
+ if (_source_file == (VirtualFile *)NULL) {
|
|
|
+ // We only need to allocate a block if we don't have a source
|
|
|
+ // file.
|
|
|
+ _block = book.alloc(_size);
|
|
|
+ memcpy(_block->get_pointer(), _resident_data, _size);
|
|
|
+ }
|
|
|
+
|
|
|
free(_resident_data);
|
|
|
_resident_data = NULL;
|
|
|
-
|
|
|
get_class_type().dec_memory_usage(TypeHandle::MC_array, _size);
|
|
|
}
|
|
|
|
|
|
@@ -104,6 +108,43 @@ page_out(VertexDataBook &book) {
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
void VertexDataBuffer::
|
|
|
page_in() {
|
|
|
+ if (_source_file != (VirtualFile *)NULL && _resident_data == (unsigned char *)NULL) {
|
|
|
+ // Re-read the data from its original source.
|
|
|
+ PStatTimer timer(_vdata_reread_pcollector);
|
|
|
+
|
|
|
+ _resident_data = (unsigned char *)malloc(_size);
|
|
|
+ nassertv(_resident_data != (unsigned char *)NULL);
|
|
|
+ get_class_type().inc_memory_usage(TypeHandle::MC_array, _size);
|
|
|
+
|
|
|
+ istream *in = _source_file->open_read_file(true);
|
|
|
+ if (in == (istream *)NULL) {
|
|
|
+ gobj_cat.error()
|
|
|
+ << "Error reopening " << _source_file->get_filename()
|
|
|
+ << " to reread vertex data.\n";
|
|
|
+ } else {
|
|
|
+ if (gobj_cat.is_debug()) {
|
|
|
+ gobj_cat.debug()
|
|
|
+ << "rereading " << _size << " bytes from "
|
|
|
+ << _source_file->get_filename() << ", position "
|
|
|
+ << _source_pos << "\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ in->seekg(_source_pos);
|
|
|
+
|
|
|
+ in->read((char *)_resident_data, _size);
|
|
|
+ if (in->fail() || in->eof()) {
|
|
|
+ gobj_cat.error()
|
|
|
+ << "Error rereading " << _size << " bytes from "
|
|
|
+ << _source_file->get_filename() << ", position "
|
|
|
+ << _source_pos << "\n";
|
|
|
+ }
|
|
|
+
|
|
|
+ VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr();
|
|
|
+ vfs->close_read_file(in);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (_block == (VertexDataBlock *)NULL) {
|
|
|
// We're already paged in.
|
|
|
return;
|
|
|
@@ -113,8 +154,8 @@ page_in() {
|
|
|
|
|
|
_resident_data = (unsigned char *)malloc(_size);
|
|
|
nassertv(_resident_data != (unsigned char *)NULL);
|
|
|
+ get_class_type().inc_memory_usage(TypeHandle::MC_array, _size);
|
|
|
+
|
|
|
memcpy(_resident_data, _block->get_pointer(), _size);
|
|
|
_block = NULL;
|
|
|
-
|
|
|
- get_class_type().inc_memory_usage(TypeHandle::MC_array, _size);
|
|
|
}
|