[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44793] branches/ge_harmony/source/blender /gpu: gpu_extensions cleanup:

Mitchell Stokes mogurijin at gmail.com
Sat Mar 10 20:55:37 CET 2012


Revision: 44793
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44793
Author:   moguri
Date:     2012-03-10 19:55:28 +0000 (Sat, 10 Mar 2012)
Log Message:
-----------
gpu_extensions cleanup:
  * GPU_texture_create_shadow_map() -> GPU_texture_create_vsm_shadow_map()
  * GPU_shader_free_builtin_shader() -> GPU_shader_free_builtin_shaders() (Now frees all shaders)
  * Better error reporting/checking for failed shader compiles
  * More comments plus a little code cleanup

Modified Paths:
--------------
    branches/ge_harmony/source/blender/gpu/GPU_extensions.h
    branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c
    branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c

Modified: branches/ge_harmony/source/blender/gpu/GPU_extensions.h
===================================================================
--- branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-03-10 17:49:26 UTC (rev 44792)
+++ branches/ge_harmony/source/blender/gpu/GPU_extensions.h	2012-03-10 19:55:28 UTC (rev 44793)
@@ -109,7 +109,7 @@
 GPUTexture *GPU_texture_create_2D(int w, int h, float *pixels, char err_out[256]);
 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, float *fpixels);
 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
-GPUTexture *GPU_texture_create_shadow_map(int size, char err_out[256]);
+GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256]);
 GPUTexture *GPU_texture_from_blender(struct Image *ima,
 	struct ImageUser *iuser, double time, int mipmap);
 void GPU_texture_free(GPUTexture *tex);
@@ -178,7 +178,7 @@
 } GPUBuiltinShader;
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);
-void GPU_shader_free_builtin_shader(GPUBuiltinShader shader);
+void GPU_shader_free_builtin_shaders();
 
 /* Vertex attributes for shaders */
 

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c	2012-03-10 17:49:26 UTC (rev 44792)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_codegen.c	2012-03-10 19:55:28 UTC (rev 44793)
@@ -258,8 +258,7 @@
 		FUNCTION_HASH = NULL;
 	}
 
-	GPU_shader_free_builtin_shader(GPU_SHADER_VSM_STORE);
-	GPU_shader_free_builtin_shader(GPU_SHADER_SEP_GAUSSIAN_BLUR);
+	GPU_shader_free_builtin_shaders();
 
 	if(glsl_material_library) {
 		MEM_freeN(glsl_material_library);

Modified: branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c
===================================================================
--- branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-03-10 17:49:26 UTC (rev 44792)
+++ branches/ge_harmony/source/blender/gpu/intern/gpu_extensions.c	2012-03-10 19:55:28 UTC (rev 44793)
@@ -87,7 +87,7 @@
 	GPUOSType os;
 	GPUDriverType driver;
 	GPUShaders shaders;
-} GG = {1, 0, 0, 0, 0, 0};
+} GG = {1, 0};
 
 /* GPU Types */
 
@@ -596,7 +596,10 @@
 	return tex;
 }
 
-GPUTexture *GPU_texture_create_shadow_map(int size, char err_out[256])
+/**
+ * A shadow map for VSM needs two components (depth and depth^2)
+ */
+GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256])
 {
 	GPUTexture *tex = GPU_texture_create_nD(size, size, 2, NULL, 0, err_out);
 
@@ -876,10 +879,18 @@
 	float scalev[2] = {0.0f, 1.0f/GPU_texture_opengl_height(tex)};
 
 	GPUShader *blur_shader = GPU_shader_get_builtin_shader(GPU_SHADER_SEP_GAUSSIAN_BLUR);
-	int scale_uniform = GPU_shader_get_uniform(blur_shader, "ScaleU");
-	int texture_source_uniform = GPU_shader_get_uniform(blur_shader, "textureSource");
+	int scale_uniform, texture_source_uniform;
+
+	if (!blur_shader)
+		return;
+
+	scale_uniform = GPU_shader_get_uniform(blur_shader, "ScaleU");
+	texture_source_uniform = GPU_shader_get_uniform(blur_shader, "textureSource");
 		
 	/* Blurring horizontally */
+
+	/* We do the bind ourselves rather than using GPU_framebuffer_texture_bind() to avoid
+	   pushing unnecessary matrices onto the OpenGL stack. */
 	glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, blurfb->object);
 
 	GPU_shader_bind(blur_shader);
@@ -1248,39 +1259,40 @@
 
 GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
 {
+	GPUShader *retval = NULL;
+
 	switch (shader)
 	{
 	case GPU_SHADER_VSM_STORE:
 		if (!GG.shaders.vsm_store)
 			GG.shaders.vsm_store = GPU_shader_create(datatoc_gpu_shader_vsm_store_vert_glsl, datatoc_gpu_shader_vsm_store_frag_glsl, NULL);
-		return GG.shaders.vsm_store;
+		retval = GG.shaders.vsm_store;
+		break;
 	case GPU_SHADER_SEP_GAUSSIAN_BLUR:
 		if (!GG.shaders.sep_gaussian_blur)
 			GG.shaders.sep_gaussian_blur = GPU_shader_create(datatoc_gpu_shader_sep_gaussian_blur_vert_glsl, datatoc_gpu_shader_sep_gaussian_blur_frag_glsl, NULL);
-		return GG.shaders.sep_gaussian_blur;
-	default:
-		return NULL;
+		retval = GG.shaders.sep_gaussian_blur;
+		break;
 	}
+
+	if (retval == NULL)
+		printf("Unable to create a GPUShader for builtin shader: %d\n", shader);
+
+	return retval;
 }
 
-void GPU_shader_free_builtin_shader(GPUBuiltinShader shader)
+void GPU_shader_free_builtin_shaders()
 {
-	GPUShader **s = NULL;
-	switch (shader)
+	if (GG.shaders.vsm_store)
 	{
-	case GPU_SHADER_VSM_STORE:
-		s = &GG.shaders.vsm_store;
-		break;
-	case GPU_SHADER_SEP_GAUSSIAN_BLUR:
-		s = &GG.shaders.sep_gaussian_blur;
-		break;
-	default:
-		s = NULL;
+		MEM_freeN(GG.shaders.vsm_store);
+		GG.shaders.vsm_store = NULL;
 	}
 
-	if (s) {
-		MEM_freeN(*s);
-		*s = NULL;
+	if (GG.shaders.sep_gaussian_blur)
+	{
+		MEM_freeN(GG.shaders.sep_gaussian_blur);
+		GG.shaders.sep_gaussian_blur = NULL;
 	}
 }
 




More information about the Bf-blender-cvs mailing list