Subversion Repositories Kolibri OS

Rev

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