From: José Fonseca Date: Wed, 28 Nov 2012 19:25:05 +0000 (+0000) Subject: llvmpipe: Only advertise unswizzled formats. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6916387e5396a891f2ffbc68866802d03f6a0939;p=mesa.git llvmpipe: Only advertise unswizzled formats. Update llvmpipe_is_format_supported and llvmpipe_is_format_unswizzled so that only the formats that we can render without swizzling are advertised. We can still render all D3D10 required formats except PIPE_FORMAT_R11G11B10_FLOAT, which needs to be implemented in a future opportunity. Removal of rendertarget swizzling will be done in a subsequent change. Reviewed-by: Roland Scheidegger --- diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 74b7b99c0ea..f1da6f87cbf 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -315,20 +315,19 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen, if (sample_count > 1) return FALSE; - if (format_desc->format == PIPE_FORMAT_R11G11B10_FLOAT || - format_desc->format == PIPE_FORMAT_R9G9B9E5_FLOAT) - return TRUE; - if (bind & PIPE_BIND_RENDER_TARGET) { - if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS || - format_desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) + if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB) return FALSE; if (format_desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) return FALSE; + assert(format_desc->block.width == 1); + assert(format_desc->block.height == 1); + + if (format_desc->is_mixed) + return FALSE; - if (format_desc->block.width != 1 || - format_desc->block.height != 1) + if (!format_desc->is_array && !format_desc->is_bitmask) return FALSE; } diff --git a/src/gallium/drivers/llvmpipe/lp_texture.c b/src/gallium/drivers/llvmpipe/lp_texture.c index e6061230dd1..dcf2665dbc2 100644 --- a/src/gallium/drivers/llvmpipe/lp_texture.c +++ b/src/gallium/drivers/llvmpipe/lp_texture.c @@ -760,29 +760,18 @@ boolean llvmpipe_is_format_unswizzled( enum pipe_format format ) { const struct util_format_description *desc = util_format_description(format); - unsigned chan; if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN || - desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB || + (desc->colorspace != UTIL_FORMAT_COLORSPACE_RGB && + desc->colorspace != UTIL_FORMAT_COLORSPACE_SRGB) || desc->block.width != 1 || - desc->block.height != 1) { + desc->block.height != 1 || + desc->is_mixed || + (!desc->is_array && !desc->is_bitmask)) { + assert(0); return FALSE; } - for (chan = 0; chan < desc->nr_channels; ++chan) { - if (desc->channel[chan].type == UTIL_FORMAT_TYPE_VOID && (chan + 1) == desc->nr_channels) - continue; - - if (desc->channel[chan].type != desc->channel[0].type) - return FALSE; - - if (desc->channel[chan].normalized != desc->channel[0].normalized) - return FALSE; - - if (desc->channel[chan].pure_integer != desc->channel[0].pure_integer) - return FALSE; - } - return TRUE; } diff --git a/src/gallium/drivers/llvmpipe/lp_tile_image.c b/src/gallium/drivers/llvmpipe/lp_tile_image.c index 4d53cdeef45..d4ce78597e6 100644 --- a/src/gallium/drivers/llvmpipe/lp_tile_image.c +++ b/src/gallium/drivers/llvmpipe/lp_tile_image.c @@ -195,6 +195,8 @@ lp_tiled_to_linear(const void *src, void *dst, const uint bytes_per_tile = tile_w * tile_h * bpp; uint i, j; + assert(0); + for (j = 0; j < height; j += tile_h) { for (i = 0; i < width; i += tile_w) { uint ii = i + x, jj = j + y; @@ -284,6 +286,8 @@ lp_linear_to_tiled(const void *src, void *dst, const uint bytes_per_tile = tile_w * tile_h * bpp; uint i, j; + assert(0); + for (j = 0; j < height; j += TILE_SIZE) { for (i = 0; i < width; i += TILE_SIZE) { uint ii = i + x, jj = j + y;