X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Futil%2Fu_format.h;h=59bd03b77406669da10225b10fbc82c298601cb3;hb=f25b6e546e66955d70a1aa72135a5054c4f0ed3e;hp=5e3dc694be688dfaf8b01700f78edb5decd11fca;hpb=02224ec4e0de8072c9d730821f88e0a00212ff50;p=mesa.git diff --git a/src/gallium/auxiliary/util/u_format.h b/src/gallium/auxiliary/util/u_format.h index 5e3dc694be6..59bd03b7740 100644 --- a/src/gallium/auxiliary/util/u_format.h +++ b/src/gallium/auxiliary/util/u_format.h @@ -192,6 +192,7 @@ struct util_format_description /** * Unpack pixel blocks to R8G8B8A8_UNORM. + * Note: strides are in bytes. * * Only defined for non-depth-stencil formats. */ @@ -202,6 +203,7 @@ struct util_format_description /** * Pack pixel blocks from R8G8B8A8_UNORM. + * Note: strides are in bytes. * * Only defined for non-depth-stencil formats. */ @@ -210,8 +212,19 @@ struct util_format_description const uint8_t *src, unsigned src_stride, unsigned width, unsigned height); + /** + * Fetch a single pixel (i, j) from a block. + * + * XXX: Only defined for a very few select formats. + */ + void + (*fetch_rgba_8unorm)(uint8_t *dst, + const uint8_t *src, + unsigned i, unsigned j); + /** * Unpack pixel blocks to R32G32B32A32_FLOAT. + * Note: strides are in bytes. * * Only defined for non-depth-stencil formats. */ @@ -222,6 +235,7 @@ struct util_format_description /** * Pack pixel blocks from R32G32B32A32_FLOAT. + * Note: strides are in bytes. * * Only defined for non-depth-stencil formats. */ @@ -242,6 +256,7 @@ struct util_format_description /** * Unpack pixels to Z32_UNORM. + * Note: strides are in bytes. * * Only defined for depth formats. */ @@ -252,6 +267,7 @@ struct util_format_description /** * Pack pixels from Z32_FLOAT. + * Note: strides are in bytes. * * Only defined for depth formats. */ @@ -262,6 +278,7 @@ struct util_format_description /** * Unpack pixels to Z32_FLOAT. + * Note: strides are in bytes. * * Only defined for depth formats. */ @@ -272,6 +289,7 @@ struct util_format_description /** * Pack pixels from Z32_FLOAT. + * Note: strides are in bytes. * * Only defined for depth formats. */ @@ -282,6 +300,7 @@ struct util_format_description /** * Unpack pixels to S8_USCALED. + * Note: strides are in bytes. * * Only defined for stencil formats. */ @@ -292,6 +311,7 @@ struct util_format_description /** * Pack pixels from S8_USCALED. + * Note: strides are in bytes. * * Only defined for stencil formats. */ @@ -322,12 +342,60 @@ util_format_name(enum pipe_format format) assert(desc); if (!desc) { - return "???"; + return "PIPE_FORMAT_???"; } return desc->name; } +static INLINE const char * +util_format_short_name(enum pipe_format format) +{ + const struct util_format_description *desc = util_format_description(format); + + assert(desc); + if (!desc) { + return "???"; + } + + return desc->short_name; +} + +/** + * Whether this format is plain, see UTIL_FORMAT_LAYOUT_PLAIN for more info. + */ +static INLINE boolean +util_format_is_plain(enum pipe_format format) +{ + const struct util_format_description *desc = util_format_description(format); + + if (!format) { + return FALSE; + } + + return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ? TRUE : FALSE; +} + +static INLINE boolean +util_format_is_compressed(enum pipe_format format) +{ + const struct util_format_description *desc = util_format_description(format); + + assert(desc); + if (!desc) { + return FALSE; + } + + switch (desc->layout) { + case UTIL_FORMAT_LAYOUT_S3TC: + case UTIL_FORMAT_LAYOUT_RGTC: + /* XXX add other formats in the future */ + return TRUE; + default: + return FALSE; + } +} + static INLINE boolean util_format_is_s3tc(enum pipe_format format) { @@ -372,6 +440,39 @@ util_format_is_depth_and_stencil(enum pipe_format format) desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE) ? TRUE : FALSE; } + +/** + * Give the RGBA colormask of the channels that can be represented in this + * format. + * + * That is, the channels whose values are preserved. + */ +static INLINE unsigned +util_format_colormask(const struct util_format_description *desc) +{ + unsigned colormask; + unsigned chan; + + switch (desc->colorspace) { + case UTIL_FORMAT_COLORSPACE_RGB: + case UTIL_FORMAT_COLORSPACE_SRGB: + case UTIL_FORMAT_COLORSPACE_YUV: + colormask = 0; + for (chan = 0; chan < 4; ++chan) { + if (desc->swizzle[chan] < 4) { + colormask |= (1 << chan); + } + } + return colormask; + case UTIL_FORMAT_COLORSPACE_ZS: + return 0; + default: + assert(0); + return 0; + } +} + + /** * Whether this format is a rgab8 variant. * @@ -562,6 +663,44 @@ util_format_has_alpha(enum pipe_format format) } } +/** + * Return the matching SRGB format, or PIPE_FORMAT_NONE if none. + */ +static INLINE enum pipe_format +util_format_srgb(enum pipe_format format) +{ + switch (format) { + case PIPE_FORMAT_L8_UNORM: + return PIPE_FORMAT_L8_SRGB; + case PIPE_FORMAT_L8A8_UNORM: + return PIPE_FORMAT_L8A8_SRGB; + case PIPE_FORMAT_R8G8B8_UNORM: + return PIPE_FORMAT_R8G8B8_SRGB; + case PIPE_FORMAT_A8B8G8R8_UNORM: + return PIPE_FORMAT_A8B8G8R8_SRGB; + case PIPE_FORMAT_X8B8G8R8_UNORM: + return PIPE_FORMAT_X8B8G8R8_SRGB; + case PIPE_FORMAT_B8G8R8A8_UNORM: + return PIPE_FORMAT_B8G8R8A8_SRGB; + case PIPE_FORMAT_B8G8R8X8_UNORM: + return PIPE_FORMAT_B8G8R8X8_SRGB; + case PIPE_FORMAT_A8R8G8B8_UNORM: + return PIPE_FORMAT_A8R8G8B8_SRGB; + case PIPE_FORMAT_X8R8G8B8_UNORM: + return PIPE_FORMAT_X8R8G8B8_SRGB; + case PIPE_FORMAT_DXT1_RGB: + return PIPE_FORMAT_DXT1_SRGB; + case PIPE_FORMAT_DXT1_RGBA: + return PIPE_FORMAT_DXT1_SRGBA; + case PIPE_FORMAT_DXT3_RGBA: + return PIPE_FORMAT_DXT3_SRGBA; + case PIPE_FORMAT_DXT5_RGBA: + return PIPE_FORMAT_DXT5_SRGBA; + default: + return PIPE_FORMAT_NONE; + } +} + /** * Return the number of components stored. * Formats with block size != 1x1 will always have 1 component (the block). @@ -605,6 +744,9 @@ util_format_write_4ub(enum pipe_format format, * Generic format conversion; */ +boolean +util_format_fits_8unorm(const struct util_format_description *format_desc); + void util_format_translate(enum pipe_format dst_format, void *dst, unsigned dst_stride,