[Bf-blender-cvs] [3f5073a8e29] master: Fix T98884: Fix edge case crashes in gpu subdiv cache code

Joseph Eagar noreply at git.blender.org
Mon Jul 4 10:41:30 CEST 2022


Commit: 3f5073a8e298c474fac36f7193d291e6f9579277
Author: Joseph Eagar
Date:   Mon Jul 4 01:34:54 2022 -0700
Branches: master
https://developer.blender.org/rB3f5073a8e298c474fac36f7193d291e6f9579277

Fix T98884: Fix edge case crashes in gpu subdiv cache code

===================================================================

M	source/blender/draw/intern/draw_cache_impl_subdivision.cc
M	source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc

===================================================================

diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
index afec92a894d..29ab814cfa4 100644
--- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc
+++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc
@@ -1470,6 +1470,11 @@ void draw_subdiv_interp_custom_data(const DRWSubdivCache *cache,
 {
   GPUShader *shader = nullptr;
 
+  if (!draw_subdiv_cache_need_polygon_data(cache)) {
+    /* Happens on meshes with only loose geometry. */
+    return;
+  }
+
   if (dimensions == 1) {
     shader = get_subdiv_shader(SHADER_COMP_CUSTOM_DATA_INTERP_1D,
                                "#define SUBDIV_POLYGON_OFFSET\n"
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
index 51d98d1ff26..e6c0d815963 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines.cc
@@ -183,17 +183,43 @@ static void extract_lines_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache,
 
   uint *flags_data = static_cast<uint *>(GPU_vertbuf_get_data(flags));
 
-  if (mr->extract_type == MR_EXTRACT_MESH) {
-    const MEdge *medge = mr->medge;
-    for (DRWSubdivLooseEdge edge : loose_edges) {
-      *flags_data++ = (medge[edge.coarse_edge_index].flag & ME_HIDE) != 0;
+  switch (mr->extract_type) {
+    case MR_EXTRACT_MESH: {
+      const MEdge *medge = mr->medge;
+      for (DRWSubdivLooseEdge edge : loose_edges) {
+        *flags_data++ = (medge[edge.coarse_edge_index].flag & ME_HIDE) != 0;
+      }
+      break;
     }
-  }
-  else {
-    BMesh *bm = mr->bm;
-    for (DRWSubdivLooseEdge edge : loose_edges) {
-      const BMEdge *bm_edge = BM_edge_at_index(bm, edge.coarse_edge_index);
-      *flags_data++ = BM_elem_flag_test_bool(bm_edge, BM_ELEM_HIDDEN) != 0;
+    case MR_EXTRACT_MAPPED: {
+      if (mr->bm) {
+        for (DRWSubdivLooseEdge edge : loose_edges) {
+          const BMEdge *bm_edge = bm_original_edge_get(mr, edge.coarse_edge_index);
+          *flags_data++ = BM_elem_flag_test_bool(bm_edge, BM_ELEM_HIDDEN) != 0;
+        }
+      }
+      else {
+        for (DRWSubdivLooseEdge edge : loose_edges) {
+          int e = edge.coarse_edge_index;
+
+          if (mr->e_origindex && mr->e_origindex[e] != ORIGINDEX_NONE) {
+            *flags_data++ = (mr->medge[mr->e_origindex[e]].flag & ME_HIDE) != 0;
+          }
+          else {
+            *flags_data++ = false;
+          }
+        }
+      }
+
+      break;
+    }
+    case MR_EXTRACT_BMESH: {
+      BMesh *bm = mr->bm;
+      for (DRWSubdivLooseEdge edge : loose_edges) {
+        const BMEdge *bm_edge = BM_edge_at_index(bm, edge.coarse_edge_index);
+        *flags_data++ = BM_elem_flag_test_bool(bm_edge, BM_ELEM_HIDDEN) != 0;
+      }
+      break;
     }
   }



More information about the Bf-blender-cvs mailing list