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;
        }
 }
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to