|
|
@@ -66,71 +66,43 @@ PreparedGraphicsObjects::
|
|
|
ReMutexHolder holder(_lock);
|
|
|
|
|
|
release_all_textures();
|
|
|
- Textures::iterator tci;
|
|
|
- for (tci = _released_textures.begin();
|
|
|
- tci != _released_textures.end();
|
|
|
- ++tci) {
|
|
|
- TextureContext *tc = (*tci);
|
|
|
+ for (TextureContext *tc : _released_textures) {
|
|
|
delete tc;
|
|
|
}
|
|
|
_released_textures.clear();
|
|
|
|
|
|
release_all_samplers();
|
|
|
- ReleasedSamplers::iterator ssci;
|
|
|
- for (ssci = _released_samplers.begin();
|
|
|
- ssci != _released_samplers.end();
|
|
|
- ++ssci) {
|
|
|
- SamplerContext *sc = (*ssci);
|
|
|
+ for (SamplerContext *sc : _released_samplers) {
|
|
|
delete sc;
|
|
|
}
|
|
|
_released_samplers.clear();
|
|
|
|
|
|
release_all_geoms();
|
|
|
- Geoms::iterator gci;
|
|
|
- for (gci = _released_geoms.begin();
|
|
|
- gci != _released_geoms.end();
|
|
|
- ++gci) {
|
|
|
- GeomContext *gc = (*gci);
|
|
|
+ for (GeomContext *gc : _released_geoms) {
|
|
|
delete gc;
|
|
|
}
|
|
|
_released_geoms.clear();
|
|
|
|
|
|
release_all_shaders();
|
|
|
- Shaders::iterator sci;
|
|
|
- for (sci = _released_shaders.begin();
|
|
|
- sci != _released_shaders.end();
|
|
|
- ++sci) {
|
|
|
- ShaderContext *sc = (*sci);
|
|
|
+ for (ShaderContext *sc : _released_shaders) {
|
|
|
delete sc;
|
|
|
}
|
|
|
_released_shaders.clear();
|
|
|
|
|
|
release_all_vertex_buffers();
|
|
|
- Buffers::iterator vbci;
|
|
|
- for (vbci = _released_vertex_buffers.begin();
|
|
|
- vbci != _released_vertex_buffers.end();
|
|
|
- ++vbci) {
|
|
|
- VertexBufferContext *vbc = (VertexBufferContext *)(*vbci);
|
|
|
- delete vbc;
|
|
|
+ for (BufferContext *bc : _released_vertex_buffers) {
|
|
|
+ delete bc;
|
|
|
}
|
|
|
_released_vertex_buffers.clear();
|
|
|
|
|
|
release_all_index_buffers();
|
|
|
- Buffers::iterator ibci;
|
|
|
- for (ibci = _released_index_buffers.begin();
|
|
|
- ibci != _released_index_buffers.end();
|
|
|
- ++ibci) {
|
|
|
- IndexBufferContext *ibc = (IndexBufferContext *)(*ibci);
|
|
|
- delete ibc;
|
|
|
+ for (BufferContext *bc : _released_index_buffers) {
|
|
|
+ delete bc;
|
|
|
}
|
|
|
_released_index_buffers.clear();
|
|
|
|
|
|
release_all_shader_buffers();
|
|
|
- Buffers::iterator bci;
|
|
|
- for (bci = _released_shader_buffers.begin();
|
|
|
- bci != _released_shader_buffers.end();
|
|
|
- ++bci) {
|
|
|
- BufferContext *bc = (BufferContext *)(*bci);
|
|
|
+ for (BufferContext *bc : _released_shader_buffers) {
|
|
|
delete bc;
|
|
|
}
|
|
|
_released_shader_buffers.clear();
|
|
|
@@ -279,7 +251,7 @@ release_texture(TextureContext *tc) {
|
|
|
bool removed = (_prepared_textures.erase(tc) != 0);
|
|
|
nassertv(removed);
|
|
|
|
|
|
- _released_textures.insert(tc);
|
|
|
+ _released_textures.push_back(tc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -310,7 +282,7 @@ release_all_textures() {
|
|
|
tc->get_texture()->clear_prepared(tc->get_view(), this);
|
|
|
tc->_object = nullptr;
|
|
|
|
|
|
- _released_textures.insert(tc);
|
|
|
+ _released_textures.push_back(tc);
|
|
|
}
|
|
|
|
|
|
_prepared_textures.clear();
|
|
|
@@ -965,7 +937,7 @@ release_vertex_buffer(VertexBufferContext *vbc) {
|
|
|
released_vbuffer_cache_size,
|
|
|
_released_vertex_buffers);
|
|
|
} else {
|
|
|
- _released_vertex_buffers.insert(vbc);
|
|
|
+ _released_vertex_buffers.push_back(vbc);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -988,7 +960,7 @@ release_all_vertex_buffers() {
|
|
|
vbc->get_data()->clear_prepared(this);
|
|
|
vbc->_object = nullptr;
|
|
|
|
|
|
- _released_vertex_buffers.insert(vbc);
|
|
|
+ _released_vertex_buffers.push_back(vbc);
|
|
|
}
|
|
|
|
|
|
_prepared_vertex_buffers.clear();
|
|
|
@@ -1004,7 +976,7 @@ release_all_vertex_buffers() {
|
|
|
BufferList::iterator li;
|
|
|
for (li = buffer_list.begin(); li != buffer_list.end(); ++li) {
|
|
|
VertexBufferContext *vbc = (VertexBufferContext *)(*li);
|
|
|
- _released_vertex_buffers.insert(vbc);
|
|
|
+ _released_vertex_buffers.push_back(vbc);
|
|
|
}
|
|
|
}
|
|
|
_vertex_buffer_cache.clear();
|
|
|
@@ -1163,7 +1135,7 @@ release_index_buffer(IndexBufferContext *ibc) {
|
|
|
released_ibuffer_cache_size,
|
|
|
_released_index_buffers);
|
|
|
} else {
|
|
|
- _released_index_buffers.insert(ibc);
|
|
|
+ _released_index_buffers.push_back(ibc);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1186,7 +1158,7 @@ release_all_index_buffers() {
|
|
|
ibc->get_data()->clear_prepared(this);
|
|
|
ibc->_object = nullptr;
|
|
|
|
|
|
- _released_index_buffers.insert(ibc);
|
|
|
+ _released_index_buffers.push_back(ibc);
|
|
|
}
|
|
|
|
|
|
_prepared_index_buffers.clear();
|
|
|
@@ -1202,7 +1174,7 @@ release_all_index_buffers() {
|
|
|
BufferList::iterator li;
|
|
|
for (li = buffer_list.begin(); li != buffer_list.end(); ++li) {
|
|
|
IndexBufferContext *vbc = (IndexBufferContext *)(*li);
|
|
|
- _released_index_buffers.insert(vbc);
|
|
|
+ _released_index_buffers.push_back(vbc);
|
|
|
}
|
|
|
}
|
|
|
_index_buffer_cache.clear();
|
|
|
@@ -1351,7 +1323,7 @@ release_shader_buffer(BufferContext *bc) {
|
|
|
bool removed = (_prepared_shader_buffers.erase(bc) != 0);
|
|
|
nassertv(removed);
|
|
|
|
|
|
- _released_shader_buffers.insert(bc);
|
|
|
+ _released_shader_buffers.push_back(bc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1371,7 +1343,7 @@ release_all_shader_buffers() {
|
|
|
++bci) {
|
|
|
|
|
|
BufferContext *bc = (BufferContext *)(*bci);
|
|
|
- _released_shader_buffers.insert(bc);
|
|
|
+ _released_shader_buffers.push_back(bc);
|
|
|
}
|
|
|
|
|
|
_prepared_shader_buffers.clear();
|
|
|
@@ -1512,68 +1484,45 @@ begin_frame(GraphicsStateGuardianBase *gsg, Thread *current_thread) {
|
|
|
|
|
|
// First, release all the textures, geoms, and buffers awaiting release.
|
|
|
if (!_released_textures.empty()) {
|
|
|
- Textures::iterator tci;
|
|
|
- for (tci = _released_textures.begin();
|
|
|
- tci != _released_textures.end();
|
|
|
- ++tci) {
|
|
|
- TextureContext *tc = (*tci);
|
|
|
- gsg->release_texture(tc);
|
|
|
- }
|
|
|
-
|
|
|
+ gsg->release_textures(_released_textures);
|
|
|
_released_textures.clear();
|
|
|
}
|
|
|
|
|
|
if (!_released_samplers.empty()) {
|
|
|
- ReleasedSamplers::iterator sci;
|
|
|
- for (sci = _released_samplers.begin();
|
|
|
- sci != _released_samplers.end();
|
|
|
- ++sci) {
|
|
|
- SamplerContext *sc = (*sci);
|
|
|
+ for (SamplerContext *sc : _released_samplers) {
|
|
|
gsg->release_sampler(sc);
|
|
|
}
|
|
|
-
|
|
|
_released_samplers.clear();
|
|
|
}
|
|
|
|
|
|
- Geoms::iterator gci;
|
|
|
- for (gci = _released_geoms.begin();
|
|
|
- gci != _released_geoms.end();
|
|
|
- ++gci) {
|
|
|
- GeomContext *gc = (*gci);
|
|
|
- gsg->release_geom(gc);
|
|
|
+ if (!_released_geoms.empty()) {
|
|
|
+ for (GeomContext *gc : _released_geoms) {
|
|
|
+ gsg->release_geom(gc);
|
|
|
+ }
|
|
|
+ _released_geoms.clear();
|
|
|
}
|
|
|
|
|
|
- _released_geoms.clear();
|
|
|
-
|
|
|
- Shaders::iterator sci;
|
|
|
- for (sci = _released_shaders.begin();
|
|
|
- sci != _released_shaders.end();
|
|
|
- ++sci) {
|
|
|
- ShaderContext *sc = (*sci);
|
|
|
- gsg->release_shader(sc);
|
|
|
+ if (!_released_shaders.empty()) {
|
|
|
+ for (ShaderContext *sc : _released_shaders) {
|
|
|
+ gsg->release_shader(sc);
|
|
|
+ }
|
|
|
+ _released_shaders.clear();
|
|
|
}
|
|
|
|
|
|
- _released_shaders.clear();
|
|
|
-
|
|
|
- Buffers::iterator vbci;
|
|
|
- for (vbci = _released_vertex_buffers.begin();
|
|
|
- vbci != _released_vertex_buffers.end();
|
|
|
- ++vbci) {
|
|
|
- VertexBufferContext *vbc = (VertexBufferContext *)(*vbci);
|
|
|
- gsg->release_vertex_buffer(vbc);
|
|
|
+ if (!_released_vertex_buffers.empty()) {
|
|
|
+ gsg->release_vertex_buffers(_released_vertex_buffers);
|
|
|
+ _released_vertex_buffers.clear();
|
|
|
}
|
|
|
|
|
|
- _released_vertex_buffers.clear();
|
|
|
-
|
|
|
- Buffers::iterator ibci;
|
|
|
- for (ibci = _released_index_buffers.begin();
|
|
|
- ibci != _released_index_buffers.end();
|
|
|
- ++ibci) {
|
|
|
- IndexBufferContext *ibc = (IndexBufferContext *)(*ibci);
|
|
|
- gsg->release_index_buffer(ibc);
|
|
|
+ if (!_released_index_buffers.empty()) {
|
|
|
+ gsg->release_index_buffers(_released_index_buffers);
|
|
|
+ _released_index_buffers.clear();
|
|
|
}
|
|
|
|
|
|
- _released_index_buffers.clear();
|
|
|
+ if (!_released_shader_buffers.empty()) {
|
|
|
+ gsg->release_shader_buffers(_released_shader_buffers);
|
|
|
+ _released_shader_buffers.clear();
|
|
|
+ }
|
|
|
|
|
|
// Reset the residency trackers.
|
|
|
_texture_residency.begin_frame(current_thread);
|
|
|
@@ -1697,7 +1646,7 @@ cache_unprepared_buffer(BufferContext *buffer, size_t data_size_bytes,
|
|
|
PreparedGraphicsObjects::BufferCacheLRU &buffer_cache_lru,
|
|
|
size_t &buffer_cache_size,
|
|
|
int released_buffer_cache_size,
|
|
|
- PreparedGraphicsObjects::Buffers &released_buffers) {
|
|
|
+ pvector<BufferContext *> &released_buffers) {
|
|
|
BufferCacheKey key;
|
|
|
key._data_size_bytes = data_size_bytes;
|
|
|
key._usage_hint = usage_hint;
|
|
|
@@ -1723,7 +1672,10 @@ cache_unprepared_buffer(BufferContext *buffer, size_t data_size_bytes,
|
|
|
(int)buffer_cache_size > released_buffer_cache_size) {
|
|
|
BufferContext *released_buffer = buffer_list.back();
|
|
|
buffer_list.pop_back();
|
|
|
- released_buffers.insert(released_buffer);
|
|
|
+ if (released_buffer->_object != nullptr) {
|
|
|
+ released_buffer->_object = nullptr;
|
|
|
+ released_buffers.push_back(released_buffer);
|
|
|
+ }
|
|
|
buffer_cache_size -= release_key._data_size_bytes;
|
|
|
}
|
|
|
|