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

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 * 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 * parse the same bits as different formats. For now, we only support
* tweaking whether we sample the alpha bits of an a8r8g8b8, or just * tweaking whether we sample the alpha bits, or just force them to 1.
* force them to 1.
*/ */
static Bool 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: case PICT_x2r10g10b10:
return storage_format == PICT_x2r10g10b10;
case PICT_a8r8g8b8: case PICT_a8r8g8b8:
case PICT_x8r8g8b8: case PICT_x8r8g8b8:
return storage_format == PICT_a8r8g8b8 || storage_format == PICT_x8r8g8b8;
case PICT_a8: case PICT_a8:
return TRUE; return storage_format == PICT_a8;
default: default:
return FALSE; return FALSE;
} }
@ -815,7 +824,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail; goto fail;
} }
if (!glamor_render_format_is_supported(dest->format)) { if (!glamor_render_format_is_supported(dest)) {
glamor_fallback("Unsupported dest picture format.\n"); glamor_fallback("Unsupported dest picture format.\n");
goto fail; goto fail;
} }
@ -978,7 +987,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail; goto fail;
} }
} else { } 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"); glamor_fallback("Unsupported source picture format.\n");
goto fail; goto fail;
} }
@ -990,7 +999,7 @@ glamor_composite_choose_shader(CARD8 op,
goto fail; goto fail;
} }
} else if (mask) { } 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"); glamor_fallback("Unsupported mask picture format.\n");
goto fail; goto fail;
} }