[Bf-blender-cvs] [3b91989a093] blender2.8: Draw Manager: structural change

Clément Foucault noreply at git.blender.org
Thu Mar 9 01:38:51 CET 2017


Commit: 3b91989a093aef874b601efcffd247cf61e73bad
Author: Clément Foucault
Date:   Wed Mar 8 20:00:09 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB3b91989a093aef874b601efcffd247cf61e73bad

Draw Manager: structural change

All engines are now called by the draw manager. Engines are separate entities that cannot interfer with each others.
Also separated draw_mode_pass.c into the mode engines.

===================================================================

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/engines/clay/clay.c
M	source/blender/draw/engines/clay/clay.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_armature.c
A	source/blender/draw/intern/draw_common.c
R052	source/blender/draw/intern/draw_mode_pass.h	source/blender/draw/intern/draw_common.h
M	source/blender/draw/intern/draw_manager.c
D	source/blender/draw/intern/draw_mode_pass.c
R073	source/blender/draw/modes/object_mode.h	source/blender/draw/modes/draw_mode_engines.h
M	source/blender/draw/modes/edit_armature_mode.c
D	source/blender/draw/modes/edit_armature_mode.h
M	source/blender/draw/modes/edit_mesh_mode.c
D	source/blender/draw/modes/edit_mesh_mode.h
M	source/blender/draw/modes/object_mode.c
M	source/blender/editors/space_view3d/CMakeLists.txt
M	source/blender/editors/space_view3d/view3d_draw.c
M	source/blender/gpu/GPU_viewport.h
M	source/blender/gpu/intern/gpu_viewport.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

===================================================================

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index cb2681fcf81..c04063d22f8 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -52,7 +52,7 @@ set(INC_SYS
 
 set(SRC
 	intern/draw_manager.c
-	intern/draw_mode_pass.c
+	intern/draw_common.c
 	intern/draw_cache.c
 	intern/draw_view.c
 	intern/draw_armature.c
@@ -62,13 +62,11 @@ set(SRC
 	modes/object_mode.c
 
 	intern/DRW_render.h
-	intern/draw_mode_pass.h
+	intern/draw_common.h
 	intern/draw_cache.h
 	intern/draw_view.h
 	engines/clay/clay.h
-	modes/edit_armature_mode.h
-	modes/edit_mesh_mode.h
-	modes/object_mode.h
+	modes/draw_mode_engines.h
 
 	./DRW_engine.h
 )
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h
index 05ecc7390d1..e8dc47245e3 100644
--- a/source/blender/draw/DRW_engine.h
+++ b/source/blender/draw/DRW_engine.h
@@ -30,10 +30,27 @@ struct CollectionEngineSettings;
 struct DRWPass;
 struct Material;
 struct Scene;
+struct DrawEngineType;
+struct bContext;
+struct Object;
 
-void DRW_engines_init(void);
+/* Buffer and textures used by the viewport by default */
+typedef struct DefaultFramebufferList {
+	struct GPUFrameBuffer *default_fb;
+} DefaultFramebufferList;
+
+typedef struct DefaultTextureList {
+	struct GPUTexture *color;
+	struct GPUTexture *depth;
+} DefaultTextureList;
+
+void DRW_engines_register(void);
 void DRW_engines_free(void);
 
+void DRW_engine_register(struct DrawEngineType *draw_engine_type);
+
+void DRW_draw_view(const struct bContext *C);
+
 /* This is here because GPUViewport needs it */
 void DRW_pass_free(struct DRWPass *pass);
 
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c
index cd19595b107..a91027cb314 100644
--- a/source/blender/draw/engines/clay/clay.c
+++ b/source/blender/draw/engines/clay/clay.c
@@ -124,6 +124,15 @@ typedef struct CLAY_PassList {
 	struct DRWPass *clay_pass;
 } CLAY_PassList;
 
+typedef struct CLAY_Data {
+	char engine_name[32];
+	CLAY_FramebufferList *fbl;
+	CLAY_TextureList *txl;
+	CLAY_PassList *psl;
+	CLAY_StorageList *stl;
+} CLAY_Data;
+
+
 //#define GTAO
 
 /* Functions */
@@ -262,20 +271,12 @@ RenderEngineSettings *CLAY_render_settings_create(void)
 	return (RenderEngineSettings *)settings;
 }
 
-MaterialEngineSettings *CLAY_material_settings_create(void)
-{
-	MaterialEngineSettingsClay *settings = MEM_callocN(sizeof(MaterialEngineSettingsClay), "MaterialEngineSettingsClay");
-
-	clay_material_settings_init(settings);
-
-	return (MaterialEngineSettings *)settings;
-}
-
 static void CLAY_engine_init(void)
 {
-	CLAY_StorageList *stl = DRW_engine_storage_list_get();
-	CLAY_TextureList *txl = DRW_engine_texture_list_get();
-	CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_StorageList *stl = vedata->stl;
+	CLAY_TextureList *txl = vedata->txl;
+	CLAY_FramebufferList *fbl = vedata->fbl;
 
 	/* Create Texture Array */
 	if (!data.matcap_array) {
@@ -428,10 +429,11 @@ static void CLAY_engine_init(void)
 
 static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id)
 {
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_TextureList *txl = vedata->txl;
 	const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3;
 
 	DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass);
-	CLAY_TextureList *txl = DRW_engine_texture_list_get();
 
 	DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
 	DRW_shgroup_uniform_buffer(grp, "depthtex", &txl->depth_dup, depthloc);
@@ -599,9 +601,9 @@ static DRWShadingGroup *depth_shgrp_cull;
 
 static void CLAY_cache_init(void)
 {
-	CLAY_PassList *psl = DRW_engine_pass_list_get();
-	CLAY_StorageList *stl = DRW_engine_storage_list_get();
-
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_PassList *psl = vedata->psl;
+	CLAY_StorageList *stl = vedata->stl;
 
 	/* Depth Pass */
 	{
@@ -622,100 +624,46 @@ static void CLAY_cache_init(void)
 
 static void CLAY_cache_populate(Object *ob)
 {
-	const bContext *C = DRW_get_context();
-	int mode = CTX_data_mode_enum(C);
-	CLAY_StorageList *stl = DRW_engine_storage_list_get();
-	CLAY_PassList *psl = DRW_engine_pass_list_get();
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_PassList *psl = vedata->psl;
+	CLAY_StorageList *stl = vedata->stl;
+
 	struct Batch *geom;
 	DRWShadingGroup *clay_shgrp;
-	bool do_occlude_wire = false;
-	bool do_cull = false;
-	CollectionEngineSettings *ces_mode_ed, *ces_mode_ob;
-
-	switch (mode) {
-		case CTX_MODE_EDIT_MESH:
-		case CTX_MODE_EDIT_CURVE:
-		case CTX_MODE_EDIT_SURFACE:
-		case CTX_MODE_EDIT_TEXT:
-		case CTX_MODE_EDIT_ARMATURE:
-		case CTX_MODE_EDIT_METABALL:
-		case CTX_MODE_EDIT_LATTICE:
-		case CTX_MODE_POSE:
-		case CTX_MODE_SCULPT:
-		case CTX_MODE_PAINT_WEIGHT:
-		case CTX_MODE_PAINT_VERTEX:
-		case CTX_MODE_PAINT_TEXTURE:
-		case CTX_MODE_PARTICLE:
-			ces_mode_ed = BKE_object_collection_engine_get(ob, COLLECTION_MODE_EDIT, "");
-			do_occlude_wire = BKE_collection_engine_property_value_get_bool(ces_mode_ed, "show_occlude_wire");
-			break;
-		case CTX_MODE_OBJECT:
-			ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
-			do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
-			break;
-	}
 
-	if (do_occlude_wire)
+	if (!DRW_is_object_renderable(ob))
 		return;
 
-	switch (ob->type) {
-		case OB_MESH:
-			geom = DRW_cache_surface_get(ob);
+	CollectionEngineSettings *ces_mode_ob = BKE_object_collection_engine_get(ob, COLLECTION_MODE_OBJECT, "");
+	bool do_cull = BKE_collection_engine_property_value_get_bool(ces_mode_ob, "show_backface_culling");
 
-			/* Depth Prepass */
-			DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
+	/* TODO all renderable */
+	if (ob->type == OB_MESH) {
+		geom = DRW_cache_surface_get(ob);
 
-			/* Shading */
-			clay_shgrp = CLAY_object_shgrp_get(ob, stl, psl);
-			DRW_shgroup_call_add(clay_shgrp, geom, ob->obmat);
-			break;
+		/* Depth Prepass */
+		DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat);
+
+		/* Shading */
+		clay_shgrp = CLAY_object_shgrp_get(ob, stl, psl);
+		DRW_shgroup_call_add(clay_shgrp, geom, ob->obmat);
 	}
 }
 
 static void CLAY_cache_finish(void)
 {
-	CLAY_StorageList *stl = DRW_engine_storage_list_get();
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_StorageList *stl = vedata->stl;
 
 	DRW_uniformbuffer_update(stl->mat_ubo, &stl->storage->mat_storage);
 }
 
-static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context)
+static void CLAY_draw_scene(void)
 {
-	DRW_viewport_init(context);
-
-	/* This function may run for multiple viewports
-	 * so get the current viewport buffers */
-	CLAY_PassList *psl = DRW_engine_pass_list_get();
-	CLAY_FramebufferList *fbl = DRW_engine_framebuffer_list_get();
-
-	CLAY_engine_init();
-	DRW_mode_init();
-
-	/* TODO : tag to refresh by the deps graph */
-	/* ideally only refresh when objects are added/removed */
-	/* or render properties / materials change */
-	if (DRW_viewport_cache_is_dirty()) {
-
-		SceneLayer *sl = CTX_data_scene_layer(context);
-
-		CLAY_cache_init();
-		DRW_mode_cache_init();
-
-		DEG_OBJECT_ITER(sl, ob);
-		{
-			CLAY_cache_populate(ob);
-			DRW_mode_cache_populate(ob);
-		}
-		DEG_OBJECT_ITER_END
-
-		CLAY_cache_finish();
-		DRW_mode_cache_finish();
-	}
-
-	/* Start Drawing */
-	DRW_draw_background();
-
-	DRW_draw_callbacks_pre_scene();
+	CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay");
+	CLAY_PassList *psl = vedata->psl;
+	CLAY_FramebufferList *fbl = vedata->fbl;
+	DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
 	/* Pass 1 : Depth pre-pass */
 	DRW_draw_pass(psl->depth_pass);
@@ -723,19 +671,10 @@ static void CLAY_view_draw(RenderEngine *UNUSED(engine), const bContext *context
 
 	/* Pass 2 : Duplicate depth */
 	/* Unless we go for deferred shading we need this to avoid manual depth test and artifacts */
-	DRW_framebuffer_blit(fbl->default_fb, fbl->dupli_depth, true);
+	DRW_framebuffer_blit(dfbl->default_fb, fbl->dupli_depth, true);
 
 	/* Pass 3 : Shading */
 	DRW_draw_pass(psl->clay_pass);
-
-	/* Pass 4 : Overlays */
-	/* At this point all shaded geometry should have been rendered and their depth written */
-	DRW_draw_mode_overlays();
-
-	DRW_draw_callbacks_post_scene();
-
-	/* Always finish by this */
-	DRW_state_reset();
 }
 
 static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), CollectionEngineSettings *ces)
@@ -753,30 +692,39 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), Collec
 	BKE_collection_engine_property_add_float(ces, "ssao_factor_edge", 1.0f);
 }
 
-void CLAY_engine_free(void)
+static void CLAY_engine_free(void)
 {
-	/* data.depth_sh Is builtin so it's automaticaly freed */
 	if (data.clay_sh) {
 		DRW_shader_free(data.clay_sh);
 	}
-
 	if (data.matcap_array) {
 		DRW_texture_free(data.matcap_array);
 	}
-
 	if (data.jitter_tx) {
 		DRW_texture_free(data.jitter_tx);
 	}
-
 	if (data.sampling_tx) {
 		DRW_texture_free(data.sampling_tx);
 	}
 }
 
+DrawEngineType draw_engine_clay_type = {
+	NULL, NULL,
+	N_("Clay"),
+	&CLAY_engine_init,
+	&CLAY_engine_free,
+	&CLAY_cache_init,
+	&CLAY_cache_populate,
+	&CLAY_cache_finish,
+	NULL,
+	&CLAY_draw_scene
+};
+
 RenderEngineType viewport_clay_type = {
 	NULL, NULL,
 	CLAY_ENGINE, N_("Clay"), RE_INTERNAL | RE_USE_OGL_PIPELINE,
-	NULL, NULL, NULL, NULL, &CLAY_view_draw, NULL, &CLAY_collection_settings_create,
+	NULL, NULL, NULL, NULL, NULL, NULL, &CLAY_collection_settings_create,
+	&draw_engine_clay_type,
 	{NULL, NULL, NULL}
 };
 
diff --git a/source/blender/draw/engines/clay/clay.h b/source/blender/draw/engines/clay/clay.h
index 34dd74b9500..1afe1ac5ea8 100644
--- a/source/blender/draw/engines/clay/clay.h
+++ b/source/blender/draw/engines/clay/clay.h
@@ -31,6 +31,4 @@ extern RenderEngineType viewport_clay_type;
 struct RenderEngineSettings *CLAY_render_settings_create(void);
 struct MaterialEngineSettings *CLAY_material_settings_create(void);
 
-void CLAY_engine_free(voi

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list