1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009-2010 Vmware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef U_FORMAT_H 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define U_FORMAT_H 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_format.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" { 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Describe how to pack/unpack pixels into/from the prescribed format. 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: This could be renamed to something like util_format_pack, or broke down 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in flags inside util_format_block that said exactly what we want. 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_layout { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Formats with util_format_block::width == util_format_block::height == 1 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that can be described as an ordinary data structure. 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_PLAIN = 0, 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Formats with sub-sampled channels. 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is for formats like YVYU where there is less than one sample per 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pixel. 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_SUBSAMPLED = 3, 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * S3 Texture Compression formats. 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_S3TC = 4, 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Red-Green Texture Compression formats. 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_RGTC = 5, 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Ericsson Texture Compression 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_ETC = 6, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Everything else that doesn't fit in any of the above layouts. 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_LAYOUT_OTHER = 7 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_block 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Block width in pixels */ 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width; 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Block height in pixels */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned height; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Block size in bits */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned bits; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_type { 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_TYPE_VOID = 0, 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_TYPE_UNSIGNED = 1, 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_TYPE_SIGNED = 2, 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_TYPE_FIXED = 3, 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_TYPE_FLOAT = 4 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_swizzle { 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_X = 0, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_Y = 1, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_Z = 2, 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_W = 3, 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_0 = 4, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_1 = 5, 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_NONE = 6, 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_SWIZZLE_MAX = 7 /**< Number of enums counter (must be last) */ 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum util_format_colorspace { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_RGB = 0, 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_SRGB = 1, 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_YUV = 2, 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UTIL_FORMAT_COLORSPACE_ZS = 3 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_channel_description 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned type:5; /**< UTIL_FORMAT_TYPE_x */ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned normalized:1; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned pure_integer:1; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned size:9; /**< bits per channel */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct util_format_description 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format format; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *name; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Short name, striped of the prefix, lower case. 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *short_name; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pixel block dimensions. 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct util_format_block block; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum util_format_layout layout; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The number of channels. 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned nr_channels:3; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether all channels have the same number of (whole) bytes. 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_array:1; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether the pixel format can be described as a bitfield structure. 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In particular: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - pixel depth must be 8, 16, or 32 bits; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - all channels must be unsigned, signed, or void 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_bitmask:1; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether channels have mixed types (ignoring UTIL_FORMAT_TYPE_VOID). 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned is_mixed:1; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Input channel description. 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only valid for UTIL_FORMAT_LAYOUT_PLAIN formats. 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct util_format_channel_description channel[4]; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Output channel swizzle. 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The order is either: 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - RGBA 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - YUV(A) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - ZS 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * depending on the colorspace. 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char swizzle[4]; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Colorspace transformation. 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum util_format_colorspace colorspace; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixel blocks to R8G8B8A8_UNORM. 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for non-depth-stencil formats. 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack pixel blocks from R8G8B8A8_UNORM. 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for non-depth-stencil formats. 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_rgba_8unorm)(uint8_t *dst, unsigned dst_stride, 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch a single pixel (i, j) from a block. 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX: Only defined for a very few select formats. 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*fetch_rgba_8unorm)(uint8_t *dst, 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, unsigned j); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixel blocks to R32G32B32A32_FLOAT. 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for non-depth-stencil formats. 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_rgba_float)(float *dst, unsigned dst_stride, 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack pixel blocks from R32G32B32A32_FLOAT. 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for non-depth-stencil formats. 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_rgba_float)(uint8_t *dst, unsigned dst_stride, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *src, unsigned src_stride, 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch a single pixel (i, j) from a block. 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for non-depth-stencil and non-integer formats. 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*fetch_rgba_float)(float *dst, 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, unsigned j); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixels to Z32_UNORM. 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for depth formats. 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_z_32unorm)(uint32_t *dst, unsigned dst_stride, 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack pixels from Z32_FLOAT. 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for depth formats. 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_z_32unorm)(uint8_t *dst, unsigned dst_stride, 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t *src, unsigned src_stride, 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixels to Z32_FLOAT. 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for depth formats. 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_z_float)(float *dst, unsigned dst_stride, 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack pixels from Z32_FLOAT. 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for depth formats. 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_z_float)(uint8_t *dst, unsigned dst_stride, 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *src, unsigned src_stride, 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixels to S8_UINT. 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for stencil formats. 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_s_8uint)(uint8_t *dst, unsigned dst_stride, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Pack pixels from S8_UINT. 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for stencil formats. 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_s_8uint)(uint8_t *dst, unsigned dst_stride, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixel blocks to R32G32B32A32_UINT. 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for INT formats. 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_rgba_uint)(unsigned *dst, unsigned dst_stride, 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_rgba_uint)(uint8_t *dst, unsigned dst_stride, 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned *src, unsigned src_stride, 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Unpack pixel blocks to R32G32B32A32_SINT. 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: strides are in bytes. 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for INT formats. 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*unpack_rgba_sint)(signed *dst, unsigned dst_stride, 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*pack_rgba_sint)(uint8_t *dst, unsigned dst_stride, 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *src, unsigned src_stride, 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch a single pixel (i, j) from a block. 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for unsigned (pure) integer formats. 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*fetch_rgba_uint)(uint32_t *dst, 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, unsigned j); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fetch a single pixel (i, j) from a block. 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Only defined for signed (pure) integer formats. 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (*fetch_rgba_sint)(int32_t *dst, 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, unsigned j); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern const struct util_format_description 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_description_table[]; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct util_format_description * 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_description(enum pipe_format format); 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format query functions. 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const char * 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_name(enum pipe_format format) 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "PIPE_FORMAT_???"; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->name; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE const char * 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_short_name(enum pipe_format format) 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return "???"; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->short_name; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether this format is plain, see UTIL_FORMAT_LAYOUT_PLAIN for more info. 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_plain(enum pipe_format format) 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!format) { 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->layout == UTIL_FORMAT_LAYOUT_PLAIN ? TRUE : FALSE; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_compressed(enum pipe_format format) 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->layout) { 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_LAYOUT_S3TC: 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_LAYOUT_RGTC: 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX add other formats in the future */ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_s3tc(enum pipe_format format) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->layout == UTIL_FORMAT_LAYOUT_S3TC ? TRUE : FALSE; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_srgb(enum pipe_format format) 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_depth(const struct util_format_description *desc) 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS && 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->swizzle[0] != UTIL_FORMAT_SWIZZLE_NONE; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_stencil(const struct util_format_description *desc) 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS && 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->swizzle[1] != UTIL_FORMAT_SWIZZLE_NONE; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_depth_or_stencil(enum pipe_format format) 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_format_has_depth(desc) || 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_has_stencil(desc); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_depth_and_stencil(enum pipe_format format) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_format_has_depth(desc) && 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org util_format_has_stencil(desc); 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Give the RGBA colormask of the channels that can be represented in this 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format. 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * That is, the channels whose values are preserved. 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_colormask(const struct util_format_description *desc) 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned colormask; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->colorspace) { 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_RGB: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_SRGB: 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_YUV: 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colormask = 0; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; ++chan) { 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->swizzle[chan] < 4) { 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colormask |= (1 << chan); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return colormask; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_ZS: 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Checks if color mask covers every channel for the specified format 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @param desc a format description to check colormask with 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * @param colormask a bit mask for channels, matches format of PIPE_MASK_RGBA 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_colormask_full(const struct util_format_description *desc, unsigned colormask) 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (~colormask & util_format_colormask(desc)) == 0; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_float(enum pipe_format format); 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_rgb_no_alpha(enum pipe_format format); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_luminance(enum pipe_format format); 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_luminance_alpha(enum pipe_format format); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_intensity(enum pipe_format format); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_integer(enum pipe_format format); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_sint(enum pipe_format format); 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_pure_uint(enum pipe_format format); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether the format is a simple array format where all channels 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are of the same type and can be loaded from memory as a vector 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_array(const struct util_format_description *desc); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the src format can be blitted to the destination format with 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a simple memcpy. For example, blitting from RGBA to RGBx is OK, but not 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the reverse. 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_is_format_compatible(const struct util_format_description *src_desc, 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *dst_desc); 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether the format is supported by Gallium for the given bindings. 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This covers S3TC textures and floating-point render targets. 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_supported(enum pipe_format format, unsigned bind); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Whether this format is a rgab8 variant. 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * That is, any format that matches the 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PIPE_FORMAT_?8?8?8?8_UNORM 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_is_rgba8_variant(const struct util_format_description *desc) 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned chan; 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc->block.width != 1 || 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->block.height != 1 || 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->block.bits != 32) 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for(chan = 0; chan < 4; ++chan) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc->channel[chan].type != UTIL_FORMAT_TYPE_UNSIGNED && 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc->channel[chan].type != UTIL_FORMAT_TYPE_VOID) 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(desc->channel[chan].size != 8) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TRUE; 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return total bits needed for the pixel format per block. 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blocksizebits(enum pipe_format format) 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->block.bits; 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return bytes per block (not pixel) for the given format. 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blocksize(enum pipe_format format) 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint bits = util_format_get_blocksizebits(format); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(bits % 8 == 0); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bits / 8; 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blockwidth(enum pipe_format format) 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->block.width; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_blockheight(enum pipe_format format) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(desc); 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!desc) { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->block.height; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocksx(enum pipe_format format, 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x) 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blockwidth = util_format_get_blockwidth(format); 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (x + blockwidth - 1) / blockwidth; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocksy(enum pipe_format format, 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned y) 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned blockheight = util_format_get_blockheight(format); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (y + blockheight - 1) / blockheight; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nblocks(enum pipe_format format, 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned height) 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_format_get_nblocksx(format, width) * util_format_get_nblocksy(format, height); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE size_t 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_stride(enum pipe_format format, 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width) 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_format_get_nblocksx(format, width) * util_format_get_blocksize(format); 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE size_t 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_2d_size(enum pipe_format format, 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size_t stride, 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned height) 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return util_format_get_nblocksy(format, height) * stride; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE uint 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_component_bits(enum pipe_format format, 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum util_format_colorspace colorspace, 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint component) 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum util_format_colorspace desc_colorspace; 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(format); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!format) { 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(component < 4); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Treat RGB and SRGB as equivalent. */ 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colorspace = UTIL_FORMAT_COLORSPACE_RGB; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) { 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc_colorspace = UTIL_FORMAT_COLORSPACE_RGB; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc_colorspace = desc->colorspace; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc_colorspace != colorspace) { 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->swizzle[component]) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_SWIZZLE_X: 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->channel[0].size; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_SWIZZLE_Y: 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->channel[1].size; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_SWIZZLE_Z: 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->channel[2].size; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_SWIZZLE_W: 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->channel[3].size; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE boolean 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_has_alpha(enum pipe_format format) 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(format); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!format) { 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (desc->colorspace) { 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_RGB: 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_SRGB: 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->swizzle[3] != UTIL_FORMAT_SWIZZLE_1; 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_YUV: 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case UTIL_FORMAT_COLORSPACE_ZS: 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return FALSE; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a linear RGB colorspace format, return the corresponding SRGB 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format, or PIPE_FORMAT_NONE if none. 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_srgb(enum pipe_format format) 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_UNORM: 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_L8_SRGB; 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_UNORM: 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_L8A8_SRGB; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8_UNORM: 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_R8G8B8_SRGB; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_UNORM: 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8B8G8R8_SRGB; 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8B8G8R8_UNORM: 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X8B8G8R8_SRGB; 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_UNORM: 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8A8_SRGB; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8X8_UNORM: 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8X8_SRGB; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8R8G8B8_UNORM: 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8R8G8B8_SRGB; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8R8G8B8_UNORM: 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X8R8G8B8_SRGB; 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_RGB: 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT1_SRGB; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_RGBA: 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT1_SRGBA; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT3_RGBA: 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT3_SRGBA; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT5_RGBA: 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT5_SRGBA; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_NONE; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given an sRGB format, return the corresponding linear colorspace format. 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For non sRGB formats, return the format unchanged. 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_linear(enum pipe_format format) 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8_SRGB: 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_L8_UNORM; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_L8A8_SRGB: 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_L8A8_UNORM; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_R8G8B8_SRGB: 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_R8G8B8_UNORM; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8B8G8R8_SRGB: 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8B8G8R8_UNORM; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8B8G8R8_SRGB: 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X8B8G8R8_UNORM; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8A8_SRGB: 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8A8_UNORM; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_B8G8R8X8_SRGB: 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_B8G8R8X8_UNORM; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_A8R8G8B8_SRGB: 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_A8R8G8B8_UNORM; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X8R8G8B8_SRGB: 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X8R8G8B8_UNORM; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_SRGB: 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT1_RGB; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT1_SRGBA: 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT1_RGBA; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT3_SRGBA: 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT3_RGBA; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_DXT5_SRGBA: 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_DXT5_RGBA; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return format; 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Given a depth-stencil format, return the corresponding stencil-only format. 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For stencil-only formats, return the format unchanged. 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE enum pipe_format 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_stencil_only(enum pipe_format format) 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* mask out the depth component */ 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z24_UNORM_S8_UINT: 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X24S8_UINT; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT_Z24_UNORM: 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_S8X24_UINT; 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_X32_S8X24_UINT; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* stencil only formats */ 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X24S8_UINT: 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8X24_UINT: 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_X32_S8X24_UINT: 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case PIPE_FORMAT_S8_UINT: 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return format; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PIPE_FORMAT_NONE; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the number of components stored. 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Formats with block size != 1x1 will always have 1 component (the block). 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE unsigned 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_nr_components(enum pipe_format format) 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return desc->nr_channels; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the index of the first non-void channel 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * -1 if no non-void channels 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE int 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_get_first_non_void_channel(enum pipe_format format) 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct util_format_description *desc = util_format_description(format); 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i == 4) 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return i; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format access functions. 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4f(enum pipe_format format, 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org float *dst, unsigned dst_stride, 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src, unsigned src_stride, 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4f(enum pipe_format format, 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float *src, unsigned src_stride, 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst, unsigned dst_stride, 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4ub(enum pipe_format format, 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *dst, unsigned dst_stride, 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src, unsigned src_stride, 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4ub(enum pipe_format format, 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *src, unsigned src_stride, 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst, unsigned dst_stride, 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4ui(enum pipe_format format, 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned *dst, unsigned dst_stride, 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src, unsigned src_stride, 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4ui(enum pipe_format format, 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned int *src, unsigned src_stride, 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst, unsigned dst_stride, 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_read_4i(enum pipe_format format, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int *dst, unsigned dst_stride, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src, unsigned src_stride, 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_write_4i(enum pipe_format format, 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int *src, unsigned src_stride, 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst, unsigned dst_stride, 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, unsigned w, unsigned h); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Generic format conversion; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_fits_8unorm(const struct util_format_description *format_desc); 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgutil_format_translate(enum pipe_format dst_format, 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *dst, unsigned dst_stride, 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dst_x, unsigned dst_y, 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum pipe_format src_format, 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const void *src, unsigned src_stride, 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned src_x, unsigned src_y, 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned width, unsigned height); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Swizzle operations. 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Compose two sets of swizzles. 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If V is a 4D vector and the function parameters represent functions that 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swizzle vector components, this holds: 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * swz2(swz1(V)) = dst(V) 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_compose_swizzles(const unsigned char swz1[4], 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned char swz2[4], 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned char dst[4]); 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_swizzle_4f(float *dst, const float *src, 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned char swz[4]); 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid util_format_unswizzle_4f(float *dst, const float *src, 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned char swz[4]); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef __cplusplus 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // extern "C" { 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* ! U_FORMAT_H */ 1036