From 4fd005fefb014a8570747b1d043de7d610078b46 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Mon, 27 Apr 2020 11:37:20 +0200 Subject: [PATCH] Fix T76131: Crash combing Hair using Python Caused by rBe82827bf6ed5. DRW_draw_depth_object calls DRW_mesh_batch_cache_create_requested with NULL scene, but that is accessed later on... Scene is actually available, so pass that around. Maniphest Tasks: T76131 Differential Revision: https://developer.blender.org/D7540 --- source/blender/draw/DRW_engine.h | 3 ++- source/blender/draw/intern/draw_cache_extract_mesh.c | 1 + source/blender/draw/intern/draw_manager.c | 4 ++-- source/blender/editors/space_view3d/view3d_draw.c | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 7ecf9df275d..1bdc3bc5a03 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -118,7 +118,8 @@ void DRW_draw_depth_loop_gpencil(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, struct GPUViewport *viewport); -void DRW_draw_depth_object(struct ARegion *region, +void DRW_draw_depth_object(struct Scene *scene, + struct ARegion *region, struct View3D *v3d, struct GPUViewport *viewport, struct Object *object); diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index 4c51ed99f2c..40687306b4e 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -4540,6 +4540,7 @@ static void extract_task_create(TaskPool *task_pool, void *buf, int32_t *task_counter) { + BLI_assert(scene != NULL); const bool do_hq_normals = (scene->r.perf_flag & SCE_PERF_HQ_NORMALS) != 0; if (do_hq_normals && (extract == &extract_lnor)) { extract = &extract_lnor_hq; diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 51222d833c2..7bc3dcfab81 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2430,7 +2430,7 @@ static void draw_world_clip_planes_from_rv3d(GPUBatch *batch, const float world_ /** * Clears the Depth Buffer and draws only the specified object. */ -void DRW_draw_depth_object(ARegion *region, View3D *v3d, GPUViewport *viewport, Object *object) +void DRW_draw_depth_object(Scene *scene, ARegion *region, View3D *v3d, GPUViewport *viewport, Object *object) { RegionView3D *rv3d = region->regiondata; @@ -2468,7 +2468,7 @@ void DRW_draw_depth_object(ARegion *region, View3D *v3d, GPUViewport *viewport, batch = DRW_mesh_batch_cache_get_surface(me); } - DRW_mesh_batch_cache_create_requested(object, me, NULL, false, true); + DRW_mesh_batch_cache_create_requested(object, me, scene, false, true); const eGPUShaderConfig sh_cfg = world_clip_planes ? GPU_SHADER_CFG_CLIPPED : GPU_SHADER_CFG_DEFAULT; diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index c1995249c26..e58559f4f6b 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2217,7 +2217,7 @@ void ED_view3d_backbuf_depth_validate(ViewContext *vc) if (obact_eval && ((obact_eval->base_flag & BASE_VISIBLE_DEPSGRAPH) != 0)) { GPUViewport *viewport = WM_draw_region_get_viewport(region); - DRW_draw_depth_object(vc->region, vc->v3d, viewport, obact_eval); + DRW_draw_depth_object(vc->scene, vc->region, vc->v3d, viewport, obact_eval); } vc->v3d->flag &= ~V3D_INVALID_BACKBUF;