|
|
@@ -18,9 +18,12 @@
|
|
|
|
|
|
#include "preparedGraphicsObjects.h"
|
|
|
#include "textureContext.h"
|
|
|
+#include "vertexBufferContext.h"
|
|
|
+#include "indexBufferContext.h"
|
|
|
#include "texture.h"
|
|
|
#include "geom.h"
|
|
|
#include "qpgeomVertexArrayData.h"
|
|
|
+#include "qpgeomPrimitive.h"
|
|
|
#include "mutexHolder.h"
|
|
|
|
|
|
PStatCollector PreparedGraphicsObjects::_total_texusage_pcollector("Texture usage");
|
|
|
@@ -74,18 +77,31 @@ PreparedGraphicsObjects::
|
|
|
_released_geoms.clear();
|
|
|
_enqueued_geoms.clear();
|
|
|
|
|
|
- Datas::iterator dci;
|
|
|
- for (dci = _prepared_datas.begin();
|
|
|
- dci != _prepared_datas.end();
|
|
|
- ++dci) {
|
|
|
- DataContext *dc = (*dci);
|
|
|
- _total_texusage_pcollector.sub_level(dc->get_num_bytes());
|
|
|
- dc->_data->clear_prepared(this);
|
|
|
+ VertexBuffers::iterator vbci;
|
|
|
+ for (vbci = _prepared_vertex_buffers.begin();
|
|
|
+ vbci != _prepared_vertex_buffers.end();
|
|
|
+ ++vbci) {
|
|
|
+ VertexBufferContext *vbc = (*vbci);
|
|
|
+ _total_texusage_pcollector.sub_level(vbc->get_data_size_bytes());
|
|
|
+ vbc->_data->clear_prepared(this);
|
|
|
}
|
|
|
|
|
|
- _prepared_datas.clear();
|
|
|
- _released_datas.clear();
|
|
|
- _enqueued_datas.clear();
|
|
|
+ _prepared_vertex_buffers.clear();
|
|
|
+ _released_vertex_buffers.clear();
|
|
|
+ _enqueued_vertex_buffers.clear();
|
|
|
+
|
|
|
+ IndexBuffers::iterator ibci;
|
|
|
+ for (ibci = _prepared_index_buffers.begin();
|
|
|
+ ibci != _prepared_index_buffers.end();
|
|
|
+ ++ibci) {
|
|
|
+ IndexBufferContext *ibc = (*ibci);
|
|
|
+ _total_texusage_pcollector.sub_level(ibc->get_data_size_bytes());
|
|
|
+ ibc->_data->clear_prepared(this);
|
|
|
+ }
|
|
|
+
|
|
|
+ _prepared_index_buffers.clear();
|
|
|
+ _released_index_buffers.clear();
|
|
|
+ _enqueued_index_buffers.clear();
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -375,78 +391,78 @@ prepare_geom_now(Geom *geom, GraphicsStateGuardianBase *gsg) {
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: PreparedGraphicsObjects::enqueue_data
|
|
|
+// Function: PreparedGraphicsObjects::enqueue_vertex_buffer
|
|
|
// Access: Public
|
|
|
-// Description: Indicates that a data array would like to be put on the
|
|
|
+// Description: Indicates that a buffer would like to be put on the
|
|
|
// list to be prepared when the GSG is next ready to
|
|
|
// do this (presumably at the next frame).
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
void PreparedGraphicsObjects::
|
|
|
-enqueue_data(qpGeomVertexArrayData *data) {
|
|
|
+enqueue_vertex_buffer(qpGeomVertexArrayData *data) {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- _enqueued_datas.insert(data);
|
|
|
+ _enqueued_vertex_buffers.insert(data);
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: PreparedGraphicsObjects::dequeue_data
|
|
|
+// Function: PreparedGraphicsObjects::dequeue_vertex_buffer
|
|
|
// Access: Public
|
|
|
-// Description: Removes a data array from the queued list of data
|
|
|
+// Description: Removes a buffer from the queued list of data
|
|
|
// arrays to be prepared. Normally it is not necessary
|
|
|
// to call this, unless you change your mind about
|
|
|
// preparing it at the last minute, since the data will
|
|
|
// automatically be dequeued and prepared at the next
|
|
|
// frame.
|
|
|
//
|
|
|
-// The return value is true if the data array is
|
|
|
+// The return value is true if the buffer is
|
|
|
// successfully dequeued, false if it had not been
|
|
|
// queued.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
bool PreparedGraphicsObjects::
|
|
|
-dequeue_data(qpGeomVertexArrayData *data) {
|
|
|
+dequeue_vertex_buffer(qpGeomVertexArrayData *data) {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- EnqueuedDatas::iterator qi = _enqueued_datas.find(data);
|
|
|
- if (qi != _enqueued_datas.end()) {
|
|
|
- _enqueued_datas.erase(qi);
|
|
|
+ EnqueuedVertexBuffers::iterator qi = _enqueued_vertex_buffers.find(data);
|
|
|
+ if (qi != _enqueued_vertex_buffers.end()) {
|
|
|
+ _enqueued_vertex_buffers.erase(qi);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: PreparedGraphicsObjects::release_data
|
|
|
+// Function: PreparedGraphicsObjects::release_vertex_buffer
|
|
|
// Access: Public
|
|
|
// Description: Indicates that a data context, created by a
|
|
|
-// previous call to prepare_data(), is no longer
|
|
|
+// previous call to prepare_vertex_buffer(), is no longer
|
|
|
// needed. The driver resources will not be freed until
|
|
|
// some GSG calls update(), indicating it is at a
|
|
|
// stage where it is ready to release datas--this
|
|
|
// prevents conflicts from threading or multiple GSG's
|
|
|
// sharing datas (we have no way of knowing which
|
|
|
// graphics context is currently active, or what state
|
|
|
-// it's in, at the time release_data is called).
|
|
|
+// it's in, at the time release_vertex_buffer is called).
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
void PreparedGraphicsObjects::
|
|
|
-release_data(DataContext *dc) {
|
|
|
+release_vertex_buffer(VertexBufferContext *vbc) {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- dc->_data->clear_prepared(this);
|
|
|
- _total_buffers_pcollector.sub_level(dc->get_num_bytes());
|
|
|
+ vbc->_data->clear_prepared(this);
|
|
|
+ _total_buffers_pcollector.sub_level(vbc->get_data_size_bytes());
|
|
|
|
|
|
// We have to set the Data pointer to NULL at this point, since
|
|
|
// the Data itself might destruct at any time after it has been
|
|
|
// released.
|
|
|
- dc->_data = (qpGeomVertexArrayData *)NULL;
|
|
|
+ vbc->_data = (qpGeomVertexArrayData *)NULL;
|
|
|
|
|
|
- bool removed = (_prepared_datas.erase(dc) != 0);
|
|
|
+ bool removed = (_prepared_vertex_buffers.erase(vbc) != 0);
|
|
|
nassertv(removed);
|
|
|
|
|
|
- _released_datas.insert(dc);
|
|
|
+ _released_vertex_buffers.insert(vbc);
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: PreparedGraphicsObjects::release_all_datas
|
|
|
+// Function: PreparedGraphicsObjects::release_all_vertex_buffers
|
|
|
// Access: Public
|
|
|
// Description: Releases all datas at once. This will force them
|
|
|
// to be reloaded into data memory for all GSG's that
|
|
|
@@ -454,71 +470,218 @@ release_data(DataContext *dc) {
|
|
|
// released.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
int PreparedGraphicsObjects::
|
|
|
-release_all_datas() {
|
|
|
+release_all_vertex_buffers() {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- int num_datas = (int)_prepared_datas.size();
|
|
|
+ int num_vertex_buffers = (int)_prepared_vertex_buffers.size();
|
|
|
|
|
|
- Datas::iterator dci;
|
|
|
- for (dci = _prepared_datas.begin();
|
|
|
- dci != _prepared_datas.end();
|
|
|
- ++dci) {
|
|
|
- DataContext *dc = (*dci);
|
|
|
- dc->_data->clear_prepared(this);
|
|
|
- _total_buffers_pcollector.sub_level(dc->get_num_bytes());
|
|
|
- dc->_data = (qpGeomVertexArrayData *)NULL;
|
|
|
+ VertexBuffers::iterator vbci;
|
|
|
+ for (vbci = _prepared_vertex_buffers.begin();
|
|
|
+ vbci != _prepared_vertex_buffers.end();
|
|
|
+ ++vbci) {
|
|
|
+ VertexBufferContext *vbc = (*vbci);
|
|
|
+ vbc->_data->clear_prepared(this);
|
|
|
+ _total_buffers_pcollector.sub_level(vbc->get_data_size_bytes());
|
|
|
+ vbc->_data = (qpGeomVertexArrayData *)NULL;
|
|
|
|
|
|
- _released_datas.insert(dc);
|
|
|
+ _released_vertex_buffers.insert(vbc);
|
|
|
}
|
|
|
|
|
|
- _prepared_datas.clear();
|
|
|
+ _prepared_vertex_buffers.clear();
|
|
|
|
|
|
- return num_datas;
|
|
|
+ return num_vertex_buffers;
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-// Function: PreparedGraphicsObjects::prepare_data_now
|
|
|
+// Function: PreparedGraphicsObjects::prepare_vertex_buffer_now
|
|
|
// Access: Public
|
|
|
-// Description: Immediately creates a new DataContext for the
|
|
|
+// Description: Immediately creates a new VertexBufferContext for the
|
|
|
// indicated data and returns it. This assumes that
|
|
|
// the GraphicsStateGuardian is the currently active
|
|
|
// rendering context and that it is ready to accept new
|
|
|
// datas. If this is not necessarily the case, you
|
|
|
-// should use enqueue_data() instead.
|
|
|
+// should use enqueue_vertex_buffer() instead.
|
|
|
//
|
|
|
// Normally, this function is not called directly. Call
|
|
|
// Data::prepare_now() instead.
|
|
|
//
|
|
|
-// The DataContext contains all of the pertinent
|
|
|
+// The VertexBufferContext contains all of the pertinent
|
|
|
// information needed by the GSG to keep track of this
|
|
|
// one particular data, and will exist as long as the
|
|
|
// data is ready to be rendered.
|
|
|
//
|
|
|
// When either the Data or the
|
|
|
// PreparedGraphicsObjects object destructs, the
|
|
|
-// DataContext will be deleted.
|
|
|
+// VertexBufferContext will be deleted.
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
-DataContext *PreparedGraphicsObjects::
|
|
|
-prepare_data_now(qpGeomVertexArrayData *data, GraphicsStateGuardianBase *gsg) {
|
|
|
+VertexBufferContext *PreparedGraphicsObjects::
|
|
|
+prepare_vertex_buffer_now(qpGeomVertexArrayData *data, GraphicsStateGuardianBase *gsg) {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- // Ask the GSG to create a brand new DataContext. There might
|
|
|
+ // Ask the GSG to create a brand new VertexBufferContext. There might
|
|
|
// be several GSG's sharing the same set of datas; if so, it
|
|
|
// doesn't matter which of them creates the context (since they're
|
|
|
// all shared anyway).
|
|
|
- DataContext *dc = gsg->prepare_data(data);
|
|
|
+ VertexBufferContext *vbc = gsg->prepare_vertex_buffer(data);
|
|
|
|
|
|
- if (dc != (DataContext *)NULL) {
|
|
|
- bool prepared = _prepared_datas.insert(dc).second;
|
|
|
- nassertr(prepared, dc);
|
|
|
+ if (vbc != (VertexBufferContext *)NULL) {
|
|
|
+ bool prepared = _prepared_vertex_buffers.insert(vbc).second;
|
|
|
+ nassertr(prepared, vbc);
|
|
|
|
|
|
// The size has already been counted by
|
|
|
- // GraphicsStateGuardian::add_to_data_record(); we don't need to
|
|
|
+ // GraphicsStateGuardian::add_to_vertex_buffer_record(); we don't need to
|
|
|
// count it again here.
|
|
|
- //_total_buffers_pcollector.add_level(dc->get_num_bytes());
|
|
|
+ //_total_buffers_pcollector.add_level(vbc->get_data_size_bytes());
|
|
|
}
|
|
|
|
|
|
- return dc;
|
|
|
+ return vbc;
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: PreparedGraphicsObjects::enqueue_index_buffer
|
|
|
+// Access: Public
|
|
|
+// Description: Indicates that a buffer would like to be put on the
|
|
|
+// list to be prepared when the GSG is next ready to
|
|
|
+// do this (presumably at the next frame).
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+void PreparedGraphicsObjects::
|
|
|
+enqueue_index_buffer(qpGeomPrimitive *data) {
|
|
|
+ MutexHolder holder(_lock);
|
|
|
+
|
|
|
+ _enqueued_index_buffers.insert(data);
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: PreparedGraphicsObjects::dequeue_index_buffer
|
|
|
+// Access: Public
|
|
|
+// Description: Removes a buffer from the queued list of data
|
|
|
+// arrays to be prepared. Normally it is not necessary
|
|
|
+// to call this, unless you change your mind about
|
|
|
+// preparing it at the last minute, since the data will
|
|
|
+// automatically be dequeued and prepared at the next
|
|
|
+// frame.
|
|
|
+//
|
|
|
+// The return value is true if the buffer is
|
|
|
+// successfully dequeued, false if it had not been
|
|
|
+// queued.
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+bool PreparedGraphicsObjects::
|
|
|
+dequeue_index_buffer(qpGeomPrimitive *data) {
|
|
|
+ MutexHolder holder(_lock);
|
|
|
+
|
|
|
+ EnqueuedIndexBuffers::iterator qi = _enqueued_index_buffers.find(data);
|
|
|
+ if (qi != _enqueued_index_buffers.end()) {
|
|
|
+ _enqueued_index_buffers.erase(qi);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: PreparedGraphicsObjects::release_index_buffer
|
|
|
+// Access: Public
|
|
|
+// Description: Indicates that a data context, created by a
|
|
|
+// previous call to prepare_index_buffer(), is no longer
|
|
|
+// needed. The driver resources will not be freed until
|
|
|
+// some GSG calls update(), indicating it is at a
|
|
|
+// stage where it is ready to release datas--this
|
|
|
+// prevents conflicts from threading or multiple GSG's
|
|
|
+// sharing datas (we have no way of knowing which
|
|
|
+// graphics context is currently active, or what state
|
|
|
+// it's in, at the time release_index_buffer is called).
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+void PreparedGraphicsObjects::
|
|
|
+release_index_buffer(IndexBufferContext *ibc) {
|
|
|
+ MutexHolder holder(_lock);
|
|
|
+
|
|
|
+ ibc->_data->clear_prepared(this);
|
|
|
+ _total_buffers_pcollector.sub_level(ibc->get_data_size_bytes());
|
|
|
+
|
|
|
+ // We have to set the Data pointer to NULL at this point, since
|
|
|
+ // the Data itself might destruct at any time after it has been
|
|
|
+ // released.
|
|
|
+ ibc->_data = (qpGeomPrimitive *)NULL;
|
|
|
+
|
|
|
+ bool removed = (_prepared_index_buffers.erase(ibc) != 0);
|
|
|
+ nassertv(removed);
|
|
|
+
|
|
|
+ _released_index_buffers.insert(ibc);
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: PreparedGraphicsObjects::release_all_index_buffers
|
|
|
+// Access: Public
|
|
|
+// Description: Releases all datas at once. This will force them
|
|
|
+// to be reloaded into data memory for all GSG's that
|
|
|
+// share this object. Returns the number of datas
|
|
|
+// released.
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+int PreparedGraphicsObjects::
|
|
|
+release_all_index_buffers() {
|
|
|
+ MutexHolder holder(_lock);
|
|
|
+
|
|
|
+ int num_index_buffers = (int)_prepared_index_buffers.size();
|
|
|
+
|
|
|
+ IndexBuffers::iterator ibci;
|
|
|
+ for (ibci = _prepared_index_buffers.begin();
|
|
|
+ ibci != _prepared_index_buffers.end();
|
|
|
+ ++ibci) {
|
|
|
+ IndexBufferContext *ibc = (*ibci);
|
|
|
+ ibc->_data->clear_prepared(this);
|
|
|
+ _total_buffers_pcollector.sub_level(ibc->get_data_size_bytes());
|
|
|
+ ibc->_data = (qpGeomPrimitive *)NULL;
|
|
|
+
|
|
|
+ _released_index_buffers.insert(ibc);
|
|
|
+ }
|
|
|
+
|
|
|
+ _prepared_index_buffers.clear();
|
|
|
+
|
|
|
+ return num_index_buffers;
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+// Function: PreparedGraphicsObjects::prepare_index_buffer_now
|
|
|
+// Access: Public
|
|
|
+// Description: Immediately creates a new IndexBufferContext for the
|
|
|
+// indicated data and returns it. This assumes that
|
|
|
+// the GraphicsStateGuardian is the currently active
|
|
|
+// rendering context and that it is ready to accept new
|
|
|
+// datas. If this is not necessarily the case, you
|
|
|
+// should use enqueue_index_buffer() instead.
|
|
|
+//
|
|
|
+// Normally, this function is not called directly. Call
|
|
|
+// Data::prepare_now() instead.
|
|
|
+//
|
|
|
+// The IndexBufferContext contains all of the pertinent
|
|
|
+// information needed by the GSG to keep track of this
|
|
|
+// one particular data, and will exist as long as the
|
|
|
+// data is ready to be rendered.
|
|
|
+//
|
|
|
+// When either the Data or the
|
|
|
+// PreparedGraphicsObjects object destructs, the
|
|
|
+// IndexBufferContext will be deleted.
|
|
|
+////////////////////////////////////////////////////////////////////
|
|
|
+IndexBufferContext *PreparedGraphicsObjects::
|
|
|
+prepare_index_buffer_now(qpGeomPrimitive *data, GraphicsStateGuardianBase *gsg) {
|
|
|
+ MutexHolder holder(_lock);
|
|
|
+
|
|
|
+ // Ask the GSG to create a brand new IndexBufferContext. There might
|
|
|
+ // be several GSG's sharing the same set of datas; if so, it
|
|
|
+ // doesn't matter which of them creates the context (since they're
|
|
|
+ // all shared anyway).
|
|
|
+ IndexBufferContext *ibc = gsg->prepare_index_buffer(data);
|
|
|
+
|
|
|
+ if (ibc != (IndexBufferContext *)NULL) {
|
|
|
+ bool prepared = _prepared_index_buffers.insert(ibc).second;
|
|
|
+ nassertr(prepared, ibc);
|
|
|
+
|
|
|
+ // The size has already been counted by
|
|
|
+ // GraphicsStateGuardian::add_to_index_buffer_record(); we don't need to
|
|
|
+ // count it again here.
|
|
|
+ //_total_buffers_pcollector.add_level(ibc->get_data_size_bytes());
|
|
|
+ }
|
|
|
+
|
|
|
+ return ibc;
|
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
@@ -537,7 +700,7 @@ void PreparedGraphicsObjects::
|
|
|
update(GraphicsStateGuardianBase *gsg) {
|
|
|
MutexHolder holder(_lock);
|
|
|
|
|
|
- // First, release all the textures, geoms, and data arrays awaiting
|
|
|
+ // First, release all the textures, geoms, and buffers awaiting
|
|
|
// release.
|
|
|
Textures::iterator tci;
|
|
|
for (tci = _released_textures.begin();
|
|
|
@@ -559,17 +722,27 @@ update(GraphicsStateGuardianBase *gsg) {
|
|
|
|
|
|
_released_geoms.clear();
|
|
|
|
|
|
- Datas::iterator dci;
|
|
|
- for (dci = _released_datas.begin();
|
|
|
- dci != _released_datas.end();
|
|
|
- ++dci) {
|
|
|
- DataContext *dc = (*dci);
|
|
|
- gsg->release_data(dc);
|
|
|
+ VertexBuffers::iterator vbci;
|
|
|
+ for (vbci = _released_vertex_buffers.begin();
|
|
|
+ vbci != _released_vertex_buffers.end();
|
|
|
+ ++vbci) {
|
|
|
+ VertexBufferContext *vbc = (*vbci);
|
|
|
+ gsg->release_vertex_buffer(vbc);
|
|
|
+ }
|
|
|
+
|
|
|
+ _released_vertex_buffers.clear();
|
|
|
+
|
|
|
+ IndexBuffers::iterator ibci;
|
|
|
+ for (ibci = _released_index_buffers.begin();
|
|
|
+ ibci != _released_index_buffers.end();
|
|
|
+ ++ibci) {
|
|
|
+ IndexBufferContext *ibc = (*ibci);
|
|
|
+ gsg->release_index_buffer(ibc);
|
|
|
}
|
|
|
|
|
|
- _released_datas.clear();
|
|
|
+ _released_index_buffers.clear();
|
|
|
|
|
|
- // Now prepare all the textures, geoms, and data arrays awaiting
|
|
|
+ // Now prepare all the textures, geoms, and buffers awaiting
|
|
|
// preparation.
|
|
|
EnqueuedTextures::iterator qti;
|
|
|
for (qti = _enqueued_textures.begin();
|
|
|
@@ -589,13 +762,25 @@ update(GraphicsStateGuardianBase *gsg) {
|
|
|
geom->prepare_now(this, gsg);
|
|
|
}
|
|
|
|
|
|
- EnqueuedDatas::iterator qdi;
|
|
|
- for (qdi = _enqueued_datas.begin();
|
|
|
- qdi != _enqueued_datas.end();
|
|
|
- ++qdi) {
|
|
|
- qpGeomVertexArrayData *data = (*qdi);
|
|
|
+ _enqueued_geoms.clear();
|
|
|
+
|
|
|
+ EnqueuedVertexBuffers::iterator qvbi;
|
|
|
+ for (qvbi = _enqueued_vertex_buffers.begin();
|
|
|
+ qvbi != _enqueued_vertex_buffers.end();
|
|
|
+ ++qvbi) {
|
|
|
+ qpGeomVertexArrayData *data = (*qvbi);
|
|
|
+ data->prepare_now(this, gsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ _enqueued_vertex_buffers.clear();
|
|
|
+
|
|
|
+ EnqueuedIndexBuffers::iterator qibi;
|
|
|
+ for (qibi = _enqueued_index_buffers.begin();
|
|
|
+ qibi != _enqueued_index_buffers.end();
|
|
|
+ ++qibi) {
|
|
|
+ qpGeomPrimitive *data = (*qibi);
|
|
|
data->prepare_now(this, gsg);
|
|
|
}
|
|
|
|
|
|
- _enqueued_datas.clear();
|
|
|
+ _enqueued_index_buffers.clear();
|
|
|
}
|