Draw manager: Pass explicit context to DEG scene update callback
This way it is more clear what is needed to be passed and what is available in the callback itself. Thanks Dalai for review and tips about engine type!
This commit is contained in:
@@ -30,6 +30,7 @@ struct ARegion;
|
|||||||
struct CollectionEngineSettings;
|
struct CollectionEngineSettings;
|
||||||
struct Depsgraph;
|
struct Depsgraph;
|
||||||
struct DRWPass;
|
struct DRWPass;
|
||||||
|
struct Main;
|
||||||
struct Material;
|
struct Material;
|
||||||
struct Scene;
|
struct Scene;
|
||||||
struct DrawEngineType;
|
struct DrawEngineType;
|
||||||
@@ -68,7 +69,15 @@ void DRW_engine_viewport_data_size_get(
|
|||||||
const void *engine_type,
|
const void *engine_type,
|
||||||
int *r_fbl_len, int *r_txl_len, int *r_psl_len, int *r_stl_len);
|
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);
|
typedef struct DRWUpdateContext {
|
||||||
|
struct Main *bmain;
|
||||||
|
struct Scene *scene;
|
||||||
|
struct ViewLayer *view_layer;
|
||||||
|
struct ARegion *ar;
|
||||||
|
struct View3D *v3d;
|
||||||
|
struct RenderEngineType *engine_type;
|
||||||
|
} DRWUpdateContext;
|
||||||
|
void DRW_notify_view_update(const DRWUpdateContext *update_ctx);
|
||||||
|
|
||||||
void DRW_draw_view(const struct bContext *C);
|
void DRW_draw_view(const struct bContext *C);
|
||||||
|
|
||||||
|
|||||||
@@ -3219,15 +3219,14 @@ static void DRW_debug_gpu_stats(void)
|
|||||||
/** \name View Update
|
/** \name View Update
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
void DRW_notify_view_update(const bContext *C)
|
void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
|
||||||
{
|
{
|
||||||
struct Depsgraph *graph = CTX_data_depsgraph(C);
|
RenderEngineType *engine_type = update_ctx->engine_type;
|
||||||
ARegion *ar = CTX_wm_region(C);
|
ARegion *ar = update_ctx->ar;
|
||||||
View3D *v3d = CTX_wm_view3d(C);
|
View3D *v3d = update_ctx->v3d;
|
||||||
RegionView3D *rv3d = ar->regiondata;
|
RegionView3D *rv3d = ar->regiondata;
|
||||||
Scene *scene = DEG_get_evaluated_scene(graph);
|
Scene *scene = update_ctx->scene;
|
||||||
RenderEngineType *engine_type = CTX_data_engine_type(C);
|
ViewLayer *view_layer = update_ctx->view_layer;
|
||||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
|
||||||
|
|
||||||
if (rv3d->viewport == NULL) {
|
if (rv3d->viewport == NULL) {
|
||||||
return;
|
return;
|
||||||
@@ -3239,7 +3238,7 @@ void DRW_notify_view_update(const bContext *C)
|
|||||||
|
|
||||||
DST.viewport = rv3d->viewport;
|
DST.viewport = rv3d->viewport;
|
||||||
DST.draw_ctx = (DRWContextState){
|
DST.draw_ctx = (DRWContextState){
|
||||||
ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine_type, C,
|
ar, rv3d, v3d, scene, view_layer, OBACT(view_layer), engine_type, NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
DRW_engines_enable(scene, view_layer, engine_type);
|
DRW_engines_enable(scene, view_layer, engine_type);
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ void ED_render_scene_update(const DEGEditorUpdateContext *update_ctx, int update
|
|||||||
* updates if there was any change. context is set to the 3d view */
|
* updates if there was any change. context is set to the 3d view */
|
||||||
Main *bmain = update_ctx->bmain;
|
Main *bmain = update_ctx->bmain;
|
||||||
Scene *scene = update_ctx->scene;
|
Scene *scene = update_ctx->scene;
|
||||||
|
ViewLayer *view_layer = update_ctx->view_layer;
|
||||||
bContext *C;
|
bContext *C;
|
||||||
wmWindowManager *wm;
|
wmWindowManager *wm;
|
||||||
wmWindow *win;
|
wmWindow *win;
|
||||||
@@ -127,15 +128,11 @@ void ED_render_scene_update(const DEGEditorUpdateContext *update_ctx, int update
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (ar = sa->regionbase.first; ar; ar = ar->next) {
|
for (ar = sa->regionbase.first; ar; ar = ar->next) {
|
||||||
RegionView3D *rv3d;
|
if (ar->regiontype != RGN_TYPE_WINDOW) {
|
||||||
RenderEngine *engine;
|
|
||||||
|
|
||||||
if (ar->regiontype != RGN_TYPE_WINDOW)
|
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
rv3d = ar->regiondata;
|
RegionView3D *rv3d = ar->regiondata;
|
||||||
engine = rv3d->render_engine;
|
RenderEngine *engine = rv3d->render_engine;
|
||||||
|
|
||||||
/* call update if the scene changed, or if the render engine
|
/* call update if the scene changed, or if the render engine
|
||||||
* tagged itself for update (e.g. because it was busy at the
|
* tagged itself for update (e.g. because it was busy at the
|
||||||
* time of the last update) */
|
* time of the last update) */
|
||||||
@@ -149,13 +146,20 @@ void ED_render_scene_update(const DEGEditorUpdateContext *update_ctx, int update
|
|||||||
engine->type->view_update(engine, C);
|
engine->type->view_update(engine, C);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if ((RE_engines_find(view_render->engine_id)->flag & RE_USE_LEGACY_PIPELINE) == 0) {
|
else {
|
||||||
|
RenderEngineType *engine_type = RE_engines_find(view_render->engine_id);
|
||||||
|
if ((engine_type->flag & RE_USE_LEGACY_PIPELINE) == 0) {
|
||||||
if (updated) {
|
if (updated) {
|
||||||
CTX_wm_screen_set(C, sc);
|
DRW_notify_view_update(
|
||||||
CTX_wm_area_set(C, sa);
|
(&(DRWUpdateContext){
|
||||||
CTX_wm_region_set(C, ar);
|
.bmain = bmain,
|
||||||
|
.scene = scene,
|
||||||
DRW_notify_view_update(C);
|
.view_layer = view_layer,
|
||||||
|
.ar = ar,
|
||||||
|
.v3d = (View3D *)sa->spacedata.first,
|
||||||
|
.engine_type = engine_type
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user