glamor: Check that storage format is compatible with RENDER format

Fixes x2r10g10b10 related rendercheck failures.

Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
Michel Dänzer 2018-12-19 10:06:23 +01:00 committed by Michel Dänzer
parent d12881ea1d
commit 7e6faa5b3c
1 changed files with 17 additions and 8 deletions

View File

@ -766,18 +766,27 @@ glamor_set_normalize_tcoords_generic(PixmapPtr pixmap,
*
* We could support many more formats by using GL_ARB_texture_view to
* parse the same bits as different formats. For now, we only support
* tweaking whether we sample the alpha bits of an a8r8g8b8, or just
* force them to 1.
* tweaking whether we sample the alpha bits, or just force them to 1.
*/
static Bool
glamor_render_format_is_supported(PictFormatShort format)
glamor_render_format_is_supported(PicturePtr picture)
{
switch (format) {
PictFormatShort storage_format;
/* Source-only pictures should always work */
if (!picture->pDrawable)
return TRUE;
storage_format = format_for_depth(picture->pDrawable->depth);
switch (picture->format) {
case PICT_x2r10g10b10:
return storage_format == PICT_x2r10g10b10;
case PICT_a8r8g8b8:
case PICT_x8r8g8b8:
return storage_format == PICT_a8r8g8b8 || storage_format == PICT_x8r8g8b8;
case PICT_a8:
return TRUE;
return storage_format == PICT_a8;
default:
return FALSE;
}
@ -815,7 +824,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
if (!glamor_render_format_is_supported(dest->format)) {
if (!glamor_render_format_is_supported(dest)) {
glamor_fallback("Unsupported dest picture format.\n");
goto fail;
}
@ -978,7 +987,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
} else {
if (source && !glamor_render_format_is_supported(source->format)) {
if (source && !glamor_render_format_is_supported(source)) {
glamor_fallback("Unsupported source picture format.\n");
goto fail;
}
@ -990,7 +999,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail;
}
} else if (mask) {
if (!glamor_render_format_is_supported(mask->format)) {
if (!glamor_render_format_is_supported(mask)) {
glamor_fallback("Unsupported mask picture format.\n");
goto fail;
}