[Bf-blender-cvs] [3169160a974] blender2.8: Workbench: TAA optimalization

Jeroen Bakker noreply at git.blender.org
Fri Jun 29 09:28:31 CEST 2018


Commit: 3169160a9741ff399059ce9900ac8cd503707b2f
Author: Jeroen Bakker
Date:   Fri Jun 29 09:22:50 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB3169160a9741ff399059ce9900ac8cd503707b2f

Workbench: TAA optimalization

First frame of the TAA is just a regular copy of the previous buffer. so
we write directly to the final buffer and skip the taa shader. We do
init the history buffer via blit so it will be initialized for the other
iterations.

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

M	source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
M	source/blender/draw/engines/workbench/workbench_effect_aa.c
M	source/blender/draw/engines/workbench/workbench_effect_taa.c
M	source/blender/draw/engines/workbench/workbench_private.h

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
index ee5a46ae7c8..1da1b2ad13c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
@@ -8,14 +8,7 @@ uniform float mixFactor;
 void main()
 {
 	ivec2 texel = ivec2(gl_FragCoord.xy);
-
 	vec4 color_buffer = texelFetch(colorBuffer, texel, 0);
-	if (mixFactor == 1.0)
-	{
-		colorOutput = color_buffer;
-	}
-	else {
-		vec4 history_buffer = texelFetch(historyBuffer, texel, 0);
-		colorOutput = mix(history_buffer, color_buffer, mixFactor);
-	}
+	vec4 history_buffer = texelFetch(historyBuffer, texel, 0);
+	colorOutput = mix(history_buffer, color_buffer, mixFactor);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_effect_aa.c b/source/blender/draw/engines/workbench/workbench_effect_aa.c
index 4f1ca7f561b..95a81649522 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_aa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_aa.c
@@ -61,11 +61,23 @@ void workbench_aa_draw_pass(WORKBENCH_Data *vedata, GPUTexture *tx)
 		DRW_draw_pass(psl->effect_aa_pass);
 	}
 	else if (TAA_ENABLED(wpd)) {
-		GPU_framebuffer_bind(fbl->effect_fb);
-		DRW_transform_to_display(tx);
-
-		GPU_framebuffer_bind(dfbl->color_only_fb);
-		workbench_taa_draw_pass(effect_info, psl->effect_aa_pass);
+		/*
+		 * when drawing the first TAA frame, we transform directly to the
+		 * color_only_fb as the TAA shader is just performing a direct copy.
+		 * the workbench_taa_draw_screen_end will fill the history buffer
+		 * for the other iterations.
+		 */
+		if (effect_info->jitter_index == 1)
+		{
+			GPU_framebuffer_bind(dfbl->color_only_fb);
+			DRW_transform_to_display(tx);
+		}
+		else {
+			GPU_framebuffer_bind(fbl->effect_fb);
+			DRW_transform_to_display(tx);
+			GPU_framebuffer_bind(dfbl->color_only_fb);
+			DRW_draw_pass(psl->effect_aa_pass);
+		}
 		workbench_taa_draw_scene_end(vedata);
 	}
 	else {
diff --git a/source/blender/draw/engines/workbench/workbench_effect_taa.c b/source/blender/draw/engines/workbench/workbench_effect_taa.c
index 43dfbd235b6..0b4cc0a4e5b 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_taa.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_taa.c
@@ -56,6 +56,7 @@ static void workbench_taa_jitter_init_order(float (*table)[2], int num)
 	/* move jitter table so that closest sample is in center */
 	for (int index = 0; index < num; index++) {
 		sub_v2_v2(table[index], table[closest_index]);
+		mul_v2_fl(table[index], 2.0f);
 	}
 
 	/* swap center sample to the start of the table */
@@ -104,7 +105,8 @@ int workbench_taa_calculate_num_iterations(WORKBENCH_Data *vedata)
 		{
 			result = 16;
 		}
-		else {
+		else
+		{
 			result = 32;
 		}
 	}
@@ -203,11 +205,12 @@ void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata)
 	WORKBENCH_EffectInfo *effect_info = stl->effects;
 	const float *viewport_size = DRW_viewport_size_get();
 	int num_samples = 8;
-	float (*samples)[2] = e_data.jitter_8;
+	float (*samples)[2];
 	float mix_factor;
 
 	num_samples = workbench_taa_calculate_num_iterations(vedata);
 	switch (num_samples) {
+		default:
 		case 8:
 			samples = e_data.jitter_8;
 			break;
@@ -215,7 +218,6 @@ void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata)
 			samples = e_data.jitter_16;
 			break;
 		case 32:
-		default:
 			samples = e_data.jitter_32;
 			break;
 	}
@@ -262,9 +264,9 @@ void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata)
 	 * default depth buffer
 	 */
 	const WORKBENCH_StorageList *stl = vedata->stl;
-	const WORKBENCH_EffectInfo *effect_info = stl->effects;
 	const WORKBENCH_FramebufferList *fbl = vedata->fbl;
 	const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+	WORKBENCH_EffectInfo *effect_info = stl->effects;
 
 	if (effect_info->jitter_index == 1) {
 		GPU_framebuffer_blit(dfbl->depth_only_fb, 0, fbl->depth_buffer_fb, 0, GPU_DEPTH_BIT);
@@ -276,11 +278,6 @@ void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata)
 	GPU_framebuffer_blit(dfbl->color_only_fb, 0, fbl->effect_taa_fb, 0, GPU_COLOR_BIT);
 
 	DRW_viewport_matrix_override_unset_all();
-}
-
-void workbench_taa_draw_pass(WORKBENCH_EffectInfo *effect_info, DRWPass *pass)
-{
-	DRW_draw_pass(pass);
 
 	copy_m4_m4(effect_info->last_mat, effect_info->curr_mat);
 	if (effect_info->jitter_index != 0) {
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index a1d829280ef..b240c0a5c3a 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -257,7 +257,6 @@ DRWPass *workbench_fxaa_create_pass(GPUTexture **color_buffer_tx);
 void workbench_taa_engine_init(WORKBENCH_Data *vedata);
 void workbench_taa_engine_free(void);
 DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx);
-void workbench_taa_draw_pass(WORKBENCH_EffectInfo *effect_info, /*WORKBENCH_PrivateData *wpd, , GPUFrameBuffer *fb, GPUTexture *tx, */DRWPass *effect_aa_pass);
 void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata);
 void workbench_taa_draw_scene_end(WORKBENCH_Data *vedata);
 void workbench_taa_view_updated(WORKBENCH_Data *vedata);



More information about the Bf-blender-cvs mailing list