Mesa (master): _mesa_meta_GenerateMipmap: Generate separate shaders for glsl 120 / 130

Anuj Phogat aphogat at kemper.freedesktop.org
Fri Sep 14 18:25:17 UTC 2012


Module: Mesa
Branch: master
Commit: 15bf3103b48a5928321fe56fbb3ed28a0f314418
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=15bf3103b48a5928321fe56fbb3ed28a0f314418

Author: Anuj Phogat <anuj.phogat at gmail.com>
Date:   Tue Sep 11 17:32:49 2012 -0700

_mesa_meta_GenerateMipmap: Generate separate shaders for glsl 120 / 130

glsl version of _mesa_meta_GenerateMipmap() would require separate
shaders for glsl 120 and 130.

V2: Removed the code for integer textures as ARB is planning to
    disallow automatic mipmap generation for integer textures.

NOTE: This is a candidate for stable branches.

Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
Reviewed-by: Brian Paul <brianp at vmware.com>

---

 src/mesa/drivers/common/meta.c |   78 +++++++++++++++++++++++++++++----------
 1 files changed, 58 insertions(+), 20 deletions(-)

diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c
index 08b4c5a..3d8e138 100644
--- a/src/mesa/drivers/common/meta.c
+++ b/src/mesa/drivers/common/meta.c
@@ -3066,24 +3066,9 @@ setup_glsl_generate_mipmap(struct gl_context *ctx,
       GLfloat x, y, tex[3];
    };
    struct glsl_sampler sampler;
+   const char *vs_source;
+   const char *fs_template;
 
-   static const char *vs_source =
-      "attribute vec2 position;\n"
-      "attribute vec3 textureCoords;\n"
-      "varying vec3 texCoords;\n"
-      "void main()\n"
-      "{\n"
-      "   texCoords = textureCoords;\n"
-      "   gl_Position = vec4(position, 0.0, 1.0);\n"
-      "}\n";
-   static const char *fs_template =
-      "uniform %s texSampler;\n"
-      "varying vec3 texCoords;\n"
-      "void main()\n"
-      "{\n"
-      "   gl_FragColor = %s(texSampler, %s);\n"
-      "}\n";
- 
    static const char *vs_int_source =
       "#version 130\n"
       "in vec2 position;\n"
@@ -3105,8 +3090,50 @@ setup_glsl_generate_mipmap(struct gl_context *ctx,
       "   out_color = texture(tex2d, texCoords.xy);\n"
       "}\n";
    char *fs_source;
+   const char *extension_mode;
    GLuint vs, fs;
 
+   if (ctx->Const.GLSLVersion < 130) {
+      vs_source =
+         "attribute vec2 position;\n"
+         "attribute vec3 textureCoords;\n"
+         "varying vec3 texCoords;\n"
+         "void main()\n"
+         "{\n"
+         "   texCoords = textureCoords;\n"
+         "   gl_Position = vec4(position, 0.0, 1.0);\n"
+         "}\n";
+      fs_template =
+         "#extension GL_EXT_texture_array : %s\n"
+         "uniform %s texSampler;\n"
+         "varying vec3 texCoords;\n"
+         "void main()\n"
+         "{\n"
+         "   gl_FragColor = %s(texSampler, %s);\n"
+         "}\n";
+   } else {
+      vs_source =
+         "#version 130\n"
+         "in vec2 position;\n"
+         "in vec3 textureCoords;\n"
+         "out vec3 texCoords;\n"
+         "void main()\n"
+         "{\n"
+         "   texCoords = textureCoords;\n"
+         "   gl_Position = vec4(position, 0.0, 1.0);\n"
+         "}\n";
+      fs_template =
+         "#version 130\n"
+         "uniform %s texSampler;\n"
+         "in vec3 texCoords;\n"
+         "out %s out_color;\n"
+         "\n"
+         "void main()\n"
+         "{\n"
+         "   out_color = texture(texSampler, %s);\n"
+         "}\n";
+    }
+
    /* Check if already initialized */
    if (mipmap->ArrayObj != 0)
       return;
@@ -3128,9 +3155,20 @@ setup_glsl_generate_mipmap(struct gl_context *ctx,
    setup_texture_sampler(target, &sampler);
    mem_ctx = ralloc_context(NULL);
 
-   fs_source = ralloc_asprintf(mem_ctx, fs_template,
-                               sampler.type, sampler.func,
-                               sampler.texcoords);
+   if (ctx->Const.GLSLVersion < 130) {
+      extension_mode = ((target == GL_TEXTURE_1D_ARRAY) ||
+                        (target == GL_TEXTURE_2D_ARRAY)) ?
+                       "require" : "disable";
+
+      fs_source = ralloc_asprintf(mem_ctx, fs_template,
+                                  extension_mode, sampler.type,
+                                  sampler.func, sampler.texcoords);
+   }
+   else {
+      fs_source = ralloc_asprintf(mem_ctx, fs_template,
+                                  sampler.type, "vec4",
+                                  sampler.texcoords);
+   }
 
    vs = compile_shader_with_debug(ctx, GL_VERTEX_SHADER, vs_source);
    fs = compile_shader_with_debug(ctx, GL_FRAGMENT_SHADER, fs_source);




More information about the mesa-commit mailing list