[Bf-blender-cvs] [4acd218] master: GPU compositing:

Antony Riakiotakis noreply at git.blender.org
Mon Mar 21 22:53:42 CET 2016


Commit: 4acd218c0262f59edd2a0251d6c9530c8753349f
Author: Antony Riakiotakis
Date:   Mon Mar 21 00:53:48 2016 +0100
Branches: master
https://developer.blender.org/rB4acd218c0262f59edd2a0251d6c9530c8753349f

GPU compositing:

Minor optimization: Store the uniform interface of shaders instead of
re-querying every frame.

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

M	source/blender/gpu/GPU_compositing.h
M	source/blender/gpu/GPU_shader.h
M	source/blender/gpu/intern/gpu_compositing.c
M	source/blender/gpu/intern/gpu_shader.c

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

diff --git a/source/blender/gpu/GPU_compositing.h b/source/blender/gpu/GPU_compositing.h
index 892fe4f..d506d91 100644
--- a/source/blender/gpu/GPU_compositing.h
+++ b/source/blender/gpu/GPU_compositing.h
@@ -44,6 +44,7 @@ struct GPUOffScreen;
 struct GPUFXSettings;
 struct rcti;
 struct Scene;
+struct GPUShader;
 enum eGPUFXFlags;
 
 /**** Public API *****/
@@ -94,6 +95,10 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx);
 
 void GPU_fx_compositor_init_dof_settings(struct GPUDOFSettings *dof);
 void GPU_fx_compositor_init_ssao_settings(struct GPUSSAOSettings *ssao);
+
+
+/* initialize and cache the shader unform interface for effects */
+void GPU_fx_shader_init_interface(struct GPUShader *shader, GPUFXShaderEffect effect);
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h
index 0317976..4c674b4 100644
--- a/source/blender/gpu/GPU_shader.h
+++ b/source/blender/gpu/GPU_shader.h
@@ -69,6 +69,8 @@ void GPU_shader_free(GPUShader *shader);
 void GPU_shader_bind(GPUShader *shader);
 void GPU_shader_unbind(void);
 
+void *GPU_shader_get_interface(GPUShader *shader);
+void GPU_shader_set_interface(GPUShader *shader, void *interface);
 int GPU_shader_get_uniform(GPUShader *shader, const char *name);
 void GPU_shader_uniform_vector(GPUShader *shader, int location, int length,
 	int arraysize, const float *value);
diff --git a/source/blender/gpu/intern/gpu_compositing.c b/source/blender/gpu/intern/gpu_compositing.c
index 8516a2d..c22f3ed 100644
--- a/source/blender/gpu/intern/gpu_compositing.c
+++ b/source/blender/gpu/intern/gpu_compositing.c
@@ -58,6 +58,97 @@
 static const float fullscreencos[4][2] = {{-1.0f, -1.0f}, {1.0f, -1.0f}, {-1.0f, 1.0f}, {1.0f, 1.0f}};
 static const float fullscreenuvs[4][2] = {{0.0f, 0.0f}, {1.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}};
 
+
+/* shader interfaces (legacy GL 2 style, without uniform buffer objects) */
+
+typedef struct
+{
+	int ssao_uniform;
+	int ssao_color_uniform;
+	int color_uniform;
+	int depth_uniform;
+	int viewvecs_uniform;
+	int ssao_sample_params_uniform;
+	int ssao_concentric_tex;
+	int ssao_jitter_uniform;
+} GPUSSAOShaderInterface;
+
+typedef struct
+{
+	int invrendertargetdim_uniform;
+	int color_uniform;
+	int dof_uniform;
+	int depth_uniform;
+	int viewvecs_uniform;
+} GPUDOFHQPassOneInterface;
+
+typedef struct
+{
+	int rendertargetdim_uniform;
+	int color_uniform;
+	int coc_uniform;
+	int select_uniform;
+	int dof_uniform;
+} GPUDOFHQPassTwoInterface;
+
+typedef struct
+{
+	int dof_uniform;
+	int invrendertargetdim_uniform;
+	int color_uniform;
+	int far_uniform;
+	int near_uniform;
+	int viewvecs_uniform;
+	int depth_uniform;
+} GPUDOFHQPassThreeInterface;
+
+typedef struct
+{
+	int dof_uniform;
+	int invrendertargetdim_uniform;
+	int color_uniform;
+	int depth_uniform;
+	int viewvecs_uniform;
+} GPUDOFPassOneInterface;
+
+typedef struct
+{
+	int dof_uniform;
+	int invrendertargetdim_uniform;
+	int color_uniform;
+	int depth_uniform;
+	int viewvecs_uniform;
+} GPUDOFPassTwoInterface;
+
+typedef struct
+{
+	int near_coc_downsampled;
+	int near_coc_blurred;
+} GPUDOFPassThreeInterface;
+
+typedef struct
+{
+	int near_coc_downsampled;
+	int invrendertargetdim_uniform;
+} GPUDOFPassFourInterface;
+
+typedef struct
+{
+	int medium_blurred_uniform;
+	int high_blurred_uniform;
+	int dof_uniform;
+	int invrendertargetdim_uniform;
+	int original_uniform;
+	int depth_uniform;
+	int viewvecs_uniform;
+} GPUDOFPassFiveInterface;
+
+typedef struct
+{
+	int depth_uniform;
+} GPUDepthResolveInterface;
+
+
 struct GPUFX {
 	/* we borrow the term gbuffer from deferred rendering however this is just a regular
 	 * depth/color framebuffer. Could be extended later though */
@@ -618,15 +709,13 @@ void GPU_fx_compositor_XRay_resolve(GPUFX *fx)
 	depth_resolve_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_DEPTH_RESOLVE, false);
 
 	if (depth_resolve_shader) {
-		int depth_uniform;
-
-		depth_uniform = GPU_shader_get_uniform(depth_resolve_shader, "depthbuffer");
+		GPUDepthResolveInterface *interface = GPU_shader_get_interface(depth_resolve_shader);
 
 		GPU_shader_bind(depth_resolve_shader);
 
 		GPU_texture_bind(fx->depth_buffer_xray, 0);
 		GPU_texture_filter_mode(fx->depth_buffer_xray, false, true);
-		GPU_shader_uniform_texture(depth_resolve_shader, depth_uniform, fx->depth_buffer_xray);
+		GPU_shader_uniform_texture(depth_resolve_shader, interface->depth_uniform, fx->depth_buffer_xray);
 
 		/* draw */
 		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
@@ -724,9 +813,6 @@ bool GPU_fx_do_composite_pass(
 		ssao_shader = GPU_shader_get_builtin_fx_shader(GPU_SHADER_FX_SSAO, is_persp);
 		if (ssao_shader) {
 			const GPUSSAOSettings *fx_ssao = fx->settings.ssao;
-			int color_uniform, depth_uniform;
-			int ssao_uniform, ssao_color_uniform, viewvecs_uniform, ssao_sample_params_uniform;
-			int ssao_jitter_uniform, ssao_concentric_tex;
 			float ssao_params[4] = {fx_ssao->distance_max, fx_ssao->factor, fx_ssao->attenuation, 0.0f};
 			float sample_params[3];
 
@@ -737,34 +823,27 @@ bool GPU_fx_do_composite_pass(
 
 			ssao_params[3] = (passes_left == 1 && !ofs) ? dfdyfac[0] : dfdyfac[1];
 
-			ssao_uniform = GPU_shader_get_uniform(ssao_shader, "ssao_params");
-			ssao_color_uniform = GPU_shader_get_uniform(ssao_shader, "ssao_color");
-			color_uniform = GPU_shader_get_uniform(ssao_shader, "colorbuffer");
-			depth_uniform = GPU_shader_get_uniform(ssao_shader, "depthbuffer");
-			viewvecs_uniform = GPU_shader_get_uniform(ssao_shader, "viewvecs");
-			ssao_sample_params_uniform = GPU_shader_get_uniform(ssao_shader, "ssao_sample_params");
-			ssao_concentric_tex = GPU_shader_get_uniform(ssao_shader, "ssao_concentric_tex");
-			ssao_jitter_uniform = GPU_shader_get_uniform(ssao_shader, "jitter_tex");
+			GPUSSAOShaderInterface *interface = GPU_shader_get_interface(ssao_shader);
 
 			GPU_shader_bind(ssao_shader);
 
-			GPU_shader_uniform_vector(ssao_shader, ssao_uniform, 4, 1, ssao_params);
-			GPU_shader_uniform_vector(ssao_shader, ssao_color_uniform, 4, 1, fx_ssao->color);
-			GPU_shader_uniform_vector(ssao_shader, viewvecs_uniform, 4, 3, viewvecs[0]);
-			GPU_shader_uniform_vector(ssao_shader, ssao_sample_params_uniform, 3, 1, sample_params);
+			GPU_shader_uniform_vector(ssao_shader, interface->ssao_uniform, 4, 1, ssao_params);
+			GPU_shader_uniform_vector(ssao_shader, interface->ssao_color_uniform, 4, 1, fx_ssao->color);
+			GPU_shader_uniform_vector(ssao_shader, interface->viewvecs_uniform, 4, 3, viewvecs[0]);
+			GPU_shader_uniform_vector(ssao_shader, interface->ssao_sample_params_uniform, 3, 1, sample_params);
 
 			GPU_texture_bind(src, numslots++);
-			GPU_shader_uniform_texture(ssao_shader, color_uniform, src);
+			GPU_shader_uniform_texture(ssao_shader, interface->color_uniform, src);
 
 			GPU_texture_bind(fx->depth_buffer, numslots++);
 			GPU_texture_filter_mode(fx->depth_buffer, false, true);
-			GPU_shader_uniform_texture(ssao_shader, depth_uniform, fx->depth_buffer);
+			GPU_shader_uniform_texture(ssao_shader, interface->depth_uniform, fx->depth_buffer);
 
 			GPU_texture_bind(fx->jitter_buffer, numslots++);
-			GPU_shader_uniform_texture(ssao_shader, ssao_jitter_uniform, fx->jitter_buffer);
+			GPU_shader_uniform_texture(ssao_shader, interface->ssao_jitter_uniform, fx->jitter_buffer);
 
 			GPU_texture_bind(fx->ssao_spiral_samples_tex, numslots++);
-			GPU_shader_uniform_texture(ssao_shader, ssao_concentric_tex, fx->ssao_spiral_samples_tex);
+			GPU_shader_uniform_texture(ssao_shader, interface->ssao_concentric_tex, fx->ssao_spiral_samples_tex);
 
 			/* draw */
 			gpu_fx_bind_render_target(&passes_left, fx, ofs, target);
@@ -835,35 +914,26 @@ bool GPU_fx_do_composite_pass(
 
 			/* pass first, downsample the color buffer to near/far targets and calculate coc texture */
 			{
-				int depth_uniform, dof_uniform;
-				int viewvecs_uniform;
-				int invrendertargetdim_uniform, color_uniform;
-
 				float invrendertargetdim[2] = {1.0f / fx->dof_downsampled_w, 1.0f / fx->dof_downsampled_h};
 
-				invrendertargetdim_uniform = GPU_shader_get_uniform(dof_shader_pass1, "invrendertargetdim");
-				color_uniform = GPU_shader_get_uniform(dof_shader_pass1, "colorbuffer");
-				dof_uniform = GPU_shader_get_uniform(dof_shader_pass1, "dof_params");
-				invrendertargetdim_uniform = GPU_shader_get_uniform(dof_shader_pass1, "invrendertargetdim");
-				depth_uniform = GPU_shader_get_uniform(dof_shader_pass1, "depthbuffer");
-				viewvecs_uniform = GPU_shader_get_uniform(dof_shader_pass1, "viewvecs");
+				GPUDOFHQPassOneInterface *interface = GPU_shader_get_interface(dof_shader_pass1);
 
 				GPU_shader_bind(dof_shader_pass1);
 
-				GPU_shader_uniform_vector(dof_shader_pass1, dof_uniform, 4, 1, dof_params);
-				GPU_shader_uniform_vector(dof_shader_pass1, invrendertargetdim_uniform, 2, 1, invrendertargetdim);
-				GPU_shader_uniform_vector(dof_shader_pass1, viewvecs_uniform, 4, 3, viewvecs[0]);
+				GPU_shader_uniform_vector(dof_shader_pass1, interface->dof_uniform, 4, 1, dof_params);
+				GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
+				GPU_shader_uniform_vector(dof_shader_pass1, interface->viewvecs_uniform, 4, 3, viewvecs[0]);
 
-				GPU_shader_uniform_vector(dof_shader_pass1, invrendertargetdim_uniform, 2, 1, invrendertargetdim);
+				GPU_shader_uniform_vector(dof_shader_pass1, interface->invrendertargetdim_uniform, 2, 1, invrendertargetdim);
 
 				GPU_texture_bind(fx->depth_buffer, numslots++);
 				GPU_texture_filter_mode(fx->depth_buffer, false, false);
-				GPU_shader_uniform_texture(dof_shader_pass1, depth_uniform, fx->depth_buffer);
+				GPU_shader_uniform_texture(dof_shader_pass1, interface->depth_uniform, fx->depth_buffer);
 
 				GPU_texture_bind(src, numslots++);
 				/* disable filtering for the texture so custom downsample can do the right thing */
 				GPU_texture_filter_mode(src, false, false);
-				GPU_shader_uniform_texture(dof_shader_pass2, color_uniform, src);
+				GPU_shader_uniform_texture(dof_shader_pass2, interface->color_uniform, src);
 
 				/* target is the downsampled coc buffer */
 				GPU_framebuffer_texture_attach(fx->gbuffer, fx->dof_half_downsampled_near, 0, N

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list