glamor: Fix linking of the gradient shaders on GLES2.

GLES2 sensibly doesn't allow you to attach multiple shaders for the
same stage to a single program.  This means we have to attach the
whole thing in one glShaderSource call.

Signed-off-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Eric Anholt 2013-12-27 13:21:21 -08:00
parent 76bd0f9949
commit 80cdbb20f9

View File

@ -42,14 +42,13 @@
#ifdef GLAMOR_GRADIENT_SHADER #ifdef GLAMOR_GRADIENT_SHADER
static GLint static const char *
_glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count, _glamor_create_getcolor_fs_source(ScreenPtr screen, int stops_count,
int use_array) int use_array)
{ {
glamor_screen_private *glamor_priv; glamor_screen_private *glamor_priv;
char *gradient_fs = NULL; char *gradient_fs = NULL;
GLint fs_getcolor_prog;
#define gradient_fs_getcolor\ #define gradient_fs_getcolor\
GLAMOR_DEFAULT_PRECISION\ GLAMOR_DEFAULT_PRECISION\
@ -181,17 +180,11 @@ _glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count,
if (use_array) { if (use_array) {
XNFasprintf(&gradient_fs, XNFasprintf(&gradient_fs,
gradient_fs_getcolor, stops_count, stops_count); gradient_fs_getcolor, stops_count, stops_count);
fs_getcolor_prog = return gradient_fs;
glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs);
free(gradient_fs);
} }
else { else {
fs_getcolor_prog = return XNFstrdup(gradient_fs_getcolor_no_array);
glamor_compile_glsl_prog(GL_FRAGMENT_SHADER,
gradient_fs_getcolor_no_array);
} }
return fs_getcolor_prog;
} }
static void static void
@ -203,7 +196,7 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count,
GLint gradient_prog = 0; GLint gradient_prog = 0;
char *gradient_fs = NULL; char *gradient_fs = NULL;
GLint fs_main_prog, fs_getcolor_prog, vs_prog; GLint fs_prog, vs_prog;
const char *gradient_vs = const char *gradient_vs =
GLAMOR_DEFAULT_PRECISION GLAMOR_DEFAULT_PRECISION
@ -344,7 +337,10 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count,
" } else {\n"\ " } else {\n"\
" gl_FragColor = get_color(stop_len);\n"\ " gl_FragColor = get_color(stop_len);\n"\
" }\n"\ " }\n"\
"}\n" "}\n"\
"\n"\
"%s\n" /* fs_getcolor_source */
const char *fs_getcolor_source;
glamor_priv = glamor_get_screen_private(screen); glamor_priv = glamor_get_screen_private(screen);
@ -364,25 +360,24 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count,
vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, gradient_vs); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, gradient_vs);
fs_getcolor_source =
_glamor_create_getcolor_fs_source(screen, stops_count,
(stops_count > 0));
XNFasprintf(&gradient_fs, XNFasprintf(&gradient_fs,
gradient_radial_fs_template, gradient_radial_fs_template,
PIXMAN_REPEAT_NONE, PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_NONE, PIXMAN_REPEAT_NORMAL,
PIXMAN_REPEAT_REFLECT); PIXMAN_REPEAT_REFLECT,
fs_getcolor_source);
fs_main_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs);
free(gradient_fs); free(gradient_fs);
fs_getcolor_prog =
_glamor_create_getcolor_fs_program(screen, stops_count,
(stops_count > 0));
glAttachShader(gradient_prog, vs_prog); glAttachShader(gradient_prog, vs_prog);
glAttachShader(gradient_prog, fs_getcolor_prog); glAttachShader(gradient_prog, fs_prog);
glAttachShader(gradient_prog, fs_main_prog);
glDeleteShader(vs_prog); glDeleteShader(vs_prog);
glDeleteShader(fs_getcolor_prog); glDeleteShader(fs_prog);
glDeleteShader(fs_main_prog);
glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position"); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position");
glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord"); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord");
@ -416,7 +411,7 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count,
int index = 0; int index = 0;
GLint gradient_prog = 0; GLint gradient_prog = 0;
char *gradient_fs = NULL; char *gradient_fs = NULL;
GLint fs_main_prog, fs_getcolor_prog, vs_prog; GLint fs_prog, vs_prog;
const char *gradient_vs = const char *gradient_vs =
GLAMOR_DEFAULT_PRECISION GLAMOR_DEFAULT_PRECISION
@ -559,7 +554,10 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count,
"{\n"\ "{\n"\
" float stop_len = get_stop_len();\n"\ " float stop_len = get_stop_len();\n"\
" gl_FragColor = get_color(stop_len);\n"\ " gl_FragColor = get_color(stop_len);\n"\
"}\n" "}\n"\
"\n"\
"%s" /* fs_getcolor_source */
const char *fs_getcolor_source;
glamor_priv = glamor_get_screen_private(screen); glamor_priv = glamor_get_screen_private(screen);
@ -578,23 +576,21 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count,
vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, gradient_vs); vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, gradient_vs);
fs_getcolor_source =
_glamor_create_getcolor_fs_source(screen, stops_count, stops_count > 0);
XNFasprintf(&gradient_fs, XNFasprintf(&gradient_fs,
gradient_fs_template, gradient_fs_template,
PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_REFLECT); PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_REFLECT,
fs_getcolor_source);
fs_main_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs); fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs);
free(gradient_fs); free(gradient_fs);
fs_getcolor_prog =
_glamor_create_getcolor_fs_program(screen, stops_count,
(stops_count > 0));
glAttachShader(gradient_prog, vs_prog); glAttachShader(gradient_prog, vs_prog);
glAttachShader(gradient_prog, fs_getcolor_prog); glAttachShader(gradient_prog, fs_prog);
glAttachShader(gradient_prog, fs_main_prog);
glDeleteShader(vs_prog); glDeleteShader(vs_prog);
glDeleteShader(fs_getcolor_prog); glDeleteShader(fs_prog);
glDeleteShader(fs_main_prog);
glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position"); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position");
glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord"); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord");