Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/intern/draw_manager.c')
-rw-r--r--source/blender/draw/intern/draw_manager.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 38a767b7e34..2a3d9fafd2a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -37,6 +37,7 @@
#include "BKE_object.h"
#include "BKE_pbvh.h"
#include "BKE_paint.h"
+#include "BKE_workspace.h"
#include "BLT_translation.h"
#include "BLF_api.h"
@@ -2905,15 +2906,14 @@ static void use_drw_engine(DrawEngineType *engine)
/* TODO revisit this when proper layering is implemented */
/* Gather all draw engines needed and store them in DST.enabled_engines
* That also define the rendering order of engines */
-static void DRW_engines_enable_from_engine(const Scene *scene)
+static void DRW_engines_enable_from_engine(RenderEngineType *engine)
{
/* TODO layers */
- RenderEngineType *type = RE_engines_find(scene->r.engine);
- if (type->draw_engine != NULL) {
- use_drw_engine(type->draw_engine);
+ if (engine->draw_engine != NULL) {
+ use_drw_engine(engine->draw_engine);
}
- if ((type->flag & RE_INTERNAL) == 0) {
+ if ((engine->flag & RE_INTERNAL) == 0) {
DRW_engines_enable_external();
}
}
@@ -2990,11 +2990,12 @@ static void DRW_engines_enable_external(void)
use_drw_engine(DRW_engine_viewport_external_type.draw_engine);
}
-static void DRW_engines_enable(const Scene *scene, SceneLayer *sl)
+static void DRW_engines_enable(const Scene *scene, SceneLayer *sl, RenderEngineType *engine)
{
Object *obact = OBACT_NEW(sl);
const int mode = CTX_data_mode_enum_ex(scene->obedit, obact);
- DRW_engines_enable_from_engine(scene);
+
+ DRW_engines_enable_from_engine(engine);
if (DRW_state_draw_support()) {
DRW_engines_enable_from_object_mode();
@@ -3153,7 +3154,8 @@ void DRW_notify_view_update(const bContext *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);
+ RenderEngineType *engine = CTX_data_engine(C);
+ SceneLayer *scene_layer = CTX_data_scene_layer(C);
if (rv3d->viewport == NULL) {
return;
@@ -3165,17 +3167,17 @@ void DRW_notify_view_update(const bContext *C)
DST.viewport = rv3d->viewport;
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), C,
+ ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine, C,
};
- DRW_engines_enable(scene, sl);
+ DRW_engines_enable(scene, scene_layer, engine);
for (LinkData *link = DST.enabled_engines.first; link; link = link->next) {
- DrawEngineType *engine = link->data;
- ViewportEngineData *data = DRW_viewport_engine_data_get(engine);
+ DrawEngineType *draw_engine = link->data;
+ ViewportEngineData *data = DRW_viewport_engine_data_get(draw_engine);
- if (engine->view_update) {
- engine->view_update(data);
+ if (draw_engine->view_update) {
+ draw_engine->view_update(data);
}
}
@@ -3197,12 +3199,13 @@ void DRW_notify_view_update(const bContext *C)
void DRW_draw_view(const bContext *C)
{
struct Depsgraph *graph = CTX_data_depsgraph(C);
+ RenderEngineType *engine = CTX_data_engine(C);
ARegion *ar = CTX_wm_region(C);
View3D *v3d = CTX_wm_view3d(C);
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
- DRW_draw_render_loop_ex(graph, ar, v3d, C);
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, C);
}
/**
@@ -3211,11 +3214,12 @@ void DRW_draw_view(const bContext *C)
*/
void DRW_draw_render_loop_ex(
struct Depsgraph *graph,
+ RenderEngineType *engine,
ARegion *ar, View3D *v3d,
const bContext *evil_C)
{
Scene *scene = DEG_get_evaluated_scene(graph);
- SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
+ SceneLayer *scene_layer = DEG_get_evaluated_scene_layer(graph);
RegionView3D *rv3d = ar->regiondata;
DST.draw_ctx.evil_C = evil_C;
@@ -3228,15 +3232,16 @@ void DRW_draw_render_loop_ex(
cache_is_dirty = GPU_viewport_cache_validate(DST.viewport, DRW_engines_get_hash());
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl),
- /* reuse if caller sets */
- DST.draw_ctx.evil_C,
+ ar, rv3d, v3d, scene, scene_layer, OBACT_NEW(scene_layer), engine,
+
+ /* reuse if caller sets */
+ DST.draw_ctx.evil_C,
};
DRW_viewport_var_init();
/* Get list of enabled engines */
- DRW_engines_enable(scene, sl);
+ DRW_engines_enable(scene, scene_layer, engine);
/* Update ubos */
DRW_globals_update();
@@ -3316,11 +3321,15 @@ void DRW_draw_render_loop(
{
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
- DRW_draw_render_loop_ex(graph, ar, v3d, NULL);
+
+ Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
+
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL);
}
void DRW_draw_render_loop_offscreen(
- struct Depsgraph *graph,
+ struct Depsgraph *graph, RenderEngineType *engine,
ARegion *ar, View3D *v3d, GPUOffScreen *ofs)
{
RegionView3D *rv3d = ar->regiondata;
@@ -3335,7 +3344,7 @@ void DRW_draw_render_loop_offscreen(
/* Reset before using it. */
memset(&DST, 0x0, sizeof(DST));
DST.options.is_image_render = true;
- DRW_draw_render_loop_ex(graph, ar, v3d, NULL);
+ DRW_draw_render_loop_ex(graph, engine, ar, v3d, NULL);
/* restore */
{
@@ -3360,6 +3369,7 @@ void DRW_draw_select_loop(
bool UNUSED(use_obedit_skip), bool UNUSED(use_nearest), const rcti *rect)
{
Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
#ifndef USE_GPU_SELECT
UNUSED_VARS(vc, scene, sl, v3d, ar, rect);
@@ -3412,7 +3422,7 @@ void DRW_draw_select_loop(
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL,
+ ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL,
};
DRW_viewport_var_init();
@@ -3478,6 +3488,7 @@ void DRW_draw_depth_loop(
ARegion *ar, View3D *v3d)
{
Scene *scene = DEG_get_evaluated_scene(graph);
+ RenderEngineType *engine = RE_engines_find(scene->view_render.engine_id);
SceneLayer *sl = DEG_get_evaluated_scene_layer(graph);
RegionView3D *rv3d = ar->regiondata;
@@ -3508,7 +3519,7 @@ void DRW_draw_depth_loop(
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
DST.draw_ctx = (DRWContextState){
- ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), (bContext *)NULL,
+ ar, rv3d, v3d, scene, sl, OBACT_NEW(sl), engine, (bContext *)NULL,
};
DRW_viewport_var_init();