Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorKévin Dietrich <kevin.dietrich@mailoo.org>2022-01-16 09:31:12 +0300
committerKévin Dietrich <kevin.dietrich@mailoo.org>2022-01-16 09:31:26 +0300
commit3574f2730d2a42cda2881d26209b8dc53b1d2047 (patch)
treedfd1aa439249d44ce10de737aea5259db70781c8 /source
parentb87d87b1d3c8400e4ee4ea3f0763df64c8ca7fc0 (diff)
Cleanup: deduplicate GPU subdiv data extraction loops
This puts the loop over the final subdivision quads outside of the mesh iteration callback. This can also allow for easier parallel execution in the future if need be.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/intern/draw_cache_extract_mesh.cc4
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh.h3
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc76
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc27
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc7
-rw-r--r--source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc7
6 files changed, 66 insertions, 58 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc
index eed015bc212..117ce2a2817 100644
--- a/source/blender/draw/intern/draw_cache_extract_mesh.cc
+++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc
@@ -861,7 +861,9 @@ static void mesh_buffer_cache_create_requested_subdiv(MeshBatchCache *cache,
extractor->init_subdiv(subdiv_cache, &mr, cache, buffer, data);
if (extractor->iter_subdiv) {
- extractor->iter_subdiv(subdiv_cache, &mr, data);
+ for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
+ extractor->iter_subdiv(subdiv_cache, &mr, data, i);
+ }
}
if (extractor->iter_loose_geom_subdiv) {
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.h b/source/blender/draw/intern/mesh_extractors/extract_mesh.h
index 7c6f4dea6c9..5d3eaf16f10 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh.h
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.h
@@ -225,7 +225,8 @@ typedef void(ExtractInitSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
void *data);
typedef void(ExtractIterSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *data);
+ void *data,
+ uint subdiv_quad_index);
typedef void(ExtractFinishSubdivFn)(const struct DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
struct MeshBatchCache *cache,
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
index 5cb77426438..3a2b6d468d8 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_edituv.cc
@@ -112,30 +112,29 @@ static void extract_edituv_tris_init_subdiv(const DRWSubdivCache *subdiv_cache,
static void extract_edituv_tris_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
- for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
- const uint loop_idx = i * 4;
- const int poly_origindex = subdiv_loop_poly_index[loop_idx];
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
+ const uint loop_idx = subdiv_quad_index * 4;
+ const int poly_origindex = subdiv_loop_poly_index[loop_idx];
+ BMFace *efa = bm_original_face_get(mr, poly_origindex);
- edituv_tri_add(data,
- BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
- BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
- loop_idx,
- loop_idx + 1,
- loop_idx + 2);
-
- edituv_tri_add(data,
- BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
- BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
- loop_idx,
- loop_idx + 2,
- loop_idx + 3);
- }
+ edituv_tri_add(data,
+ BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
+ BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ loop_idx + 1,
+ loop_idx + 2);
+
+ edituv_tri_add(data,
+ BM_elem_flag_test(efa, BM_ELEM_HIDDEN) != 0,
+ BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ loop_idx + 2,
+ loop_idx + 3);
}
static void extract_edituv_tris_finish_subdiv(const struct DRWSubdivCache *UNUSED(subdiv_cache),
@@ -256,30 +255,28 @@ static void extract_edituv_lines_init_subdiv(const DRWSubdivCache *subdiv_cache,
static void extract_edituv_lines_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
- for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
- uint start_loop_idx = i * 4;
- uint end_loop_idx = (i + 1) * 4;
+ const int poly_origindex = subdiv_loop_poly_index[start_loop_idx];
+ BMFace *efa = bm_original_face_get(mr, poly_origindex);
- const int poly_origindex = subdiv_loop_poly_index[start_loop_idx];
- BMFace *efa = bm_original_face_get(mr, poly_origindex);
-
- for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) {
- const int edge_origindex = subdiv_loop_edge_index[loop_idx];
- const bool real_edge = (edge_origindex != -1 &&
- mr->e_origindex[edge_origindex] != ORIGINDEX_NONE);
- edituv_edge_add(data,
- BM_elem_flag_test_bool(efa, BM_ELEM_HIDDEN) != 0 || !real_edge,
- BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) != 0,
- loop_idx,
- (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1));
- }
+ for (uint loop_idx = start_loop_idx; loop_idx < end_loop_idx; loop_idx++) {
+ const int edge_origindex = subdiv_loop_edge_index[loop_idx];
+ const bool real_edge = (edge_origindex != -1 &&
+ mr->e_origindex[edge_origindex] != ORIGINDEX_NONE);
+ edituv_edge_add(data,
+ BM_elem_flag_test_bool(efa, BM_ELEM_HIDDEN) != 0 || !real_edge,
+ BM_elem_flag_test_bool(efa, BM_ELEM_SELECT) != 0,
+ loop_idx,
+ (loop_idx + 1 == end_loop_idx) ? start_loop_idx : (loop_idx + 1));
}
}
@@ -395,13 +392,16 @@ static void extract_edituv_points_init_subdiv(const DRWSubdivCache *subdiv_cache
static void extract_edituv_points_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
MeshExtract_EditUvElem_Data *data = static_cast<MeshExtract_EditUvElem_Data *>(_data);
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
- for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) {
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
+ for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int poly_origindex = subdiv_loop_poly_index[i];
BMFace *efa = bm_original_face_get(mr, poly_origindex);
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
index f125593cff2..59db4ca6445 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_ibo_lines_adjacency.cc
@@ -198,25 +198,24 @@ static void extract_lines_adjacency_init_subdiv(const DRWSubdivCache *subdiv_cac
static void extract_lines_adjacency_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *UNUSED(mr),
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
MeshExtract_LineAdjacency_Data *data = static_cast<MeshExtract_LineAdjacency_Data *>(_data);
- for (uint i = 0; i < subdiv_cache->num_subdiv_quads; i++) {
- const uint loop_index = i * 4;
- const uint l0 = loop_index + 0;
- const uint l1 = loop_index + 1;
- const uint l2 = loop_index + 2;
- const uint l3 = loop_index + 3;
+ const uint loop_index = subdiv_quad_index * 4;
+ const uint l0 = loop_index + 0;
+ const uint l1 = loop_index + 1;
+ const uint l2 = loop_index + 2;
+ const uint l3 = loop_index + 3;
- const uint v0 = subdiv_cache->subdiv_loop_subdiv_vert_index[l0];
- const uint v1 = subdiv_cache->subdiv_loop_subdiv_vert_index[l1];
- const uint v2 = subdiv_cache->subdiv_loop_subdiv_vert_index[l2];
- const uint v3 = subdiv_cache->subdiv_loop_subdiv_vert_index[l3];
+ const uint v0 = subdiv_cache->subdiv_loop_subdiv_vert_index[l0];
+ const uint v1 = subdiv_cache->subdiv_loop_subdiv_vert_index[l1];
+ const uint v2 = subdiv_cache->subdiv_loop_subdiv_vert_index[l2];
+ const uint v3 = subdiv_cache->subdiv_loop_subdiv_vert_index[l3];
- lines_adjacency_triangle(v0, v1, v2, l0, l1, l2, data);
- lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data);
- }
+ lines_adjacency_triangle(v0, v1, v2, l0, l1, l2, data);
+ lines_adjacency_triangle(v0, v2, v3, l0, l2, l3, data);
}
static void extract_lines_adjacency_finish_subdiv(const DRWSubdivCache *UNUSED(subdiv_cache),
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
index 0b4172dfb28..2ac495f3b4c 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edit_data.cc
@@ -263,14 +263,17 @@ static void extract_edit_data_init_subdiv(const DRWSubdivCache *subdiv_cache,
static void extract_edit_data_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
EditLoopData *vbo_data = *(EditLoopData **)_data;
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
- for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) {
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
+ for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int edge_origindex = subdiv_loop_edge_index[i];
const int poly_origindex = subdiv_loop_poly_index[i];
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
index 067d482bc2b..b1866708d14 100644
--- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
+++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_data.cc
@@ -141,14 +141,17 @@ static void extract_edituv_data_init_subdiv(const DRWSubdivCache *subdiv_cache,
static void extract_edituv_data_iter_subdiv(const DRWSubdivCache *subdiv_cache,
const MeshRenderData *mr,
- void *_data)
+ void *_data,
+ uint subdiv_quad_index)
{
MeshExtract_EditUVData_Data *data = static_cast<MeshExtract_EditUVData_Data *>(_data);
int *subdiv_loop_vert_index = (int *)GPU_vertbuf_get_data(subdiv_cache->verts_orig_index);
int *subdiv_loop_edge_index = (int *)GPU_vertbuf_get_data(subdiv_cache->edges_orig_index);
int *subdiv_loop_poly_index = subdiv_cache->subdiv_loop_poly_index;
- for (uint i = 0; i < subdiv_cache->num_subdiv_loops; i++) {
+ uint start_loop_idx = subdiv_quad_index * 4;
+ uint end_loop_idx = (subdiv_quad_index + 1) * 4;
+ for (uint i = start_loop_idx; i < end_loop_idx; i++) {
const int vert_origindex = subdiv_loop_vert_index[i];
const int edge_origindex = subdiv_loop_edge_index[i];
const int poly_origindex = subdiv_loop_poly_index[i];