Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/util/format/u_format_bptc.c
7197 views
1
/**************************************************************************
2
*
3
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
4
* Copyright (c) 2008 VMware, Inc.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a
7
* copy of this software and associated documentation files (the "Software"),
8
* to deal in the Software without restriction, including without limitation
9
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
* and/or sell copies of the Software, and to permit persons to whom the
11
* Software is furnished to do so, subject to the following conditions:
12
*
13
* The above copyright notice and this permission notice shall be included
14
* in all copies or substantial portions of the Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
* OTHER DEALINGS IN THE SOFTWARE.
23
*
24
**************************************************************************/
25
26
#include "util/format/u_format.h"
27
#include "util/format/u_format_bptc.h"
28
#include "u_format_pack.h"
29
#include "util/format_srgb.h"
30
#include "util/u_math.h"
31
32
#define BPTC_BLOCK_DECODE
33
#include "../../mesa/main/texcompress_bptc_tmp.h"
34
35
void
36
util_format_bptc_rgba_unorm_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
37
const uint8_t *restrict src_row, unsigned src_stride,
38
unsigned width, unsigned height)
39
{
40
decompress_rgba_unorm(width, height,
41
src_row, src_stride,
42
dst_row, dst_stride);
43
}
44
45
void
46
util_format_bptc_rgba_unorm_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
47
const uint8_t *restrict src_row, unsigned src_stride,
48
unsigned width, unsigned height)
49
{
50
compress_rgba_unorm(width, height,
51
src_row, src_stride,
52
dst_row, dst_stride);
53
}
54
55
void
56
util_format_bptc_rgba_unorm_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
57
const uint8_t *restrict src_row, unsigned src_stride,
58
unsigned width, unsigned height)
59
{
60
uint8_t *temp_block;
61
temp_block = malloc(width * height * 4 * sizeof(uint8_t));
62
decompress_rgba_unorm(width, height,
63
src_row, src_stride,
64
temp_block, width * 4 * sizeof(uint8_t));
65
/* Direct call to row unpack instead of util_format_rgba_unpack_rect()
66
* to avoid table lookup that would pull in all unpack symbols.
67
*/
68
for (int y = 0; y < height; y++) {
69
util_format_r8g8b8a8_unorm_unpack_rgba_float((char *)dst_row + dst_stride * y,
70
temp_block + 4 * width * y,
71
width);
72
}
73
free((void *) temp_block);
74
}
75
76
void
77
util_format_bptc_rgba_unorm_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
78
const float *restrict src_row, unsigned src_stride,
79
unsigned width, unsigned height)
80
{
81
uint8_t *temp_block;
82
temp_block = malloc(width * height * 4 * sizeof(uint8_t));
83
/* Direct call to row unpack instead of util_format_rgba_unpack_rect()
84
* to avoid table lookup that would pull in all unpack symbols.
85
*/
86
for (int y = 0; y < height; y++) {
87
util_format_r32g32b32a32_float_unpack_rgba_8unorm(
88
temp_block + 4 * width * y,
89
(uint8_t *)src_row + src_stride * y,
90
width);
91
}
92
compress_rgba_unorm(width, height,
93
temp_block, width * 4 * sizeof(uint8_t),
94
dst_row, dst_stride);
95
free((void *) temp_block);
96
}
97
98
void
99
util_format_bptc_rgba_unorm_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
100
unsigned width, unsigned height)
101
{
102
uint8_t temp_block[4];
103
104
fetch_rgba_unorm_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
105
temp_block, (width % 4) + (height % 4) * 4);
106
107
util_format_read_4(PIPE_FORMAT_R8G8B8A8_UNORM,
108
dst, 4 * sizeof(float),
109
temp_block, 4 * sizeof(uint8_t),
110
0, 0, 1, 1);
111
}
112
113
void
114
util_format_bptc_srgba_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
115
const uint8_t *restrict src_row, unsigned src_stride,
116
unsigned width, unsigned height)
117
{
118
decompress_rgba_unorm(width, height,
119
src_row, src_stride,
120
dst_row, dst_stride);
121
}
122
123
void
124
util_format_bptc_srgba_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
125
const uint8_t *restrict src_row, unsigned src_stride,
126
unsigned width, unsigned height)
127
{
128
compress_rgba_unorm(width, height,
129
src_row, src_stride,
130
dst_row, dst_stride);
131
}
132
133
void
134
util_format_bptc_srgba_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
135
const uint8_t *restrict src_row, unsigned src_stride,
136
unsigned width, unsigned height)
137
{
138
uint8_t *temp_block;
139
temp_block = malloc(width * height * 4 * sizeof(uint8_t));
140
decompress_rgba_unorm(width, height,
141
src_row, src_stride,
142
temp_block, width * 4 * sizeof(uint8_t));
143
144
/* Direct call to row unpack instead of util_format_rgba_unpack_rect()
145
* to avoid table lookup that would pull in all unpack symbols.
146
*/
147
for (int y = 0; y < height; y++) {
148
util_format_r8g8b8a8_srgb_unpack_rgba_float((char *)dst_row + dst_stride * y,
149
temp_block + width * 4 * y,
150
width);
151
}
152
153
free((void *) temp_block);
154
}
155
156
void
157
util_format_bptc_srgba_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
158
const float *restrict src_row, unsigned src_stride,
159
unsigned width, unsigned height)
160
{
161
compress_rgb_float(width, height,
162
src_row, src_stride,
163
dst_row, dst_stride,
164
true);
165
}
166
167
void
168
util_format_bptc_srgba_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
169
unsigned width, unsigned height)
170
{
171
uint8_t temp_block[4];
172
173
fetch_rgba_unorm_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
174
temp_block, (width % 4) + (height % 4) * 4);
175
util_format_r8g8b8a8_srgb_fetch_rgba(dst, temp_block, 0, 0);
176
}
177
178
void
179
util_format_bptc_rgb_float_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
180
const uint8_t *restrict src_row, unsigned src_stride,
181
unsigned width, unsigned height)
182
{
183
float *temp_block;
184
temp_block = malloc(width * height * 4 * sizeof(float));
185
decompress_rgb_float(width, height,
186
src_row, src_stride,
187
temp_block, width * 4 * sizeof(float),
188
true);
189
/* Direct call to row unpack instead of util_format_rgba_unpack_rect()
190
* to avoid table lookup that would pull in all unpack symbols.
191
*/
192
for (int y = 0; y < height; y++) {
193
util_format_r32g32b32a32_float_unpack_rgba_8unorm(
194
dst_row + dst_stride * y,
195
(const uint8_t *)temp_block + width * 4 * sizeof(float) * y,
196
width);
197
}
198
free((void *) temp_block);
199
}
200
201
void
202
util_format_bptc_rgb_float_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
203
const uint8_t *restrict src_row, unsigned src_stride,
204
unsigned width, unsigned height)
205
{
206
compress_rgba_unorm(width, height,
207
src_row, src_stride,
208
dst_row, dst_stride);
209
}
210
211
void
212
util_format_bptc_rgb_float_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
213
const uint8_t *restrict src_row, unsigned src_stride,
214
unsigned width, unsigned height)
215
{
216
decompress_rgb_float(width, height,
217
src_row, src_stride,
218
dst_row, dst_stride,
219
true);
220
}
221
222
void
223
util_format_bptc_rgb_float_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
224
const float *restrict src_row, unsigned src_stride,
225
unsigned width, unsigned height)
226
{
227
compress_rgb_float(width, height,
228
src_row, src_stride,
229
dst_row, dst_stride,
230
true);
231
}
232
233
void
234
util_format_bptc_rgb_float_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
235
unsigned width, unsigned height)
236
{
237
fetch_rgb_float_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
238
dst, (width % 4) + (height % 4) * 4, true);
239
}
240
241
void
242
util_format_bptc_rgb_ufloat_unpack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
243
const uint8_t *restrict src_row, unsigned src_stride,
244
unsigned width, unsigned height)
245
{
246
float *temp_block;
247
temp_block = malloc(width * height * 4 * sizeof(float));
248
decompress_rgb_float(width, height,
249
src_row, src_stride,
250
temp_block, width * 4 * sizeof(float),
251
false);
252
/* Direct call to row unpack instead of util_format_rgba_unpack_8unorm()
253
* to avoid table lookup that would pull in all unpack symbols.
254
*/
255
for (int y = 0; y < height; y++) {
256
util_format_r32g32b32a32_float_unpack_rgba_8unorm(dst_row + dst_stride * y,
257
(void *)(temp_block + 4 * width * y),
258
width);
259
}
260
free((void *) temp_block);
261
}
262
263
void
264
util_format_bptc_rgb_ufloat_pack_rgba_8unorm(uint8_t *restrict dst_row, unsigned dst_stride,
265
const uint8_t *restrict src_row, unsigned src_stride,
266
unsigned width, unsigned height)
267
{
268
compress_rgba_unorm(width, height,
269
src_row, src_stride,
270
dst_row, dst_stride);
271
}
272
273
void
274
util_format_bptc_rgb_ufloat_unpack_rgba_float(void *restrict dst_row, unsigned dst_stride,
275
const uint8_t *restrict src_row, unsigned src_stride,
276
unsigned width, unsigned height)
277
{
278
decompress_rgb_float(width, height,
279
src_row, src_stride,
280
dst_row, dst_stride,
281
false);
282
}
283
284
void
285
util_format_bptc_rgb_ufloat_pack_rgba_float(uint8_t *restrict dst_row, unsigned dst_stride,
286
const float *restrict src_row, unsigned src_stride,
287
unsigned width, unsigned height)
288
{
289
compress_rgb_float(width, height,
290
src_row, src_stride,
291
dst_row, dst_stride,
292
false);
293
}
294
295
void
296
util_format_bptc_rgb_ufloat_fetch_rgba(void *restrict dst, const uint8_t *restrict src,
297
unsigned width, unsigned height)
298
{
299
fetch_rgb_float_from_block(src + ((width * sizeof(uint8_t)) * (height / 4) + (width / 4)) * 16,
300
dst, (width % 4) + (height % 4) * 4, false);
301
}
302
303