Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_impl_mesh.c
| Show First 20 Lines • Show All 490 Lines • ▼ Show 20 Lines | if (cache->is_editmode == false) { | ||||
| // cache->edge_len = mesh_render_edges_len_get(me); | // cache->edge_len = mesh_render_edges_len_get(me); | ||||
| // cache->tri_len = mesh_render_looptri_len_get(me); | // cache->tri_len = mesh_render_looptri_len_get(me); | ||||
| // cache->poly_len = mesh_render_polys_len_get(me); | // cache->poly_len = mesh_render_polys_len_get(me); | ||||
| // cache->vert_len = mesh_render_verts_len_get(me); | // cache->vert_len = mesh_render_verts_len_get(me); | ||||
| } | } | ||||
| cache->mat_len = mesh_render_mat_len_get(me); | cache->mat_len = mesh_render_mat_len_get(me); | ||||
| cache->surface_per_mat = MEM_callocN(sizeof(*cache->surface_per_mat) * cache->mat_len, __func__); | cache->surface_per_mat = MEM_callocN(sizeof(*cache->surface_per_mat) * cache->mat_len, __func__); | ||||
| FOREACH_MESH_BUFFER_CACHE (cache, mbufcache) { | |||||
| mbufcache->tris_per_mat = MEM_callocN(sizeof(*mbufcache->tris_per_mat) * cache->mat_len, | |||||
| __func__); | |||||
| } | |||||
| cache->is_dirty = false; | cache->is_dirty = false; | ||||
| cache->batch_ready = 0; | cache->batch_ready = 0; | ||||
| cache->batch_requested = 0; | cache->batch_requested = 0; | ||||
| drw_mesh_weight_state_clear(&cache->weight_state); | drw_mesh_weight_state_clear(&cache->weight_state); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | FOREACH_MESH_BUFFER_CACHE (cache, mbufcache) { | ||||
| GPUVertBuf **vbos = (GPUVertBuf **)&mbufcache->vbo; | GPUVertBuf **vbos = (GPUVertBuf **)&mbufcache->vbo; | ||||
| GPUIndexBuf **ibos = (GPUIndexBuf **)&mbufcache->ibo; | GPUIndexBuf **ibos = (GPUIndexBuf **)&mbufcache->ibo; | ||||
| for (int i = 0; i < sizeof(mbufcache->vbo) / sizeof(void *); i++) { | for (int i = 0; i < sizeof(mbufcache->vbo) / sizeof(void *); i++) { | ||||
| GPU_VERTBUF_DISCARD_SAFE(vbos[i]); | GPU_VERTBUF_DISCARD_SAFE(vbos[i]); | ||||
| } | } | ||||
| for (int i = 0; i < sizeof(mbufcache->ibo) / sizeof(void *); i++) { | for (int i = 0; i < sizeof(mbufcache->ibo) / sizeof(void *); i++) { | ||||
| GPU_INDEXBUF_DISCARD_SAFE(ibos[i]); | GPU_INDEXBUF_DISCARD_SAFE(ibos[i]); | ||||
| } | } | ||||
| BLI_assert((mbufcache->tris_per_mat != NULL) || (cache->mat_len == 0)); | |||||
| BLI_assert((mbufcache->tris_per_mat != NULL) && (cache->mat_len > 0)); | |||||
| if (mbufcache->tris_per_mat) { | |||||
| for (int i = 0; i < cache->mat_len; i++) { | |||||
| GPU_INDEXBUF_DISCARD_SAFE(mbufcache->tris_per_mat[i]); | |||||
| } | |||||
| MEM_SAFE_FREE(mbufcache->tris_per_mat); | |||||
| } | |||||
| } | } | ||||
| for (int i = 0; i < sizeof(cache->batch) / sizeof(void *); i++) { | for (int i = 0; i < sizeof(cache->batch) / sizeof(void *); i++) { | ||||
| GPUBatch **batch = (GPUBatch **)&cache->batch; | GPUBatch **batch = (GPUBatch **)&cache->batch; | ||||
| GPU_BATCH_DISCARD_SAFE(batch[i]); | GPU_BATCH_DISCARD_SAFE(batch[i]); | ||||
| } | } | ||||
| mesh_batch_cache_discard_shaded_tri(cache); | mesh_batch_cache_discard_shaded_tri(cache); | ||||
| mesh_batch_cache_discard_uvedit(cache); | mesh_batch_cache_discard_uvedit(cache); | ||||
| ▲ Show 20 Lines • Show All 449 Lines • ▼ Show 20 Lines | |||||
| void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, | void DRW_mesh_batch_cache_create_requested(struct TaskGraph *task_graph, | ||||
| Object *ob, | Object *ob, | ||||
| Mesh *me, | Mesh *me, | ||||
| const Scene *scene, | const Scene *scene, | ||||
| const bool is_paint_mode, | const bool is_paint_mode, | ||||
| const bool use_hide) | const bool use_hide) | ||||
| { | { | ||||
| BLI_assert(task_graph); | BLI_assert(task_graph); | ||||
| 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 */ | ||||
| ▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | if (cd_overlap == false) { | ||||
| GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.sculpt_data); | GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.sculpt_data); | ||||
| } | } | ||||
| if (((cache->cd_used.vcol & cache->cd_needed.vcol) != cache->cd_needed.vcol) || | if (((cache->cd_used.vcol & cache->cd_needed.vcol) != cache->cd_needed.vcol) || | ||||
| ((cache->cd_used.sculpt_vcol & cache->cd_needed.sculpt_vcol) != | ((cache->cd_used.sculpt_vcol & cache->cd_needed.sculpt_vcol) != | ||||
| cache->cd_needed.sculpt_vcol)) { | cache->cd_needed.sculpt_vcol)) { | ||||
| GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.vcol); | GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.vcol); | ||||
| } | } | ||||
| } | } | ||||
| /* XXX save element buffer to avoid recreating them. | |||||
| * This is only if the cd_needed changes so it is ok to keep them.*/ | |||||
| if (cache->surface_per_mat[0] && cache->surface_per_mat[0]->elem) { | |||||
| saved_elem_ranges = MEM_callocN(sizeof(saved_elem_ranges) * cache->mat_len, __func__); | |||||
| for (int i = 0; i < cache->mat_len; i++) { | |||||
| saved_elem_ranges[i] = cache->surface_per_mat[i]->elem; | |||||
| /* Avoid deletion as the batch is owner. */ | |||||
| cache->surface_per_mat[i]->elem = NULL; | |||||
| cache->surface_per_mat[i]->flag &= ~GPU_BATCH_OWNS_INDEX; | |||||
| } | |||||
| } | |||||
| /* We can't discard batches at this point as they have been | /* We can't discard batches at this point as they have been | ||||
| * referenced for drawing. Just clear them in place. */ | * referenced for drawing. Just clear them in place. */ | ||||
| for (int i = 0; i < cache->mat_len; i++) { | for (int i = 0; i < cache->mat_len; i++) { | ||||
| GPU_BATCH_CLEAR_SAFE(cache->surface_per_mat[i]); | GPU_BATCH_CLEAR_SAFE(cache->surface_per_mat[i]); | ||||
| } | } | ||||
| GPU_BATCH_CLEAR_SAFE(cache->batch.surface); | GPU_BATCH_CLEAR_SAFE(cache->batch.surface); | ||||
| cache->batch_ready &= ~(MBC_SURFACE); | cache->batch_ready &= ~(MBC_SURFACE); | ||||
| ▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | if (DRW_batch_requested(cache->batch.edit_mesh_analysis, GPU_PRIM_TRIS)) { | ||||
| DRW_ibo_request(cache->batch.edit_mesh_analysis, &mbufcache->ibo.tris); | DRW_ibo_request(cache->batch.edit_mesh_analysis, &mbufcache->ibo.tris); | ||||
| DRW_vbo_request(cache->batch.edit_mesh_analysis, &mbufcache->vbo.pos_nor); | DRW_vbo_request(cache->batch.edit_mesh_analysis, &mbufcache->vbo.pos_nor); | ||||
| DRW_vbo_request(cache->batch.edit_mesh_analysis, &mbufcache->vbo.mesh_analysis); | DRW_vbo_request(cache->batch.edit_mesh_analysis, &mbufcache->vbo.mesh_analysis); | ||||
| } | } | ||||
| /* Per Material */ | /* Per Material */ | ||||
| for (int i = 0; i < cache->mat_len; i++) { | for (int i = 0; i < cache->mat_len; i++) { | ||||
| if (DRW_batch_requested(cache->surface_per_mat[i], GPU_PRIM_TRIS)) { | if (DRW_batch_requested(cache->surface_per_mat[i], GPU_PRIM_TRIS)) { | ||||
| if (saved_elem_ranges && saved_elem_ranges[i]) { | DRW_ibo_request(cache->surface_per_mat[i], &mbufcache->tris_per_mat[i]); | ||||
| /* XXX assign old element buffer range (it did not change).*/ | |||||
| GPU_batch_elembuf_set(cache->surface_per_mat[i], saved_elem_ranges[i], true); | |||||
| } | |||||
| else { | |||||
| DRW_ibo_request(cache->surface_per_mat[i], &mbufcache->ibo.tris); | |||||
| } | |||||
| /* Order matters. First ones override latest VBO's attributes. */ | /* Order matters. First ones override latest VBO's attributes. */ | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.lnor); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.lnor); | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.pos_nor); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.pos_nor); | ||||
| if (cache->cd_used.uv != 0) { | if (cache->cd_used.uv != 0) { | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.uv); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.uv); | ||||
| } | } | ||||
| if ((cache->cd_used.tan != 0) || (cache->cd_used.tan_orco != 0)) { | if ((cache->cd_used.tan != 0) || (cache->cd_used.tan_orco != 0)) { | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.tan); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.tan); | ||||
| } | } | ||||
| if (cache->cd_used.vcol != 0 || cache->cd_used.sculpt_vcol != 0) { | if (cache->cd_used.vcol != 0 || cache->cd_used.sculpt_vcol != 0) { | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.vcol); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.vcol); | ||||
| } | } | ||||
| if (cache->cd_used.orco != 0) { | if (cache->cd_used.orco != 0) { | ||||
| DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.orco); | DRW_vbo_request(cache->surface_per_mat[i], &mbufcache->vbo.orco); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| MEM_SAFE_FREE(saved_elem_ranges); | |||||
| mbufcache = (do_cage) ? &cache->cage : &cache->final; | mbufcache = (do_cage) ? &cache->cage : &cache->final; | ||||
| /* Edit Mesh */ | /* Edit Mesh */ | ||||
| if (DRW_batch_requested(cache->batch.edit_triangles, GPU_PRIM_TRIS)) { | if (DRW_batch_requested(cache->batch.edit_triangles, GPU_PRIM_TRIS)) { | ||||
| DRW_ibo_request(cache->batch.edit_triangles, &mbufcache->ibo.tris); | DRW_ibo_request(cache->batch.edit_triangles, &mbufcache->ibo.tris); | ||||
| DRW_vbo_request(cache->batch.edit_triangles, &mbufcache->vbo.pos_nor); | DRW_vbo_request(cache->batch.edit_triangles, &mbufcache->vbo.pos_nor); | ||||
| DRW_vbo_request(cache->batch.edit_triangles, &mbufcache->vbo.edit_data); | DRW_vbo_request(cache->batch.edit_triangles, &mbufcache->vbo.edit_data); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines | |||||