[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