1956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca/************************************************************************** 2956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 3956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * Copyright 2010 VMware, Inc. 4956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * All Rights Reserved. 5956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 6956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * copy of this software and associated documentation files (the 8956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * "Software"), to deal in the Software without restriction, including 9956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * the following conditions: 13956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 14956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 17956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 18956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 19956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 20956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE. 21956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 22956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * The above copyright notice and this permission notice (including the 23956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * next paragraph) shall be included in all copies or substantial portions 24956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * of the Software. 25956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 26956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca **************************************************************************/ 27956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 28956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 29956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#include "u_math.h" 30956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#include "u_format_other.h" 311271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "u_format_rgb9e5.h" 32b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#include "u_format_r11g11b10f.h" 33956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 34956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 35956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 36d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r9g9b9e5_float_unpack_rgba_float(float *dst_row, unsigned dst_stride, 37956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 38956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 39956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 40349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák unsigned x, y; 41349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(y = 0; y < height; y += 1) { 42349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák float *dst = dst_row; 43349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák const uint8_t *src = src_row; 44349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(x = 0; x < width; x += 1) { 45349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint32_t value = *(const uint32_t *)src; 46349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 47349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = util_bswap32(value); 48349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#endif 49349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák rgb9e5_to_float3(value, dst); 50349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[3] = 1; /* a */ 51349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src += 4; 52349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst += 4; 53349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 54349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src_row += src_stride; 55349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst_row += dst_stride/sizeof(*dst_row); 56349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 57956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 58956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 59956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 60d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r9g9b9e5_float_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 61956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const float *src_row, unsigned src_stride, 62956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 63956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 64349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák unsigned x, y; 65349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(y = 0; y < height; y += 1) { 66349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák const float *src = src_row; 67349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint8_t *dst = dst_row; 68349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(x = 0; x < width; x += 1) { 69349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint32_t value = float3_to_rgb9e5(src); 70349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 71349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = util_bswap32(value); 72349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#endif 73349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák *(uint32_t *)dst = value; 74349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src += 4; 75349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst += 4; 76349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 77349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst_row += dst_stride; 78349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src_row += src_stride/sizeof(*src_row); 79349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 80956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 81956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 82956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 83d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r9g9b9e5_float_fetch_rgba_float(float *dst, const uint8_t *src, 84956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned i, unsigned j) 85956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 86349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint32_t value = *(const uint32_t *)src; 87349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 88349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = util_bswap32(value); 89349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#endif 90349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák rgb9e5_to_float3(value, dst); 91349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[3] = 1; /* a */ 92956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 93956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 94956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 95956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 96d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r9g9b9e5_float_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 97956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 98956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 99956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 100349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák unsigned x, y; 101349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák float p[3]; 102349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(y = 0; y < height; y += 1) { 103349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint8_t *dst = dst_row; 104349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák const uint8_t *src = src_row; 105349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(x = 0; x < width; x += 1) { 106349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint32_t value = *(const uint32_t *)src; 107349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 108349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = util_bswap32(value); 109349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#endif 110349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák rgb9e5_to_float3(value, p); 111349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[0] = float_to_ubyte(p[0]); /* r */ 112349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[1] = float_to_ubyte(p[1]); /* g */ 113349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[2] = float_to_ubyte(p[2]); /* b */ 114349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst[3] = 255; /* a */ 115349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src += 4; 116349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst += 4; 117349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 118349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src_row += src_stride; 119349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst_row += dst_stride/sizeof(*dst_row); 120349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 121956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 122956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 123956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 124956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 125d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r9g9b9e5_float_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 126956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 127956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 128956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 129349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák unsigned x, y; 130349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák float p[3]; 131349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(y = 0; y < height; y += 1) { 132349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák const uint8_t *src = src_row; 133349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint8_t *dst = dst_row; 134349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák for(x = 0; x < width; x += 1) { 135349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák uint32_t value; 136349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák p[0] = ubyte_to_float(src[0]); 137349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák p[1] = ubyte_to_float(src[1]); 138349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák p[2] = ubyte_to_float(src[2]); 139349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = float3_to_rgb9e5(p); 140349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 141349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák value = util_bswap32(value); 142349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák#endif 143349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák *(uint32_t *)dst = value; 144349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src += 4; 145349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst += 4; 146349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 147349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák dst_row += dst_stride; 148349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák src_row += src_stride/sizeof(*src_row); 149349184be36e59f49309b8c1f371d99efceaf6d5fMarek Olšák } 150956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 151956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 152956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 153956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 154b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákutil_format_r11g11b10_float_unpack_rgba_float(float *dst_row, unsigned dst_stride, 155b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src_row, unsigned src_stride, 156b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned width, unsigned height) 157b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák{ 158b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned x, y; 159b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(y = 0; y < height; y += 1) { 160b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák float *dst = dst_row; 161b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src = src_row; 162b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(x = 0; x < width; x += 1) { 163b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint32_t value = *(const uint32_t *)src; 164b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 165b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = util_bswap32(value); 166b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#endif 167b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák r11g11b10f_to_float3(value, dst); 168b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[3] = 1; /* a */ 169b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src += 4; 170b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst += 4; 171b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 172b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src_row += src_stride; 173b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst_row += dst_stride/sizeof(*dst_row); 174b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 175b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák} 176b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 177b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákvoid 178b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákutil_format_r11g11b10_float_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 179b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const float *src_row, unsigned src_stride, 180b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned width, unsigned height) 181b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák{ 182b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned x, y; 183b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(y = 0; y < height; y += 1) { 184b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const float *src = src_row; 185b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint8_t *dst = dst_row; 186b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(x = 0; x < width; x += 1) { 187b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint32_t value = float3_to_r11g11b10f(src); 188b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 189b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = util_bswap32(value); 190b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#endif 191b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák *(uint32_t *)dst = value; 192b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src += 4; 193b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst += 4; 194b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 195b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst_row += dst_stride; 196b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src_row += src_stride/sizeof(*src_row); 197b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 198b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák} 199b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 200b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákvoid 201b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákutil_format_r11g11b10_float_fetch_rgba_float(float *dst, const uint8_t *src, 202b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned i, unsigned j) 203b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák{ 204b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint32_t value = *(const uint32_t *)src; 205b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 206b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = util_bswap32(value); 207b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#endif 208b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák r11g11b10f_to_float3(value, dst); 209b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[3] = 1; /* a */ 210b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák} 211b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 212b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 213b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákvoid 214b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákutil_format_r11g11b10_float_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 215b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src_row, unsigned src_stride, 216b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned width, unsigned height) 217b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák{ 218b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned x, y; 219b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák float p[3]; 220b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(y = 0; y < height; y += 1) { 221b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint8_t *dst = dst_row; 222b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src = src_row; 223b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(x = 0; x < width; x += 1) { 224b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint32_t value = *(const uint32_t *)src; 225b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 226b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = util_bswap32(value); 227b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#endif 228b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák r11g11b10f_to_float3(value, p); 229b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[0] = float_to_ubyte(p[0]); /* r */ 230b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[1] = float_to_ubyte(p[1]); /* g */ 231b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[2] = float_to_ubyte(p[2]); /* b */ 232b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst[3] = 255; /* a */ 233b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src += 4; 234b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst += 4; 235b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 236b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src_row += src_stride; 237b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst_row += dst_stride/sizeof(*dst_row); 238b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 239b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák} 240b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 241b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 242b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákvoid 243b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákutil_format_r11g11b10_float_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 244b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src_row, unsigned src_stride, 245b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned width, unsigned height) 246b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák{ 247b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák unsigned x, y; 248b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák float p[3]; 249b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(y = 0; y < height; y += 1) { 250b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák const uint8_t *src = src_row; 251b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint8_t *dst = dst_row; 252b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák for(x = 0; x < width; x += 1) { 253b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák uint32_t value; 254b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák p[0] = ubyte_to_float(src[0]); 255b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák p[1] = ubyte_to_float(src[1]); 256b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák p[2] = ubyte_to_float(src[2]); 257b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = float3_to_r11g11b10f(p); 258b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#ifdef PIPE_ARCH_BIG_ENDIAN 259b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák value = util_bswap32(value); 260b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák#endif 261b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák *(uint32_t *)dst = value; 262b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src += 4; 263b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst += 4; 264b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 265b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák dst_row += dst_stride; 266b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák src_row += src_stride/sizeof(*src_row); 267b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák } 268b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák} 269b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 270b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšák 271b48359184e36ecd11510e9c87e3db535935c99e2Marek Olšákvoid 272d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r1_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 273956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 274956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 275956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 276956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 277956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 278956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 279956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 280956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 281d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r1_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 282956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const float *src_row, unsigned src_stride, 283956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 284956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 285956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 286956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 287956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 288956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 289956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 290d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, 291956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned i, unsigned j) 292956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 293956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 294956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 295956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 296956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 297956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 298d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r1_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 299956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 300956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 301956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 302956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 303956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 304956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 305956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 306956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 307d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 308956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 309956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 310956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 311956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 312956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 313956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 314956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca/* 315956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * PIPE_FORMAT_R8G8Bx_SNORM 316956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * 317956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca * A.k.a. D3DFMT_CxV8U8 318956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca */ 319956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 320c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krolstatic uint8_t 321c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krolr8g8bx_derive(int16_t r, int16_t g) 322c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol{ 323c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol /* Derive blue from red and green components. 324c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol * Apparently, we must always use integers to perform calculations, 325c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol * otherwise the results won't match D3D's CxV8U8 definition. 326c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol */ 327c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol return (uint8_t)sqrtf(0x7f * 0x7f - r * r - g * g) * 0xff / 0x7f; 328c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol} 329956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 330956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 331d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r8g8bx_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, 332956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 333956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 334956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 335956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned x, y; 336956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 337956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(y = 0; y < height; y += 1) { 338956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca float *dst = dst_row; 339956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint16_t *src = (const uint16_t *)src_row; 340956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(x = 0; x < width; x += 1) { 341956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t value = *src++; 342956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca int16_t r, g; 343956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 344956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#ifdef PIPE_ARCH_BIG_ENDIAN 345956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value = util_bswap32(value); 346956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#endif 347956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 348956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca r = ((int16_t)(value << 8)) >> 8; 349956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca g = ((int16_t)(value << 0)) >> 8; 350956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 351956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[0] = (float)(r * (1.0f/0x7f)); /* r */ 352956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[1] = (float)(g * (1.0f/0x7f)); /* g */ 353c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol dst[2] = r8g8bx_derive(r, g) * (1.0f/0xff); /* b */ 354956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[3] = 1.0f; /* a */ 355956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst += 4; 356956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 357956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src_row += src_stride; 358956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst_row += dst_stride/sizeof(*dst_row); 359956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 360956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 361956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 362956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 363956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 364d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r8g8bx_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 365956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 366956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 367956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 368956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned x, y; 369956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(y = 0; y < height; y += 1) { 370956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint8_t *dst = dst_row; 371956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint16_t *src = (const uint16_t *)src_row; 372956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(x = 0; x < width; x += 1) { 373956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t value = *src++; 374956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca int16_t r, g; 375956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 376956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#ifdef PIPE_ARCH_BIG_ENDIAN 377956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value = util_bswap32(value); 378956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#endif 379956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 380956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca r = ((int16_t)(value << 8)) >> 8; 381956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca g = ((int16_t)(value << 0)) >> 8; 382956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 383956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[0] = (uint8_t)(((uint16_t)MAX2(r, 0)) * 0xff / 0x7f); /* r */ 384956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[1] = (uint8_t)(((uint16_t)MAX2(g, 0)) * 0xff / 0x7f); /* g */ 385c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol dst[2] = r8g8bx_derive(r, g); /* b */ 386956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[3] = 255; /* a */ 387956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst += 4; 388956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 389956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src_row += src_stride; 390956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst_row += dst_stride/sizeof(*dst_row); 391956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 392956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 393956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 394956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 395956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 396d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r8g8bx_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, 397956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const float *src_row, unsigned src_stride, 398956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 399956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 400956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned x, y; 401956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(y = 0; y < height; y += 1) { 402956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const float *src = src_row; 403956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t *dst = (uint16_t *)dst_row; 404956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(x = 0; x < width; x += 1) { 405956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t value = 0; 406956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 407956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value |= (uint16_t)(((int8_t)(CLAMP(src[0], -1, 1) * 0x7f)) & 0xff) ; 408956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value |= (uint16_t)((((int8_t)(CLAMP(src[1], -1, 1) * 0x7f)) & 0xff) << 8) ; 409956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 410956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#ifdef PIPE_ARCH_BIG_ENDIAN 411956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value = util_bswap32(value); 412956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#endif 413956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 414956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca *dst++ = value; 415956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 416956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src += 4; 417956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 418956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst_row += dst_stride; 419956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src_row += src_stride/sizeof(*src_row); 420956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 421956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 422956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 423956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 424956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 425d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r8g8bx_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, 426956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src_row, unsigned src_stride, 427956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned width, unsigned height) 428956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 429956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned x, y; 430956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 431956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(y = 0; y < height; y += 1) { 432956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca const uint8_t *src = src_row; 433956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t *dst = (uint16_t *)dst_row; 434956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca for(x = 0; x < width; x += 1) { 435956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t value = 0; 436956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 437956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value |= src[0] >> 1; 438956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value |= (src[1] >> 1) << 8; 439956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 440956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#ifdef PIPE_ARCH_BIG_ENDIAN 441956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value = util_bswap32(value); 442956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#endif 443956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 444956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca *dst++ = value; 445956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 446956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src += 4; 447956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 448956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst_row += dst_stride; 449956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca src_row += src_stride/sizeof(*src_row); 450956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca } 451956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 452956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 453956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 454956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonsecavoid 455d3808b1b1f34dbb826b99102786d94e1baf9d667José Fonsecautil_format_r8g8bx_snorm_fetch_rgba_float(float *dst, const uint8_t *src, 456956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca unsigned i, unsigned j) 457956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca{ 458956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca uint16_t value = *(const uint16_t *)src; 459956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca int16_t r, g; 460956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 461956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#ifdef PIPE_ARCH_BIG_ENDIAN 462956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca value = util_bswap32(value); 463956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca#endif 464956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 465956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca r = ((int16_t)(value << 8)) >> 8; 466956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca g = ((int16_t)(value << 0)) >> 8; 467956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca 468956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[0] = r * (1.0f/0x7f); /* r */ 469956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[1] = g * (1.0f/0x7f); /* g */ 470c1f33097f4a6cd33df57dc601ba1733985979a4fMichal Krol dst[2] = r8g8bx_derive(r, g) * (1.0f/0xff); /* b */ 471956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca dst[3] = 1.0f; /* a */ 472956b2f74d8048ee9e0cfde4704bb9a5e438c3b03José Fonseca} 473