mesa: fix packing/unpacking for MESA_FORMAT_A4R4G4B4_UNORM
[mesa.git] / src / mesa / swrast / s_texfetch_tmp.h
1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
5 * Copyright (c) 2008-2009 VMware, Inc.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 * OTHER DEALINGS IN THE SOFTWARE.
24 */
25
26
27 /**
28 * \file texfetch_tmp.h
29 * Texel fetch functions template.
30 *
31 * This template file is used by texfetch.c to generate texel fetch functions
32 * for 1-D, 2-D and 3-D texture images.
33 *
34 * It should be expanded by defining \p DIM as the number texture dimensions
35 * (1, 2 or 3). According to the value of \p DIM a series of macros is defined
36 * for the texel lookup in the gl_texture_image::Data.
37 *
38 * \author Gareth Hughes
39 * \author Brian Paul
40 */
41
42
43 #if DIM == 1
44
45 #define TEXEL_ADDR( type, image, i, j, k, size ) \
46 ((void) (j), (void) (k), ((type *)(image)->ImageSlices[0] + (i) * (size)))
47
48 #define FETCH(x) fetch_texel_1d_##x
49
50 #elif DIM == 2
51
52 #define TEXEL_ADDR( type, image, i, j, k, size ) \
53 ((void) (k), \
54 ((type *)((GLubyte *) (image)->ImageSlices[0] + (image)->RowStride * (j)) + \
55 (i) * (size)))
56
57 #define FETCH(x) fetch_texel_2d_##x
58
59 #elif DIM == 3
60
61 #define TEXEL_ADDR( type, image, i, j, k, size ) \
62 ((type *)((GLubyte *) (image)->ImageSlices[k] + \
63 (image)->RowStride * (j)) + (i) * (size))
64
65 #define FETCH(x) fetch_texel_3d_##x
66
67 #else
68 #error illegal number of texture dimensions
69 #endif
70
71
72 /* MESA_FORMAT_Z_UNORM32 ***********************************************************/
73
74 /* Fetch depth texel from 1D, 2D or 3D 32-bit depth texture,
75 * returning 1 GLfloat.
76 * Note: no GLchan version of this function.
77 */
78 static void FETCH(f_z32)( const struct swrast_texture_image *texImage,
79 GLint i, GLint j, GLint k, GLfloat *texel )
80 {
81 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
82 texel[0] = src[0] * (1.0F / 0xffffffff);
83 }
84
85
86 /* MESA_FORMAT_Z_UNORM16 ***********************************************************/
87
88 /* Fetch depth texel from 1D, 2D or 3D 16-bit depth texture,
89 * returning 1 GLfloat.
90 * Note: no GLchan version of this function.
91 */
92 static void FETCH(f_z16)(const struct swrast_texture_image *texImage,
93 GLint i, GLint j, GLint k, GLfloat *texel )
94 {
95 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
96 texel[0] = src[0] * (1.0F / 65535.0F);
97 }
98
99
100
101 /* MESA_FORMAT_RGBA_F32 ******************************************************/
102
103 /* Fetch texel from 1D, 2D or 3D RGBA_FLOAT32 texture, returning 4 GLfloats.
104 */
105 static void FETCH(f_rgba_f32)( const struct swrast_texture_image *texImage,
106 GLint i, GLint j, GLint k, GLfloat *texel )
107 {
108 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
109 texel[RCOMP] = src[0];
110 texel[GCOMP] = src[1];
111 texel[BCOMP] = src[2];
112 texel[ACOMP] = src[3];
113 }
114
115
116
117
118 /* MESA_FORMAT_RGBA_F16 ******************************************************/
119
120 /* Fetch texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
121 * returning 4 GLfloats.
122 */
123 static void FETCH(f_rgba_f16)( const struct swrast_texture_image *texImage,
124 GLint i, GLint j, GLint k, GLfloat *texel )
125 {
126 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
127 texel[RCOMP] = _mesa_half_to_float(src[0]);
128 texel[GCOMP] = _mesa_half_to_float(src[1]);
129 texel[BCOMP] = _mesa_half_to_float(src[2]);
130 texel[ACOMP] = _mesa_half_to_float(src[3]);
131 }
132
133
134
135 /* MESA_FORMAT_RGB_F32 *******************************************************/
136
137 /* Fetch texel from 1D, 2D or 3D RGB_FLOAT32 texture,
138 * returning 4 GLfloats.
139 */
140 static void FETCH(f_rgb_f32)( const struct swrast_texture_image *texImage,
141 GLint i, GLint j, GLint k, GLfloat *texel )
142 {
143 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3);
144 texel[RCOMP] = src[0];
145 texel[GCOMP] = src[1];
146 texel[BCOMP] = src[2];
147 texel[ACOMP] = 1.0F;
148 }
149
150
151
152
153 /* MESA_FORMAT_RGB_F16 *******************************************************/
154
155 /* Fetch texel from 1D, 2D or 3D RGB_FLOAT16 texture,
156 * returning 4 GLfloats.
157 */
158 static void FETCH(f_rgb_f16)( const struct swrast_texture_image *texImage,
159 GLint i, GLint j, GLint k, GLfloat *texel )
160 {
161 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3);
162 texel[RCOMP] = _mesa_half_to_float(src[0]);
163 texel[GCOMP] = _mesa_half_to_float(src[1]);
164 texel[BCOMP] = _mesa_half_to_float(src[2]);
165 texel[ACOMP] = 1.0F;
166 }
167
168
169
170
171 /* MESA_FORMAT_ALPHA_F32 *****************************************************/
172
173 /* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
174 * returning 4 GLfloats.
175 */
176 static void FETCH(f_alpha_f32)( const struct swrast_texture_image *texImage,
177 GLint i, GLint j, GLint k, GLfloat *texel )
178 {
179 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
180 texel[RCOMP] =
181 texel[GCOMP] =
182 texel[BCOMP] = 0.0F;
183 texel[ACOMP] = src[0];
184 }
185
186
187
188
189 /* MESA_FORMAT_ALPHA_F32 *****************************************************/
190
191 /* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
192 * returning 4 GLfloats.
193 */
194 static void FETCH(f_alpha_f16)( const struct swrast_texture_image *texImage,
195 GLint i, GLint j, GLint k, GLfloat *texel )
196 {
197 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
198 texel[RCOMP] =
199 texel[GCOMP] =
200 texel[BCOMP] = 0.0F;
201 texel[ACOMP] = _mesa_half_to_float(src[0]);
202 }
203
204
205
206
207 /* MESA_FORMAT_LUMINANCE_F32 *************************************************/
208
209 /* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
210 * returning 4 GLfloats.
211 */
212 static void FETCH(f_luminance_f32)( const struct swrast_texture_image *texImage,
213 GLint i, GLint j, GLint k, GLfloat *texel )
214 {
215 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
216 texel[RCOMP] =
217 texel[GCOMP] =
218 texel[BCOMP] = src[0];
219 texel[ACOMP] = 1.0F;
220 }
221
222
223
224
225 /* MESA_FORMAT_LUMINANCE_F16 *************************************************/
226
227 /* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
228 * returning 4 GLfloats.
229 */
230 static void FETCH(f_luminance_f16)( const struct swrast_texture_image *texImage,
231 GLint i, GLint j, GLint k, GLfloat *texel )
232 {
233 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
234 texel[RCOMP] =
235 texel[GCOMP] =
236 texel[BCOMP] = _mesa_half_to_float(src[0]);
237 texel[ACOMP] = 1.0F;
238 }
239
240
241
242
243 /* MESA_FORMAT_LUMINANCE_ALPHA_F32 *******************************************/
244
245 /* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
246 * returning 4 GLfloats.
247 */
248 static void FETCH(f_luminance_alpha_f32)( const struct swrast_texture_image *texImage,
249 GLint i, GLint j, GLint k, GLfloat *texel )
250 {
251 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
252 texel[RCOMP] =
253 texel[GCOMP] =
254 texel[BCOMP] = src[0];
255 texel[ACOMP] = src[1];
256 }
257
258
259
260
261 /* MESA_FORMAT_LUMINANCE_ALPHA_F16 *******************************************/
262
263 /* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
264 * returning 4 GLfloats.
265 */
266 static void FETCH(f_luminance_alpha_f16)( const struct swrast_texture_image *texImage,
267 GLint i, GLint j, GLint k, GLfloat *texel )
268 {
269 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
270 texel[RCOMP] =
271 texel[GCOMP] =
272 texel[BCOMP] = _mesa_half_to_float(src[0]);
273 texel[ACOMP] = _mesa_half_to_float(src[1]);
274 }
275
276
277
278
279 /* MESA_FORMAT_INTENSITY_F32 *************************************************/
280
281 /* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
282 * returning 4 GLfloats.
283 */
284 static void FETCH(f_intensity_f32)( const struct swrast_texture_image *texImage,
285 GLint i, GLint j, GLint k, GLfloat *texel )
286 {
287 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
288 texel[RCOMP] =
289 texel[GCOMP] =
290 texel[BCOMP] =
291 texel[ACOMP] = src[0];
292 }
293
294
295
296
297 /* MESA_FORMAT_INTENSITY_F16 *************************************************/
298
299 /* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
300 * returning 4 GLfloats.
301 */
302 static void FETCH(f_intensity_f16)( const struct swrast_texture_image *texImage,
303 GLint i, GLint j, GLint k, GLfloat *texel )
304 {
305 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
306 texel[RCOMP] =
307 texel[GCOMP] =
308 texel[BCOMP] =
309 texel[ACOMP] = _mesa_half_to_float(src[0]);
310 }
311
312
313
314
315 /* MESA_FORMAT_R_FLOAT32 *****************************************************/
316
317 /* Fetch texel from 1D, 2D or 3D R_FLOAT32 texture,
318 * returning 4 GLfloats.
319 */
320 static void FETCH(f_r_f32)( const struct swrast_texture_image *texImage,
321 GLint i, GLint j, GLint k, GLfloat *texel )
322 {
323 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
324 texel[RCOMP] = src[0];
325 texel[GCOMP] = 0.0F;
326 texel[BCOMP] = 0.0F;
327 texel[ACOMP] = 1.0F;
328 }
329
330
331
332
333 /* MESA_FORMAT_R_FLOAT16 *****************************************************/
334
335 /* Fetch texel from 1D, 2D or 3D R_FLOAT16 texture,
336 * returning 4 GLfloats.
337 */
338 static void FETCH(f_r_f16)( const struct swrast_texture_image *texImage,
339 GLint i, GLint j, GLint k, GLfloat *texel )
340 {
341 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
342 texel[RCOMP] = _mesa_half_to_float(src[0]);
343 texel[GCOMP] = 0.0F;
344 texel[BCOMP] = 0.0F;
345 texel[ACOMP] = 1.0F;
346 }
347
348
349
350
351 /* MESA_FORMAT_RG_FLOAT32 ****************************************************/
352
353 /* Fetch texel from 1D, 2D or 3D RG_FLOAT32 texture,
354 * returning 4 GLfloats.
355 */
356 static void FETCH(f_rg_f32)( const struct swrast_texture_image *texImage,
357 GLint i, GLint j, GLint k, GLfloat *texel )
358 {
359 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
360 texel[RCOMP] = src[0];
361 texel[GCOMP] = src[1];
362 texel[BCOMP] = 0.0F;
363 texel[ACOMP] = 1.0F;
364 }
365
366
367
368
369 /* MESA_FORMAT_RG_FLOAT16 ****************************************************/
370
371 /* Fetch texel from 1D, 2D or 3D RG_FLOAT16 texture,
372 * returning 4 GLfloats.
373 */
374 static void FETCH(f_rg_f16)( const struct swrast_texture_image *texImage,
375 GLint i, GLint j, GLint k, GLfloat *texel )
376 {
377 const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
378 texel[RCOMP] = _mesa_half_to_float(src[0]);
379 texel[GCOMP] = _mesa_half_to_float(src[1]);
380 texel[BCOMP] = 0.0F;
381 texel[ACOMP] = 1.0F;
382 }
383
384
385
386
387 /*
388 * Begin Hardware formats
389 */
390
391 /* MESA_FORMAT_A8B8G8R8_UNORM ******************************************************/
392
393 /* Fetch texel from 1D, 2D or 3D rgba8888 texture, return 4 GLfloats */
394 static void FETCH(f_rgba8888)( const struct swrast_texture_image *texImage,
395 GLint i, GLint j, GLint k, GLfloat *texel )
396 {
397 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
398 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24) );
399 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
400 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
401 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
402 }
403
404
405
406
407
408
409 /* MESA_FORMAT_RGBA888_REV ***************************************************/
410
411 /* Fetch texel from 1D, 2D or 3D abgr8888 texture, return 4 GLchans */
412 static void FETCH(f_rgba8888_rev)( const struct swrast_texture_image *texImage,
413 GLint i, GLint j, GLint k, GLfloat *texel )
414 {
415 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
416 texel[RCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
417 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
418 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
419 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) );
420 }
421
422
423
424
425 /* MESA_FORMAT_B8G8R8A8_UNORM ******************************************************/
426
427 /* Fetch texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */
428 static void FETCH(f_argb8888)( const struct swrast_texture_image *texImage,
429 GLint i, GLint j, GLint k, GLfloat *texel )
430 {
431 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
432 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
433 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
434 texel[BCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
435 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) );
436 }
437
438
439
440
441 /* MESA_FORMAT_A8R8G8B8_UNORM **************************************************/
442
443 /* Fetch texel from 1D, 2D or 3D argb8888_rev texture, return 4 GLfloats */
444 static void FETCH(f_argb8888_rev)( const struct swrast_texture_image *texImage,
445 GLint i, GLint j, GLint k, GLfloat *texel )
446 {
447 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
448 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
449 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
450 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24) );
451 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
452 }
453
454
455
456
457 /* MESA_FORMAT_X8B8G8R8_UNORM ******************************************************/
458
459 /* Fetch texel from 1D, 2D or 3D rgbx8888 texture, return 4 GLfloats */
460 static void FETCH(f_rgbx8888)( const struct swrast_texture_image *texImage,
461 GLint i, GLint j, GLint k, GLfloat *texel )
462 {
463 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
464 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24) );
465 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
466 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
467 texel[ACOMP] = 1.0f;
468 }
469
470
471
472
473 /* MESA_FORMAT_RGBX888_REV ***************************************************/
474
475 /* Fetch texel from 1D, 2D or 3D rgbx8888_rev texture, return 4 GLchans */
476 static void FETCH(f_rgbx8888_rev)( const struct swrast_texture_image *texImage,
477 GLint i, GLint j, GLint k, GLfloat *texel )
478 {
479 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
480 texel[RCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
481 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
482 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
483 texel[ACOMP] = 1.0f;
484 }
485
486
487
488
489 /* MESA_FORMAT_B8G8R8X8_UNORM ******************************************************/
490
491 /* Fetch texel from 1D, 2D or 3D xrgb8888 texture, return 4 GLchans */
492 static void FETCH(f_xrgb8888)( const struct swrast_texture_image *texImage,
493 GLint i, GLint j, GLint k, GLfloat *texel )
494 {
495 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
496 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
497 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
498 texel[BCOMP] = UBYTE_TO_FLOAT( (s ) & 0xff );
499 texel[ACOMP] = 1.0f;
500 }
501
502
503
504
505 /* MESA_FORMAT_X8R8G8B8_UNORM **************************************************/
506
507 /* Fetch texel from 1D, 2D or 3D xrgb8888_rev texture, return 4 GLfloats */
508 static void FETCH(f_xrgb8888_rev)( const struct swrast_texture_image *texImage,
509 GLint i, GLint j, GLint k, GLfloat *texel )
510 {
511 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
512 texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 8) & 0xff );
513 texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
514 texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24) );
515 texel[ACOMP] = 1.0f;
516 }
517
518
519
520
521 /* MESA_FORMAT_BGR_UNORM8 ********************************************************/
522
523 /* Fetch texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */
524 static void FETCH(f_rgb888)( const struct swrast_texture_image *texImage,
525 GLint i, GLint j, GLint k, GLfloat *texel )
526 {
527 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
528 texel[RCOMP] = UBYTE_TO_FLOAT( src[2] );
529 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
530 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
531 texel[ACOMP] = 1.0F;
532 }
533
534
535
536
537 /* MESA_FORMAT_RGB_UNORM8 ********************************************************/
538
539 /* Fetch texel from 1D, 2D or 3D bgr888 texture, return 4 GLchans */
540 static void FETCH(f_bgr888)( const struct swrast_texture_image *texImage,
541 GLint i, GLint j, GLint k, GLfloat *texel )
542 {
543 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
544 texel[RCOMP] = UBYTE_TO_FLOAT( src[0] );
545 texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
546 texel[BCOMP] = UBYTE_TO_FLOAT( src[2] );
547 texel[ACOMP] = 1.0F;
548 }
549
550
551
552
553 /* use color expansion like (g << 2) | (g >> 4) (does somewhat random rounding)
554 instead of slow (g << 2) * 255 / 252 (always rounds down) */
555
556 /* MESA_FORMAT_B5G6R5_UNORM ********************************************************/
557
558 /* Fetch texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
559 static void FETCH(f_rgb565)( const struct swrast_texture_image *texImage,
560 GLint i, GLint j, GLint k, GLfloat *texel )
561 {
562 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
563 const GLushort s = *src;
564 texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
565 texel[GCOMP] = ((s >> 5 ) & 0x3f) * (1.0F / 63.0F);
566 texel[BCOMP] = ((s ) & 0x1f) * (1.0F / 31.0F);
567 texel[ACOMP] = 1.0F;
568 }
569
570
571
572
573 /* MESA_FORMAT_R5G6B5_UNORM ****************************************************/
574
575 /* Fetch texel from 1D, 2D or 3D rgb565_rev texture, return 4 GLchans */
576 static void FETCH(f_rgb565_rev)( const struct swrast_texture_image *texImage,
577 GLint i, GLint j, GLint k, GLfloat *texel )
578 {
579 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
580 const GLushort s = (*src >> 8) | (*src << 8); /* byte swap */
581 texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) );
582 texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 3) & 0xfc) | ((s >> 9) & 0x3) );
583 texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >> 2) & 0x7) );
584 texel[ACOMP] = 1.0F;
585 }
586
587
588
589
590 /* MESA_FORMAT_B4G4R4A4_UNORM ******************************************************/
591
592 /* Fetch texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */
593 static void FETCH(f_argb4444)( const struct swrast_texture_image *texImage,
594 GLint i, GLint j, GLint k, GLfloat *texel )
595 {
596 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
597 const GLushort s = *src;
598 texel[RCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F);
599 texel[GCOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
600 texel[BCOMP] = ((s ) & 0xf) * (1.0F / 15.0F);
601 texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
602 }
603
604
605
606
607 /* MESA_FORMAT_A4R4G4B4_UNORM **************************************************/
608
609 /* Fetch texel from 1D, 2D or 3D argb4444_rev texture, return 4 GLchans */
610 static void FETCH(f_argb4444_rev)( const struct swrast_texture_image *texImage,
611 GLint i, GLint j, GLint k, GLfloat *texel )
612 {
613 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
614 texel[RCOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
615 texel[GCOMP] = ((s >> 8) & 0xf) * (1.0F / 15.0F);
616 texel[BCOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
617 texel[ACOMP] = ((s ) & 0xf) * (1.0F / 15.0F);
618 }
619
620
621
622 /* MESA_FORMAT_A1B5G5R5_UNORM ******************************************************/
623
624 /* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
625 static void FETCH(f_rgba5551)( const struct swrast_texture_image *texImage,
626 GLint i, GLint j, GLint k, GLfloat *texel )
627 {
628 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
629 const GLushort s = *src;
630 texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
631 texel[GCOMP] = ((s >> 6) & 0x1f) * (1.0F / 31.0F);
632 texel[BCOMP] = ((s >> 1) & 0x1f) * (1.0F / 31.0F);
633 texel[ACOMP] = ((s ) & 0x01) * 1.0F;
634 }
635
636
637
638 /* MESA_FORMAT_B5G5R5A1_UNORM ******************************************************/
639
640 /* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
641 static void FETCH(f_argb1555)( const struct swrast_texture_image *texImage,
642 GLint i, GLint j, GLint k, GLfloat *texel )
643 {
644 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
645 const GLushort s = *src;
646 texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F);
647 texel[GCOMP] = ((s >> 5) & 0x1f) * (1.0F / 31.0F);
648 texel[BCOMP] = ((s >> 0) & 0x1f) * (1.0F / 31.0F);
649 texel[ACOMP] = ((s >> 15) & 0x01) * 1.0F;
650 }
651
652
653
654
655 /* MESA_FORMAT_A1R5G5B5_UNORM **************************************************/
656
657 /* Fetch texel from 1D, 2D or 3D argb1555_rev texture, return 4 GLchans */
658 static void FETCH(f_argb1555_rev)( const struct swrast_texture_image *texImage,
659 GLint i, GLint j, GLint k, GLfloat *texel )
660 {
661 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
662 const GLushort s = (*src << 8) | (*src >> 8); /* byteswap */
663 texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 7) & 0xf8) | ((s >> 12) & 0x7) );
664 texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 2) & 0xf8) | ((s >> 7) & 0x7) );
665 texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >> 2) & 0x7) );
666 texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 );
667 }
668
669
670
671
672 /* MESA_FORMAT_B10G10R10A2_UNORM ***************************************************/
673
674 /* Fetch texel from 1D, 2D or 3D argb2101010 texture, return 4 GLchans */
675 static void FETCH(f_argb2101010)( const struct swrast_texture_image *texImage,
676 GLint i, GLint j, GLint k, GLfloat *texel )
677 {
678 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
679 const GLuint s = *src;
680 texel[RCOMP] = ((s >> 20) & 0x3ff) * (1.0F / 1023.0F);
681 texel[GCOMP] = ((s >> 10) & 0x3ff) * (1.0F / 1023.0F);
682 texel[BCOMP] = ((s >> 0) & 0x3ff) * (1.0F / 1023.0F);
683 texel[ACOMP] = ((s >> 30) & 0x03) * (1.0F / 3.0F);
684 }
685
686
687
688
689 /* MESA_FORMAT_R8G8_UNORM **********************************************************/
690
691 /* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
692 static void FETCH(f_gr88)( const struct swrast_texture_image *texImage,
693 GLint i, GLint j, GLint k, GLfloat *texel )
694 {
695 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
696 texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
697 texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
698 texel[BCOMP] = 0.0;
699 texel[ACOMP] = 1.0;
700 }
701
702
703
704
705 /* MESA_FORMAT_G8R8_UNORM ******************************************************/
706
707 /* Fetch texel from 1D, 2D or 3D rg88_rev texture, return 4 GLchans */
708 static void FETCH(f_rg88)( const struct swrast_texture_image *texImage,
709 GLint i, GLint j, GLint k, GLfloat *texel )
710 {
711 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
712 texel[RCOMP] = UBYTE_TO_FLOAT( s >> 8 );
713 texel[GCOMP] = UBYTE_TO_FLOAT( s & 0xff );
714 texel[BCOMP] = 0.0;
715 texel[ACOMP] = 1.0;
716 }
717
718
719
720
721 /* MESA_FORMAT_L4A4_UNORM **********************************************************/
722
723 /* Fetch texel from 1D, 2D or 3D al44 texture, return 4 GLchans */
724 static void FETCH(f_al44)( const struct swrast_texture_image *texImage,
725 GLint i, GLint j, GLint k, GLfloat *texel )
726 {
727 const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
728 texel[RCOMP] =
729 texel[GCOMP] =
730 texel[BCOMP] = (s & 0xf) * (1.0F / 15.0F);
731 texel[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
732 }
733
734
735
736
737 /* MESA_FORMAT_L8A8_UNORM **********************************************************/
738
739 /* Fetch texel from 1D, 2D or 3D al88 texture, return 4 GLchans */
740 static void FETCH(f_al88)( const struct swrast_texture_image *texImage,
741 GLint i, GLint j, GLint k, GLfloat *texel )
742 {
743 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
744 texel[RCOMP] =
745 texel[GCOMP] =
746 texel[BCOMP] = UBYTE_TO_FLOAT( s & 0xff );
747 texel[ACOMP] = UBYTE_TO_FLOAT( s >> 8 );
748 }
749
750
751
752
753 /* MESA_FORMAT_R_UNORM8 ************************************************************/
754
755 /* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
756 static void FETCH(f_r8)(const struct swrast_texture_image *texImage,
757 GLint i, GLint j, GLint k, GLfloat *texel)
758 {
759 const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
760 texel[RCOMP] = UBYTE_TO_FLOAT(s);
761 texel[GCOMP] = 0.0;
762 texel[BCOMP] = 0.0;
763 texel[ACOMP] = 1.0;
764 }
765
766
767
768
769 /* MESA_FORMAT_R_UNORM16 ***********************************************************/
770
771 /* Fetch texel from 1D, 2D or 3D r16 texture, return 4 GLchans */
772 static void FETCH(f_r16)(const struct swrast_texture_image *texImage,
773 GLint i, GLint j, GLint k, GLfloat *texel)
774 {
775 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
776 texel[RCOMP] = USHORT_TO_FLOAT(s);
777 texel[GCOMP] = 0.0;
778 texel[BCOMP] = 0.0;
779 texel[ACOMP] = 1.0;
780 }
781
782
783
784
785 /* MESA_FORMAT_A8L8_UNORM ******************************************************/
786
787 /* Fetch texel from 1D, 2D or 3D al88_rev texture, return 4 GLchans */
788 static void FETCH(f_al88_rev)( const struct swrast_texture_image *texImage,
789 GLint i, GLint j, GLint k, GLfloat *texel )
790 {
791 const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
792 texel[RCOMP] =
793 texel[GCOMP] =
794 texel[BCOMP] = UBYTE_TO_FLOAT( s >> 8 );
795 texel[ACOMP] = UBYTE_TO_FLOAT( s & 0xff );
796 }
797
798
799
800
801 /* MESA_FORMAT_R16G16_UNORM ********************************************************/
802
803 /* Fetch texel from 1D, 2D or 3D rg1616 texture, return 4 GLchans */
804 static void FETCH(f_rg1616)( const struct swrast_texture_image *texImage,
805 GLint i, GLint j, GLint k, GLfloat *texel )
806 {
807 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
808 texel[RCOMP] = USHORT_TO_FLOAT( s & 0xffff );
809 texel[GCOMP] = USHORT_TO_FLOAT( s >> 16 );
810 texel[BCOMP] = 0.0;
811 texel[ACOMP] = 1.0;
812 }
813
814
815
816
817 /* MESA_FORMAT_G16R16_UNORM ****************************************************/
818
819 /* Fetch texel from 1D, 2D or 3D rg1616_rev texture, return 4 GLchans */
820 static void FETCH(f_rg1616_rev)( const struct swrast_texture_image *texImage,
821 GLint i, GLint j, GLint k, GLfloat *texel )
822 {
823 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
824 texel[RCOMP] = USHORT_TO_FLOAT( s >> 16 );
825 texel[GCOMP] = USHORT_TO_FLOAT( s & 0xffff );
826 texel[BCOMP] = 0.0;
827 texel[ACOMP] = 1.0;
828 }
829
830
831
832
833 /* MESA_FORMAT_L16A16_UNORM ********************************************************/
834
835 /* Fetch texel from 1D, 2D or 3D al1616 texture, return 4 GLchans */
836 static void FETCH(f_al1616)( const struct swrast_texture_image *texImage,
837 GLint i, GLint j, GLint k, GLfloat *texel )
838 {
839 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
840 texel[RCOMP] =
841 texel[GCOMP] =
842 texel[BCOMP] = USHORT_TO_FLOAT( s & 0xffff );
843 texel[ACOMP] = USHORT_TO_FLOAT( s >> 16 );
844 }
845
846
847
848
849 /* MESA_FORMAT_A16L16_UNORM ****************************************************/
850
851 /* Fetch texel from 1D, 2D or 3D al1616_rev texture, return 4 GLchans */
852 static void FETCH(f_al1616_rev)( const struct swrast_texture_image *texImage,
853 GLint i, GLint j, GLint k, GLfloat *texel )
854 {
855 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
856 texel[RCOMP] =
857 texel[GCOMP] =
858 texel[BCOMP] = USHORT_TO_FLOAT( s >> 16 );
859 texel[ACOMP] = USHORT_TO_FLOAT( s & 0xffff );
860 }
861
862
863
864
865 /* MESA_FORMAT_B2G3R3_UNORM ********************************************************/
866
867 /* Fetch texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */
868 static void FETCH(f_rgb332)( const struct swrast_texture_image *texImage,
869 GLint i, GLint j, GLint k, GLfloat *texel )
870 {
871 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
872 const GLubyte s = *src;
873 texel[RCOMP] = ((s >> 5) & 0x7) * (1.0F / 7.0F);
874 texel[GCOMP] = ((s >> 2) & 0x7) * (1.0F / 7.0F);
875 texel[BCOMP] = ((s ) & 0x3) * (1.0F / 3.0F);
876 texel[ACOMP] = 1.0F;
877 }
878
879
880
881
882 /* MESA_FORMAT_A_UNORM8 ************************************************************/
883
884 /* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
885 static void FETCH(f_a8)( const struct swrast_texture_image *texImage,
886 GLint i, GLint j, GLint k, GLfloat *texel )
887 {
888 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
889 texel[RCOMP] =
890 texel[GCOMP] =
891 texel[BCOMP] = 0.0F;
892 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
893 }
894
895
896
897
898 /* MESA_FORMAT_A_UNORM16 ************************************************************/
899
900 /* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
901 static void FETCH(f_a16)( const struct swrast_texture_image *texImage,
902 GLint i, GLint j, GLint k, GLfloat *texel )
903 {
904 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
905 texel[RCOMP] =
906 texel[GCOMP] =
907 texel[BCOMP] = 0.0F;
908 texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
909 }
910
911
912
913
914 /* MESA_FORMAT_L_UNORM8 ************************************************************/
915
916 /* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLchans */
917 static void FETCH(f_l8)( const struct swrast_texture_image *texImage,
918 GLint i, GLint j, GLint k, GLfloat *texel )
919 {
920 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
921 texel[RCOMP] =
922 texel[GCOMP] =
923 texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
924 texel[ACOMP] = 1.0F;
925 }
926
927
928
929
930 /* MESA_FORMAT_L_UNORM16 ***********************************************************/
931
932 /* Fetch texel from 1D, 2D or 3D l16 texture, return 4 GLchans */
933 static void FETCH(f_l16)( const struct swrast_texture_image *texImage,
934 GLint i, GLint j, GLint k, GLfloat *texel )
935 {
936 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
937 texel[RCOMP] =
938 texel[GCOMP] =
939 texel[BCOMP] = USHORT_TO_FLOAT( src[0] );
940 texel[ACOMP] = 1.0F;
941 }
942
943
944
945
946 /* MESA_FORMAT_I_UNORM8 ************************************************************/
947
948 /* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLchans */
949 static void FETCH(f_i8)( const struct swrast_texture_image *texImage,
950 GLint i, GLint j, GLint k, GLfloat *texel )
951 {
952 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
953 texel[RCOMP] =
954 texel[GCOMP] =
955 texel[BCOMP] =
956 texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
957 }
958
959
960
961
962 /* MESA_FORMAT_I_UNORM16 ***********************************************************/
963
964 /* Fetch texel from 1D, 2D or 3D i16 texture, return 4 GLchans */
965 static void FETCH(f_i16)( const struct swrast_texture_image *texImage,
966 GLint i, GLint j, GLint k, GLfloat *texel )
967 {
968 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
969 texel[RCOMP] =
970 texel[GCOMP] =
971 texel[BCOMP] =
972 texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
973 }
974
975
976
977
978 /* Fetch texel from 1D, 2D or 3D srgb8 texture, return 4 GLfloats */
979 /* Note: component order is same as for MESA_FORMAT_BGR_UNORM8 */
980 static void FETCH(srgb8)(const struct swrast_texture_image *texImage,
981 GLint i, GLint j, GLint k, GLfloat *texel )
982 {
983 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
984 texel[RCOMP] = nonlinear_to_linear(src[2]);
985 texel[GCOMP] = nonlinear_to_linear(src[1]);
986 texel[BCOMP] = nonlinear_to_linear(src[0]);
987 texel[ACOMP] = 1.0F;
988 }
989
990
991
992 /* Fetch texel from 1D, 2D or 3D srgba8 texture, return 4 GLfloats */
993 static void FETCH(srgba8)(const struct swrast_texture_image *texImage,
994 GLint i, GLint j, GLint k, GLfloat *texel )
995 {
996 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
997 texel[RCOMP] = nonlinear_to_linear( (s >> 24) );
998 texel[GCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
999 texel[BCOMP] = nonlinear_to_linear( (s >> 8) & 0xff );
1000 texel[ACOMP] = UBYTE_TO_FLOAT( (s ) & 0xff ); /* linear! */
1001 }
1002
1003
1004
1005 /* Fetch texel from 1D, 2D or 3D sargb8 texture, return 4 GLfloats */
1006 static void FETCH(sargb8)(const struct swrast_texture_image *texImage,
1007 GLint i, GLint j, GLint k, GLfloat *texel )
1008 {
1009 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1010 texel[RCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
1011 texel[GCOMP] = nonlinear_to_linear( (s >> 8) & 0xff );
1012 texel[BCOMP] = nonlinear_to_linear( (s ) & 0xff );
1013 texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */
1014 }
1015
1016
1017
1018 /* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */
1019 static void FETCH(sl8)(const struct swrast_texture_image *texImage,
1020 GLint i, GLint j, GLint k, GLfloat *texel )
1021 {
1022 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
1023 texel[RCOMP] =
1024 texel[GCOMP] =
1025 texel[BCOMP] = nonlinear_to_linear(src[0]);
1026 texel[ACOMP] = 1.0F;
1027 }
1028
1029
1030
1031 /* Fetch texel from 1D, 2D or 3D sla8 texture, return 4 GLfloats */
1032 static void FETCH(sla8)(const struct swrast_texture_image *texImage,
1033 GLint i, GLint j, GLint k, GLfloat *texel )
1034 {
1035 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
1036 texel[RCOMP] =
1037 texel[GCOMP] =
1038 texel[BCOMP] = nonlinear_to_linear(src[0]);
1039 texel[ACOMP] = UBYTE_TO_FLOAT(src[1]); /* linear */
1040 }
1041
1042
1043
1044
1045 /* MESA_FORMAT_RGBA_SINT8 **************************************************/
1046
1047 static void
1048 FETCH(rgba_int8)(const struct swrast_texture_image *texImage,
1049 GLint i, GLint j, GLint k, GLfloat *texel )
1050 {
1051 const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
1052 texel[RCOMP] = (GLfloat) src[0];
1053 texel[GCOMP] = (GLfloat) src[1];
1054 texel[BCOMP] = (GLfloat) src[2];
1055 texel[ACOMP] = (GLfloat) src[3];
1056 }
1057
1058
1059
1060
1061 /* MESA_FORMAT_RGBA_SINT16 **************************************************/
1062
1063 static void
1064 FETCH(rgba_int16)(const struct swrast_texture_image *texImage,
1065 GLint i, GLint j, GLint k, GLfloat *texel )
1066 {
1067 const GLshort *src = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
1068 texel[RCOMP] = (GLfloat) src[0];
1069 texel[GCOMP] = (GLfloat) src[1];
1070 texel[BCOMP] = (GLfloat) src[2];
1071 texel[ACOMP] = (GLfloat) src[3];
1072 }
1073
1074
1075
1076
1077 /* MESA_FORMAT_RGBA_SINT32 **************************************************/
1078
1079 static void
1080 FETCH(rgba_int32)(const struct swrast_texture_image *texImage,
1081 GLint i, GLint j, GLint k, GLfloat *texel )
1082 {
1083 const GLint *src = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
1084 texel[RCOMP] = (GLfloat) src[0];
1085 texel[GCOMP] = (GLfloat) src[1];
1086 texel[BCOMP] = (GLfloat) src[2];
1087 texel[ACOMP] = (GLfloat) src[3];
1088 }
1089
1090
1091
1092
1093 /* MESA_FORMAT_RGBA_UINT8 **************************************************/
1094
1095 static void
1096 FETCH(rgba_uint8)(const struct swrast_texture_image *texImage,
1097 GLint i, GLint j, GLint k, GLfloat *texel )
1098 {
1099 const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
1100 texel[RCOMP] = (GLfloat) src[0];
1101 texel[GCOMP] = (GLfloat) src[1];
1102 texel[BCOMP] = (GLfloat) src[2];
1103 texel[ACOMP] = (GLfloat) src[3];
1104 }
1105
1106
1107
1108
1109 /* MESA_FORMAT_RGBA_UINT16 **************************************************/
1110
1111 static void
1112 FETCH(rgba_uint16)(const struct swrast_texture_image *texImage,
1113 GLint i, GLint j, GLint k, GLfloat *texel )
1114 {
1115 const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
1116 texel[RCOMP] = (GLfloat) src[0];
1117 texel[GCOMP] = (GLfloat) src[1];
1118 texel[BCOMP] = (GLfloat) src[2];
1119 texel[ACOMP] = (GLfloat) src[3];
1120 }
1121
1122
1123
1124
1125 /* MESA_FORMAT_RGBA_UINT32 **************************************************/
1126
1127 static void
1128 FETCH(rgba_uint32)(const struct swrast_texture_image *texImage,
1129 GLint i, GLint j, GLint k, GLfloat *texel )
1130 {
1131 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
1132 texel[RCOMP] = (GLfloat) src[0];
1133 texel[GCOMP] = (GLfloat) src[1];
1134 texel[BCOMP] = (GLfloat) src[2];
1135 texel[ACOMP] = (GLfloat) src[3];
1136 }
1137
1138
1139
1140
1141 /* MESA_FORMAT_DUDV8 ********************************************************/
1142
1143 /* this format by definition produces 0,0,0,1 as rgba values,
1144 however we'll return the dudv values as rg and fix up elsewhere */
1145 static void FETCH(dudv8)(const struct swrast_texture_image *texImage,
1146 GLint i, GLint j, GLint k, GLfloat *texel )
1147 {
1148 const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 2);
1149 texel[RCOMP] = BYTE_TO_FLOAT(src[0]);
1150 texel[GCOMP] = BYTE_TO_FLOAT(src[1]);
1151 texel[BCOMP] = 0;
1152 texel[ACOMP] = 0;
1153 }
1154
1155
1156 /* MESA_FORMAT_R_SNORM8 ***********************************************/
1157
1158 static void FETCH(signed_r8)( const struct swrast_texture_image *texImage,
1159 GLint i, GLint j, GLint k, GLfloat *texel )
1160 {
1161 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
1162 texel[RCOMP] = BYTE_TO_FLOAT_TEX( s );
1163 texel[GCOMP] = 0.0F;
1164 texel[BCOMP] = 0.0F;
1165 texel[ACOMP] = 1.0F;
1166 }
1167
1168
1169
1170
1171 /* MESA_FORMAT_A_SNORM8 ***********************************************/
1172
1173 static void FETCH(signed_a8)( const struct swrast_texture_image *texImage,
1174 GLint i, GLint j, GLint k, GLfloat *texel )
1175 {
1176 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
1177 texel[RCOMP] = 0.0F;
1178 texel[GCOMP] = 0.0F;
1179 texel[BCOMP] = 0.0F;
1180 texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1181 }
1182
1183
1184
1185
1186 /* MESA_FORMAT_L_SNORM8 ***********************************************/
1187
1188 static void FETCH(signed_l8)( const struct swrast_texture_image *texImage,
1189 GLint i, GLint j, GLint k, GLfloat *texel )
1190 {
1191 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
1192 texel[RCOMP] =
1193 texel[GCOMP] =
1194 texel[BCOMP] = BYTE_TO_FLOAT_TEX( s );
1195 texel[ACOMP] = 1.0F;
1196 }
1197
1198
1199
1200
1201 /* MESA_FORMAT_I_SNORM8 ***********************************************/
1202
1203 static void FETCH(signed_i8)( const struct swrast_texture_image *texImage,
1204 GLint i, GLint j, GLint k, GLfloat *texel )
1205 {
1206 const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
1207 texel[RCOMP] =
1208 texel[GCOMP] =
1209 texel[BCOMP] =
1210 texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
1211 }
1212
1213
1214
1215
1216 /* MESA_FORMAT_R8G8_SNORM ***********************************************/
1217
1218 static void FETCH(signed_rg88_rev)( const struct swrast_texture_image *texImage,
1219 GLint i, GLint j, GLint k, GLfloat *texel )
1220 {
1221 const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1222 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
1223 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1224 texel[BCOMP] = 0.0F;
1225 texel[ACOMP] = 1.0F;
1226 }
1227
1228
1229
1230
1231 /* MESA_FORMAT_L8A8_SNORM ***********************************************/
1232
1233 static void FETCH(signed_al88)( const struct swrast_texture_image *texImage,
1234 GLint i, GLint j, GLint k, GLfloat *texel )
1235 {
1236 const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1237 texel[RCOMP] =
1238 texel[GCOMP] =
1239 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
1240 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1241 }
1242
1243
1244
1245
1246 /* MESA_FORMAT_X8B8G8R8_SNORM ***********************************************/
1247
1248 static void FETCH(signed_rgbx8888)( const struct swrast_texture_image *texImage,
1249 GLint i, GLint j, GLint k, GLfloat *texel )
1250 {
1251 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1252 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
1253 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
1254 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1255 texel[ACOMP] = 1.0f;
1256 }
1257
1258
1259
1260
1261 /* MESA_FORMAT_A8B8G8R8_SNORM ***********************************************/
1262
1263 static void FETCH(signed_rgba8888)( const struct swrast_texture_image *texImage,
1264 GLint i, GLint j, GLint k, GLfloat *texel )
1265 {
1266 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1267 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
1268 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
1269 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1270 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s ) );
1271 }
1272
1273
1274
1275 static void FETCH(signed_rgba8888_rev)( const struct swrast_texture_image *texImage,
1276 GLint i, GLint j, GLint k, GLfloat *texel )
1277 {
1278 const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1279 texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s ) );
1280 texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
1281 texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
1282 texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
1283 }
1284
1285
1286
1287
1288
1289 /* MESA_FORMAT_R_SNORM16 ***********************************************/
1290
1291 static void
1292 FETCH(signed_r16)(const struct swrast_texture_image *texImage,
1293 GLint i, GLint j, GLint k, GLfloat *texel)
1294 {
1295 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1296 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s );
1297 texel[GCOMP] = 0.0F;
1298 texel[BCOMP] = 0.0F;
1299 texel[ACOMP] = 1.0F;
1300 }
1301
1302
1303
1304
1305 /* MESA_FORMAT_A_SNORM16 ***********************************************/
1306
1307 static void
1308 FETCH(signed_a16)(const struct swrast_texture_image *texImage,
1309 GLint i, GLint j, GLint k, GLfloat *texel)
1310 {
1311 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1312 texel[RCOMP] = 0.0F;
1313 texel[GCOMP] = 0.0F;
1314 texel[BCOMP] = 0.0F;
1315 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1316 }
1317
1318
1319
1320
1321 /* MESA_FORMAT_L_SNORM16 ***********************************************/
1322
1323 static void
1324 FETCH(signed_l16)(const struct swrast_texture_image *texImage,
1325 GLint i, GLint j, GLint k, GLfloat *texel)
1326 {
1327 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1328 texel[RCOMP] =
1329 texel[GCOMP] =
1330 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s );
1331 texel[ACOMP] = 1.0F;
1332 }
1333
1334
1335
1336
1337 /* MESA_FORMAT_I_SNORM16 ***********************************************/
1338
1339 static void
1340 FETCH(signed_i16)(const struct swrast_texture_image *texImage,
1341 GLint i, GLint j, GLint k, GLfloat *texel)
1342 {
1343 const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
1344 texel[RCOMP] =
1345 texel[GCOMP] =
1346 texel[BCOMP] =
1347 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
1348 }
1349
1350
1351
1352
1353 /* MESA_FORMAT_G16R16_SNORM ***********************************************/
1354
1355 static void
1356 FETCH(signed_rg1616)(const struct swrast_texture_image *texImage,
1357 GLint i, GLint j, GLint k, GLfloat *texel)
1358 {
1359 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
1360 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1361 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1362 texel[BCOMP] = 0.0F;
1363 texel[ACOMP] = 1.0F;
1364 }
1365
1366
1367
1368
1369 /* MESA_FORMAT_LA_SNORM16 ***********************************************/
1370
1371 static void
1372 FETCH(signed_al1616)(const struct swrast_texture_image *texImage,
1373 GLint i, GLint j, GLint k, GLfloat *texel)
1374 {
1375 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
1376 texel[RCOMP] =
1377 texel[GCOMP] =
1378 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1379 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1380 }
1381
1382
1383
1384
1385 /* MESA_FORMAT_RGB_SNORM16 ***********************************************/
1386
1387 static void
1388 FETCH(signed_rgb_16)(const struct swrast_texture_image *texImage,
1389 GLint i, GLint j, GLint k, GLfloat *texel)
1390 {
1391 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 3);
1392 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1393 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1394 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
1395 texel[ACOMP] = 1.0F;
1396 }
1397
1398
1399
1400
1401 /* MESA_FORMAT_RGBA_SNORM16 ***********************************************/
1402
1403 static void
1404 FETCH(signed_rgba_16)(const struct swrast_texture_image *texImage,
1405 GLint i, GLint j, GLint k, GLfloat *texel)
1406 {
1407 const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
1408 texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
1409 texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
1410 texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
1411 texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[3] );
1412 }
1413
1414
1415
1416
1417
1418 /* MESA_FORMAT_RGBA_UNORM16 ***********************************************/
1419
1420 static void
1421 FETCH(rgba_16)(const struct swrast_texture_image *texImage,
1422 GLint i, GLint j, GLint k, GLfloat *texel)
1423 {
1424 const GLushort *s = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
1425 texel[RCOMP] = USHORT_TO_FLOAT( s[0] );
1426 texel[GCOMP] = USHORT_TO_FLOAT( s[1] );
1427 texel[BCOMP] = USHORT_TO_FLOAT( s[2] );
1428 texel[ACOMP] = USHORT_TO_FLOAT( s[3] );
1429 }
1430
1431
1432
1433 /* MESA_FORMAT_XBGR.... **********************************************/
1434
1435 static void
1436 FETCH(xbgr16161616_unorm)(const struct swrast_texture_image *texImage,
1437 GLint i, GLint j, GLint k, GLfloat *texel)
1438 {
1439 const GLushort *s = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
1440 texel[RCOMP] = USHORT_TO_FLOAT(s[0]);
1441 texel[GCOMP] = USHORT_TO_FLOAT(s[1]);
1442 texel[BCOMP] = USHORT_TO_FLOAT(s[2]);
1443 texel[ACOMP] = 1.0f;
1444 }
1445
1446 static void
1447 FETCH(xbgr16161616_float)(const struct swrast_texture_image *texImage,
1448 GLint i, GLint j, GLint k, GLfloat *texel)
1449 {
1450 const GLhalfARB *s = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
1451 texel[RCOMP] = _mesa_half_to_float(s[0]);
1452 texel[GCOMP] = _mesa_half_to_float(s[1]);
1453 texel[BCOMP] = _mesa_half_to_float(s[2]);
1454 texel[ACOMP] = 1.0f;
1455 }
1456
1457 static void
1458 FETCH(xbgr32323232_float)(const struct swrast_texture_image *texImage,
1459 GLint i, GLint j, GLint k, GLfloat *texel)
1460 {
1461 const GLfloat *s = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
1462 texel[RCOMP] = s[0];
1463 texel[GCOMP] = s[1];
1464 texel[BCOMP] = s[2];
1465 texel[ACOMP] = 1.0f;
1466 }
1467
1468 /* XXX other XBGR formats need to be implemented here */
1469
1470
1471
1472 /* MESA_FORMAT_YCBCR *********************************************************/
1473
1474 /* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats.
1475 * We convert YCbCr to RGB here.
1476 */
1477 static void FETCH(f_ycbcr)( const struct swrast_texture_image *texImage,
1478 GLint i, GLint j, GLint k, GLfloat *texel )
1479 {
1480 const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
1481 const GLushort *src1 = src0 + 1; /* odd */
1482 const GLubyte y0 = (*src0 >> 8) & 0xff; /* luminance */
1483 const GLubyte cb = *src0 & 0xff; /* chroma U */
1484 const GLubyte y1 = (*src1 >> 8) & 0xff; /* luminance */
1485 const GLubyte cr = *src1 & 0xff; /* chroma V */
1486 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
1487 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
1488 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
1489 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
1490 r *= (1.0F / 255.0F);
1491 g *= (1.0F / 255.0F);
1492 b *= (1.0F / 255.0F);
1493 texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
1494 texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
1495 texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
1496 texel[ACOMP] = 1.0F;
1497 }
1498
1499
1500
1501
1502 /* MESA_FORMAT_YCBCR_REV *****************************************************/
1503
1504 /* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats.
1505 * We convert YCbCr to RGB here.
1506 */
1507 static void FETCH(f_ycbcr_rev)( const struct swrast_texture_image *texImage,
1508 GLint i, GLint j, GLint k, GLfloat *texel )
1509 {
1510 const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
1511 const GLushort *src1 = src0 + 1; /* odd */
1512 const GLubyte y0 = *src0 & 0xff; /* luminance */
1513 const GLubyte cr = (*src0 >> 8) & 0xff; /* chroma V */
1514 const GLubyte y1 = *src1 & 0xff; /* luminance */
1515 const GLubyte cb = (*src1 >> 8) & 0xff; /* chroma U */
1516 const GLubyte y = (i & 1) ? y1 : y0; /* choose even/odd luminance */
1517 GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
1518 GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
1519 GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
1520 r *= (1.0F / 255.0F);
1521 g *= (1.0F / 255.0F);
1522 b *= (1.0F / 255.0F);
1523 texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
1524 texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
1525 texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
1526 texel[ACOMP] = 1.0F;
1527 }
1528
1529
1530
1531
1532 /* MESA_TEXFORMAT_Z24_S8 ***************************************************/
1533
1534 static void FETCH(f_z24_s8)( const struct swrast_texture_image *texImage,
1535 GLint i, GLint j, GLint k, GLfloat *texel )
1536 {
1537 /* only return Z, not stencil data */
1538 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1539 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
1540 texel[0] = (GLfloat) (((*src) >> 8) * scale);
1541 ASSERT(texImage->Base.TexFormat == MESA_FORMAT_S8_UINT_Z24_UNORM ||
1542 texImage->Base.TexFormat == MESA_FORMAT_X8Z24_UNORM);
1543 ASSERT(texel[0] >= 0.0F);
1544 ASSERT(texel[0] <= 1.0F);
1545 }
1546
1547
1548
1549
1550 /* MESA_TEXFORMAT_S8_Z24 ***************************************************/
1551
1552 static void FETCH(f_s8_z24)( const struct swrast_texture_image *texImage,
1553 GLint i, GLint j, GLint k, GLfloat *texel )
1554 {
1555 /* only return Z, not stencil data */
1556 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1557 const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
1558 texel[0] = (GLfloat) (((*src) & 0x00ffffff) * scale);
1559 ASSERT(texImage->Base.TexFormat == MESA_FORMAT_Z24_UNORM_S8_UINT ||
1560 texImage->Base.TexFormat == MESA_FORMAT_Z24_UNORM_X8_UINT);
1561 ASSERT(texel[0] >= 0.0F);
1562 ASSERT(texel[0] <= 1.0F);
1563 }
1564
1565
1566
1567
1568 /* MESA_FORMAT_RGB9_E5 ******************************************************/
1569
1570 static void FETCH(rgb9_e5)( const struct swrast_texture_image *texImage,
1571 GLint i, GLint j, GLint k, GLfloat *texel )
1572 {
1573 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1574 rgb9e5_to_float3(*src, texel);
1575 texel[ACOMP] = 1.0F;
1576 }
1577
1578
1579
1580
1581 /* MESA_FORMAT_R11G11B10_FLOAT *********************************************/
1582
1583 static void FETCH(r11_g11_b10f)( const struct swrast_texture_image *texImage,
1584 GLint i, GLint j, GLint k, GLfloat *texel )
1585 {
1586 const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
1587 r11g11b10f_to_float3(*src, texel);
1588 texel[ACOMP] = 1.0F;
1589 }
1590
1591
1592
1593
1594 /* MESA_FORMAT_Z32_FLOAT_S8X24_UINT ***********************************************/
1595
1596 static void FETCH(z32f_x24s8)(const struct swrast_texture_image *texImage,
1597 GLint i, GLint j, GLint k, GLfloat *texel)
1598 {
1599 const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
1600 texel[RCOMP] = src[0];
1601 texel[GCOMP] = 0.0F;
1602 texel[BCOMP] = 0.0F;
1603 texel[ACOMP] = 1.0F;
1604 }
1605
1606
1607
1608 #undef TEXEL_ADDR
1609 #undef DIM
1610 #undef FETCH