[Bf-blender-cvs] [2e8cb8d8361] blender2.8: Draw Manager: Make use of texture reuse.

Clément Foucault noreply at git.blender.org
Tue May 16 21:31:03 CEST 2017


Commit: 2e8cb8d836167e82599414e4d5ff3d15b609fc12
Author: Clément Foucault
Date:   Tue May 16 03:03:58 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB2e8cb8d836167e82599414e4d5ff3d15b609fc12

Draw Manager: Make use of texture reuse.

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

M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/basic/basic_engine.h
M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/clay/clay_engine.h
M	source/blender/draw/engines/eevee/eevee_effects.c
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_lights.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_probes.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/object_mode.c

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

diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index e10eaaac128..64585604bbd 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -137,7 +137,7 @@ static void BASIC_engine_init(void *vedata)
 	if (DRW_state_is_fbo()) {
 		const float *viewport_size = DRW_viewport_size_get();
 		DRWFboTexture tex = {&txl->depth_dup, DRW_BUF_DEPTH_24, 0};
-		DRW_framebuffer_init(&fbl->dupli_depth,
+		DRW_framebuffer_init(&fbl->dupli_depth, &draw_engine_basic_type,
 		                     (int)viewport_size[0], (int)viewport_size[1],
 		                     &tex, 1);
 	}
diff --git a/source/blender/draw/engines/basic/basic_engine.h b/source/blender/draw/engines/basic/basic_engine.h
index 4fd559ca50a..0adf99835a2 100644
--- a/source/blender/draw/engines/basic/basic_engine.h
+++ b/source/blender/draw/engines/basic/basic_engine.h
@@ -26,6 +26,7 @@
 #ifndef __BASIC_ENGINE_H__
 #define __BASIC_ENGINE_H__
 
+extern DrawEngineType draw_engine_basic_type;
 extern RenderEngineType DRW_engine_viewport_basic_type;
 
 #endif /* __BASIC_ENGINE_H__ */
diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 8abf85a14cc..3d692c0b3d9 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -109,14 +109,6 @@ typedef struct CLAY_FramebufferList {
 	struct GPUFrameBuffer *dupli_depth;
 } CLAY_FramebufferList;
 
-typedef struct CLAY_TextureList {
-	/* default */
-	struct GPUTexture *color;
-	struct GPUTexture *depth;
-	/* engine specific */
-	struct GPUTexture *depth_dup;
-} CLAY_TextureList;
-
 typedef struct CLAY_PassList {
 	struct DRWPass *depth_pass;
 	struct DRWPass *depth_pass_cull;
@@ -127,7 +119,7 @@ typedef struct CLAY_PassList {
 typedef struct CLAY_Data {
 	void *engine_type;
 	CLAY_FramebufferList *fbl;
-	CLAY_TextureList *txl;
+	DRWViewportEmptyList *txl;
 	CLAY_PassList *psl;
 	CLAY_StorageList *stl;
 } CLAY_Data;
@@ -155,6 +147,10 @@ static struct {
 
 	/* Just a serie of int from 0 to MAX_CLAY_MAT-1 */
 	int ubo_mat_idxs[MAX_CLAY_MAT];
+	int hair_ubo_mat_idxs[MAX_CLAY_MAT];
+
+	/* engine specific */
+	struct GPUTexture *depth_dup;
 } e_data = {NULL}; /* Engine data */
 
 typedef struct CLAY_PrivateData {
@@ -281,7 +277,6 @@ static struct GPUTexture *create_jitter_texture(void)
 static void CLAY_engine_init(void *vedata)
 {
 	CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl;
-	CLAY_TextureList *txl = ((CLAY_Data *)vedata)->txl;
 	CLAY_FramebufferList *fbl = ((CLAY_Data *)vedata)->fbl;
 
 	/* Create Texture Array */
@@ -374,8 +369,8 @@ static void CLAY_engine_init(void *vedata)
 
 	if (DRW_state_is_fbo()) {
 		const float *viewport_size = DRW_viewport_size_get();
-		DRWFboTexture tex = {&txl->depth_dup, DRW_BUF_DEPTH_24, 0};
-		DRW_framebuffer_init(&fbl->dupli_depth,
+		DRWFboTexture tex = {&e_data.depth_dup, DRW_BUF_DEPTH_24, DRW_TEX_TEMP};
+		DRW_framebuffer_init(&fbl->dupli_depth, &draw_engine_clay_type,
 		                     (int)viewport_size[0], (int)viewport_size[1],
 		                     &tex, 1);
 	}
@@ -448,14 +443,12 @@ static void CLAY_engine_init(void *vedata)
 	}
 }
 
-static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *vedata, DRWPass *pass, int *material_id)
+static DRWShadingGroup *CLAY_shgroup_create(CLAY_Data *UNUSED(vedata), DRWPass *pass, int *material_id)
 {
-	CLAY_TextureList *txl = ((CLAY_Data *)vedata)->txl;
-
 	DRWShadingGroup *grp = DRW_shgroup_create(e_data.clay_sh, pass);
 
 	DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1);
-	DRW_shgroup_uniform_buffer(grp, "depthtex", &txl->depth_dup);
+	DRW_shgroup_uniform_buffer(grp, "depthtex", &e_data.depth_dup);
 	DRW_shgroup_uniform_texture(grp, "matcaps", e_data.matcap_array);
 	DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)e_data.winmat);
 	DRW_shgroup_uniform_vec4(grp, "viewvecs[0]", (float *)e_data.viewvecs, 3);
@@ -803,7 +796,16 @@ static void CLAY_draw_scene(void *vedata)
 	/* Pass 2 : Duplicate depth */
 	/* Unless we go for deferred shading we need this to avoid manual depth test and artifacts */
 	if (DRW_state_is_fbo()) {
+		/* attach temp textures */
+		DRW_framebuffer_texture_attach(fbl->dupli_depth, e_data.depth_dup, 0, 0);
+
 		DRW_framebuffer_blit(dfbl->default_fb, fbl->dupli_depth, true);
+
+		/* detach temp textures */
+		DRW_framebuffer_texture_detach(e_data.depth_dup);
+
+		/* restore default fb */
+		DRW_framebuffer_bind(dfbl->default_fb);
 	}
 
 	/* Pass 3 : Shading */
diff --git a/source/blender/draw/engines/clay/clay_engine.h b/source/blender/draw/engines/clay/clay_engine.h
index 9d07c6c217b..b7c9d00c9ae 100644
--- a/source/blender/draw/engines/clay/clay_engine.h
+++ b/source/blender/draw/engines/clay/clay_engine.h
@@ -26,6 +26,7 @@
 #ifndef __CLAY_ENGINE_H__
 #define __CLAY_ENGINE_H__
 
+extern DrawEngineType draw_engine_clay_type;
 extern RenderEngineType DRW_engine_viewport_clay_type;
 
 struct IDProperty;
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index d5e712601ad..0a86fc1afb4 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -229,7 +229,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 		effects->blit_texel_size[1] = 1.0f / (float)blitsize[1];
 
 		DRWFboTexture tex_blit = {&txl->bloom_blit, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
-		DRW_framebuffer_init(&fbl->bloom_blit_fb,
+		DRW_framebuffer_init(&fbl->bloom_blit_fb, &draw_engine_eevee_type,
 		                    (int)blitsize[0], (int)blitsize[1],
 		                    &tex_blit, 1);
 
@@ -264,7 +264,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			effects->downsamp_texel_size[i][1] = 1.0f / (float)texsize[1];
 
 			DRWFboTexture tex_bloom = {&txl->bloom_downsample[i], DRW_BUF_RGBA_16, DRW_TEX_FILTER};
-			DRW_framebuffer_init(&fbl->bloom_down_fb[i],
+			DRW_framebuffer_init(&fbl->bloom_down_fb[i], &draw_engine_eevee_type,
 			                    (int)texsize[0], (int)texsize[1],
 			                    &tex_bloom, 1);
 		}
@@ -277,7 +277,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			texsize[1] = MAX2(texsize[1], 2);
 
 			DRWFboTexture tex_bloom = {&txl->bloom_upsample[i], DRW_BUF_RGBA_16, DRW_TEX_FILTER};
-			DRW_framebuffer_init(&fbl->bloom_accum_fb[i],
+			DRW_framebuffer_init(&fbl->bloom_accum_fb[i], &draw_engine_eevee_type,
 			                    (int)texsize[0], (int)texsize[1],
 			                    &tex_bloom, 1);
 		}
@@ -302,13 +302,13 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			DRWFboTexture tex_down[3] = {{&txl->dof_down_near, DRW_BUF_RGBA_16, 0},
 			                             {&txl->dof_down_far, DRW_BUF_RGBA_16, 0},
 			                             {&txl->dof_coc, DRW_BUF_RG_16, 0}};
-			DRW_framebuffer_init(&fbl->dof_down_fb, buffer_size[0], buffer_size[1], tex_down, 3);
+			DRW_framebuffer_init(&fbl->dof_down_fb, &draw_engine_eevee_type, buffer_size[0], buffer_size[1], tex_down, 3);
 
 			DRWFboTexture tex_scatter_far = {&txl->dof_far_blur, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
-			DRW_framebuffer_init(&fbl->dof_scatter_far_fb, buffer_size[0], buffer_size[1], &tex_scatter_far, 1);
+			DRW_framebuffer_init(&fbl->dof_scatter_far_fb, &draw_engine_eevee_type, buffer_size[0], buffer_size[1], &tex_scatter_far, 1);
 
 			DRWFboTexture tex_scatter_near = {&txl->dof_near_blur, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
-			DRW_framebuffer_init(&fbl->dof_scatter_near_fb, buffer_size[0], buffer_size[1], &tex_scatter_near, 1);
+			DRW_framebuffer_init(&fbl->dof_scatter_near_fb, &draw_engine_eevee_type, buffer_size[0], buffer_size[1], &tex_scatter_near, 1);
 
 			/* Parameters */
 			/* TODO UI Options */
@@ -351,7 +351,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 		/* Ping Pong buffer */
 		DRWFboTexture tex = {&txl->color_post, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
 
-		DRW_framebuffer_init(&fbl->effect_fb,
+		DRW_framebuffer_init(&fbl->effect_fb, &draw_engine_eevee_type,
 		                    (int)viewport_size[0], (int)viewport_size[1],
 		                    &tex, 1);
 	}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 14dc4a0dbc0..7311ec5a459 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -166,7 +166,7 @@ static struct GPUTexture *create_ggx_lut_texture(int UNUSED(w), int UNUSED(h))
 	tex = DRW_texture_create_2D(w, h, DRW_TEX_RG_16, DRW_TEX_FILTER, (float *)texels);
 
 	DRWFboTexture tex_filter = {&tex, DRW_BUF_RG_16, DRW_TEX_FILTER};
-	DRW_framebuffer_init(&fb, w, h, &tex_filter, 1);
+	DRW_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1);
 
 	DRW_framebuffer_bind(fb);
 	DRW_draw_pass(pass);
@@ -215,7 +215,7 @@ static void EEVEE_engine_init(void *ved)
 	DRWFboTexture tex = {&txl->color, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
 
 	const float *viewport_size = DRW_viewport_size_get();
-	DRW_framebuffer_init(&fbl->main,
+	DRW_framebuffer_init(&fbl->main, &draw_engine_eevee_type,
 	                    (int)viewport_size[0], (int)viewport_size[1],
 	                    &tex, 1);
 
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index 15f0b6e99b2..bec3d8a047a 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -168,13 +168,13 @@ void EEVEE_lights_cache_finish(EEVEE_StorageList *stl, EEVEE_TextureList *txl, E
 	}
 
 	DRWFboTexture tex_cube = {&txl->shadow_depth_cube_pool, DRW_BUF_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
-	DRW_framebuffer_init(&fbl->shadow_cube_fb, 512, 512, &tex_cube, 1);
+	DRW_framebuffer_init(&fbl->shadow_cube_fb, &draw_engine_eevee_type, 512, 512, &tex_cube, 1);
 
 	DRWFboTexture tex_map = {&txl->shadow_depth_map_pool, DRW_BUF_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
-	DRW_framebuffer_init(&fbl->shadow_map_fb, 512, 512, &tex_map, 1);
+	DRW_framebuffer_init(&fbl->shadow_map_fb, &draw_engine_eevee_type, 512, 512, &tex_map, 1);
 
 	DRWFboTexture tex_cascade = {&txl->shadow

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list