diff options
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/BKE_customdata.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_pbvh.h | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 257 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.cc | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_bmesh.c | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_intern.h | 2 |
6 files changed, 133 insertions, 153 deletions
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h index 22e4a2bce87..0e172abd9a2 100644 --- a/source/blender/blenkernel/BKE_customdata.h +++ b/source/blender/blenkernel/BKE_customdata.h @@ -450,6 +450,7 @@ int CustomData_get_stencil_layer(const struct CustomData *data, int type); * if no such active layer is defined. */ const char *CustomData_get_active_layer_name(const struct CustomData *data, int type); +const char *CustomData_get_render_layer_name(const struct CustomData *data, int type); /** * Returns name of the default layer of the given type or NULL diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h index ff2140732cc..9e0884a8c76 100644 --- a/source/blender/blenkernel/BKE_pbvh.h +++ b/source/blender/blenkernel/BKE_pbvh.h @@ -16,6 +16,7 @@ /* For embedding CCGKey in iterator. */ #include "BKE_attribute.h" #include "BKE_ccg.h" +#include "DNA_customdata_types.h" #ifdef __cplusplus extern "C" { @@ -27,7 +28,6 @@ struct CCGElem; struct CCGKey; struct CustomData; struct DMFlagMat; -struct GPU_PBVH_Buffers; struct IsectRayPrecalc; struct MLoop; struct MLoopTri; @@ -36,7 +36,9 @@ struct MVert; struct Mesh; struct MeshElemMap; struct PBVH; +struct PBVHBatches; struct PBVHNode; +struct PBVH_GPU_Args; struct SubdivCCG; struct TaskParallelSettings; struct Image; @@ -98,6 +100,12 @@ typedef struct PBVHPixelsNode { void *node_data; } PBVHPixelsNode; +typedef struct PBVHAttrReq { + char name[MAX_CUSTOMDATA_LAYER_NAME]; + eAttrDomain domain; + eCustomDataType type; +} PBVHAttrReq; + typedef enum { PBVH_Leaf = 1 << 0, @@ -348,9 +356,13 @@ void BKE_pbvh_draw_cb(PBVH *pbvh, bool update_only_visible, PBVHFrustumPlanes *update_frustum, PBVHFrustumPlanes *draw_frustum, - void (*draw_fn)(void *user_data, struct GPU_PBVH_Buffers *buffers), + void (*draw_fn)(void *user_data, + struct PBVHBatches *batches, + struct PBVH_GPU_Args *args), void *user_data, - bool full_render); + bool full_render, + PBVHAttrReq *attrs, + int attrs_num); void BKE_pbvh_draw_debug_cb(PBVH *pbvh, void (*draw_fn)(PBVHNode *node, diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 1d65e958e1c..a1de8e40fe3 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -25,9 +25,9 @@ #include "BKE_pbvh.h" #include "BKE_subdiv_ccg.h" -#include "PIL_time.h" +#include "DRW_pbvh.h" -#include "GPU_buffers.h" +#include "PIL_time.h" #include "bmesh.h" @@ -513,6 +513,80 @@ static void pbvh_build(PBVH *pbvh, BB *cb, BBC *prim_bbc, int totprim) build_sub(pbvh, 0, cb, prim_bbc, 0, totprim); } +static void pbvh_draw_args_init(PBVH *pbvh, PBVH_GPU_Args *args, PBVHNode *node) +{ + memset((void *)args, 0, sizeof(*args)); + + args->pbvh_type = pbvh->header.type; + args->mesh_verts_num = pbvh->totvert; + args->mesh_grids_num = pbvh->totgrid; + args->node = node; + + BKE_pbvh_node_num_verts(pbvh, node, NULL, &args->node_verts_num); + + args->grid_hidden = pbvh->grid_hidden; + args->face_sets_color_default = pbvh->face_sets_color_default; + args->face_sets_color_seed = pbvh->face_sets_color_seed; + args->mvert = pbvh->verts; + args->mloop = pbvh->mloop; + args->mpoly = pbvh->mpoly; + args->mlooptri = pbvh->looptri; + + if (ELEM(pbvh->header.type, PBVH_FACES, PBVH_GRIDS)) { + args->hide_poly = pbvh->pdata ? + CustomData_get_layer_named(pbvh->pdata, CD_PROP_BOOL, ".hide_poly") : + NULL; + } + + switch (pbvh->header.type) { + case PBVH_FACES: + args->mesh_faces_num = pbvh->mesh->totpoly; + args->vdata = pbvh->vdata; + args->ldata = pbvh->ldata; + args->pdata = pbvh->pdata; + args->totprim = node->totprim; + args->me = pbvh->mesh; + args->mpoly = pbvh->mpoly; + args->vert_normals = pbvh->vert_normals; + + args->prim_indices = node->prim_indices; + args->face_sets = pbvh->face_sets; + break; + case PBVH_GRIDS: + args->vdata = pbvh->vdata; + args->ldata = pbvh->ldata; + args->pdata = pbvh->pdata; + args->ccg_key = pbvh->gridkey; + args->me = pbvh->mesh; + args->totprim = node->totprim; + args->grid_indices = node->prim_indices; + args->subdiv_ccg = pbvh->subdiv_ccg; + args->face_sets = pbvh->face_sets; + args->mpoly = pbvh->mpoly; + + args->mesh_grids_num = pbvh->totgrid; + args->grids = pbvh->grids; + args->gridfaces = pbvh->gridfaces; + args->grid_flag_mats = pbvh->grid_flag_mats; + args->vert_normals = pbvh->vert_normals; + + args->face_sets = pbvh->face_sets; + break; + case PBVH_BMESH: + args->bm = pbvh->header.bm; + args->vdata = &args->bm->vdata; + args->ldata = &args->bm->ldata; + args->pdata = &args->bm->pdata; + args->bm_faces = node->bm_faces; + args->bm_other_verts = node->bm_other_verts; + args->bm_unique_vert = node->bm_unique_verts; + args->totprim = BLI_gset_len(node->bm_faces); + args->cd_mask_layer = CustomData_get_offset(&pbvh->header.bm->vdata, CD_PAINT_MASK); + + break; + } +} + void BKE_pbvh_build_mesh(PBVH *pbvh, Mesh *mesh, const MPoly *mpoly, @@ -645,8 +719,8 @@ void BKE_pbvh_free(PBVH *pbvh) PBVHNode *node = &pbvh->nodes[i]; if (node->flag & PBVH_Leaf) { - if (node->draw_buffers) { - GPU_pbvh_buffers_free(node->draw_buffers); + if (node->draw_batches) { + DRW_pbvh_node_free(node->draw_batches); } if (node->vert_indices) { MEM_freeN((void *)node->vert_indices); @@ -693,10 +767,6 @@ void BKE_pbvh_free(PBVH *pbvh) MEM_SAFE_FREE(pbvh->vert_bitmap); - if (pbvh->vbo_id) { - GPU_pbvh_free_format(pbvh->vbo_id); - } - MEM_freeN(pbvh); } @@ -988,6 +1058,8 @@ typedef struct PBVHUpdateData { float (*vnors)[3]; int flag; bool show_sculpt_face_sets; + PBVHAttrReq *attrs; + int attrs_num; } PBVHUpdateData; static void pbvh_update_normals_clear_task_cb(void *__restrict userdata, @@ -1240,13 +1312,6 @@ void pbvh_update_BB_redraw(PBVH *pbvh, PBVHNode **nodes, int totnode, int flag) BLI_task_parallel_range(0, totnode, &data, pbvh_update_BB_redraw_task_cb, &settings); } -static int pbvh_get_buffers_update_flags(PBVH *UNUSED(pbvh)) -{ - int update_flags = GPU_PBVH_BUFFERS_SHOW_VCOL | GPU_PBVH_BUFFERS_SHOW_MASK | - GPU_PBVH_BUFFERS_SHOW_SCULPT_FACE_SETS; - return update_flags; -} - bool BKE_pbvh_get_color_layer(const Mesh *me, CustomDataLayer **r_layer, eAttrDomain *r_attr) { CustomDataLayer *layer = BKE_id_attributes_active_color_get((ID *)me); @@ -1283,128 +1348,29 @@ static void pbvh_update_draw_buffer_cb(void *__restrict userdata, PBVHNode *node = data->nodes[n]; if (node->flag & PBVH_RebuildDrawBuffers) { - switch (pbvh->header.type) { - case PBVH_GRIDS: { - bool smooth = node->totprim > 0 ? - pbvh->grid_flag_mats[node->prim_indices[0]].flag & ME_SMOOTH : - false; + PBVH_GPU_Args args; + pbvh_draw_args_init(pbvh, &args, node); - node->draw_buffers = GPU_pbvh_grid_buffers_build(node->totprim, pbvh->grid_hidden, smooth); - break; - } - case PBVH_FACES: - node->draw_buffers = GPU_pbvh_mesh_buffers_build( - pbvh->mesh, pbvh->looptri, node->prim_indices, node->totprim); - break; - case PBVH_BMESH: - node->draw_buffers = GPU_pbvh_bmesh_buffers_build(pbvh->flags & - PBVH_DYNTOPO_SMOOTH_SHADING); - break; - } + node->draw_batches = DRW_pbvh_node_create(&args); } if (node->flag & PBVH_UpdateDrawBuffers) { node->debug_draw_gen++; - const int update_flags = pbvh_get_buffers_update_flags(pbvh); - switch (pbvh->header.type) { - case PBVH_GRIDS: - GPU_pbvh_grid_buffers_update(pbvh->vbo_id, - node->draw_buffers, - pbvh->subdiv_ccg, - pbvh->grids, - pbvh->grid_flag_mats, - node->prim_indices, - node->totprim, - pbvh->face_sets, - pbvh->face_sets_color_seed, - pbvh->face_sets_color_default, - &pbvh->gridkey, - update_flags); - break; - case PBVH_FACES: { - /* Pass vertices separately because they may be not be the same as the mesh's vertices, - * and pass normals separately because they are managed by the PBVH. */ - GPU_pbvh_mesh_buffers_update( - pbvh->vbo_id, - node->draw_buffers, - pbvh->mesh, - pbvh->verts, - CustomData_get_layer(pbvh->vdata, CD_PAINT_MASK), - CustomData_get_layer_named(pbvh->pdata, CD_PROP_INT32, ".sculpt_face_set"), - pbvh->face_sets_color_seed, - pbvh->face_sets_color_default, - update_flags, - pbvh->vert_normals); - break; - } - case PBVH_BMESH: - GPU_pbvh_bmesh_buffers_update(pbvh->vbo_id, - node->draw_buffers, - pbvh->header.bm, - node->bm_faces, - node->bm_unique_verts, - node->bm_other_verts, - update_flags); - break; + if (node->draw_batches) { + PBVH_GPU_Args args; + + pbvh_draw_args_init(pbvh, &args, node); + DRW_pbvh_node_update(node->draw_batches, &args); } } } void pbvh_free_draw_buffers(PBVH *pbvh, PBVHNode *node) { - if (node->draw_buffers) { - pbvh->draw_cache_invalid = true; - - GPU_pbvh_buffers_free(node->draw_buffers); - node->draw_buffers = NULL; - } -} - -static void pbvh_check_draw_layout(PBVH *pbvh) -{ - const CustomData *vdata; - const CustomData *ldata; - - if (!pbvh->vbo_id) { - pbvh->vbo_id = GPU_pbvh_make_format(); - } - - switch (pbvh->header.type) { - case PBVH_BMESH: - if (!pbvh->header.bm) { - /* BMesh hasn't been created yet */ - return; - } - - vdata = &pbvh->header.bm->vdata; - ldata = &pbvh->header.bm->ldata; - break; - case PBVH_FACES: - vdata = pbvh->vdata; - ldata = pbvh->ldata; - break; - case PBVH_GRIDS: - ldata = vdata = NULL; - break; - } - - /* Rebuild all draw buffers if attribute layout changed. - * - * NOTE: The optimization where we only send active attributes - * to the GPU in workbench mode is disabled due to bugs - * (there's no guarantee there isn't another EEVEE viewport which would - * free the draw buffers and corrupt the draw cache). - */ - if (GPU_pbvh_attribute_names_update(pbvh->header.type, pbvh->vbo_id, vdata, ldata, false)) { - /* attribute layout changed; force rebuild */ - for (int i = 0; i < pbvh->totnode; i++) { - PBVHNode *node = pbvh->nodes + i; - - if (node->flag & PBVH_Leaf) { - node->flag |= PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers | PBVH_UpdateRedraw; - } - } + if (node->draw_batches) { + DRW_pbvh_node_free(node->draw_batches); + node->draw_batches = NULL; } } @@ -1412,10 +1378,6 @@ static void pbvh_update_draw_buffers(PBVH *pbvh, PBVHNode **nodes, int totnode, { const CustomData *vdata; - if (!pbvh->vbo_id) { - pbvh->vbo_id = GPU_pbvh_make_format(); - } - switch (pbvh->header.type) { case PBVH_BMESH: if (!pbvh->header.bm) { @@ -1441,14 +1403,11 @@ static void pbvh_update_draw_buffers(PBVH *pbvh, PBVHNode **nodes, int totnode, if (node->flag & PBVH_RebuildDrawBuffers) { pbvh_free_draw_buffers(pbvh, node); } - else if ((node->flag & PBVH_UpdateDrawBuffers) && node->draw_buffers) { - if (pbvh->header.type == PBVH_GRIDS) { - GPU_pbvh_grid_buffers_update_free( - node->draw_buffers, pbvh->grid_flag_mats, node->prim_indices); - } - else if (pbvh->header.type == PBVH_BMESH) { - GPU_pbvh_bmesh_buffers_update_free(node->draw_buffers); - } + else if ((node->flag & PBVH_UpdateDrawBuffers) && node->draw_batches) { + PBVH_GPU_Args args; + + pbvh_draw_args_init(pbvh, &args, node); + DRW_pbvh_update_pre(node->draw_batches, &args); } } } @@ -1468,7 +1427,10 @@ static void pbvh_update_draw_buffers(PBVH *pbvh, PBVHNode **nodes, int totnode, if (node->flag & PBVH_UpdateDrawBuffers) { /* Flush buffers uses OpenGL, so not in parallel. */ - GPU_pbvh_buffers_update_flush(node->draw_buffers); + + if (node->draw_batches) { + DRW_pbvh_node_gpu_flush(node->draw_batches); + } } node->flag &= ~(PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers); @@ -2810,6 +2772,8 @@ void BKE_pbvh_face_sets_color_set(PBVH *pbvh, int seed, int color_default) typedef struct PBVHDrawSearchData { PBVHFrustumPlanes *frustum; int accum_update_flag; + PBVHAttrReq *attrs; + int attrs_num; } PBVHDrawSearchData; static bool pbvh_draw_search_cb(PBVHNode *node, void *data_v) @@ -2827,9 +2791,11 @@ void BKE_pbvh_draw_cb(PBVH *pbvh, bool update_only_visible, PBVHFrustumPlanes *update_frustum, PBVHFrustumPlanes *draw_frustum, - void (*draw_fn)(void *user_data, GPU_PBVH_Buffers *buffers), + void (*draw_fn)(void *user_data, PBVHBatches *batches, PBVH_GPU_Args *args), void *user_data, - bool UNUSED(full_render)) + bool UNUSED(full_render), + PBVHAttrReq *attrs, + int attrs_num) { PBVHNode **nodes; int totnode; @@ -2840,7 +2806,8 @@ void BKE_pbvh_draw_cb(PBVH *pbvh, /* Search for nodes that need updates. */ if (update_only_visible) { /* Get visible nodes with draw updates. */ - PBVHDrawSearchData data = {.frustum = update_frustum, .accum_update_flag = 0}; + PBVHDrawSearchData data = { + .frustum = update_frustum, .accum_update_flag = 0, attrs, attrs_num}; BKE_pbvh_search_gather(pbvh, pbvh_draw_search_cb, &data, &nodes, &totnode); update_flag = data.accum_update_flag; } @@ -2852,8 +2819,6 @@ void BKE_pbvh_draw_cb(PBVH *pbvh, update_flag = PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers; } - pbvh_check_draw_layout(pbvh); - /* Update draw buffers. */ if (totnode != 0 && (update_flag & (PBVH_RebuildDrawBuffers | PBVH_UpdateDrawBuffers))) { pbvh_update_draw_buffers(pbvh, nodes, totnode, update_flag); @@ -2864,10 +2829,14 @@ void BKE_pbvh_draw_cb(PBVH *pbvh, PBVHDrawSearchData draw_data = {.frustum = draw_frustum, .accum_update_flag = 0}; BKE_pbvh_search_gather(pbvh, pbvh_draw_search_cb, &draw_data, &nodes, &totnode); + PBVH_GPU_Args args; + for (int i = 0; i < totnode; i++) { PBVHNode *node = nodes[i]; if (!(node->flag & PBVH_FullyHidden)) { - draw_fn(user_data, node->draw_buffers); + pbvh_draw_args_init(pbvh, &args, node); + + draw_fn(user_data, node->draw_batches, &args); } } diff --git a/source/blender/blenkernel/intern/pbvh.cc b/source/blender/blenkernel/intern/pbvh.cc index b2f32a38f23..03382de34db 100644 --- a/source/blender/blenkernel/intern/pbvh.cc +++ b/source/blender/blenkernel/intern/pbvh.cc @@ -29,8 +29,6 @@ #include "PIL_time.h" -#include "GPU_buffers.h" - #include "bmesh.h" #include "atomic_ops.h" diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 81dbff980d5..de908adac79 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -17,7 +17,7 @@ #include "BKE_ccg.h" #include "BKE_pbvh.h" -#include "GPU_buffers.h" +#include "DRW_pbvh.h" #include "bmesh.h" #include "pbvh_intern.h" @@ -347,8 +347,8 @@ static void pbvh_bmesh_node_split(PBVH *pbvh, const BBC *bbc_array, int node_ind n->bm_other_verts = NULL; n->layer_disp = NULL; - if (n->draw_buffers) { - pbvh_free_draw_buffers(pbvh, n); + if (n->draw_batches) { + DRW_pbvh_node_free(n->draw_batches); } n->flag &= ~PBVH_Leaf; diff --git a/source/blender/blenkernel/intern/pbvh_intern.h b/source/blender/blenkernel/intern/pbvh_intern.h index 8ab56839f9c..bdfd3ad3d09 100644 --- a/source/blender/blenkernel/intern/pbvh_intern.h +++ b/source/blender/blenkernel/intern/pbvh_intern.h @@ -33,7 +33,7 @@ struct MeshElemMap; * union'd structs */ struct PBVHNode { /* Opaque handle for drawing code */ - struct GPU_PBVH_Buffers *draw_buffers; + struct PBVHBatches *draw_batches; /* Voxel bounds */ BB vb; |