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