Browse Source

gobj: fix `_contexts != nullptr` assert when prepare fails

rdb 2 years ago
parent
commit
a2fa54f385
2 changed files with 22 additions and 12 deletions
  1. 11 6
      panda/src/gobj/geomVertexArrayData.cxx
  2. 11 6
      panda/src/gobj/shaderBuffer.cxx

+ 11 - 6
panda/src/gobj/geomVertexArrayData.cxx

@@ -239,19 +239,24 @@ is_prepared(PreparedGraphicsObjects *prepared_objects) const {
 VertexBufferContext *GeomVertexArrayData::
 prepare_now(PreparedGraphicsObjects *prepared_objects,
             GraphicsStateGuardianBase *gsg) {
-  if (_contexts == nullptr) {
+  if (_contexts != nullptr) {
+    Contexts::const_iterator ci;
+    ci = _contexts->find(prepared_objects);
+    if (ci != _contexts->end()) {
+      return (*ci).second;
+    }
+  } else {
     _contexts = new Contexts;
   }
-  Contexts::const_iterator ci;
-  ci = _contexts->find(prepared_objects);
-  if (ci != _contexts->end()) {
-    return (*ci).second;
-  }
 
   VertexBufferContext *vbc = prepared_objects->prepare_vertex_buffer_now(this, gsg);
   if (vbc != nullptr) {
     (*_contexts)[prepared_objects] = vbc;
   }
+  else if (_contexts->empty()) {
+    delete _contexts;
+    _contexts = nullptr;
+  }
   return vbc;
 }
 

+ 11 - 6
panda/src/gobj/shaderBuffer.cxx

@@ -76,19 +76,24 @@ is_prepared(PreparedGraphicsObjects *prepared_objects) const {
 BufferContext *ShaderBuffer::
 prepare_now(PreparedGraphicsObjects *prepared_objects,
             GraphicsStateGuardianBase *gsg) {
-  if (_contexts == nullptr) {
+  if (_contexts != nullptr) {
+    Contexts::const_iterator ci;
+    ci = _contexts->find(prepared_objects);
+    if (ci != _contexts->end()) {
+      return (*ci).second;
+    }
+  } else {
     _contexts = new Contexts;
   }
-  Contexts::const_iterator ci;
-  ci = _contexts->find(prepared_objects);
-  if (ci != _contexts->end()) {
-    return (*ci).second;
-  }
 
   BufferContext *vbc = prepared_objects->prepare_shader_buffer_now(this, gsg);
   if (vbc != nullptr) {
     (*_contexts)[prepared_objects] = vbc;
   }
+  else if (_contexts->empty()) {
+    delete _contexts;
+    _contexts = nullptr;
+  }
   return vbc;
 }