Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5564 | serge | 1 | /** |
2 | * \file format_utils.h |
||
3 | * A collection of format conversion utility functions. |
||
4 | */ |
||
5 | |||
6 | /* |
||
7 | * Mesa 3-D graphics library |
||
8 | * |
||
9 | * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. |
||
10 | * Copyright (C) 2014 Intel Corporation All Rights Reserved. |
||
11 | * |
||
12 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
13 | * copy of this software and associated documentation files (the "Software"), |
||
14 | * to deal in the Software without restriction, including without limitation |
||
15 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
16 | * and/or sell copies of the Software, and to permit persons to whom the |
||
17 | * Software is furnished to do so, subject to the following conditions: |
||
18 | * |
||
19 | * The above copyright notice and this permission notice shall be included |
||
20 | * in all copies or substantial portions of the Software. |
||
21 | * |
||
22 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
||
23 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
24 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
25 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
||
26 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
||
27 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
||
28 | * OTHER DEALINGS IN THE SOFTWARE. |
||
29 | */ |
||
30 | |||
31 | #ifndef FORMAT_UTILS_H |
||
32 | #define FORMAT_UTILS_H |
||
33 | |||
34 | #include "imports.h" |
||
35 | #include "macros.h" |
||
36 | |||
37 | extern const mesa_array_format RGBA32_FLOAT; |
||
38 | extern const mesa_array_format RGBA8_UBYTE; |
||
39 | extern const mesa_array_format RGBA32_UINT; |
||
40 | extern const mesa_array_format RGBA32_INT; |
||
41 | |||
42 | /* Only guaranteed to work for BITS <= 32 */ |
||
43 | #define MAX_UINT(BITS) ((BITS) == 32 ? UINT32_MAX : ((1u << (BITS)) - 1)) |
||
44 | #define MAX_INT(BITS) ((int)MAX_UINT((BITS) - 1)) |
||
45 | #define MIN_INT(BITS) ((BITS) == 32 ? INT32_MIN : (-(1 << (BITS - 1)))) |
||
46 | |||
47 | /* Extends an integer of size SRC_BITS to one of size DST_BITS linearly */ |
||
48 | #define EXTEND_NORMALIZED_INT(X, SRC_BITS, DST_BITS) \ |
||
49 | (((X) * (int)(MAX_UINT(DST_BITS) / MAX_UINT(SRC_BITS))) + \ |
||
50 | ((DST_BITS % SRC_BITS) ? ((X) >> (SRC_BITS - DST_BITS % SRC_BITS)) : 0)) |
||
51 | |||
52 | static inline float |
||
53 | _mesa_unorm_to_float(unsigned x, unsigned src_bits) |
||
54 | { |
||
55 | return x * (1.0f / (float)MAX_UINT(src_bits)); |
||
56 | } |
||
57 | |||
58 | static inline float |
||
59 | _mesa_snorm_to_float(int x, unsigned src_bits) |
||
60 | { |
||
61 | if (x <= -MAX_INT(src_bits)) |
||
62 | return -1.0f; |
||
63 | else |
||
64 | return x * (1.0f / (float)MAX_INT(src_bits)); |
||
65 | } |
||
66 | |||
67 | static inline uint16_t |
||
68 | _mesa_unorm_to_half(unsigned x, unsigned src_bits) |
||
69 | { |
||
70 | return _mesa_float_to_half(_mesa_unorm_to_float(x, src_bits)); |
||
71 | } |
||
72 | |||
73 | static inline uint16_t |
||
74 | _mesa_snorm_to_half(int x, unsigned src_bits) |
||
75 | { |
||
76 | return _mesa_float_to_half(_mesa_snorm_to_float(x, src_bits)); |
||
77 | } |
||
78 | |||
79 | static inline unsigned |
||
80 | _mesa_float_to_unorm(float x, unsigned dst_bits) |
||
81 | { |
||
82 | if (x < 0.0f) |
||
83 | return 0; |
||
84 | else if (x > 1.0f) |
||
85 | return MAX_UINT(dst_bits); |
||
86 | else |
||
87 | return F_TO_I(x * MAX_UINT(dst_bits)); |
||
88 | } |
||
89 | |||
90 | static inline unsigned |
||
91 | _mesa_half_to_unorm(uint16_t x, unsigned dst_bits) |
||
92 | { |
||
93 | return _mesa_float_to_unorm(_mesa_half_to_float(x), dst_bits); |
||
94 | } |
||
95 | |||
96 | static inline unsigned |
||
97 | _mesa_unorm_to_unorm(unsigned x, unsigned src_bits, unsigned dst_bits) |
||
98 | { |
||
99 | if (src_bits < dst_bits) { |
||
100 | return EXTEND_NORMALIZED_INT(x, src_bits, dst_bits); |
||
101 | } else { |
||
102 | unsigned src_half = (1 << (src_bits - 1)) - 1; |
||
103 | |||
104 | if (src_bits + dst_bits > sizeof(x) * 8) { |
||
105 | assert(src_bits + dst_bits <= sizeof(uint64_t) * 8); |
||
106 | return (((uint64_t) x * MAX_UINT(dst_bits) + src_half) / |
||
107 | MAX_UINT(src_bits)); |
||
108 | } else { |
||
109 | return (x * MAX_UINT(dst_bits) + src_half) / MAX_UINT(src_bits); |
||
110 | } |
||
111 | } |
||
112 | } |
||
113 | |||
114 | static inline unsigned |
||
115 | _mesa_snorm_to_unorm(int x, unsigned src_bits, unsigned dst_bits) |
||
116 | { |
||
117 | if (x < 0) |
||
118 | return 0; |
||
119 | else |
||
120 | return _mesa_unorm_to_unorm(x, src_bits - 1, dst_bits); |
||
121 | } |
||
122 | |||
123 | static inline int |
||
124 | _mesa_float_to_snorm(float x, unsigned dst_bits) |
||
125 | { |
||
126 | if (x < -1.0f) |
||
127 | return -MAX_INT(dst_bits); |
||
128 | else if (x > 1.0f) |
||
129 | return MAX_INT(dst_bits); |
||
130 | else |
||
131 | return F_TO_I(x * MAX_INT(dst_bits)); |
||
132 | } |
||
133 | |||
134 | static inline int |
||
135 | _mesa_half_to_snorm(uint16_t x, unsigned dst_bits) |
||
136 | { |
||
137 | return _mesa_float_to_snorm(_mesa_half_to_float(x), dst_bits); |
||
138 | } |
||
139 | |||
140 | static inline int |
||
141 | _mesa_unorm_to_snorm(unsigned x, unsigned src_bits, unsigned dst_bits) |
||
142 | { |
||
143 | return _mesa_unorm_to_unorm(x, src_bits, dst_bits - 1); |
||
144 | } |
||
145 | |||
146 | static inline int |
||
147 | _mesa_snorm_to_snorm(int x, unsigned src_bits, unsigned dst_bits) |
||
148 | { |
||
149 | if (x < -MAX_INT(src_bits)) |
||
150 | return -MAX_INT(dst_bits); |
||
151 | else if (src_bits < dst_bits) |
||
152 | return EXTEND_NORMALIZED_INT(x, src_bits - 1, dst_bits - 1); |
||
153 | else |
||
154 | return x >> (src_bits - dst_bits); |
||
155 | } |
||
156 | |||
157 | static inline unsigned |
||
158 | _mesa_unsigned_to_unsigned(unsigned src, unsigned dst_size) |
||
159 | { |
||
160 | return MIN2(src, MAX_UINT(dst_size)); |
||
161 | } |
||
162 | |||
163 | static inline int |
||
164 | _mesa_unsigned_to_signed(unsigned src, unsigned dst_size) |
||
165 | { |
||
166 | return MIN2(src, (unsigned)MAX_INT(dst_size)); |
||
167 | } |
||
168 | |||
169 | static inline int |
||
170 | _mesa_signed_to_signed(int src, unsigned dst_size) |
||
171 | { |
||
172 | return CLAMP(src, MIN_INT(dst_size), MAX_INT(dst_size)); |
||
173 | } |
||
174 | |||
175 | static inline unsigned |
||
176 | _mesa_signed_to_unsigned(int src, unsigned dst_size) |
||
177 | { |
||
178 | return CLAMP(src, 0, MAX_UINT(dst_size)); |
||
179 | } |
||
180 | |||
181 | static inline unsigned |
||
182 | _mesa_float_to_unsigned(float src, unsigned dst_bits) |
||
183 | { |
||
184 | if (src < 0.0f) |
||
185 | return 0; |
||
186 | if (src > (float)MAX_UINT(dst_bits)) |
||
187 | return MAX_UINT(dst_bits); |
||
188 | return _mesa_signed_to_unsigned(src, dst_bits); |
||
189 | } |
||
190 | |||
191 | static inline unsigned |
||
192 | _mesa_float_to_signed(float src, unsigned dst_bits) |
||
193 | { |
||
194 | if (src < (float)(-MAX_INT(dst_bits))) |
||
195 | return -MAX_INT(dst_bits); |
||
196 | if (src > (float)MAX_INT(dst_bits)) |
||
197 | return MAX_INT(dst_bits); |
||
198 | return _mesa_signed_to_signed(src, dst_bits); |
||
199 | } |
||
200 | |||
201 | static inline unsigned |
||
202 | _mesa_half_to_unsigned(uint16_t src, unsigned dst_bits) |
||
203 | { |
||
204 | if (_mesa_half_is_negative(src)) |
||
205 | return 0; |
||
206 | return _mesa_unsigned_to_unsigned(_mesa_float_to_half(src), dst_bits); |
||
207 | } |
||
208 | |||
209 | static inline unsigned |
||
210 | _mesa_half_to_signed(uint16_t src, unsigned dst_bits) |
||
211 | { |
||
212 | return _mesa_float_to_signed(_mesa_half_to_float(src), dst_bits); |
||
213 | } |
||
214 | |||
215 | bool |
||
216 | _mesa_format_to_array(mesa_format, GLenum *type, int *num_components, |
||
217 | uint8_t swizzle[4], bool *normalized); |
||
218 | |||
219 | void |
||
220 | _mesa_swizzle_and_convert(void *dst, |
||
221 | enum mesa_array_format_datatype dst_type, |
||
222 | int num_dst_channels, |
||
223 | const void *src, |
||
224 | enum mesa_array_format_datatype src_type, |
||
225 | int num_src_channels, |
||
226 | const uint8_t swizzle[4], bool normalized, int count); |
||
227 | |||
228 | bool |
||
229 | _mesa_compute_rgba2base2rgba_component_mapping(GLenum baseFormat, uint8_t *map); |
||
230 | |||
231 | void |
||
232 | _mesa_format_convert(void *void_dst, uint32_t dst_format, size_t dst_stride, |
||
233 | void *void_src, uint32_t src_format, size_t src_stride, |
||
234 | size_t width, size_t height, uint8_t *rebase_swizzle); |
||
235 | |||
236 | #endif>>>>>>=>><>>>=>><>><>=> |