summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-02-18 09:23:22 -0800
committerEric Anholt <eric@anholt.net>2010-02-18 14:00:57 -0800
commit1bc64af07ab1ca53084491ab7d9c131bbb1e3846 (patch)
tree08430f9fb2b2e1f0692c45a4b9f367281e4c8e71
parentbff49a1804631f683d6831ddda71ea9e116cc30e (diff)
glamor: Rework shader setup to make extending the IN types easier.
-rw-r--r--glamor/glamor_priv.h9
-rw-r--r--glamor/glamor_render.c107
2 files changed, 72 insertions, 44 deletions
diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h
index cd7ca1528..5ce74890b 100644
--- a/glamor/glamor_priv.h
+++ b/glamor/glamor_priv.h
@@ -113,6 +113,12 @@ enum shader_mask {
SHADER_MASK_COUNT,
};
+enum shader_in {
+ SHADER_IN_SOURCE_ONLY,
+ SHADER_IN_NORMAL,
+ SHADER_IN_COUNT,
+};
+
typedef struct glamor_screen_private {
CreateGCProcPtr saved_create_gc;
CreatePixmapProcPtr saved_create_pixmap;
@@ -147,7 +153,8 @@ typedef struct glamor_screen_private {
/* glamor_composite */
glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
- [SHADER_MASK_COUNT];
+ [SHADER_MASK_COUNT]
+ [SHADER_IN_COUNT];
glamor_glyph_cache_t glyph_caches[GLAMOR_NUM_GLYPH_CACHES];
} glamor_screen_private;
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 421aa3530..f4840dc0c 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -41,6 +41,7 @@
struct shader_key {
enum shader_source source;
enum shader_mask mask;
+ enum shader_in in;
};
struct blendinfo {
@@ -69,51 +70,68 @@ static struct blendinfo composite_op_info[] = {
static GLuint
glamor_create_composite_fs(struct shader_key *key)
{
- const char *source_pixmap_header =
- "uniform sampler2D source_sampler;\n";
- const char *source_solid_header =
- "uniform vec4 source;\n";
- const char *mask_pixmap_header =
- "uniform sampler2D mask_sampler;\n";
- const char *mask_solid_header =
- "uniform vec4 mask;\n";
- const char *main_opening =
- "void main()\n"
- "{\n";
+ const char *source_solid_fetch =
+ "uniform vec4 source;\n"
+ "vec4 get_source()\n"
+ "{\n"
+ " return source;\n"
+ "}\n";
const char *source_alpha_pixmap_fetch =
- " vec4 source = texture2D(source_sampler, gl_TexCoord[0].xy);\n";
+ "uniform sampler2D source_sampler;\n"
+ "vec4 get_source()\n"
+ "{\n"
+ " return texture2D(source_sampler, gl_TexCoord[0].xy);\n"
+ "}\n";
const char *source_pixmap_fetch =
- " vec4 source = vec4(texture2D(source_sampler, "
- " gl_TexCoord[0].xy).rgb, 1.0);\n";
+ "uniform sampler2D source_sampler;\n"
+ "vec4 get_source()\n"
+ "{\n"
+ " return vec4(texture2D(source_sampler, gl_TexCoord[0].xy).rgb,\n"
+ " 1.0);\n"
+ "}\n";
+ const char *mask_solid_fetch =
+ "uniform vec4 mask;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " return mask;\n"
+ "}\n";
const char *mask_alpha_pixmap_fetch =
- " vec4 mask = texture2D(mask_sampler, gl_TexCoord[1].xy);\n";
+ "uniform sampler2D mask_sampler;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " return texture2D(mask_sampler, gl_TexCoord[1].xy);\n"
+ "}\n";
const char *mask_pixmap_fetch =
- " vec4 mask = vec4(texture2D(mask_sampler, "
- " gl_TexCoord[1].xy).rgb, 1.0);\n";
- const char *source_in_mask =
- " gl_FragColor = source * mask.a;\n";
- const char *source_only =
- " gl_FragColor = source;\n";
- const char *main_closing =
+ "uniform sampler2D mask_sampler;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " return vec4(texture2D(mask_sampler, gl_TexCoord[1].xy).rgb, \n"
+ " 1.0);\n"
+ "}\n";
+ const char *in_source_only =
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source();\n"
+ "}\n";
+ const char *in_normal =
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source() * get_mask().a;\n"
"}\n";
char *source;
- const char *source_setup = "";
- const char *source_fetch = "";
- const char *mask_setup = "";
+ const char *source_fetch;
const char *mask_fetch = "";
const char *in;
GLuint prog;
switch (key->source) {
case SHADER_SOURCE_SOLID:
- source_setup = source_solid_header;
+ source_fetch = source_solid_fetch;
break;
case SHADER_SOURCE_TEXTURE_ALPHA:
- source_setup = source_pixmap_header;
source_fetch = source_alpha_pixmap_fetch;
break;
case SHADER_SOURCE_TEXTURE:
- source_setup = source_pixmap_header;
source_fetch = source_pixmap_fetch;
break;
default:
@@ -124,34 +142,33 @@ glamor_create_composite_fs(struct shader_key *key)
case SHADER_MASK_NONE:
break;
case SHADER_MASK_SOLID:
- mask_setup = mask_solid_header;
+ mask_fetch = mask_solid_fetch;
break;
case SHADER_MASK_TEXTURE_ALPHA:
- mask_setup = mask_pixmap_header;
mask_fetch = mask_alpha_pixmap_fetch;
break;
case SHADER_MASK_TEXTURE:
- mask_setup = mask_pixmap_header;
mask_fetch = mask_pixmap_fetch;
break;
default:
FatalError("Bad composite shader mask");
}
- if (key->mask == SHADER_MASK_NONE) {
- in = source_only;
- } else {
- in = source_in_mask;
+ switch (key->in) {
+ case SHADER_IN_SOURCE_ONLY:
+ in = in_source_only;
+ break;
+ case SHADER_IN_NORMAL:
+ in = in_normal;
+ break;
+ default:
+ FatalError("Bad composite IN type");
}
- source = XNFprintf("%s%s%s%s%s%s%s",
- source_setup,
- mask_setup,
- main_opening,
+ source = XNFprintf("%s%s%s",
source_fetch,
mask_fetch,
- in,
- main_closing);
+ in);
prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER_ARB, source);
xfree(source);
@@ -245,7 +262,7 @@ glamor_lookup_composite_shader(ScreenPtr screen, struct shader_key *key)
glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
glamor_composite_shader *shader;
- shader = &glamor_priv->composite_shader[key->source][key->mask];
+ shader = &glamor_priv->composite_shader[key->source][key->mask][key->in];
if (shader->prog == 0)
glamor_create_composite_shader(screen, key, shader);
@@ -597,8 +614,11 @@ glamor_composite_with_shader(CARD8 op,
key.mask = SHADER_MASK_TEXTURE;
}
}
+
+ key.in = SHADER_IN_NORMAL;
} else {
key.mask = SHADER_MASK_NONE;
+ key.in = SHADER_IN_SOURCE_ONLY;
}
if (source->alphaMap) {
glamor_fallback("source alphaMap\n");
@@ -851,6 +871,7 @@ glamor_composite(CARD8 op,
width, height))
return;
+fail:
glamor_fallback("glamor_composite(): "
"from picts %p/%p(%c,%c) to pict %p (%c)\n",
source, mask,
@@ -858,7 +879,7 @@ glamor_composite(CARD8 op,
glamor_get_picture_location(mask),
dest,
glamor_get_picture_location(dest));
-fail:
+
glUseProgramObjectARB(0);
glDisable(GL_BLEND);
if (glamor_prepare_access(dest->pDrawable, GLAMOR_ACCESS_RW)) {