Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_impl_mesh.c
| Show First 20 Lines • Show All 1,001 Lines • ▼ Show 20 Lines | void DRW_mesh_batch_cache_free_old(Mesh *me, int ctime) | ||||
| if (ctime - cache->lastmatch > U.vbotimeout) { | if (ctime - cache->lastmatch > U.vbotimeout) { | ||||
| mesh_batch_cache_discard_shaded_tri(cache); | mesh_batch_cache_discard_shaded_tri(cache); | ||||
| } | } | ||||
| mesh_cd_layers_type_clear(&cache->cd_used_over_time); | mesh_cd_layers_type_clear(&cache->cd_used_over_time); | ||||
| } | } | ||||
| /* Can be called for any surface type. Mesh *me is the final mesh. */ | /* Can be called for any surface type. Mesh *me is the final mesh. */ | ||||
| void DRW_mesh_batch_cache_create_requested( | void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, | ||||
| Object *ob, Mesh *me, const Scene *scene, const bool is_paint_mode, const bool use_hide) | Object *ob, | ||||
| Mesh *me, | |||||
| const Scene *scene, | |||||
| const bool is_paint_mode, | |||||
| const bool use_hide) | |||||
| { | { | ||||
| BLI_assert(task_graph); | |||||
| GPUIndexBuf **saved_elem_ranges = NULL; | GPUIndexBuf **saved_elem_ranges = NULL; | ||||
| const ToolSettings *ts = NULL; | const ToolSettings *ts = NULL; | ||||
| if (scene) { | if (scene) { | ||||
| ts = scene->toolsettings; | ts = scene->toolsettings; | ||||
| } | } | ||||
| MeshBatchCache *cache = mesh_batch_cache_get(me); | MeshBatchCache *cache = mesh_batch_cache_get(me); | ||||
| bool cd_uv_update = false; | bool cd_uv_update = false; | ||||
| /* Early out */ | /* Early out */ | ||||
| if (cache->batch_requested == 0) { | if (cache->batch_requested == 0) { | ||||
| #ifdef DEBUG | // #ifdef DEBUG | ||||
| goto check; | // goto check; | ||||
| #else | // #else | ||||
| return; | return; | ||||
| #endif | // #endif | ||||
| } | } | ||||
| /* Sanity check. */ | /* Sanity check. */ | ||||
| if ((me->edit_mesh != NULL) && (ob->mode & OB_MODE_EDIT)) { | if ((me->edit_mesh != NULL) && (ob->mode & OB_MODE_EDIT)) { | ||||
| BLI_assert(me->edit_mesh->mesh_eval_final != NULL); | BLI_assert(me->edit_mesh->mesh_eval_final != NULL); | ||||
| } | } | ||||
| const bool is_editmode = (me->edit_mesh != NULL) && DRW_object_is_in_edit_mode(ob); | const bool is_editmode = (me->edit_mesh != NULL) && DRW_object_is_in_edit_mode(ob); | ||||
| ▲ Show 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | if (cd_uv_update || (cache->is_uvsyncsel != is_uvsyncsel)) { | ||||
| GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_verts); | GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_verts); | ||||
| GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_fdots); | GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_fdots); | ||||
| cache->batch_ready &= ~MBC_EDITUV; | cache->batch_ready &= ~MBC_EDITUV; | ||||
| } | } | ||||
| } | } | ||||
| /* Second chance to early out */ | /* Second chance to early out */ | ||||
| if ((batch_requested & ~cache->batch_ready) == 0) { | if ((batch_requested & ~cache->batch_ready) == 0) { | ||||
| #ifdef DEBUG | // #ifdef DEBUG | ||||
| goto check; | // goto check; | ||||
| #else | // #else | ||||
fclem: left over comments? | |||||
| return; | return; | ||||
| #endif | // #endif | ||||
| } | } | ||||
| cache->batch_ready |= batch_requested; | cache->batch_ready |= batch_requested; | ||||
| const bool do_cage = (is_editmode && | const bool do_cage = (is_editmode && | ||||
| (me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage)); | (me->edit_mesh->mesh_eval_final != me->edit_mesh->mesh_eval_cage)); | ||||
| const bool do_uvcage = is_editmode && !me->edit_mesh->mesh_eval_final->runtime.is_original; | const bool do_uvcage = is_editmode && !me->edit_mesh->mesh_eval_final->runtime.is_original; | ||||
| ▲ Show 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | if (DRW_batch_requested(cache->batch.edituv_fdots, GPU_PRIM_POINTS)) { | ||||
| DRW_vbo_request(cache->batch.edituv_fdots, &mbufcache->vbo.fdots_edituv_data); | DRW_vbo_request(cache->batch.edituv_fdots, &mbufcache->vbo.fdots_edituv_data); | ||||
| } | } | ||||
| /* Meh loose Scene const correctness here. */ | /* Meh loose Scene const correctness here. */ | ||||
| const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots((Scene *)scene, ob) : | const bool use_subsurf_fdots = scene ? BKE_modifiers_uses_subsurf_facedots((Scene *)scene, ob) : | ||||
| false; | false; | ||||
| if (do_uvcage) { | if (do_uvcage) { | ||||
| mesh_buffer_cache_create_requested(cache, | mesh_buffer_cache_create_requested(task_graph, | ||||
| cache, | |||||
| cache->uv_cage, | cache->uv_cage, | ||||
| me, | me, | ||||
| is_editmode, | is_editmode, | ||||
| is_paint_mode, | is_paint_mode, | ||||
| ob->obmat, | ob->obmat, | ||||
| false, | false, | ||||
| true, | true, | ||||
| false, | false, | ||||
| &cache->cd_used, | &cache->cd_used, | ||||
| scene, | scene, | ||||
| ts, | ts, | ||||
| true); | true); | ||||
| } | } | ||||
| if (do_cage) { | if (do_cage) { | ||||
| mesh_buffer_cache_create_requested(cache, | mesh_buffer_cache_create_requested(task_graph, | ||||
| cache, | |||||
| cache->cage, | cache->cage, | ||||
| me, | me, | ||||
| is_editmode, | is_editmode, | ||||
| is_paint_mode, | is_paint_mode, | ||||
| ob->obmat, | ob->obmat, | ||||
| false, | false, | ||||
| false, | false, | ||||
| use_subsurf_fdots, | use_subsurf_fdots, | ||||
| &cache->cd_used, | &cache->cd_used, | ||||
| scene, | scene, | ||||
| ts, | ts, | ||||
| true); | true); | ||||
| } | } | ||||
| mesh_buffer_cache_create_requested(cache, | mesh_buffer_cache_create_requested(task_graph, | ||||
| cache, | |||||
| cache->final, | cache->final, | ||||
| me, | me, | ||||
| is_editmode, | is_editmode, | ||||
| is_paint_mode, | is_paint_mode, | ||||
| ob->obmat, | ob->obmat, | ||||
| true, | true, | ||||
| false, | false, | ||||
| use_subsurf_fdots, | use_subsurf_fdots, | ||||
| &cache->cd_used, | &cache->cd_used, | ||||
| scene, | scene, | ||||
| ts, | ts, | ||||
| use_hide); | use_hide); | ||||
| // TODO(jbakker): this check should be re-implemented as a post check in the draw_manager. | |||||
| #ifdef DEBUG | // #ifdef DEBUG | ||||
| check: | // check: | ||||
| /* Make sure all requested batches have been setup. */ | // /* Make sure all requested batches have been setup. */ | ||||
| for (int i = 0; i < sizeof(cache->batch) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->batch) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_batch_requested(((GPUBatch **)&cache->batch)[i], 0)); | // BLI_assert(!DRW_batch_requested(((GPUBatch **)&cache->batch)[i], 0)); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->final.vbo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->final.vbo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->final.vbo)[i])); | // BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->final.vbo)[i])); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->final.ibo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->final.ibo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->final.ibo)[i])); | // BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->final.ibo)[i])); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->cage.vbo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->cage.vbo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->cage.vbo)[i])); | // BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->cage.vbo)[i])); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->cage.ibo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->cage.ibo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->cage.ibo)[i])); | // BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->cage.ibo)[i])); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->uv_cage.vbo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->uv_cage.vbo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->uv_cage.vbo)[i])); | // BLI_assert(!DRW_vbo_requested(((GPUVertBuf **)&cache->uv_cage.vbo)[i])); | ||||
| } | // } | ||||
| for (int i = 0; i < sizeof(cache->uv_cage.ibo) / sizeof(void *); i++) { | // for (int i = 0; i < sizeof(cache->uv_cage.ibo) / sizeof(void *); i++) { | ||||
| BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->uv_cage.ibo)[i])); | // BLI_assert(!DRW_ibo_requested(((GPUIndexBuf **)&cache->uv_cage.ibo)[i])); | ||||
| } | // } | ||||
| #endif | // #endif | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||
left over comments?