diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-09-25 21:07:02 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-09-25 21:14:42 +0300 |
commit | 198c7d3687c16581a48701733c4fe4b511eaf149 (patch) | |
tree | 41ff532219804afff847ac234d3af0b07521a9e2 /source/blender | |
parent | 98dd2a518be52b7f94c3a6f9345f19a0aebb2284 (diff) |
DRW : Add new view_update mechanism.
This makes updates for the viewport cleaner and also add the possibility to add a new callback called when the scene is updated.
Diffstat (limited to 'source/blender')
25 files changed, 124 insertions, 19 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index 3b1dcba1503..646d8716094 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -66,6 +66,8 @@ void DRW_engine_viewport_data_size_get( const void *engine_type, int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len); +void DRW_notify_view_update(const struct bContext *C); + void DRW_draw_view(const struct bContext *C); void DRW_draw_render_loop_ex( diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index cc78a43912e..fbd8f20caf7 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -261,7 +261,8 @@ DrawEngineType draw_engine_basic_type = { &BASIC_cache_populate, &BASIC_cache_finish, NULL, - &BASIC_draw_scene + &BASIC_draw_scene, + NULL, }; /* Note: currently unused, we may want to register so we can see this when debugging the view. */ diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c index 6e98b9e5ae4..97ea6ae77a4 100644 --- a/source/blender/draw/engines/clay/clay_engine.c +++ b/source/blender/draw/engines/clay/clay_engine.c @@ -923,7 +923,8 @@ DrawEngineType draw_engine_clay_type = { &CLAY_cache_populate, &CLAY_cache_finish, NULL, - &CLAY_draw_scene + &CLAY_draw_scene, + NULL, }; RenderEngineType DRW_engine_viewport_clay_type = { diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c index e487b29ebfd..e765a0fe3a8 100644 --- a/source/blender/draw/engines/external/external_engine.c +++ b/source/blender/draw/engines/external/external_engine.c @@ -216,7 +216,8 @@ DrawEngineType draw_engine_external_type = { &EXTERNAL_cache_populate, &EXTERNAL_cache_finish, NULL, - &EXTERNAL_draw_scene + &EXTERNAL_draw_scene, + NULL, }; /* Note: currently unused, we should not register unless we want to see this when debugging the view. */ diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index b546631b8c3..428bea17f7c 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -136,6 +136,8 @@ typedef struct DrawEngineType { void (*draw_background)(void *vedata); void (*draw_scene)(void *vedata); + + void (*view_update)(void *vedata); } DrawEngineType; #ifndef __DRW_ENGINE_H__ diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 1f3be9b1f4d..eb19f99802a 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2549,6 +2549,8 @@ static void DRW_viewport_var_init(void) if (RST.bound_tex_slots == NULL) { RST.bound_tex_slots = MEM_callocN(sizeof(bool) * GPU_max_textures(), "Bound Texture Slots"); } + + memset(viewport_matrix_override.override, 0x0, sizeof(viewport_matrix_override.override)); } void DRW_viewport_matrix_get(float mat[4][4], DRWViewportMatrixType type) @@ -2615,8 +2617,7 @@ DefaultTextureList *DRW_viewport_texture_list_get(void) void DRW_viewport_request_redraw(void) { - /* XXXXXXXXXXX HAAAAAAAACKKKK */ - WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, NULL); + GPU_viewport_tag_update(DST.viewport); } /** \} */ @@ -3138,6 +3139,50 @@ static void DRW_debug_gpu_stats(void) DRW_stats_draw(&rect); } +/* -------------------------------------------------------------------- */ + +/** \name View Update + * \{ */ + +void DRW_notify_view_update(const bContext *C) +{ + struct Depsgraph *graph = CTX_data_depsgraph(C); + ARegion *ar = CTX_wm_region(C); + View3D *v3d = CTX_wm_view3d(C); + RegionView3D *rv3d = ar->regiondata; + Scene *scene = DEG_get_evaluated_scene(graph); + SceneLayer *sl = DEG_get_evaluated_scene_layer(graph); + + if (rv3d->viewport == NULL) { + return; + } + + + /* Reset before using it. */ + memset(&DST, 0x0, sizeof(DST)); + + DST.viewport = rv3d->viewport; + DST.draw_ctx = (DRWContextState){ + ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C, + }; + + DRW_engines_enable(scene, sl); + + for (LinkData *link = DST.enabled_engines.first; link; link = link->next) { + DrawEngineType *engine = link->data; + ViewportEngineData *data = DRW_viewport_engine_data_get(engine); + + if (engine->view_update) { + engine->view_update(data); + } + } + + DST.viewport = NULL; + + DRW_engines_disable(); +} + +/** \} */ /* -------------------------------------------------------------------- */ diff --git a/source/blender/draw/modes/edit_armature_mode.c b/source/blender/draw/modes/edit_armature_mode.c index 06756e5a240..4deb4f86692 100644 --- a/source/blender/draw/modes/edit_armature_mode.c +++ b/source/blender/draw/modes/edit_armature_mode.c @@ -152,5 +152,6 @@ DrawEngineType draw_engine_edit_armature_type = { &EDIT_ARMATURE_cache_populate, NULL, NULL, - &EDIT_ARMATURE_draw_scene + &EDIT_ARMATURE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index 02a35e07798..1d542fc8e7e 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -329,5 +329,6 @@ DrawEngineType draw_engine_edit_curve_type = { &EDIT_CURVE_cache_populate, &EDIT_CURVE_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &EDIT_CURVE_draw_scene + &EDIT_CURVE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index 48ea723613a..675ea925a39 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -292,5 +292,6 @@ DrawEngineType draw_engine_edit_lattice_type = { &EDIT_LATTICE_cache_populate, &EDIT_LATTICE_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &EDIT_LATTICE_draw_scene + &EDIT_LATTICE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index 7cff23a2d23..08310d75a57 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -593,5 +593,6 @@ DrawEngineType draw_engine_edit_mesh_type = { &EDIT_MESH_cache_populate, NULL, NULL, - &EDIT_MESH_draw_scene + &EDIT_MESH_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_metaball_mode.c b/source/blender/draw/modes/edit_metaball_mode.c index 4e9e1cb5b56..202e520193b 100644 --- a/source/blender/draw/modes/edit_metaball_mode.c +++ b/source/blender/draw/modes/edit_metaball_mode.c @@ -264,5 +264,6 @@ DrawEngineType draw_engine_edit_metaball_type = { &EDIT_METABALL_cache_populate, &EDIT_METABALL_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &EDIT_METABALL_draw_scene + &EDIT_METABALL_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_surface_mode.c b/source/blender/draw/modes/edit_surface_mode.c index c8dbbd90754..e99973144aa 100644 --- a/source/blender/draw/modes/edit_surface_mode.c +++ b/source/blender/draw/modes/edit_surface_mode.c @@ -264,5 +264,6 @@ DrawEngineType draw_engine_edit_surface_type = { &EDIT_SURFACE_cache_populate, &EDIT_SURFACE_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &EDIT_SURFACE_draw_scene + &EDIT_SURFACE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/edit_text_mode.c b/source/blender/draw/modes/edit_text_mode.c index 938ab2f3fbc..476a2ab9ac2 100644 --- a/source/blender/draw/modes/edit_text_mode.c +++ b/source/blender/draw/modes/edit_text_mode.c @@ -307,5 +307,6 @@ DrawEngineType draw_engine_edit_text_type = { &EDIT_TEXT_cache_populate, &EDIT_TEXT_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &EDIT_TEXT_draw_scene + &EDIT_TEXT_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index bde0a43120f..1667dd9e846 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1876,5 +1876,6 @@ DrawEngineType draw_engine_object_type = { &OBJECT_cache_populate, NULL, NULL, - &OBJECT_draw_scene + &OBJECT_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c index 65ab9fd9286..f898770acef 100644 --- a/source/blender/draw/modes/paint_texture_mode.c +++ b/source/blender/draw/modes/paint_texture_mode.c @@ -412,5 +412,6 @@ DrawEngineType draw_engine_paint_texture_type = { &PAINT_TEXTURE_cache_populate, &PAINT_TEXTURE_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &PAINT_TEXTURE_draw_scene + &PAINT_TEXTURE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index 68bdf6d1304..e430fca5742 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -211,5 +211,6 @@ DrawEngineType draw_engine_paint_vertex_type = { &PAINT_VERTEX_cache_populate, NULL, NULL, - &PAINT_VERTEX_draw_scene + &PAINT_VERTEX_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index d837b273404..e139b4af97f 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -249,5 +249,6 @@ DrawEngineType draw_engine_paint_weight_type = { &PAINT_WEIGHT_cache_populate, NULL, NULL, - &PAINT_WEIGHT_draw_scene + &PAINT_WEIGHT_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c index dd22a5c6d8f..be076815f4c 100644 --- a/source/blender/draw/modes/particle_mode.c +++ b/source/blender/draw/modes/particle_mode.c @@ -259,5 +259,6 @@ DrawEngineType draw_engine_particle_type = { &PARTICLE_cache_populate, &PARTICLE_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &PARTICLE_draw_scene + &PARTICLE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/pose_mode.c b/source/blender/draw/modes/pose_mode.c index 77688f9156c..1c2acd56085 100644 --- a/source/blender/draw/modes/pose_mode.c +++ b/source/blender/draw/modes/pose_mode.c @@ -193,5 +193,6 @@ DrawEngineType draw_engine_pose_type = { &POSE_cache_populate, NULL, NULL, - &POSE_draw_scene + &POSE_draw_scene, + NULL, }; diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c index 7d2c96dc8de..f38e6565065 100644 --- a/source/blender/draw/modes/sculpt_mode.c +++ b/source/blender/draw/modes/sculpt_mode.c @@ -300,5 +300,6 @@ DrawEngineType draw_engine_sculpt_type = { &SCULPT_cache_populate, &SCULPT_cache_finish, NULL, /* draw_background but not needed by mode engines */ - &SCULPT_draw_scene + &SCULPT_draw_scene, + NULL, }; diff --git a/source/blender/editors/render/CMakeLists.txt b/source/blender/editors/render/CMakeLists.txt index 22e0b141d73..ed2e9747d1c 100644 --- a/source/blender/editors/render/CMakeLists.txt +++ b/source/blender/editors/render/CMakeLists.txt @@ -25,6 +25,7 @@ set(INC ../../blenloader ../../blentranslation ../../depsgraph + ../../draw ../../gpu ../../imbuf ../../bmesh diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c index 67354a70e4a..ccea1e5930c 100644 --- a/source/blender/editors/render/render_update.c +++ b/source/blender/editors/render/render_update.c @@ -41,6 +41,8 @@ #include "DNA_world_types.h" #include "DNA_windowmanager_types.h" +#include "DRW_engine.h" + #include "BLI_listbase.h" #include "BLI_threads.h" #include "BLI_utildefines.h" @@ -137,6 +139,16 @@ void ED_render_scene_update(Main *bmain, Scene *scene, int updated) engine->flag &= ~RE_ENGINE_DO_UPDATE; engine->type->view_update(engine, C); + + } + else if ((RE_engines_find(scene->r.engine)->flag & RE_USE_LEGACY_PIPELINE) == 0) { + if (updated) { + CTX_wm_screen_set(C, sc); + CTX_wm_area_set(C, sa); + CTX_wm_region_set(C, ar); + + DRW_notify_view_update(C); + } } } } diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h index 2b2a07f50b7..622b3b301e4 100644 --- a/source/blender/gpu/GPU_viewport.h +++ b/source/blender/gpu/GPU_viewport.h @@ -101,6 +101,9 @@ void *GPU_viewport_texture_list_get(GPUViewport *viewport); void GPU_viewport_size_get(const GPUViewport *viewport, int size[2]); void GPU_viewport_size_set(GPUViewport *viewport, const int size[2]); +void GPU_viewport_tag_update(GPUViewport *viewport); +bool GPU_viewport_do_update(GPUViewport *viewport); + /* Texture pool */ GPUTexture *GPU_viewport_texture_pool_query(GPUViewport *viewport, void *engine, int width, int height, int channels, int format); diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c index f80842364f3..bf255cfef6f 100644 --- a/source/blender/gpu/intern/gpu_viewport.c +++ b/source/blender/gpu/intern/gpu_viewport.c @@ -72,7 +72,9 @@ struct GPUViewport { /* debug */ GPUTexture *debug_depth; int size[2]; + int samples; + int flag; ListBase data; /* ViewportEngineData wrapped in LinkData */ unsigned int data_hash; /* If hash mismatch we free all ViewportEngineData in this viewport */ @@ -83,11 +85,27 @@ struct GPUViewport { ListBase tex_pool; /* ViewportTempTexture list : Temporary textures shared across draw engines */ }; +enum { + DO_UPDATE = (1 << 0), +}; + static void gpu_viewport_buffers_free(FramebufferList *fbl, int fbl_len, TextureList *txl, int txl_len); static void gpu_viewport_storage_free(StorageList *stl, int stl_len); static void gpu_viewport_passes_free(PassList *psl, int psl_len); static void gpu_viewport_texture_pool_free(GPUViewport *viewport); +void GPU_viewport_tag_update(GPUViewport *viewport) +{ + viewport->flag |= DO_UPDATE; +} + +bool GPU_viewport_do_update(GPUViewport *viewport) +{ + bool ret = (viewport->flag & DO_UPDATE); + viewport->flag &= ~DO_UPDATE; + return ret; +} + GPUViewport *GPU_viewport_create(void) { GPUViewport *viewport = MEM_callocN(sizeof(GPUViewport), "GPUViewport"); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 81f913d7aa7..b4db8a8b3ac 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -58,6 +58,7 @@ #include "GPU_draw.h" #include "GPU_extensions.h" #include "GPU_immediate.h" +#include "GPU_viewport.h" #include "RE_engine.h" @@ -136,6 +137,7 @@ static void wm_region_test_render_do_draw(const Scene *scene, ScrArea *sa, ARegi if (sa->spacetype == SPACE_VIEW3D) { RegionView3D *rv3d = ar->regiondata; RenderEngine *engine = (rv3d) ? rv3d->render_engine : NULL; + GPUViewport *viewport = (rv3d) ? rv3d->viewport : NULL; if (engine && (engine->flag & RE_ENGINE_DO_DRAW)) { View3D *v3d = sa->spacedata.first; @@ -149,6 +151,9 @@ static void wm_region_test_render_do_draw(const Scene *scene, ScrArea *sa, ARegi engine->flag &= ~RE_ENGINE_DO_DRAW; } + else if (viewport && GPU_viewport_do_update(viewport)) { + ED_region_tag_redraw(ar); + } } } |