glamor: Add support for accel of x8r8g8b8 source pictures.
There's a limitation still for RepeatNone, but this fixes a bunch of fallbacks for gnome-terminal.
This commit is contained in:
parent
e6bf505736
commit
0565c1d789
|
@ -100,6 +100,7 @@ typedef struct {
|
||||||
|
|
||||||
enum shader_source {
|
enum shader_source {
|
||||||
SHADER_SOURCE_SOLID,
|
SHADER_SOURCE_SOLID,
|
||||||
|
SHADER_SOURCE_TEXTURE,
|
||||||
SHADER_SOURCE_TEXTURE_ALPHA,
|
SHADER_SOURCE_TEXTURE_ALPHA,
|
||||||
SHADER_SOURCE_COUNT,
|
SHADER_SOURCE_COUNT,
|
||||||
};
|
};
|
||||||
|
@ -107,6 +108,7 @@ enum shader_source {
|
||||||
enum shader_mask {
|
enum shader_mask {
|
||||||
SHADER_MASK_NONE,
|
SHADER_MASK_NONE,
|
||||||
SHADER_MASK_SOLID,
|
SHADER_MASK_SOLID,
|
||||||
|
SHADER_MASK_TEXTURE,
|
||||||
SHADER_MASK_TEXTURE_ALPHA,
|
SHADER_MASK_TEXTURE_ALPHA,
|
||||||
SHADER_MASK_COUNT,
|
SHADER_MASK_COUNT,
|
||||||
};
|
};
|
||||||
|
|
|
@ -82,8 +82,14 @@ glamor_create_composite_fs(struct shader_key *key)
|
||||||
"{\n";
|
"{\n";
|
||||||
const char *source_alpha_pixmap_fetch =
|
const char *source_alpha_pixmap_fetch =
|
||||||
" vec4 source = texture2D(source_sampler, gl_TexCoord[0].xy);\n";
|
" vec4 source = texture2D(source_sampler, gl_TexCoord[0].xy);\n";
|
||||||
|
const char *source_pixmap_fetch =
|
||||||
|
" vec4 source = vec4(texture2D(source_sampler, "
|
||||||
|
" gl_TexCoord[0].xy).rgb, 1.0);\n";
|
||||||
const char *mask_alpha_pixmap_fetch =
|
const char *mask_alpha_pixmap_fetch =
|
||||||
" vec4 mask = texture2D(mask_sampler, gl_TexCoord[1].xy);\n";
|
" vec4 mask = texture2D(mask_sampler, gl_TexCoord[1].xy);\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 =
|
const char *source_in_mask =
|
||||||
" gl_FragColor = source * mask.a;\n";
|
" gl_FragColor = source * mask.a;\n";
|
||||||
const char *source_only =
|
const char *source_only =
|
||||||
|
@ -106,9 +112,12 @@ glamor_create_composite_fs(struct shader_key *key)
|
||||||
source_setup = source_pixmap_header;
|
source_setup = source_pixmap_header;
|
||||||
source_fetch = source_alpha_pixmap_fetch;
|
source_fetch = source_alpha_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
FatalError("Bad composite shader source");
|
case SHADER_SOURCE_TEXTURE:
|
||||||
|
source_setup = source_pixmap_header;
|
||||||
|
source_fetch = source_pixmap_fetch;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FatalError("Bad composite source mask");
|
FatalError("Bad composite shader source");
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (key->mask) {
|
switch (key->mask) {
|
||||||
|
@ -121,6 +130,10 @@ glamor_create_composite_fs(struct shader_key *key)
|
||||||
mask_setup = mask_pixmap_header;
|
mask_setup = mask_pixmap_header;
|
||||||
mask_fetch = mask_alpha_pixmap_fetch;
|
mask_fetch = mask_alpha_pixmap_fetch;
|
||||||
break;
|
break;
|
||||||
|
case SHADER_MASK_TEXTURE:
|
||||||
|
mask_setup = mask_pixmap_header;
|
||||||
|
mask_fetch = mask_pixmap_fetch;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
FatalError("Bad composite shader mask");
|
FatalError("Bad composite shader mask");
|
||||||
}
|
}
|
||||||
|
@ -446,6 +459,14 @@ good_source_format(PicturePtr picture)
|
||||||
case PICT_a8:
|
case PICT_a8:
|
||||||
case PICT_a8r8g8b8:
|
case PICT_a8r8g8b8:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
case PICT_x8r8g8b8:
|
||||||
|
/* In order to support formats with no alpha, we have to wire the
|
||||||
|
* alpha to 1 in the shader, which conflicts with
|
||||||
|
* GL_CLAMP_TO_BORDERing to transparent. We could possibly compute
|
||||||
|
* coverage of the texels in the sampling area if we need to, but
|
||||||
|
* that isn't implemented today.
|
||||||
|
*/
|
||||||
|
return (picture->repeatType != RepeatNone);
|
||||||
default:
|
default:
|
||||||
glamor_fallback("Bad source format 0x%08x\n", picture->format);
|
glamor_fallback("Bad source format 0x%08x\n", picture->format);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -459,6 +480,14 @@ good_mask_format(PicturePtr picture)
|
||||||
case PICT_a8:
|
case PICT_a8:
|
||||||
case PICT_a8r8g8b8:
|
case PICT_a8r8g8b8:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
case PICT_x8r8g8b8:
|
||||||
|
/* In order to support formats with no alpha, we have to wire the
|
||||||
|
* alpha to 1 in the shader, which conflicts with
|
||||||
|
* GL_CLAMP_TO_BORDERing to transparent. We could possibly compute
|
||||||
|
* coverage of the texels in the sampling area if we need to, but
|
||||||
|
* that isn't implemented today.
|
||||||
|
*/
|
||||||
|
return (picture->repeatType != RepeatNone);
|
||||||
default:
|
default:
|
||||||
glamor_fallback("Bad mask format 0x%08x\n", picture->format);
|
glamor_fallback("Bad mask format 0x%08x\n", picture->format);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -514,7 +543,11 @@ glamor_composite_with_shader(CARD8 op,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
key.source = SHADER_SOURCE_TEXTURE_ALPHA;
|
if (PICT_FORMAT_A(source->format) != 0) {
|
||||||
|
key.source = SHADER_SOURCE_TEXTURE_ALPHA;
|
||||||
|
} else {
|
||||||
|
key.source = SHADER_SOURCE_TEXTURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (mask) {
|
if (mask) {
|
||||||
if (!mask->pDrawable) {
|
if (!mask->pDrawable) {
|
||||||
|
@ -525,7 +558,11 @@ glamor_composite_with_shader(CARD8 op,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
key.mask = SHADER_MASK_TEXTURE_ALPHA;
|
if (PICT_FORMAT_A(mask->format) != 0) {
|
||||||
|
key.mask = SHADER_MASK_TEXTURE_ALPHA;
|
||||||
|
} else {
|
||||||
|
key.mask = SHADER_MASK_TEXTURE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
key.mask = SHADER_MASK_NONE;
|
key.mask = SHADER_MASK_NONE;
|
||||||
|
@ -539,7 +576,8 @@ glamor_composite_with_shader(CARD8 op,
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (key.source == SHADER_SOURCE_TEXTURE_ALPHA) {
|
if (key.source == SHADER_SOURCE_TEXTURE ||
|
||||||
|
key.source == SHADER_SOURCE_TEXTURE_ALPHA) {
|
||||||
source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
|
source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
|
||||||
source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
|
source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
|
||||||
if (source_pixmap == dest_pixmap) {
|
if (source_pixmap == dest_pixmap) {
|
||||||
|
@ -553,7 +591,8 @@ glamor_composite_with_shader(CARD8 op,
|
||||||
if (!good_source_format(source))
|
if (!good_source_format(source))
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
if (key.mask == SHADER_MASK_TEXTURE_ALPHA) {
|
if (key.mask == SHADER_MASK_TEXTURE ||
|
||||||
|
key.mask == SHADER_MASK_TEXTURE_ALPHA) {
|
||||||
mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
|
mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
|
||||||
mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
|
mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
|
||||||
if (mask_pixmap == dest_pixmap) {
|
if (mask_pixmap == dest_pixmap) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user