Browse Source

gobj: add PreparedGraphicsObjects::release_all_now() (for Vulkan)

rdb 7 years ago
parent
commit
2aeec34ac1

+ 15 - 0
panda/src/gobj/preparedGraphicsObjects.I

@@ -48,6 +48,21 @@ release_all() {
   _sbuffer_residency.set_levels();
 }
 
+/**
+ * Releases all prepared objects of all kinds at once, immediately.  This
+ * assumes that the GraphicsStateGuardian is currently active on this thread
+ * and in a state ready to accept releases.
+ *
+ * In most cases, you will simply want to call release_all() instead, which
+ * waits until the beginning of the next frame to process the releases.
+ */
+INLINE void PreparedGraphicsObjects::
+release_all_now(GraphicsStateGuardianBase *gsg) {
+  ReMutexHolder holder(_lock);
+  release_all();
+  do_release_now(gsg);
+}
+
 /**
  * Returns the number of objects of any kind that have been enqueued to be
  * prepared on this GSG.

+ 72 - 63
panda/src/gobj/preparedGraphicsObjects.cxx

@@ -1504,69 +1504,7 @@ begin_frame(GraphicsStateGuardianBase *gsg, Thread *current_thread) {
   ReMutexHolder holder(_lock, 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);
-    }
-
-    _released_textures.clear();
-  }
-
-  if (!_released_samplers.empty()) {
-    ReleasedSamplers::iterator sci;
-    for (sci = _released_samplers.begin();
-         sci != _released_samplers.end();
-         ++sci) {
-      SamplerContext *sc = (*sci);
-      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);
-  }
-
-  _released_geoms.clear();
-
-  Shaders::iterator sci;
-  for (sci = _released_shaders.begin();
-       sci != _released_shaders.end();
-       ++sci) {
-    ShaderContext *sc = (*sci);
-    gsg->release_shader(sc);
-  }
-
-  _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);
-  }
-
-  _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);
-  }
-
-  _released_index_buffers.clear();
+  do_release_now(gsg);
 
   // Reset the residency trackers.
   _texture_residency.begin_frame(current_thread);
@@ -1665,6 +1603,77 @@ end_frame(Thread *current_thread) {
   _sbuffer_residency.end_frame(current_thread);
 }
 
+/**
+ * Asks the GraphicsStateGuardian to release all contexts that are pending
+ * release.  Assumes the lock is held.
+ */
+void PreparedGraphicsObjects::
+do_release_now(GraphicsStateGuardianBase *gsg) {
+  if (!_released_textures.empty()) {
+    Textures::iterator tci;
+    for (tci = _released_textures.begin();
+         tci != _released_textures.end();
+         ++tci) {
+      TextureContext *tc = (*tci);
+      gsg->release_texture(tc);
+    }
+
+    _released_textures.clear();
+  }
+
+  if (!_released_samplers.empty()) {
+    ReleasedSamplers::iterator sci;
+    for (sci = _released_samplers.begin();
+         sci != _released_samplers.end();
+         ++sci) {
+      SamplerContext *sc = (*sci);
+      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);
+  }
+
+  _released_geoms.clear();
+
+  Shaders::iterator sci;
+  for (sci = _released_shaders.begin();
+       sci != _released_shaders.end();
+       ++sci) {
+    ShaderContext *sc = (*sci);
+    gsg->release_shader(sc);
+  }
+
+  _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);
+  }
+
+  _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);
+  }
+
+  _released_index_buffers.clear();
+}
+
 /**
  * Returns a new, unique name for a newly-constructed object.
  */

+ 3 - 0
panda/src/gobj/preparedGraphicsObjects.h

@@ -69,6 +69,7 @@ PUBLISHED:
   void show_residency_trackers(ostream &out) const;
 
   INLINE void release_all();
+  INLINE void release_all_now(GraphicsStateGuardianBase *gsg);
   INLINE int get_num_queued() const;
   INLINE int get_num_prepared() const;
 
@@ -215,6 +216,8 @@ public:
   void end_frame(Thread *current_thread);
 
 private:
+  void do_release_now(GraphicsStateGuardianBase *gsg);
+
   static string init_name();
 
 private: