Commit: a864e84d96619d4505d1631e72df309f1a059296
Author: Campbell Barton
Date:   Wed Jun 8 05:39:22 2016 +1000
Branches: compositor-2016
https://developer.blender.org/rBa864e84d96619d4505d1631e72df309f1a059296

GPU: Fix triple buffer w/ basic glsl shader

Needed to add GL_TEXTURE_RECTANGLE support to basic-shader.

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

M       source/blender/gpu/GPU_basic_shader.h
M       source/blender/gpu/intern/gpu_basic_shader.c
M       source/blender/gpu/shaders/gpu_shader_basic_frag.glsl
M       source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/source/blender/gpu/GPU_basic_shader.h 
b/source/blender/gpu/GPU_basic_shader.h
index f30b40c..1e2db6a 100644
--- a/source/blender/gpu/GPU_basic_shader.h
+++ b/source/blender/gpu/GPU_basic_shader.h
@@ -46,11 +46,12 @@ typedef enum GPUBasicShaderOption {
        GPU_SHADER_LIGHTING =         (1 << 1),   /* use lighting */
        GPU_SHADER_TWO_SIDED =        (1 << 2),   /* flip normals towards 
viewer */
        GPU_SHADER_TEXTURE_2D =       (1 << 3),   /* use 2D texture to replace 
diffuse color */
+       GPU_SHADER_TEXTURE_RECT =     (1 << 4),   /* same as 
GPU_SHADER_TEXTURE_2D, for GL_TEXTURE_RECTANGLE */
 
-       GPU_SHADER_SOLID_LIGHTING =   (1 << 4),   /* use faster lighting (set 
automatically) */
-       GPU_SHADER_STIPPLE =          (1 << 5),   /* use stipple */
-       GPU_SHADER_LINE =             (1 << 6),   /* draw lines */
-       GPU_SHADER_OPTIONS_NUM = 7,
+       GPU_SHADER_SOLID_LIGHTING =   (1 << 5),   /* use faster lighting (set 
automatically) */
+       GPU_SHADER_STIPPLE =          (1 << 6),   /* use stipple */
+       GPU_SHADER_LINE =             (1 << 7),   /* draw lines */
+       GPU_SHADER_OPTIONS_NUM = 8,
        GPU_SHADER_OPTION_COMBINATIONS = (1 << GPU_SHADER_OPTIONS_NUM)
 } GPUBasicShaderOption;
 
diff --git a/source/blender/gpu/intern/gpu_basic_shader.c 
b/source/blender/gpu/intern/gpu_basic_shader.c
index e4ec57d..b066922 100644
--- a/source/blender/gpu/intern/gpu_basic_shader.c
+++ b/source/blender/gpu/intern/gpu_basic_shader.c
@@ -324,6 +324,9 @@ static int detect_options()
 
        if (glIsEnabled(GL_TEXTURE_2D))
                options |= GPU_SHADER_TEXTURE_2D;
+       if (glIsEnabled(GL_TEXTURE_RECTANGLE))
+               options |= GPU_SHADER_TEXTURE_RECT;
+       GPU_SHADER_TEXTURE_RECT
        if (glIsEnabled(GL_COLOR_MATERIAL))
                options |= GPU_SHADER_USE_COLOR;
 
@@ -363,8 +366,10 @@ static GPUShader *gpu_basic_shader(int options)
                        strcat(defines, "#define USE_COLOR\n");
                if (options & GPU_SHADER_TWO_SIDED)
                        strcat(defines, "#define USE_TWO_SIDED\n");
-               if (options & GPU_SHADER_TEXTURE_2D)
+               if (options & (GPU_SHADER_TEXTURE_2D | GPU_SHADER_TEXTURE_RECT))
                        strcat(defines, "#define USE_TEXTURE\n");
+               if (options & GPU_SHADER_TEXTURE_RECT)
+                       strcat(defines, "#define USE_TEXTURE_RECTANGLE\n");
                if (options & GPU_SHADER_STIPPLE)
                        strcat(defines, "#define USE_STIPPLE\n");
                if (options & GPU_SHADER_LINE) {
@@ -385,7 +390,7 @@ static GPUShader *gpu_basic_shader(int options)
                
                if (shader) {
                        /* set texture map to first texture unit */
-                       if (options & GPU_SHADER_TEXTURE_2D) {
+                       if (options & (GPU_SHADER_TEXTURE_2D | 
GPU_SHADER_TEXTURE_RECT)) {
                                GPU_shader_bind(shader);
                                glUniform1i(GPU_shader_get_uniform(shader, 
"texture_map"), 0);
                                GPU_shader_unbind();
@@ -415,6 +420,23 @@ void GPU_basic_shader_bind(int options)
 {
        if (USE_GLSL) {
                if (options) {
+                       const int bound_options = 
GPU_MATERIAL_STATE.bound_options;
+
+                       /* texture options need to be set for basic shader too 
*/
+                       if (options & GPU_SHADER_TEXTURE_2D) {
+                               glEnable(GL_TEXTURE_2D);
+                       }
+                       else if (bound_options & GPU_SHADER_TEXTURE_2D) {
+                               glDisable(GL_TEXTURE_2D);
+                       }
+
+                       if (options & GPU_SHADER_TEXTURE_RECT) {
+                               glEnable(GL_TEXTURE_RECTANGLE);
+                       }
+                       else if (bound_options & GPU_SHADER_TEXTURE_RECT) {
+                               glDisable(GL_TEXTURE_RECTANGLE);
+                       }
+
                        GPUShader *shader = gpu_basic_shader(options);
 
                        if (shader) {
@@ -427,7 +449,7 @@ void GPU_basic_shader_bind(int options)
                }
        }
        else {
-               int bound_options = GPU_MATERIAL_STATE.bound_options;
+               const int bound_options = GPU_MATERIAL_STATE.bound_options;
 
                if (options & GPU_SHADER_LIGHTING) {
                        glEnable(GL_LIGHTING);
@@ -454,10 +476,24 @@ void GPU_basic_shader_bind(int options)
                        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 
env_mode);
                }
                else if (bound_options & GPU_SHADER_TEXTURE_2D) {
-                       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 
GL_MODULATE);
+                       if ((options & GPU_SHADER_TEXTURE_RECT) == 0) {
+                               glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 
GL_MODULATE);
+                       }
                        glDisable(GL_TEXTURE_2D);
                }
 
+               if (options & GPU_SHADER_TEXTURE_RECT) {
+                       GLint env_mode = (options & (GPU_SHADER_USE_COLOR | 
GPU_SHADER_LIGHTING)) ? GL_MODULATE : GL_REPLACE;
+                       glEnable(GL_TEXTURE_RECTANGLE);
+                       glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 
env_mode);
+               }
+               else if (bound_options & GPU_SHADER_TEXTURE_RECT) {
+                       if ((options & GPU_SHADER_TEXTURE_2D) == 0) {
+                               glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, 
GL_MODULATE);
+                       }
+                       glDisable(GL_TEXTURE_RECTANGLE);
+               }
+
                if ((options & GPU_SHADER_LINE) && (options & 
GPU_SHADER_STIPPLE)) {
                        glEnable(GL_LINE_STIPPLE);
                }
diff --git a/source/blender/gpu/shaders/gpu_shader_basic_frag.glsl 
b/source/blender/gpu/shaders/gpu_shader_basic_frag.glsl
index 6b6679b..ea5f6ae 100644
--- a/source/blender/gpu/shaders/gpu_shader_basic_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_basic_frag.glsl
@@ -3,6 +3,7 @@
  *
  * USE_COLOR: use glColor for diffuse colors
  * USE_TEXTURE: use texture for diffuse colors
+ * USE_TEXTURE_RECTANGLE: use GL_TEXTURE_RECTANGLE instead of GL_TEXTURE_2D
  * USE_SCENE_LIGHTING: use lights (up to 8)
  * USE_SOLID_LIGHTING: assume 3 directional lights for solid draw mode
  * USE_TWO_SIDED: flip normal towards viewer
@@ -39,8 +40,16 @@ varying vec4 varying_vertex_color;
 #endif
 
 #ifdef USE_TEXTURE
+#ifdef USE_TEXTURE_RECTANGLE
+#define sampler2D_default sampler2DRect
+#define texture2D_default texture2DRect
+#else
+#define sampler2D_default sampler2D
+#define texture2D_default texture2D
+#endif
+
 varying vec2 varying_texture_coord;
-uniform sampler2D texture_map;
+uniform sampler2D_default texture_map;
 #endif
 
 #ifdef USE_STIPPLE
@@ -229,12 +238,12 @@ void main()
        float alpha;
 
 #if defined(USE_TEXTURE) && defined(USE_COLOR)
-       vec4 texture_color = texture2D(texture_map, varying_texture_coord);
+       vec4 texture_color = texture2D_default(texture_map, 
varying_texture_coord);
 
        L_diffuse *= texture_color.rgb * varying_vertex_color.rgb;
        alpha = texture_color.a * varying_vertex_color.a;
 #elif defined(USE_TEXTURE)
-       vec4 texture_color = texture2D(texture_map, varying_texture_coord);
+       vec4 texture_color = texture2D_default(texture_map, 
varying_texture_coord);
 
        L_diffuse *= texture_color.rgb;
        alpha = texture_color.a;
@@ -259,9 +268,9 @@ void main()
 
        /* no lighting */
 #if defined(USE_TEXTURE) && defined(USE_COLOR)
-       gl_FragColor = texture2D(texture_map, varying_texture_coord) * 
varying_vertex_color;
+       gl_FragColor = texture2D_default(texture_map, varying_texture_coord) * 
varying_vertex_color;
 #elif defined(USE_TEXTURE)
-       gl_FragColor = texture2D(texture_map, varying_texture_coord);
+       gl_FragColor = texture2D_default(texture_map, varying_texture_coord);
 #elif defined(USE_COLOR)
        gl_FragColor = varying_vertex_color;
 #else
diff --git a/source/blender/windowmanager/intern/wm_draw.c 
b/source/blender/windowmanager/intern/wm_draw.c
index 8f15d94..962ed3c 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -437,8 +437,6 @@ void wm_triple_draw_textures(wmWindow *win, wmDrawTriple 
*triple, float alpha)
 
        float halfx, halfy, ratiox, ratioy;
 
-       glEnable(triple->target);
-
        /* wmOrtho for the screen has this same offset */
        ratiox = sizex;
        ratioy = sizey;
@@ -453,6 +451,8 @@ void wm_triple_draw_textures(wmWindow *win, wmDrawTriple 
*triple, float alpha)
                halfy /= triple->y;
        }
 
+       GPU_basic_shader_bind((triple->target == GL_TEXTURE_2D) ? 
GPU_SHADER_TEXTURE_2D : GPU_SHADER_TEXTURE_RECT);
+
        glBindTexture(triple->target, triple->bind);
 
        glColor4f(1.0f, 1.0f, 1.0f, alpha);
@@ -471,7 +471,8 @@ void wm_triple_draw_textures(wmWindow *win, wmDrawTriple 
*triple, float alpha)
        glEnd();
 
        glBindTexture(triple->target, 0);
-       glDisable(triple->target);
+
+       GPU_basic_shader_bind(GPU_SHADER_USE_COLOR);
 }
 
 static void wm_triple_copy_textures(wmWindow *win, wmDrawTriple *triple)

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to