[Bf-blender-cvs] [90aff807ab9] blender2.8: Draw Manager: Texture Memory usage improvement.

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


Commit: 90aff807ab9c3b75511f49e8e22daa39c76b9b8a
Author: Clément Foucault
Date:   Tue May 16 20:18:57 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB90aff807ab9c3b75511f49e8e22daa39c76b9b8a

Draw Manager: Texture Memory usage improvement.

-Use 11_11_10 buffers for hdr content.
-Eevee compositing share 1 buffer if bloom and DOF are both activated.
-Fix slowdown when resizing EEVEE viewport.
-Removed DRW_BUF_*** enums causing confusion.

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

M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/clay/clay_engine.c
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_probes.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/edit_curve_mode.c
M	source/blender/draw/modes/edit_lattice_mode.c
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/edit_metaball_mode.c
M	source/blender/draw/modes/edit_surface_mode.c
M	source/blender/draw/modes/edit_text_mode.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/paint_texture_mode.c
M	source/blender/draw/modes/particle_mode.c
M	source/blender/draw/modes/sculpt_mode.c
M	source/blender/gpu/GPU_texture.h
M	source/blender/gpu/intern/gpu_texture.c

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

diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c
index 64585604bbd..96eaf541cae 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -136,7 +136,7 @@ static void BASIC_engine_init(void *vedata)
 #ifdef USE_DEPTH
 	if (DRW_state_is_fbo()) {
 		const float *viewport_size = DRW_viewport_size_get();
-		DRWFboTexture tex = {&txl->depth_dup, DRW_BUF_DEPTH_24, 0};
+		DRWFboTexture tex = {&txl->depth_dup, DRW_TEX_DEPTH_24, 0};
 		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/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 3d692c0b3d9..ff0c37aa623 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -369,7 +369,7 @@ static void CLAY_engine_init(void *vedata)
 
 	if (DRW_state_is_fbo()) {
 		const float *viewport_size = DRW_viewport_size_get();
-		DRWFboTexture tex = {&e_data.depth_dup, DRW_BUF_DEPTH_24, DRW_TEX_TEMP};
+		DRWFboTexture tex = {&e_data.depth_dup, DRW_TEX_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);
diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 0a86fc1afb4..b19bbce801c 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -178,7 +178,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 
 	effects = stl->effects;
 
-	effects->enabled_effects = 0;
+	int enabled_effects = 0;
 
 #if ENABLE_EFFECT_MOTION_BLUR
 	if (BKE_collection_engine_property_value_get_bool(props, "motion_blur_enable")) {
@@ -207,7 +207,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 				invert_m4(effects->current_ndc_to_world);
 
 				effects->motion_blur_samples = BKE_collection_engine_property_value_get_int(props, "motion_blur_samples");
-				effects->enabled_effects |= EFFECT_MOTION_BLUR;
+				enabled_effects |= EFFECT_MOTION_BLUR;
 			}
 		}
 	}
@@ -228,7 +228,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 		effects->blit_texel_size[0] = 1.0f / (float)blitsize[0];
 		effects->blit_texel_size[1] = 1.0f / (float)blitsize[1];
 
-		DRWFboTexture tex_blit = {&txl->bloom_blit, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+		DRWFboTexture tex_blit = {&txl->bloom_blit, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
 		DRW_framebuffer_init(&fbl->bloom_blit_fb, &draw_engine_eevee_type,
 		                    (int)blitsize[0], (int)blitsize[1],
 		                    &tex_blit, 1);
@@ -263,7 +263,7 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			effects->downsamp_texel_size[i][0] = 1.0f / (float)texsize[0];
 			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};
+			DRWFboTexture tex_bloom = {&txl->bloom_downsample[i], DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
 			DRW_framebuffer_init(&fbl->bloom_down_fb[i], &draw_engine_eevee_type,
 			                    (int)texsize[0], (int)texsize[1],
 			                    &tex_bloom, 1);
@@ -276,13 +276,13 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			texsize[0] = MAX2(texsize[0], 2);
 			texsize[1] = MAX2(texsize[1], 2);
 
-			DRWFboTexture tex_bloom = {&txl->bloom_upsample[i], DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+			DRWFboTexture tex_bloom = {&txl->bloom_upsample[i], DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
 			DRW_framebuffer_init(&fbl->bloom_accum_fb[i], &draw_engine_eevee_type,
 			                    (int)texsize[0], (int)texsize[1],
 			                    &tex_bloom, 1);
 		}
 
-		effects->enabled_effects |= EFFECT_BLOOM;
+		enabled_effects |= EFFECT_BLOOM;
 	}
 #endif /* ENABLE_EFFECT_BLOOM */
 
@@ -298,16 +298,31 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 
 			int buffer_size[2] = {(int)viewport_size[0] / 2, (int)viewport_size[1] / 2};
 
+			struct GPUTexture **dof_down_near = &txl->dof_down_near;
+
+			/* Reuse buffer from Bloom if available */
+			/* WATCH IT : must have the same size */
+			if ((enabled_effects & EFFECT_BLOOM) != 0) {
+				dof_down_near = &txl->bloom_downsample[0]; /* should always exists */
+			}
+			else if ((effects->enabled_effects & EFFECT_BLOOM) != 0) {
+				/* if framebuffer was configured to share buffer with bloom last frame */
+				if (fbl->dof_down_fb != NULL) {
+					DRW_framebuffer_free(fbl->dof_down_fb);
+					fbl->dof_down_fb = NULL;
+				}
+			}
+
 			/* Setup buffers */
-			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}};
+			DRWFboTexture tex_down[3] = {{dof_down_near, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER}, /* filter to not interfeer with bloom */
+			                             {&txl->dof_down_far, DRW_TEX_RGB_11_11_10, 0},
+			                             {&txl->dof_coc, DRW_TEX_RG_16, 0}};
 			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};
+			DRWFboTexture tex_scatter_far = {&txl->dof_far_blur, DRW_TEX_RGBA_16, DRW_TEX_FILTER};
 			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};
+			DRWFboTexture tex_scatter_near = {&txl->dof_near_blur, DRW_TEX_RGBA_16, DRW_TEX_FILTER};
 			DRW_framebuffer_init(&fbl->dof_scatter_near_fb, &draw_engine_eevee_type, buffer_size[0], buffer_size[1], &tex_scatter_near, 1);
 
 			/* Parameters */
@@ -341,15 +356,17 @@ void EEVEE_effects_init(EEVEE_Data *vedata)
 			effects->dof_bokeh[2] = ratio;
 			effects->dof_bokeh[3] = BKE_collection_engine_property_value_get_float(props, "bokeh_max_size");
 
-			effects->enabled_effects |= EFFECT_DOF;
+			enabled_effects |= EFFECT_DOF;
 		}
 	}
 #endif /* ENABLE_EFFECT_DOF */
 
+	effects->enabled_effects = enabled_effects;
+
 	/* Only allocate if at least one effect is activated */
 	if (effects->enabled_effects != 0) {
 		/* Ping Pong buffer */
-		DRWFboTexture tex = {&txl->color_post, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+		DRWFboTexture tex = {&txl->color_post, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
 
 		DRW_framebuffer_init(&fbl->effect_fb, &draw_engine_eevee_type,
 		                    (int)viewport_size[0], (int)viewport_size[1],
@@ -538,7 +555,13 @@ void EEVEE_draw_effects(EEVEE_Data *vedata)
 		DRW_draw_pass(psl->dof_scatter);
 
 		/* Scatter Near */
-		effects->unf_source_buffer = txl->dof_down_near;
+		if ((effects->enabled_effects & EFFECT_BLOOM) != 0) {
+			/* Reuse bloom half res buffer */
+			effects->unf_source_buffer = txl->bloom_downsample[0];
+		}
+		else {
+			effects->unf_source_buffer = txl->dof_down_near;
+		}
 		copy_v2_fl2(effects->dof_layer_select, 1.0f, 0.0f);
 		DRW_framebuffer_bind(fbl->dof_scatter_near_fb);
 		DRW_framebuffer_clear(true, false, false, clear_col, 0.0f);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 7311ec5a459..9b4a7a15630 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -165,7 +165,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};
+	DRWFboTexture tex_filter = {&tex, DRW_TEX_RG_16, DRW_TEX_FILTER};
 	DRW_framebuffer_init(&fb, &draw_engine_eevee_type, w, h, &tex_filter, 1);
 
 	DRW_framebuffer_bind(fb);
@@ -212,7 +212,7 @@ static void EEVEE_engine_init(void *ved)
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_StorageList *stl = vedata->stl;
 
-	DRWFboTexture tex = {&txl->color, DRW_BUF_RGBA_16, DRW_TEX_FILTER};
+	DRWFboTexture tex = {&txl->color, DRW_TEX_RGB_11_11_10, DRW_TEX_FILTER};
 
 	const float *viewport_size = DRW_viewport_size_get();
 	DRW_framebuffer_init(&fbl->main, &draw_engine_eevee_type,
diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c
index bec3d8a047a..aeeb25ca1c0 100644
--- a/source/blender/draw/engines/eevee/eevee_lights.c
+++ b/source/blender/draw/engines/eevee/eevee_lights.c
@@ -167,13 +167,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};
+	DRWFboTexture tex_cube = {&txl->shadow_depth_cube_pool, DRW_TEX_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
 	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};
+	DRWFboTexture tex_map = {&txl->shadow_depth_map_pool, DRW_TEX_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
 	DRW_framebuffer_init(&fbl->shadow_map_fb, &draw_engine_eevee_type, 512, 512, &tex_map, 1);
 
-	DRWFboTexture tex_cascade = {&txl->shadow_depth_cascade_pool, DRW_BUF_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
+	DRWFboTexture tex_cascade = {&txl->shadow_depth_cascade_pool, DRW_TEX_DEPTH_24, DRW_TEX_FILTER | DRW_TEX_COMPARE};
 	DRW_framebuffer_init(&fbl->shadow_cascade_fb, &draw_engine_eevee_type, 512, 512, &tex_cascade, 1);
 }
 
diff --git a/source/blender/draw/engines/eevee/eevee_probes.c b/source/blender/draw/engines/eevee/eevee_probes.c
index b3ca21d17cc..8a97373f9e4 100644
--- a/source/blender/draw/engines/eevee/eevee_probes.c
+++ b/source/blender/draw/engines/eevee/eevee_probes.c
@@ -54,53 +54,26 @@ void EEVEE_probes_init(EEVEE_Data *vedata)
 	}
 
 	if (!txl->probe_rt) {
-		float *test_tex;
-		const float fac

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list