_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@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Anuj Phogat 2012-09-11 17:32:49 -07:00
parent 299acac849
commit 15bf3103b4

View file

@ -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);