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 <e...@anholt.net> --- glamor/glamor_gradient.c | 68 +++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 36 deletions(-) diff --git a/glamor/glamor_gradient.c b/glamor/glamor_gradient.c index 9ecaf03..9f6f1b1 100644 --- a/glamor/glamor_gradient.c +++ b/glamor/glamor_gradient.c @@ -42,14 +42,13 @@ #ifdef GLAMOR_GRADIENT_SHADER -static GLint -_glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count, - int use_array) +static const char * +_glamor_create_getcolor_fs_source(ScreenPtr screen, int stops_count, + int use_array) { glamor_screen_private *glamor_priv; char *gradient_fs = NULL; - GLint fs_getcolor_prog; #define gradient_fs_getcolor\ GLAMOR_DEFAULT_PRECISION\ @@ -181,17 +180,11 @@ _glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count, if (use_array) { XNFasprintf(&gradient_fs, gradient_fs_getcolor, stops_count, stops_count); - fs_getcolor_prog = - glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, gradient_fs); - free(gradient_fs); + return gradient_fs; } else { - fs_getcolor_prog = - glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, - gradient_fs_getcolor_no_array); + return XNFstrdup(gradient_fs_getcolor_no_array); } - - return fs_getcolor_prog; } static void @@ -203,7 +196,7 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, GLint gradient_prog = 0; char *gradient_fs = NULL; - GLint fs_main_prog, fs_getcolor_prog, vs_prog; + GLint fs_prog, vs_prog; const char *gradient_vs = GLAMOR_DEFAULT_PRECISION @@ -344,7 +337,10 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, " } else {\n"\ " gl_FragColor = get_color(stop_len);\n"\ " }\n"\ - "}\n" + "}\n"\ + "\n"\ + "%s\n" /* fs_getcolor_source */ + const char *fs_getcolor_source; 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); + fs_getcolor_source = + _glamor_create_getcolor_fs_source(screen, stops_count, + (stops_count > 0)); + XNFasprintf(&gradient_fs, gradient_radial_fs_template, 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); - fs_getcolor_prog = - _glamor_create_getcolor_fs_program(screen, stops_count, - (stops_count > 0)); - glAttachShader(gradient_prog, vs_prog); - glAttachShader(gradient_prog, fs_getcolor_prog); - glAttachShader(gradient_prog, fs_main_prog); + glAttachShader(gradient_prog, fs_prog); glDeleteShader(vs_prog); - glDeleteShader(fs_getcolor_prog); - glDeleteShader(fs_main_prog); + glDeleteShader(fs_prog); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position"); 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; GLint gradient_prog = 0; char *gradient_fs = NULL; - GLint fs_main_prog, fs_getcolor_prog, vs_prog; + GLint fs_prog, vs_prog; const char *gradient_vs = GLAMOR_DEFAULT_PRECISION @@ -559,7 +554,10 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, "{\n"\ " float stop_len = get_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); @@ -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); + fs_getcolor_source = + _glamor_create_getcolor_fs_source(screen, stops_count, stops_count > 0); + XNFasprintf(&gradient_fs, 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); - fs_getcolor_prog = - _glamor_create_getcolor_fs_program(screen, stops_count, - (stops_count > 0)); - glAttachShader(gradient_prog, vs_prog); - glAttachShader(gradient_prog, fs_getcolor_prog); - glAttachShader(gradient_prog, fs_main_prog); + glAttachShader(gradient_prog, fs_prog); glDeleteShader(vs_prog); - glDeleteShader(fs_getcolor_prog); - glDeleteShader(fs_main_prog); + glDeleteShader(fs_prog); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position"); glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord"); -- 1.9.rc1 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel