Mesh: Draw: Replace extractor abstraction for face dots UV edit data buffer

Part of #116901.
This commit is contained in:
Hans Goudey
2024-06-03 15:47:40 -04:00
committed by Hans Goudey
parent 01b0096b5e
commit 7292667db6
3 changed files with 50 additions and 64 deletions

View File

@@ -644,7 +644,6 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
} \
} while (0)
EXTRACT_ADD_REQUESTED(vbo, fdots_edituv_data);
for (int i = 0; i < GPU_MAX_ATTR; i++) {
EXTRACT_ADD_REQUESTED(vbo, attr[i]);
}
@@ -667,7 +666,8 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
!DRW_vbo_requested(buffers.vbo.face_idx) && !DRW_vbo_requested(buffers.vbo.edge_idx) &&
!DRW_vbo_requested(buffers.vbo.vert_idx) && !DRW_vbo_requested(buffers.vbo.fdot_idx) &&
!DRW_vbo_requested(buffers.vbo.weights) && !DRW_vbo_requested(buffers.vbo.fdots_uv) &&
!DRW_vbo_requested(buffers.vbo.uv) && !DRW_vbo_requested(buffers.vbo.edituv_stretch_area) &&
!DRW_vbo_requested(buffers.vbo.fdots_edituv_data) && !DRW_vbo_requested(buffers.vbo.uv) &&
!DRW_vbo_requested(buffers.vbo.edituv_stretch_area) &&
!DRW_vbo_requested(buffers.vbo.edituv_stretch_angle) &&
!DRW_vbo_requested(buffers.vbo.edituv_data) &&
!DRW_ibo_requested(buffers.ibo.lines_paint_mask) &&
@@ -959,6 +959,21 @@ void mesh_buffer_cache_create_requested(TaskGraph &task_graph,
[](void *task_data) { delete static_cast<TaskData *>(task_data); });
BLI_task_graph_edge_create(task_node_mesh_render_data, task_node);
}
if (DRW_vbo_requested(buffers.vbo.fdots_edituv_data)) {
struct TaskData {
MeshRenderData &mr;
MeshBufferList &buffers;
};
TaskNode *task_node = BLI_task_graph_node_create(
&task_graph,
[](void *__restrict task_data) {
const TaskData &data = *static_cast<TaskData *>(task_data);
extract_face_dots_edituv_data(data.mr, *data.buffers.vbo.fdots_edituv_data);
},
new TaskData{*mr, buffers},
[](void *task_data) { delete static_cast<TaskData *>(task_data); });
BLI_task_graph_edge_create(task_node_mesh_render_data, task_node);
}
if (DRW_vbo_requested(buffers.vbo.uv)) {
struct TaskData {
MeshRenderData &mr;

View File

@@ -441,6 +441,7 @@ void extract_weights_subdiv(const MeshRenderData &mr,
void extract_face_dots(const MeshRenderData &mr, gpu::IndexBuf &face_dots);
void extract_face_dots_uv(const MeshRenderData &mr, gpu::VertBuf &vbo);
void extract_face_dots_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo);
void extract_lines_paint_mask(const MeshRenderData &mr, gpu::IndexBuf &lines);
void extract_lines_paint_mask_subdiv(const MeshRenderData &mr,
@@ -490,7 +491,6 @@ extern const MeshExtract extract_edituv_tris;
extern const MeshExtract extract_edituv_lines;
extern const MeshExtract extract_edituv_points;
extern const MeshExtract extract_edituv_fdots;
extern const MeshExtract extract_fdots_edituv_data;
extern const MeshExtract extract_attr[GPU_MAX_ATTR];
extern const MeshExtract extract_attr_viewer;

View File

@@ -12,73 +12,44 @@
namespace blender::draw {
/* ---------------------------------------------------------------------- */
/** \name Extract Face-dots Edit UV flag
* \{ */
struct MeshExtract_EditUVFdotData_Data {
EditLoopData *vbo_data;
BMUVOffsets offsets;
};
static void extract_fdots_edituv_data_init(const MeshRenderData &mr,
MeshBatchCache & /*cache*/,
void *buf,
void *tls_data)
void extract_face_dots_edituv_data(const MeshRenderData &mr, gpu::VertBuf &vbo)
{
gpu::VertBuf *vbo = static_cast<gpu::VertBuf *>(buf);
static GPUVertFormat format = {0};
if (format.attr_len == 0) {
GPU_vertformat_attr_add(&format, "flag", GPU_COMP_U8, 4, GPU_FETCH_INT);
}
GPU_vertbuf_init_with_format(vbo, &format);
GPU_vertbuf_data_alloc(vbo, mr.faces_num);
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(tls_data);
data->vbo_data = (EditLoopData *)GPU_vertbuf_get_data(vbo);
data->offsets = BM_uv_map_get_offsets(mr.bm);
}
static void extract_fdots_edituv_data_iter_face_bm(const MeshRenderData &mr,
const BMFace *f,
const int /*f_index*/,
void *_data)
{
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(_data);
EditLoopData *eldata = &data->vbo_data[BM_elem_index_get(f)];
memset(eldata, 0x0, sizeof(*eldata));
mesh_render_data_face_flag(mr, f, data->offsets, *eldata);
}
static void extract_fdots_edituv_data_iter_face_mesh(const MeshRenderData &mr,
const int face_index,
void *_data)
{
MeshExtract_EditUVFdotData_Data *data = static_cast<MeshExtract_EditUVFdotData_Data *>(_data);
EditLoopData *eldata = &data->vbo_data[face_index];
memset(eldata, 0x0, sizeof(*eldata));
BMFace *efa = bm_original_face_get(mr, face_index);
if (efa) {
mesh_render_data_face_flag(mr, efa, data->offsets, *eldata);
GPU_vertbuf_init_with_format(&vbo, &format);
GPU_vertbuf_data_alloc(&vbo, mr.faces_num);
MutableSpan vbo_data(static_cast<EditLoopData *>(GPU_vertbuf_get_data(&vbo)), mr.faces_num);
const BMesh &bm = *mr.bm;
const BMUVOffsets offsets = BM_uv_map_get_offsets(&bm);
if (mr.extract_type == MR_EXTRACT_BMESH) {
threading::parallel_for(IndexRange(bm.totface), 2048, [&](const IndexRange range) {
for (const int face_index : range) {
const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
vbo_data[face_index] = {};
mesh_render_data_face_flag(mr, &face, offsets, vbo_data[face_index]);
}
});
}
else {
if (mr.orig_index_face) {
const Span<int> orig_index_face(mr.orig_index_face, mr.faces_num);
threading::parallel_for(IndexRange(mr.faces_num), 4096, [&](const IndexRange range) {
for (const int face : range) {
vbo_data[face] = {};
if (orig_index_face[face] == ORIGINDEX_NONE) {
continue;
}
const BMFace *orig_face = bm_original_face_get(mr, face);
mesh_render_data_face_flag(mr, orig_face, offsets, vbo_data[face]);
}
});
}
else {
vbo_data.fill({});
}
}
}
constexpr MeshExtract create_extractor_fdots_edituv_data()
{
MeshExtract extractor = {nullptr};
extractor.init = extract_fdots_edituv_data_init;
extractor.iter_face_bm = extract_fdots_edituv_data_iter_face_bm;
extractor.iter_face_mesh = extract_fdots_edituv_data_iter_face_mesh;
extractor.data_type = MR_DATA_NONE;
extractor.data_size = sizeof(MeshExtract_EditUVFdotData_Data);
extractor.use_threading = true;
extractor.mesh_buffer_offset = offsetof(MeshBufferList, vbo.fdots_edituv_data);
return extractor;
}
/** \} */
const MeshExtract extract_fdots_edituv_data = create_extractor_fdots_edituv_data();
} // namespace blender::draw