Exemple #1
0
void
glamor_init_solid_shader(ScreenPtr screen)
{
    glamor_screen_private *glamor_priv;
    const char *solid_vs =
        "attribute vec4 v_position;"
        "void main()\n"
        "{\n"
        "       gl_Position = v_position;\n"
        "}\n";
    const char *solid_fs =
        GLAMOR_DEFAULT_PRECISION
        "uniform vec4 color;\n"
        "void main()\n"
        "{\n"
        "	gl_FragColor = color;\n"
        "}\n";
    GLint fs_prog, vs_prog;

    glamor_priv = glamor_get_screen_private(screen);
    glamor_get_context(glamor_priv);
    glamor_priv->solid_prog = glCreateProgram();
    vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, solid_vs);
    fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, solid_fs);
    glAttachShader(glamor_priv->solid_prog, vs_prog);
    glAttachShader(glamor_priv->solid_prog, fs_prog);

    glBindAttribLocation(glamor_priv->solid_prog,
                         GLAMOR_VERTEX_POS, "v_position");
    glamor_link_glsl_prog(glamor_priv->solid_prog);

    glamor_priv->solid_color_uniform_location =
        glGetUniformLocation(glamor_priv->solid_prog, "color");
    glamor_put_context(glamor_priv);
}
Exemple #2
0
void
glamor_init_putimage_shaders(ScreenPtr screen)
{
#if 0
	glamor_screen_private *glamor_priv =
	    glamor_get_screen_private(screen);
	const char *xybitmap_vs =
	    "uniform float x_bias;\n" "uniform float x_scale;\n"
	    "uniform float y_bias;\n" "uniform float y_scale;\n"
	    "varying vec2 bitmap_coords;\n" "void main()\n" "{\n"
	    "	gl_Position = vec4((gl_Vertex.x + x_bias) * x_scale,\n"
	    "			   (gl_Vertex.y + y_bias) * y_scale,\n"
	    "			   0,\n"
	    "			   1);\n"
	    "	bitmap_coords = gl_MultiTexCoord0.xy;\n" "}\n";
	const char *xybitmap_fs =
	    "uniform vec4 fg, bg;\n" "varying vec2 bitmap_coords;\n"
	    "uniform sampler2D bitmap_sampler;\n" "void main()\n" "{\n"
	    "	float bitmap_value = texture2D(bitmap_sampler,\n"
	    "				       bitmap_coords).x;\n"
	    "	gl_FragColor = mix(bg, fg, bitmap_value);\n" "}\n";
	GLint fs_prog, vs_prog, prog;
	GLint sampler_uniform_location;

	if (!GLEW_ARB_fragment_shader)
		return;

	prog = dispatch->glCreateProgram();
	vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, xybitmap_vs);
	fs_prog =
	    glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, xybitmap_fs);
	dispatch->glAttachShader(prog, vs_prog);
	dispatch->glAttachShader(prog, fs_prog);
	glamor_link_glsl_prog(prog);

	dispatch->glUseProgram(prog);
	sampler_uniform_location =
	    dispatch->glGetUniformLocation(prog, "bitmap_sampler");
	dispatch->glUniform1i(sampler_uniform_location, 0);

	glamor_priv->put_image_xybitmap_fg_uniform_location =
	    dispatch->glGetUniformLocation(prog, "fg");
	glamor_priv->put_image_xybitmap_bg_uniform_location =
	    dispatch->glGetUniformLocation(prog, "bg");
	glamor_get_transform_uniform_locations(prog,
					       &glamor_priv->put_image_xybitmap_transform);
	glamor_priv->put_image_xybitmap_prog = prog;
	dispatch->glUseProgram(0);
#endif
}
Exemple #3
0
void
glamor_init_tile_shader(ScreenPtr screen)
{
    glamor_screen_private *glamor_priv;
    const char *tile_vs =
        "attribute vec4 v_position;\n"
        "attribute vec4 v_texcoord0;\n"
        "varying vec2 tile_texture;\n"
        "void main()\n"
        "{\n"
        "       gl_Position = v_position;\n"
        "       tile_texture = v_texcoord0.xy;\n"
        "}\n";
    const char *tile_fs =
        GLAMOR_DEFAULT_PRECISION
        "varying vec2 tile_texture;\n"
        "uniform sampler2D sampler;\n"
        "uniform vec2	wh;"
        "void main()\n"
        "{\n"
        "   vec2 rel_tex;"
        "   rel_tex = tile_texture * wh; \n"
        "   rel_tex = floor(rel_tex) + (fract(rel_tex) / wh); \n"
        "	gl_FragColor = texture2D(sampler, rel_tex);\n"
        "}\n";
    GLint fs_prog, vs_prog;
    GLint sampler_uniform_location;

    glamor_priv = glamor_get_screen_private(screen);
    glamor_make_current(glamor_priv);
    glamor_priv->tile_prog = glCreateProgram();
    vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, tile_vs);
    fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, tile_fs);
    glAttachShader(glamor_priv->tile_prog, vs_prog);
    glAttachShader(glamor_priv->tile_prog, fs_prog);

    glBindAttribLocation(glamor_priv->tile_prog,
                         GLAMOR_VERTEX_POS, "v_position");
    glBindAttribLocation(glamor_priv->tile_prog,
                         GLAMOR_VERTEX_SOURCE, "v_texcoord0");
    glamor_link_glsl_prog(screen, glamor_priv->tile_prog, "tile");

    sampler_uniform_location =
        glGetUniformLocation(glamor_priv->tile_prog, "sampler");
    glUseProgram(glamor_priv->tile_prog);
    glUniform1i(sampler_uniform_location, 0);

    glamor_priv->tile_wh =
        glGetUniformLocation(glamor_priv->tile_prog, "wh");
}
Exemple #4
0
void
glamor_init_finish_access_shaders(ScreenPtr screen)
{
    glamor_screen_private *glamor_priv;
    const char *vs_source =
        "attribute vec4 v_position;\n"
        "attribute vec4 v_texcoord0;\n"
        "varying vec2 source_texture;\n"
        "void main()\n"
        "{\n"
        "	gl_Position = v_position;\n"
        "	source_texture = v_texcoord0.xy;\n"
        "}\n";

    const char *common_source =
        GLAMOR_DEFAULT_PRECISION
        "varying vec2 source_texture;\n"
        "uniform sampler2D sampler;\n"
        "uniform int revert;\n"
        "uniform int swap_rb;\n"
        "#define REVERT_NONE       			0\n"
        "#define REVERT_NORMAL     			1\n"
        "#define SWAP_NONE_DOWNLOADING  		0\n"
        "#define SWAP_DOWNLOADING  			1\n"
        "#define SWAP_UPLOADING	  		2\n"
        "#define SWAP_NONE_UPLOADING		3\n";

    const char *fs_source =
        "void main()\n"
        "{\n"
        "   if (revert == REVERT_NONE) \n"
        "    { \n"
        "     if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING))   \n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).bgra;\n"
        "     else \n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).rgba;\n"
        "    } \n"
        "   else \n"
        "    { \n"
        "     if (swap_rb == SWAP_DOWNLOADING)   \n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).argb;\n"
        "     else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
        "     else if (swap_rb == SWAP_UPLOADING)\n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).gbar;\n"
        "     else if (swap_rb == SWAP_NONE_UPLOADING)\n"
        "	  	gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
        "    } \n"
        "}\n";

    const char *set_alpha_source =
        "void main()\n"
        "{\n"
        "   if (revert == REVERT_NONE) \n"
        "    { \n"
        "     if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING))   \n"
        "	  	gl_FragColor = vec4(texture2D(sampler, source_texture).bgr, 1);\n"
        "     else \n"
        "	  	gl_FragColor = vec4(texture2D(sampler, source_texture).rgb, 1);\n"
        "    } \n"
        "   else \n"
        "    { \n"
        "     if (swap_rb == SWAP_DOWNLOADING)   \n"
        "	  	gl_FragColor = vec4(1, texture2D(sampler, source_texture).rgb);\n"
        "     else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
        "	  	gl_FragColor = vec4(1, texture2D(sampler, source_texture).bgr);\n"
        "     else if (swap_rb == SWAP_UPLOADING)\n"
        "	  	gl_FragColor = vec4(texture2D(sampler, source_texture).gba, 1);\n"
        "     else if (swap_rb == SWAP_NONE_UPLOADING)\n"
        "	  	gl_FragColor = vec4(texture2D(sampler, source_texture).abg, 1);\n"
        "    } \n"
        "}\n";
    GLint fs_prog, vs_prog, avs_prog, set_alpha_prog;
    GLint sampler_uniform_location;
    char *source;

    glamor_priv = glamor_get_screen_private(screen);
    glamor_get_context(glamor_priv);
    glamor_priv->finish_access_prog[0] = glCreateProgram();
    glamor_priv->finish_access_prog[1] = glCreateProgram();

    vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, vs_source);

    XNFasprintf(&source, "%s%s", common_source, fs_source);
    fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, source);
    free(source);

    glAttachShader(glamor_priv->finish_access_prog[0], vs_prog);
    glAttachShader(glamor_priv->finish_access_prog[0], fs_prog);

    avs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, vs_source);

    XNFasprintf(&source, "%s%s", common_source, set_alpha_source);
    set_alpha_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER,
                                              source);
    free(source);

    glAttachShader(glamor_priv->finish_access_prog[1], avs_prog);
    glAttachShader(glamor_priv->finish_access_prog[1], set_alpha_prog);

    glBindAttribLocation(glamor_priv->finish_access_prog[0],
                         GLAMOR_VERTEX_POS, "v_position");
    glBindAttribLocation(glamor_priv->finish_access_prog[0],
                         GLAMOR_VERTEX_SOURCE, "v_texcoord0");
    glamor_link_glsl_prog(glamor_priv->finish_access_prog[0]);

    glBindAttribLocation(glamor_priv->finish_access_prog[1],
                         GLAMOR_VERTEX_POS, "v_position");
    glBindAttribLocation(glamor_priv->finish_access_prog[1],
                         GLAMOR_VERTEX_SOURCE, "v_texcoord0");
    glamor_link_glsl_prog(glamor_priv->finish_access_prog[1]);

    glamor_priv->finish_access_revert[0] =
        glGetUniformLocation(glamor_priv->finish_access_prog[0], "revert");

    glamor_priv->finish_access_swap_rb[0] =
        glGetUniformLocation(glamor_priv->finish_access_prog[0], "swap_rb");
    sampler_uniform_location =
        glGetUniformLocation(glamor_priv->finish_access_prog[0], "sampler");
    glUseProgram(glamor_priv->finish_access_prog[0]);
    glUniform1i(sampler_uniform_location, 0);
    glUniform1i(glamor_priv->finish_access_revert[0], 0);
    glUniform1i(glamor_priv->finish_access_swap_rb[0], 0);
    glUseProgram(0);

    glamor_priv->finish_access_revert[1] =
        glGetUniformLocation(glamor_priv->finish_access_prog[1], "revert");
    glamor_priv->finish_access_swap_rb[1] =
        glGetUniformLocation(glamor_priv->finish_access_prog[1], "swap_rb");
    sampler_uniform_location =
        glGetUniformLocation(glamor_priv->finish_access_prog[1], "sampler");
    glUseProgram(glamor_priv->finish_access_prog[1]);
    glUniform1i(glamor_priv->finish_access_revert[1], 0);
    glUniform1i(sampler_uniform_location, 0);
    glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
    glUseProgram(0);
    glamor_put_context(glamor_priv);
}