glamor: Rework shader setup to make extending the IN types easier.
This commit is contained in:
parent
8cefa287dd
commit
d07fc66a05
|
@ -113,6 +113,12 @@ enum shader_mask {
|
||||||
SHADER_MASK_COUNT,
|
SHADER_MASK_COUNT,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum shader_in {
|
||||||
|
SHADER_IN_SOURCE_ONLY,
|
||||||
|
SHADER_IN_NORMAL,
|
||||||
|
SHADER_IN_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct glamor_screen_private {
|
typedef struct glamor_screen_private {
|
||||||
CreateGCProcPtr saved_create_gc;
|
CreateGCProcPtr saved_create_gc;
|
||||||
CreatePixmapProcPtr saved_create_pixmap;
|
CreatePixmapProcPtr saved_create_pixmap;
|
||||||
|
@ -147,7 +153,8 @@ typedef struct glamor_screen_private {
|
||||||
|
|
||||||
/* glamor_composite */
|
/* glamor_composite */
|
||||||
glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
|
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_glyph_cache_t glyph_caches[GLAMOR_NUM_GLYPH_CACHES];
|
||||||
} glamor_screen_private;
|
} glamor_screen_private;
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
struct shader_key {
|
struct shader_key {
|
||||||
enum shader_source source;
|
enum shader_source source;
|
||||||
enum shader_mask mask;
|
enum shader_mask mask;
|
||||||
|
enum shader_in in;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct blendinfo {
|
struct blendinfo {
|
||||||
|
@ -69,51 +70,68 @@ static struct blendinfo composite_op_info[] = {
|
||||||
static GLuint
|
static GLuint
|
||||||
glamor_create_composite_fs(struct shader_key *key)
|
glamor_create_composite_fs(struct shader_key *key)
|
||||||
{
|
{
|
||||||
const char *source_pixmap_header =
|
const char *source_solid_fetch =
|
||||||
"uniform sampler2D source_sampler;\n";
|
"uniform vec4 source;\n"
|
||||||
const char *source_solid_header =
|
"vec4 get_source()\n"
|
||||||
"uniform vec4 source;\n";
|
"{\n"
|
||||||
const char *mask_pixmap_header =
|
" return source;\n"
|
||||||
"uniform sampler2D mask_sampler;\n";
|
"}\n";
|
||||||
const char *mask_solid_header =
|
|
||||||
"uniform vec4 mask;\n";
|
|
||||||
const char *main_opening =
|
|
||||||
"void main()\n"
|
|
||||||
"{\n";
|
|
||||||
const char *source_alpha_pixmap_fetch =
|
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 =
|
const char *source_pixmap_fetch =
|
||||||
" vec4 source = vec4(texture2D(source_sampler, "
|
"uniform sampler2D source_sampler;\n"
|
||||||
" gl_TexCoord[0].xy).rgb, 1.0);\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 =
|
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 =
|
const char *mask_pixmap_fetch =
|
||||||
" vec4 mask = vec4(texture2D(mask_sampler, "
|
"uniform sampler2D mask_sampler;\n"
|
||||||
" gl_TexCoord[1].xy).rgb, 1.0);\n";
|
"vec4 get_mask()\n"
|
||||||
const char *source_in_mask =
|
"{\n"
|
||||||
" gl_FragColor = source * mask.a;\n";
|
" return vec4(texture2D(mask_sampler, gl_TexCoord[1].xy).rgb, \n"
|
||||||
const char *source_only =
|
" 1.0);\n"
|
||||||
" gl_FragColor = source;\n";
|
"}\n";
|
||||||
const char *main_closing =
|
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";
|
"}\n";
|
||||||
char *source;
|
char *source;
|
||||||
const char *source_setup = "";
|
const char *source_fetch;
|
||||||
const char *source_fetch = "";
|
|
||||||
const char *mask_setup = "";
|
|
||||||
const char *mask_fetch = "";
|
const char *mask_fetch = "";
|
||||||
const char *in;
|
const char *in;
|
||||||
GLuint prog;
|
GLuint prog;
|
||||||
|
|
||||||
switch (key->source) {
|
switch (key->source) {
|
||||||
case SHADER_SOURCE_SOLID:
|
case SHADER_SOURCE_SOLID:
|
||||||
source_setup = source_solid_header;
|
source_fetch = source_solid_fetch;
|
||||||
break;
|
break;
|
||||||
case SHADER_SOURCE_TEXTURE_ALPHA:
|
case SHADER_SOURCE_TEXTURE_ALPHA:
|
||||||
source_setup = source_pixmap_header;
|
|
||||||
source_fetch = source_alpha_pixmap_fetch;
|
source_fetch = source_alpha_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
case SHADER_SOURCE_TEXTURE:
|
case SHADER_SOURCE_TEXTURE:
|
||||||
source_setup = source_pixmap_header;
|
|
||||||
source_fetch = source_pixmap_fetch;
|
source_fetch = source_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -124,34 +142,33 @@ glamor_create_composite_fs(struct shader_key *key)
|
||||||
case SHADER_MASK_NONE:
|
case SHADER_MASK_NONE:
|
||||||
break;
|
break;
|
||||||
case SHADER_MASK_SOLID:
|
case SHADER_MASK_SOLID:
|
||||||
mask_setup = mask_solid_header;
|
mask_fetch = mask_solid_fetch;
|
||||||
break;
|
break;
|
||||||
case SHADER_MASK_TEXTURE_ALPHA:
|
case SHADER_MASK_TEXTURE_ALPHA:
|
||||||
mask_setup = mask_pixmap_header;
|
|
||||||
mask_fetch = mask_alpha_pixmap_fetch;
|
mask_fetch = mask_alpha_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
case SHADER_MASK_TEXTURE:
|
case SHADER_MASK_TEXTURE:
|
||||||
mask_setup = mask_pixmap_header;
|
|
||||||
mask_fetch = mask_pixmap_fetch;
|
mask_fetch = mask_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FatalError("Bad composite shader mask");
|
FatalError("Bad composite shader mask");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key->mask == SHADER_MASK_NONE) {
|
switch (key->in) {
|
||||||
in = source_only;
|
case SHADER_IN_SOURCE_ONLY:
|
||||||
} else {
|
in = in_source_only;
|
||||||
in = source_in_mask;
|
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 = XNFprintf("%s%s%s",
|
||||||
source_setup,
|
|
||||||
mask_setup,
|
|
||||||
main_opening,
|
|
||||||
source_fetch,
|
source_fetch,
|
||||||
mask_fetch,
|
mask_fetch,
|
||||||
in,
|
in);
|
||||||
main_closing);
|
|
||||||
|
|
||||||
prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER_ARB, source);
|
prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER_ARB, source);
|
||||||
xfree(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_screen_private *glamor_priv = glamor_get_screen_private(screen);
|
||||||
glamor_composite_shader *shader;
|
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)
|
if (shader->prog == 0)
|
||||||
glamor_create_composite_shader(screen, key, shader);
|
glamor_create_composite_shader(screen, key, shader);
|
||||||
|
|
||||||
|
@ -597,8 +614,11 @@ glamor_composite_with_shader(CARD8 op,
|
||||||
key.mask = SHADER_MASK_TEXTURE;
|
key.mask = SHADER_MASK_TEXTURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
key.in = SHADER_IN_NORMAL;
|
||||||
} else {
|
} else {
|
||||||
key.mask = SHADER_MASK_NONE;
|
key.mask = SHADER_MASK_NONE;
|
||||||
|
key.in = SHADER_IN_SOURCE_ONLY;
|
||||||
}
|
}
|
||||||
if (source->alphaMap) {
|
if (source->alphaMap) {
|
||||||
glamor_fallback("source alphaMap\n");
|
glamor_fallback("source alphaMap\n");
|
||||||
|
@ -851,6 +871,7 @@ glamor_composite(CARD8 op,
|
||||||
width, height))
|
width, height))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
fail:
|
||||||
glamor_fallback("glamor_composite(): "
|
glamor_fallback("glamor_composite(): "
|
||||||
"from picts %p/%p(%c,%c) to pict %p (%c)\n",
|
"from picts %p/%p(%c,%c) to pict %p (%c)\n",
|
||||||
source, mask,
|
source, mask,
|
||||||
|
@ -858,7 +879,7 @@ glamor_composite(CARD8 op,
|
||||||
glamor_get_picture_location(mask),
|
glamor_get_picture_location(mask),
|
||||||
dest,
|
dest,
|
||||||
glamor_get_picture_location(dest));
|
glamor_get_picture_location(dest));
|
||||||
fail:
|
|
||||||
glUseProgramObjectARB(0);
|
glUseProgramObjectARB(0);
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
if (glamor_prepare_access(dest->pDrawable, GLAMOR_ACCESS_RW)) {
|
if (glamor_prepare_access(dest->pDrawable, GLAMOR_ACCESS_RW)) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user