Commit: 6bb980b0f43721a5f87185cbac11d1bd0919a490 Author: Germano Cavalcante Date: Mon Jun 14 08:00:42 2021 -0300 Branches: master https://developer.blender.org/rB6bb980b0f43721a5f87185cbac11d1bd0919a490
DRW: sanitize 'DRW_mesh_batch_cache_dirty_tag' Create maps that specify which batches have vbo or ibo as a reference and use these maps to discard batches along with buffers. Differential Revision: https://developer.blender.org/D11588 =================================================================== M source/blender/draw/intern/draw_cache_extract.h M source/blender/draw/intern/draw_cache_extract_mesh_private.h M source/blender/draw/intern/draw_cache_impl_mesh.c =================================================================== diff --git a/source/blender/draw/intern/draw_cache_extract.h b/source/blender/draw/intern/draw_cache_extract.h index 2c4e4dfe76b..a9c1a506460 100644 --- a/source/blender/draw/intern/draw_cache_extract.h +++ b/source/blender/draw/intern/draw_cache_extract.h @@ -175,41 +175,6 @@ typedef struct MeshBufferExtractionCache { } MeshBufferExtractionCache; -typedef enum DRWBatchFlag { - MBC_SURFACE = (1 << 0), - MBC_SURFACE_WEIGHTS = (1 << 1), - MBC_EDIT_TRIANGLES = (1 << 2), - MBC_EDIT_VERTICES = (1 << 3), - MBC_EDIT_EDGES = (1 << 4), - MBC_EDIT_VNOR = (1 << 5), - MBC_EDIT_LNOR = (1 << 6), - MBC_EDIT_FACEDOTS = (1 << 7), - MBC_EDIT_MESH_ANALYSIS = (1 << 8), - MBC_EDITUV_FACES_STRETCH_AREA = (1 << 9), - MBC_EDITUV_FACES_STRETCH_ANGLE = (1 << 10), - MBC_EDITUV_FACES = (1 << 11), - MBC_EDITUV_EDGES = (1 << 12), - MBC_EDITUV_VERTS = (1 << 13), - MBC_EDITUV_FACEDOTS = (1 << 14), - MBC_EDIT_SELECTION_VERTS = (1 << 15), - MBC_EDIT_SELECTION_EDGES = (1 << 16), - MBC_EDIT_SELECTION_FACES = (1 << 17), - MBC_EDIT_SELECTION_FACEDOTS = (1 << 18), - MBC_ALL_VERTS = (1 << 19), - MBC_ALL_EDGES = (1 << 20), - MBC_LOOSE_EDGES = (1 << 21), - MBC_EDGE_DETECTION = (1 << 22), - MBC_WIRE_EDGES = (1 << 23), - MBC_WIRE_LOOPS = (1 << 24), - MBC_WIRE_LOOPS_UVS = (1 << 25), - MBC_SKIN_ROOTS = (1 << 26), - MBC_SCULPT_OVERLAYS = (1 << 27), -} DRWBatchFlag; - -#define MBC_EDITUV \ - (MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | MBC_EDITUV_FACES | \ - MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS) - #define FOREACH_MESH_BUFFER_CACHE(batch_cache, mbc) \ for (MeshBufferCache *mbc = &batch_cache->final; \ mbc == &batch_cache->final || mbc == &batch_cache->cage || mbc == &batch_cache->uv_cage; \ @@ -262,8 +227,8 @@ typedef struct MeshBatchCache { GPUBatch **surface_per_mat; - DRWBatchFlag batch_requested; - DRWBatchFlag batch_ready; + uint32_t batch_requested; /* DRWBatchFlag */ + uint32_t batch_ready; /* DRWBatchFlag */ /* settings to determine if cache is invalid */ int edge_len; @@ -297,6 +262,47 @@ typedef struct MeshBatchCache { #define MBC_VBO_LEN (sizeof(((MeshBufferCache){0}).vbo) / sizeof(void *)) #define MBC_IBO_LEN (sizeof(((MeshBufferCache){0}).ibo) / sizeof(void *)) +#define MBC_BATCH_INDEX(batch_name) \ + ((offsetof(MeshBatchCache, batch_name) - offsetof(MeshBatchCache, batch.surface)) / \ + sizeof(void *)) + +typedef enum DRWBatchFlag { + MBC_SURFACE = (1u << MBC_BATCH_INDEX(batch.surface)), + MBC_SURFACE_WEIGHTS = (1u << MBC_BATCH_INDEX(batch.surface_weights)), + MBC_EDIT_TRIANGLES = (1u << MBC_BATCH_INDEX(batch.edit_triangles)), + MBC_EDIT_VERTICES = (1u << MBC_BATCH_INDEX(batch.edit_vertices)), + MBC_EDIT_EDGES = (1u << MBC_BATCH_INDEX(batch.edit_edges)), + MBC_EDIT_VNOR = (1u << MBC_BATCH_INDEX(batch.edit_vnor)), + MBC_EDIT_LNOR = (1u << MBC_BATCH_INDEX(batch.edit_lnor)), + MBC_EDIT_FACEDOTS = (1u << MBC_BATCH_INDEX(batch.edit_fdots)), + MBC_EDIT_MESH_ANALYSIS = (1u << MBC_BATCH_INDEX(batch.edit_mesh_analysis)), + MBC_SKIN_ROOTS = (1u << MBC_BATCH_INDEX(batch.edit_skin_roots)), + MBC_EDITUV_FACES_STRETCH_AREA = (1u << MBC_BATCH_INDEX(batch.edituv_faces_stretch_area)), + MBC_EDITUV_FACES_STRETCH_ANGLE = (1u << MBC_BATCH_INDEX(batch.edituv_faces_stretch_angle)), + MBC_EDITUV_FACES = (1u << MBC_BATCH_INDEX(batch.edituv_faces)), + MBC_EDITUV_EDGES = (1u << MBC_BATCH_INDEX(batch.edituv_edges)), + MBC_EDITUV_VERTS = (1u << MBC_BATCH_INDEX(batch.edituv_verts)), + MBC_EDITUV_FACEDOTS = (1u << MBC_BATCH_INDEX(batch.edituv_fdots)), + MBC_EDIT_SELECTION_VERTS = (1u << MBC_BATCH_INDEX(batch.edit_selection_verts)), + MBC_EDIT_SELECTION_EDGES = (1u << MBC_BATCH_INDEX(batch.edit_selection_edges)), + MBC_EDIT_SELECTION_FACES = (1u << MBC_BATCH_INDEX(batch.edit_selection_faces)), + MBC_EDIT_SELECTION_FACEDOTS = (1u << MBC_BATCH_INDEX(batch.edit_selection_fdots)), + MBC_ALL_VERTS = (1u << MBC_BATCH_INDEX(batch.all_verts)), + MBC_ALL_EDGES = (1u << MBC_BATCH_INDEX(batch.all_edges)), + MBC_LOOSE_EDGES = (1u << MBC_BATCH_INDEX(batch.loose_edges)), + MBC_EDGE_DETECTION = (1u << MBC_BATCH_INDEX(batch.edge_detection)), + MBC_WIRE_EDGES = (1u << MBC_BATCH_INDEX(batch.wire_edges)), + MBC_WIRE_LOOPS = (1u << MBC_BATCH_INDEX(batch.wire_loops)), + MBC_WIRE_LOOPS_UVS = (1u << MBC_BATCH_INDEX(batch.wire_loops_uvs)), + MBC_SCULPT_OVERLAYS = (1u << MBC_BATCH_INDEX(batch.sculpt_overlays)), +} DRWBatchFlag; + +BLI_STATIC_ASSERT(MBC_BATCH_INDEX(surface_per_mat) < 32, "Number of batches exceeded the limit of bit fields"); + +#define MBC_EDITUV \ + (MBC_EDITUV_FACES_STRETCH_AREA | MBC_EDITUV_FACES_STRETCH_ANGLE | MBC_EDITUV_FACES | \ + MBC_EDITUV_EDGES | MBC_EDITUV_VERTS | MBC_EDITUV_FACEDOTS | MBC_WIRE_LOOPS_UVS) + void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, MeshBatchCache *cache, MeshBufferCache *mbc, diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_private.h b/source/blender/draw/intern/draw_cache_extract_mesh_private.h index 8c7011dd13c..6e92db3cfb9 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_private.h +++ b/source/blender/draw/intern/draw_cache_extract_mesh_private.h @@ -38,6 +38,70 @@ extern "C" { #endif +/* ---------------------------------------------------------------------- */ +/** \name Dependencies between buffer and batch + * \{ */ +#ifndef NDEBUG +# define _MDEF_type(name) static DRWBatchFlag MDEP_assert_##name = 0, MDEP_##name +#else +# define _MDEF_type(name) static const DRWBatchFlag MDEP_##name +#endif + +/* clang-format off */ + +#define _MDEPS_CREATE1(b) (1u << MBC_BATCH_INDEX(b)) +#define _MDEPS_CREATE2(b1, b2) _MDEPS_CREATE1(b1) | _MDEPS_CREATE1(b2) +#define _MDEPS_CREATE3(b1, b2, b3) _MDEPS_CREATE2(b1, b2) | _MDEPS_CREATE1(b3) +#define _MDEPS_CREATE4(b1, b2, b3, b4) _MDEPS_CREATE3(b1, b2, b3) | _MDEPS_CREATE1(b4) +#define _MDEPS_CREATE5(b1, b2, b3, b4, b5) _MDEPS_CREATE4(b1, b2, b3, b4) | _MDEPS_CREATE1(b5) +#define _MDEPS_CREATE6(b1, b2, b3, b4, b5, b6) _MDEPS_CREATE5(b1, b2, b3, b4, b5) | _MDEPS_CREATE1(b6) +#define _MDEPS_CREATE7(b1, b2, b3, b4, b5, b6, b7) _MDEPS_CREATE6(b1, b2, b3, b4, b5, b6) | _MDEPS_CREATE1(b7) +#define _MDEPS_CREATE8(b1, b2, b3, b4, b5, b6, b7, b8) _MDEPS_CREATE7(b1, b2, b3, b4, b5, b6, b7) | _MDEPS_CREATE1(b8) +#define _MDEPS_CREATE9(b1, b2, b3, b4, b5, b6, b7, b8, b9) _MDEPS_CREATE8(b1, b2, b3, b4, b5, b6, b7, b8) | _MDEPS_CREATE1(b9) +#define _MDEPS_CREATE10(b1, b2, b3, b4, b5, b6, b7, b8, b9, b10) _MDEPS_CREATE9(b1, b2, b3, b4, b5, b6, b7, b8, b9) | _MDEPS_CREATE1(b10) +#define _MDEPS_CREATE19(b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19) _MDEPS_CREATE10(b1, b2, b3, b4, b5, b6, b7, b8, b9, b10) | _MDEPS_CREATE9(b11, b12, b13, b14, b15, b16, b17, b18, b19) + +#define MDEPS_CREATE(name, ...) _MDEF_type(name) = VA_NARGS_CALL_OVERLOAD(_MDEPS_CREATE, __VA_ARGS__) + +#define _MDEPS_CREATE_MAP1(a) MDEP_##a +#define _MDEPS_CREATE_MAP2(a, b) MDEP_##a | MDEP_##b +#define _MDEPS_CREATE_MAP3(a, b, c) _MDEPS_CREATE_MAP2(a, b) | MDEP_##c +#define _MDEPS_CREATE_MAP4(a, b, c, d) _MDEPS_CREATE_MAP3(a, b, c) | MDEP_##d +#define _MDEPS_CREATE_MAP5(a, b, c, d, e) _MDEPS_CREATE_MAP4(a, b, c, d) | MDEP_##e +#define _MDEPS_CREATE_MAP6(a, b, c, d, e, f) _MDEPS_CREATE_MAP5(a, b, c, d, e) | MDEP_##f +#define _MDEPS_CREATE_MAP7(a, b, c, d, e, f, g) _MDEPS_CREATE_MAP6(a, b, c, d, e, f) | MDEP_##g +#define _MDEPS_CREATE_MAP8(a, b, c, d, e, f, g, h) _MDEPS_CREATE_MAP7(a, b, c, d, e, f, g) | MDEP_##h +#define _MDEPS_CREATE_MAP9(a, b, c, d, e, f, g, h, i) _MDEPS_CREATE_MAP8(a, b, c, d, e, f, g, h) | MDEP_##i +#define _MDEPS_CREATE_MAP10(a, b, c, d, e, f, g, h, i, j) _MDEPS_CREATE_MAP9(a, b, c, d, e, f, g, h, i) | MDEP_##j + +#define MDEPS_CREATE_MAP(...) VA_NARGS_CALL_OVERLOAD(_MDEPS_CREATE_MAP, __VA_ARGS__) + +#ifndef NDEBUG +# define _MDEPS_ASSERT2(b, name) \ + MDEP_assert_##name |= _MDEPS_CREATE1(b); \ + BLI_assert(MDEP_##name & _MDEPS_CREATE1(b)) +# define _MDEPS_ASSERT3(b, n1, n2) _MDEPS_ASSERT2(b, n1); _MDEPS_ASSERT2(b, n2) +# define _MDEPS_ASSERT4(b, n1, n2, n3) _MDEPS_ASSERT3(b, n1, n2); _MDEPS_ASSERT2(b, n3) +# define _MDEPS_ASSERT5(b, n1, n2, n3, n4) _MDEPS_ASSERT4(b, n1, n2, n3); _MDEPS_ASSERT2(b, n4) +# define _MDEPS_ASSERT6(b, n1, n2, n3, n4, n5) _MDEPS_ASSERT5(b, n1, n2, n3, n4); _MDEPS_ASSERT2(b, n5) +# define _MDEPS_ASSERT7(b, n1, n2, n3, n4, n5, n6) _MDEPS_ASSERT6(b, n1, n2, n3, n4, n5); _MDEPS_ASSERT2(b, n6) +# define _MDEPS_ASSERT8(b, n1, n2, n3, n4, n5, n6, n7) _MDEPS_ASSERT7(b, n1, n2, n3, n4, n5, n6); _MDEPS_ASSERT2(b, n7) + +# define MDEPS_ASSERT(...) VA_NARGS_CALL_OVERLOAD(_MDEPS_ASSERT, __VA_ARGS__) +# define MDEPS_ASSERT_MAP(name) BLI_assert(MDEP_assert_##name == MDEP_##name) +#else +# define MDEPS_ASSERT(...) +# define MDEPS_ASSERT_MAP(name) +#endif + +/* clang-format on */ + +/** \} */ + +/* ---------------------------------------------------------------------- */ +/** \name Mesh Render Data + * \{ */ + typedef enum eMRExtractType { MR_EXTRACT_BMESH, MR_EXTRACT_MAPPED, @@ -154,6 +218,8 @@ BLI_INLINE const float *bm_face_no_get(const MeshRenderData *mr, const BMFace *e return efa->no; } +/** \} */ + /* ---------------------------------------------------------------------- */ /** \name Mesh Elements Extract Struct * \{ */ diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index e4c682e1765..20ec22a2f78 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -67,12 +67,109 @@ #include "ED_uvedit.h" #include "draw_cache_extract.h" +#include "draw_cache_extract_mesh_private.h" #include "draw_cache_inline.h" #include "draw_cache_impl.h" /* own include */ +MDEPS_CREATE(vbo_lnor, batch.surface, batch.wire_loops, batch.edit_lnor, surface_per_mat); +MDEPS_CREATE(vbo_pos_nor, + batch.surface, + batch.surface_weights, + batch.all_verts, + batch.all_edges, + batch.loose_edges, + batch @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs