Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/*
2
 * Mesa 3-D graphics library
3
 *
4
 * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5
 * Copyright (c) 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 s_texfetch.c
29
 *
30
 * Texel fetch/store functions
31
 *
32
 * \author Gareth Hughes
33
 */
34
 
35
 
36
#include "main/colormac.h"
37
#include "main/macros.h"
38
#include "main/texcompress.h"
39
#include "main/texcompress_fxt1.h"
40
#include "main/texcompress_s3tc.h"
41
#include "main/texcompress_rgtc.h"
42
#include "main/texcompress_etc.h"
43
#include "main/teximage.h"
44
#include "main/samplerobj.h"
45
#include "s_context.h"
46
#include "s_texfetch.h"
47
#include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
48
#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
49
 
50
 
51
/**
52
 * Convert an 8-bit sRGB value from non-linear space to a
53
 * linear RGB value in [0, 1].
54
 * Implemented with a 256-entry lookup table.
55
 */
56
static inline GLfloat
57
nonlinear_to_linear(GLubyte cs8)
58
{
59
   static GLfloat table[256];
60
   static GLboolean tableReady = GL_FALSE;
61
   if (!tableReady) {
62
      /* compute lookup table now */
63
      GLuint i;
64
      for (i = 0; i < 256; i++) {
65
         const GLfloat cs = UBYTE_TO_FLOAT(i);
66
         if (cs <= 0.04045) {
67
            table[i] = cs / 12.92f;
68
         }
69
         else {
70
            table[i] = (GLfloat) pow((cs + 0.055) / 1.055, 2.4);
71
         }
72
      }
73
      tableReady = GL_TRUE;
74
   }
75
   return table[cs8];
76
}
77
 
78
 
79
 
80
/* Texel fetch routines for all supported formats
81
 */
82
#define DIM 1
83
#include "s_texfetch_tmp.h"
84
 
85
#define DIM 2
86
#include "s_texfetch_tmp.h"
87
 
88
#define DIM 3
89
#include "s_texfetch_tmp.h"
90
 
91
 
92
/**
93
 * All compressed texture texel fetching is done though this function.
94
 * Basically just call a core-Mesa texel fetch function.
95
 */
96
static void
97
fetch_compressed(const struct swrast_texture_image *swImage,
98
                 GLint i, GLint j, GLint k, GLfloat *texel)
99
{
100
   /* The FetchCompressedTexel function takes an integer pixel rowstride,
101
    * while the image's rowstride is bytes per row of blocks.
102
    */
103
   GLuint bw, bh;
104
   GLuint texelBytes = _mesa_get_format_bytes(swImage->Base.TexFormat);
105
   _mesa_get_format_block_size(swImage->Base.TexFormat, &bw, &bh);
106
   assert(swImage->RowStride * bw % texelBytes == 0);
107
 
108
   swImage->FetchCompressedTexel(swImage->ImageSlices[k],
109
                                 swImage->RowStride * bw / texelBytes,
110
                                 i, j, texel);
111
}
112
 
113
 
114
 
115
/**
116
 * Null texel fetch function.
117
 *
118
 * Have to have this so the FetchTexel function pointer is never NULL.
119
 */
120
static void fetch_null_texelf( const struct swrast_texture_image *texImage,
121
                               GLint i, GLint j, GLint k, GLfloat *texel )
122
{
123
   (void) texImage; (void) i; (void) j; (void) k;
124
   texel[RCOMP] = 0.0;
125
   texel[GCOMP] = 0.0;
126
   texel[BCOMP] = 0.0;
127
   texel[ACOMP] = 0.0;
128
   _mesa_warning(NULL, "fetch_null_texelf() called!");
129
}
130
 
131
 
132
/**
133
 * Table to map MESA_FORMAT_ to texel fetch/store funcs.
134
 * XXX this is somewhat temporary.
135
 */
136
static struct {
137
   gl_format Name;
138
   FetchTexelFunc Fetch1D;
139
   FetchTexelFunc Fetch2D;
140
   FetchTexelFunc Fetch3D;
141
}
142
texfetch_funcs[] =
143
{
144
   {
145
      MESA_FORMAT_NONE,
146
      fetch_null_texelf,
147
      fetch_null_texelf,
148
      fetch_null_texelf
149
   },
150
 
151
   {
152
      MESA_FORMAT_RGBA8888,
153
      fetch_texel_1d_f_rgba8888,
154
      fetch_texel_2d_f_rgba8888,
155
      fetch_texel_3d_f_rgba8888
156
   },
157
   {
158
      MESA_FORMAT_RGBA8888_REV,
159
      fetch_texel_1d_f_rgba8888_rev,
160
      fetch_texel_2d_f_rgba8888_rev,
161
      fetch_texel_3d_f_rgba8888_rev
162
   },
163
   {
164
      MESA_FORMAT_ARGB8888,
165
      fetch_texel_1d_f_argb8888,
166
      fetch_texel_2d_f_argb8888,
167
      fetch_texel_3d_f_argb8888
168
   },
169
   {
170
      MESA_FORMAT_ARGB8888_REV,
171
      fetch_texel_1d_f_argb8888_rev,
172
      fetch_texel_2d_f_argb8888_rev,
173
      fetch_texel_3d_f_argb8888_rev
174
   },
175
   {
176
      MESA_FORMAT_RGBX8888,
177
      fetch_texel_1d_f_rgbx8888,
178
      fetch_texel_2d_f_rgbx8888,
179
      fetch_texel_3d_f_rgbx8888
180
   },
181
   {
182
      MESA_FORMAT_RGBX8888_REV,
183
      fetch_texel_1d_f_rgbx8888_rev,
184
      fetch_texel_2d_f_rgbx8888_rev,
185
      fetch_texel_3d_f_rgbx8888_rev
186
   },
187
   {
188
      MESA_FORMAT_XRGB8888,
189
      fetch_texel_1d_f_xrgb8888,
190
      fetch_texel_2d_f_xrgb8888,
191
      fetch_texel_3d_f_xrgb8888
192
   },
193
   {
194
      MESA_FORMAT_XRGB8888_REV,
195
      fetch_texel_1d_f_xrgb8888_rev,
196
      fetch_texel_2d_f_xrgb8888_rev,
197
      fetch_texel_3d_f_xrgb8888_rev
198
   },
199
   {
200
      MESA_FORMAT_RGB888,
201
      fetch_texel_1d_f_rgb888,
202
      fetch_texel_2d_f_rgb888,
203
      fetch_texel_3d_f_rgb888
204
   },
205
   {
206
      MESA_FORMAT_BGR888,
207
      fetch_texel_1d_f_bgr888,
208
      fetch_texel_2d_f_bgr888,
209
      fetch_texel_3d_f_bgr888
210
   },
211
   {
212
      MESA_FORMAT_RGB565,
213
      fetch_texel_1d_f_rgb565,
214
      fetch_texel_2d_f_rgb565,
215
      fetch_texel_3d_f_rgb565
216
   },
217
   {
218
      MESA_FORMAT_RGB565_REV,
219
      fetch_texel_1d_f_rgb565_rev,
220
      fetch_texel_2d_f_rgb565_rev,
221
      fetch_texel_3d_f_rgb565_rev
222
   },
223
   {
224
      MESA_FORMAT_ARGB4444,
225
      fetch_texel_1d_f_argb4444,
226
      fetch_texel_2d_f_argb4444,
227
      fetch_texel_3d_f_argb4444
228
   },
229
   {
230
      MESA_FORMAT_ARGB4444_REV,
231
      fetch_texel_1d_f_argb4444_rev,
232
      fetch_texel_2d_f_argb4444_rev,
233
      fetch_texel_3d_f_argb4444_rev
234
   },
235
   {
236
      MESA_FORMAT_RGBA5551,
237
      fetch_texel_1d_f_rgba5551,
238
      fetch_texel_2d_f_rgba5551,
239
      fetch_texel_3d_f_rgba5551
240
   },
241
   {
242
      MESA_FORMAT_ARGB1555,
243
      fetch_texel_1d_f_argb1555,
244
      fetch_texel_2d_f_argb1555,
245
      fetch_texel_3d_f_argb1555
246
   },
247
   {
248
      MESA_FORMAT_ARGB1555_REV,
249
      fetch_texel_1d_f_argb1555_rev,
250
      fetch_texel_2d_f_argb1555_rev,
251
      fetch_texel_3d_f_argb1555_rev
252
   },
253
   {
254
      MESA_FORMAT_AL44,
255
      fetch_texel_1d_f_al44,
256
      fetch_texel_2d_f_al44,
257
      fetch_texel_3d_f_al44
258
   },
259
   {
260
      MESA_FORMAT_AL88,
261
      fetch_texel_1d_f_al88,
262
      fetch_texel_2d_f_al88,
263
      fetch_texel_3d_f_al88
264
   },
265
   {
266
      MESA_FORMAT_AL88_REV,
267
      fetch_texel_1d_f_al88_rev,
268
      fetch_texel_2d_f_al88_rev,
269
      fetch_texel_3d_f_al88_rev
270
   },
271
   {
272
      MESA_FORMAT_AL1616,
273
      fetch_texel_1d_f_al1616,
274
      fetch_texel_2d_f_al1616,
275
      fetch_texel_3d_f_al1616
276
   },
277
   {
278
      MESA_FORMAT_AL1616_REV,
279
      fetch_texel_1d_f_al1616_rev,
280
      fetch_texel_2d_f_al1616_rev,
281
      fetch_texel_3d_f_al1616_rev
282
   },
283
   {
284
      MESA_FORMAT_RGB332,
285
      fetch_texel_1d_f_rgb332,
286
      fetch_texel_2d_f_rgb332,
287
      fetch_texel_3d_f_rgb332
288
   },
289
   {
290
      MESA_FORMAT_A8,
291
      fetch_texel_1d_f_a8,
292
      fetch_texel_2d_f_a8,
293
      fetch_texel_3d_f_a8
294
   },
295
   {
296
      MESA_FORMAT_A16,
297
      fetch_texel_1d_f_a16,
298
      fetch_texel_2d_f_a16,
299
      fetch_texel_3d_f_a16
300
   },
301
   {
302
      MESA_FORMAT_L8,
303
      fetch_texel_1d_f_l8,
304
      fetch_texel_2d_f_l8,
305
      fetch_texel_3d_f_l8
306
   },
307
   {
308
      MESA_FORMAT_L16,
309
      fetch_texel_1d_f_l16,
310
      fetch_texel_2d_f_l16,
311
      fetch_texel_3d_f_l16
312
   },
313
   {
314
      MESA_FORMAT_I8,
315
      fetch_texel_1d_f_i8,
316
      fetch_texel_2d_f_i8,
317
      fetch_texel_3d_f_i8
318
   },
319
   {
320
      MESA_FORMAT_I16,
321
      fetch_texel_1d_f_i16,
322
      fetch_texel_2d_f_i16,
323
      fetch_texel_3d_f_i16
324
   },
325
   {
326
      MESA_FORMAT_YCBCR,
327
      fetch_texel_1d_f_ycbcr,
328
      fetch_texel_2d_f_ycbcr,
329
      fetch_texel_3d_f_ycbcr
330
   },
331
   {
332
      MESA_FORMAT_YCBCR_REV,
333
      fetch_texel_1d_f_ycbcr_rev,
334
      fetch_texel_2d_f_ycbcr_rev,
335
      fetch_texel_3d_f_ycbcr_rev
336
   },
337
   {
338
      MESA_FORMAT_R8,
339
      fetch_texel_1d_f_r8,
340
      fetch_texel_2d_f_r8,
341
      fetch_texel_3d_f_r8
342
   },
343
   {
344
      MESA_FORMAT_GR88,
345
      fetch_texel_1d_f_gr88,
346
      fetch_texel_2d_f_gr88,
347
      fetch_texel_3d_f_gr88
348
   },
349
   {
350
      MESA_FORMAT_RG88,
351
      fetch_texel_1d_f_rg88,
352
      fetch_texel_2d_f_rg88,
353
      fetch_texel_3d_f_rg88
354
   },
355
   {
356
      MESA_FORMAT_R16,
357
      fetch_texel_1d_f_r16,
358
      fetch_texel_2d_f_r16,
359
      fetch_texel_3d_f_r16
360
   },
361
   {
362
      MESA_FORMAT_GR1616,
363
      fetch_texel_1d_f_rg1616,
364
      fetch_texel_2d_f_rg1616,
365
      fetch_texel_3d_f_rg1616
366
   },
367
   {
368
      MESA_FORMAT_RG1616,
369
      fetch_texel_1d_f_rg1616_rev,
370
      fetch_texel_2d_f_rg1616_rev,
371
      fetch_texel_3d_f_rg1616_rev
372
   },
373
   {
374
      MESA_FORMAT_ARGB2101010,
375
      fetch_texel_1d_f_argb2101010,
376
      fetch_texel_2d_f_argb2101010,
377
      fetch_texel_3d_f_argb2101010
378
   },
379
   {
380
      MESA_FORMAT_Z24_S8,
381
      fetch_texel_1d_f_z24_s8,
382
      fetch_texel_2d_f_z24_s8,
383
      fetch_texel_3d_f_z24_s8
384
   },
385
   {
386
      MESA_FORMAT_S8_Z24,
387
      fetch_texel_1d_f_s8_z24,
388
      fetch_texel_2d_f_s8_z24,
389
      fetch_texel_3d_f_s8_z24
390
   },
391
   {
392
      MESA_FORMAT_Z16,
393
      fetch_texel_1d_f_z16,
394
      fetch_texel_2d_f_z16,
395
      fetch_texel_3d_f_z16
396
   },
397
   {
398
      MESA_FORMAT_X8_Z24,
399
      fetch_texel_1d_f_s8_z24,
400
      fetch_texel_2d_f_s8_z24,
401
      fetch_texel_3d_f_s8_z24
402
   },
403
   {
404
      MESA_FORMAT_Z24_X8,
405
      fetch_texel_1d_f_z24_s8,
406
      fetch_texel_2d_f_z24_s8,
407
      fetch_texel_3d_f_z24_s8
408
   },
409
   {
410
      MESA_FORMAT_Z32,
411
      fetch_texel_1d_f_z32,
412
      fetch_texel_2d_f_z32,
413
      fetch_texel_3d_f_z32
414
   },
415
   {
416
      MESA_FORMAT_S8,
417
      NULL,
418
      NULL,
419
      NULL
420
   },
421
   {
422
      MESA_FORMAT_SRGB8,
423
      fetch_texel_1d_srgb8,
424
      fetch_texel_2d_srgb8,
425
      fetch_texel_3d_srgb8
426
   },
427
   {
428
      MESA_FORMAT_SRGBA8,
429
      fetch_texel_1d_srgba8,
430
      fetch_texel_2d_srgba8,
431
      fetch_texel_3d_srgba8
432
   },
433
   {
434
      MESA_FORMAT_SARGB8,
435
      fetch_texel_1d_sargb8,
436
      fetch_texel_2d_sargb8,
437
      fetch_texel_3d_sargb8
438
   },
439
   {
440
      MESA_FORMAT_SL8,
441
      fetch_texel_1d_sl8,
442
      fetch_texel_2d_sl8,
443
      fetch_texel_3d_sl8
444
   },
445
   {
446
      MESA_FORMAT_SLA8,
447
      fetch_texel_1d_sla8,
448
      fetch_texel_2d_sla8,
449
      fetch_texel_3d_sla8
450
   },
451
   {
452
      MESA_FORMAT_SRGB_DXT1,
453
      fetch_compressed,
454
      fetch_compressed,
455
      fetch_compressed
456
   },
457
   {
458
      MESA_FORMAT_SRGBA_DXT1,
459
      fetch_compressed,
460
      fetch_compressed,
461
      fetch_compressed
462
   },
463
   {
464
      MESA_FORMAT_SRGBA_DXT3,
465
      fetch_compressed,
466
      fetch_compressed,
467
      fetch_compressed
468
   },
469
   {
470
      MESA_FORMAT_SRGBA_DXT5,
471
      fetch_compressed,
472
      fetch_compressed,
473
      fetch_compressed
474
   },
475
 
476
   {
477
      MESA_FORMAT_RGB_FXT1,
478
      fetch_compressed,
479
      fetch_compressed,
480
      fetch_compressed
481
   },
482
   {
483
      MESA_FORMAT_RGBA_FXT1,
484
      fetch_compressed,
485
      fetch_compressed,
486
      fetch_compressed
487
   },
488
   {
489
      MESA_FORMAT_RGB_DXT1,
490
      fetch_compressed,
491
      fetch_compressed,
492
      fetch_compressed
493
   },
494
   {
495
      MESA_FORMAT_RGBA_DXT1,
496
      fetch_compressed,
497
      fetch_compressed,
498
      fetch_compressed
499
   },
500
   {
501
      MESA_FORMAT_RGBA_DXT3,
502
      fetch_compressed,
503
      fetch_compressed,
504
      fetch_compressed
505
   },
506
   {
507
      MESA_FORMAT_RGBA_DXT5,
508
      fetch_compressed,
509
      fetch_compressed,
510
      fetch_compressed
511
   },
512
   {
513
      MESA_FORMAT_RGBA_FLOAT32,
514
      fetch_texel_1d_f_rgba_f32,
515
      fetch_texel_2d_f_rgba_f32,
516
      fetch_texel_3d_f_rgba_f32
517
   },
518
   {
519
      MESA_FORMAT_RGBA_FLOAT16,
520
      fetch_texel_1d_f_rgba_f16,
521
      fetch_texel_2d_f_rgba_f16,
522
      fetch_texel_3d_f_rgba_f16
523
   },
524
   {
525
      MESA_FORMAT_RGB_FLOAT32,
526
      fetch_texel_1d_f_rgb_f32,
527
      fetch_texel_2d_f_rgb_f32,
528
      fetch_texel_3d_f_rgb_f32
529
   },
530
   {
531
      MESA_FORMAT_RGB_FLOAT16,
532
      fetch_texel_1d_f_rgb_f16,
533
      fetch_texel_2d_f_rgb_f16,
534
      fetch_texel_3d_f_rgb_f16
535
   },
536
   {
537
      MESA_FORMAT_ALPHA_FLOAT32,
538
      fetch_texel_1d_f_alpha_f32,
539
      fetch_texel_2d_f_alpha_f32,
540
      fetch_texel_3d_f_alpha_f32
541
   },
542
   {
543
      MESA_FORMAT_ALPHA_FLOAT16,
544
      fetch_texel_1d_f_alpha_f16,
545
      fetch_texel_2d_f_alpha_f16,
546
      fetch_texel_3d_f_alpha_f16
547
   },
548
   {
549
      MESA_FORMAT_LUMINANCE_FLOAT32,
550
      fetch_texel_1d_f_luminance_f32,
551
      fetch_texel_2d_f_luminance_f32,
552
      fetch_texel_3d_f_luminance_f32
553
   },
554
   {
555
      MESA_FORMAT_LUMINANCE_FLOAT16,
556
      fetch_texel_1d_f_luminance_f16,
557
      fetch_texel_2d_f_luminance_f16,
558
      fetch_texel_3d_f_luminance_f16
559
   },
560
   {
561
      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
562
      fetch_texel_1d_f_luminance_alpha_f32,
563
      fetch_texel_2d_f_luminance_alpha_f32,
564
      fetch_texel_3d_f_luminance_alpha_f32
565
   },
566
   {
567
      MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
568
      fetch_texel_1d_f_luminance_alpha_f16,
569
      fetch_texel_2d_f_luminance_alpha_f16,
570
      fetch_texel_3d_f_luminance_alpha_f16
571
   },
572
   {
573
      MESA_FORMAT_INTENSITY_FLOAT32,
574
      fetch_texel_1d_f_intensity_f32,
575
      fetch_texel_2d_f_intensity_f32,
576
      fetch_texel_3d_f_intensity_f32
577
   },
578
   {
579
      MESA_FORMAT_INTENSITY_FLOAT16,
580
      fetch_texel_1d_f_intensity_f16,
581
      fetch_texel_2d_f_intensity_f16,
582
      fetch_texel_3d_f_intensity_f16
583
   },
584
   {
585
      MESA_FORMAT_R_FLOAT32,
586
      fetch_texel_1d_f_r_f32,
587
      fetch_texel_2d_f_r_f32,
588
      fetch_texel_3d_f_r_f32
589
   },
590
   {
591
      MESA_FORMAT_R_FLOAT16,
592
      fetch_texel_1d_f_r_f16,
593
      fetch_texel_2d_f_r_f16,
594
      fetch_texel_3d_f_r_f16
595
   },
596
   {
597
      MESA_FORMAT_RG_FLOAT32,
598
      fetch_texel_1d_f_rg_f32,
599
      fetch_texel_2d_f_rg_f32,
600
      fetch_texel_3d_f_rg_f32
601
   },
602
   {
603
      MESA_FORMAT_RG_FLOAT16,
604
      fetch_texel_1d_f_rg_f16,
605
      fetch_texel_2d_f_rg_f16,
606
      fetch_texel_3d_f_rg_f16
607
   },
608
 
609
   {
610
      MESA_FORMAT_ALPHA_UINT8,
611
      NULL,
612
      NULL,
613
      NULL
614
   },
615
 
616
   {
617
      MESA_FORMAT_ALPHA_UINT16,
618
      NULL,
619
      NULL,
620
      NULL
621
   },
622
 
623
   {
624
      MESA_FORMAT_ALPHA_UINT32,
625
      NULL,
626
      NULL,
627
      NULL
628
   },
629
 
630
   {
631
      MESA_FORMAT_ALPHA_INT8,
632
      NULL,
633
      NULL,
634
      NULL
635
   },
636
 
637
   {
638
      MESA_FORMAT_ALPHA_INT16,
639
      NULL,
640
      NULL,
641
      NULL
642
   },
643
 
644
   {
645
      MESA_FORMAT_ALPHA_INT32,
646
      NULL,
647
      NULL,
648
      NULL
649
   },
650
 
651
 
652
   {
653
      MESA_FORMAT_INTENSITY_UINT8,
654
      NULL,
655
      NULL,
656
      NULL
657
   },
658
 
659
   {
660
      MESA_FORMAT_INTENSITY_UINT16,
661
      NULL,
662
      NULL,
663
      NULL
664
   },
665
 
666
   {
667
      MESA_FORMAT_INTENSITY_UINT32,
668
      NULL,
669
      NULL,
670
      NULL
671
   },
672
 
673
   {
674
      MESA_FORMAT_INTENSITY_INT8,
675
      NULL,
676
      NULL,
677
      NULL
678
   },
679
 
680
   {
681
      MESA_FORMAT_INTENSITY_INT16,
682
      NULL,
683
      NULL,
684
      NULL
685
   },
686
 
687
   {
688
      MESA_FORMAT_INTENSITY_INT32,
689
      NULL,
690
      NULL,
691
      NULL
692
   },
693
 
694
 
695
   {
696
      MESA_FORMAT_LUMINANCE_UINT8,
697
      NULL,
698
      NULL,
699
      NULL
700
   },
701
 
702
   {
703
      MESA_FORMAT_LUMINANCE_UINT16,
704
      NULL,
705
      NULL,
706
      NULL
707
   },
708
 
709
   {
710
      MESA_FORMAT_LUMINANCE_UINT32,
711
      NULL,
712
      NULL,
713
      NULL
714
   },
715
 
716
   {
717
      MESA_FORMAT_LUMINANCE_INT8,
718
      NULL,
719
      NULL,
720
      NULL
721
   },
722
 
723
   {
724
      MESA_FORMAT_LUMINANCE_INT16,
725
      NULL,
726
      NULL,
727
      NULL
728
   },
729
 
730
   {
731
      MESA_FORMAT_LUMINANCE_INT32,
732
      NULL,
733
      NULL,
734
      NULL
735
   },
736
 
737
 
738
   {
739
      MESA_FORMAT_LUMINANCE_ALPHA_UINT8,
740
      NULL,
741
      NULL,
742
      NULL
743
   },
744
 
745
   {
746
      MESA_FORMAT_LUMINANCE_ALPHA_UINT16,
747
      NULL,
748
      NULL,
749
      NULL
750
   },
751
 
752
   {
753
      MESA_FORMAT_LUMINANCE_ALPHA_UINT32,
754
      NULL,
755
      NULL,
756
      NULL
757
   },
758
 
759
   {
760
      MESA_FORMAT_LUMINANCE_ALPHA_INT8,
761
      NULL,
762
      NULL,
763
      NULL
764
   },
765
 
766
   {
767
      MESA_FORMAT_LUMINANCE_ALPHA_INT16,
768
      NULL,
769
      NULL,
770
      NULL
771
   },
772
 
773
   {
774
      MESA_FORMAT_LUMINANCE_ALPHA_INT32,
775
      NULL,
776
      NULL,
777
      NULL
778
   },
779
 
780
 
781
   {
782
      MESA_FORMAT_R_INT8,
783
      NULL,
784
      NULL,
785
      NULL
786
   },
787
 
788
   {
789
      MESA_FORMAT_RG_INT8,
790
      NULL,
791
      NULL,
792
      NULL
793
   },
794
 
795
   {
796
      MESA_FORMAT_RGB_INT8,
797
      NULL,
798
      NULL,
799
      NULL
800
   },
801
 
802
   /* non-normalized, signed int */
803
   {
804
      MESA_FORMAT_RGBA_INT8,
805
      fetch_texel_1d_rgba_int8,
806
      fetch_texel_2d_rgba_int8,
807
      fetch_texel_3d_rgba_int8
808
   },
809
   {
810
      MESA_FORMAT_R_INT16,
811
      NULL,
812
      NULL,
813
      NULL
814
   },
815
   {
816
      MESA_FORMAT_RG_INT16,
817
      NULL,
818
      NULL,
819
      NULL
820
   },
821
   {
822
      MESA_FORMAT_RGB_INT16,
823
      NULL,
824
      NULL,
825
      NULL
826
   },
827
   {
828
      MESA_FORMAT_RGBA_INT16,
829
      fetch_texel_1d_rgba_int16,
830
      fetch_texel_2d_rgba_int16,
831
      fetch_texel_3d_rgba_int16
832
   },
833
   {
834
      MESA_FORMAT_R_INT32,
835
      NULL,
836
      NULL,
837
      NULL
838
   },
839
   {
840
      MESA_FORMAT_RG_INT32,
841
      NULL,
842
      NULL,
843
      NULL
844
   },
845
   {
846
      MESA_FORMAT_RGB_INT32,
847
      NULL,
848
      NULL,
849
      NULL
850
   },
851
   {
852
      MESA_FORMAT_RGBA_INT32,
853
      fetch_texel_1d_rgba_int32,
854
      fetch_texel_2d_rgba_int32,
855
      fetch_texel_3d_rgba_int32
856
   },
857
 
858
   /* non-normalized, unsigned int */
859
   {
860
      MESA_FORMAT_R_UINT8,
861
      NULL,
862
      NULL,
863
      NULL
864
   },
865
   {
866
      MESA_FORMAT_RG_UINT8,
867
      NULL,
868
      NULL,
869
      NULL
870
   },
871
   {
872
      MESA_FORMAT_RGB_UINT8,
873
      NULL,
874
      NULL,
875
      NULL
876
   },
877
   {
878
      MESA_FORMAT_RGBA_UINT8,
879
      fetch_texel_1d_rgba_uint8,
880
      fetch_texel_2d_rgba_uint8,
881
      fetch_texel_3d_rgba_uint8
882
   },
883
   {
884
      MESA_FORMAT_R_UINT16,
885
      NULL,
886
      NULL,
887
      NULL
888
   },
889
   {
890
      MESA_FORMAT_RG_UINT16,
891
      NULL,
892
      NULL,
893
      NULL
894
   },
895
   {
896
      MESA_FORMAT_RGB_UINT16,
897
      NULL,
898
      NULL,
899
      NULL
900
   },
901
   {
902
      MESA_FORMAT_RGBA_UINT16,
903
      fetch_texel_1d_rgba_uint16,
904
      fetch_texel_2d_rgba_uint16,
905
      fetch_texel_3d_rgba_uint16
906
   },
907
   {
908
      MESA_FORMAT_R_UINT32,
909
      NULL,
910
      NULL,
911
      NULL
912
   },
913
   {
914
      MESA_FORMAT_RG_UINT32,
915
      NULL,
916
      NULL,
917
      NULL
918
   },
919
   {
920
      MESA_FORMAT_RGB_UINT32,
921
      NULL,
922
      NULL,
923
      NULL
924
   },
925
   {
926
      MESA_FORMAT_RGBA_UINT32,
927
      fetch_texel_1d_rgba_uint32,
928
      fetch_texel_2d_rgba_uint32,
929
      fetch_texel_3d_rgba_uint32
930
   },
931
 
932
   /* dudv */
933
   {
934
      MESA_FORMAT_DUDV8,
935
      fetch_texel_1d_dudv8,
936
      fetch_texel_2d_dudv8,
937
      fetch_texel_3d_dudv8
938
   },
939
 
940
   /* signed, normalized */
941
   {
942
      MESA_FORMAT_SIGNED_R8,
943
      fetch_texel_1d_signed_r8,
944
      fetch_texel_2d_signed_r8,
945
      fetch_texel_3d_signed_r8
946
   },
947
   {
948
      MESA_FORMAT_SIGNED_RG88_REV,
949
      fetch_texel_1d_signed_rg88_rev,
950
      fetch_texel_2d_signed_rg88_rev,
951
      fetch_texel_3d_signed_rg88_rev
952
   },
953
   {
954
      MESA_FORMAT_SIGNED_RGBX8888,
955
      fetch_texel_1d_signed_rgbx8888,
956
      fetch_texel_2d_signed_rgbx8888,
957
      fetch_texel_3d_signed_rgbx8888
958
   },
959
   {
960
      MESA_FORMAT_SIGNED_RGBA8888,
961
      fetch_texel_1d_signed_rgba8888,
962
      fetch_texel_2d_signed_rgba8888,
963
      fetch_texel_3d_signed_rgba8888
964
   },
965
   {
966
      MESA_FORMAT_SIGNED_RGBA8888_REV,
967
      fetch_texel_1d_signed_rgba8888_rev,
968
      fetch_texel_2d_signed_rgba8888_rev,
969
      fetch_texel_3d_signed_rgba8888_rev
970
   },
971
   {
972
      MESA_FORMAT_SIGNED_R16,
973
      fetch_texel_1d_signed_r16,
974
      fetch_texel_2d_signed_r16,
975
      fetch_texel_3d_signed_r16
976
   },
977
   {
978
      MESA_FORMAT_SIGNED_GR1616,
979
      fetch_texel_1d_signed_rg1616,
980
      fetch_texel_2d_signed_rg1616,
981
      fetch_texel_3d_signed_rg1616
982
   },
983
   {
984
      MESA_FORMAT_SIGNED_RGB_16,
985
      fetch_texel_1d_signed_rgb_16,
986
      fetch_texel_2d_signed_rgb_16,
987
      fetch_texel_3d_signed_rgb_16
988
   },
989
   {
990
      MESA_FORMAT_SIGNED_RGBA_16,
991
      fetch_texel_1d_signed_rgba_16,
992
      fetch_texel_2d_signed_rgba_16,
993
      fetch_texel_3d_signed_rgba_16
994
   },
995
   {
996
      MESA_FORMAT_RGBA_16,
997
      fetch_texel_1d_rgba_16,
998
      fetch_texel_2d_rgba_16,
999
      fetch_texel_3d_rgba_16
1000
   },
1001
   {
1002
      MESA_FORMAT_RED_RGTC1,
1003
      fetch_compressed,
1004
      fetch_compressed,
1005
      fetch_compressed
1006
   },
1007
   {
1008
      MESA_FORMAT_SIGNED_RED_RGTC1,
1009
      fetch_compressed,
1010
      fetch_compressed,
1011
      fetch_compressed
1012
   },
1013
   {
1014
      MESA_FORMAT_RG_RGTC2,
1015
      fetch_compressed,
1016
      fetch_compressed,
1017
      fetch_compressed
1018
   },
1019
   {
1020
      MESA_FORMAT_SIGNED_RG_RGTC2,
1021
      fetch_compressed,
1022
      fetch_compressed,
1023
      fetch_compressed
1024
   },
1025
   {
1026
      MESA_FORMAT_L_LATC1,
1027
      fetch_compressed,
1028
      fetch_compressed,
1029
      fetch_compressed
1030
   },
1031
   {
1032
      MESA_FORMAT_SIGNED_L_LATC1,
1033
      fetch_compressed,
1034
      fetch_compressed,
1035
      fetch_compressed
1036
   },
1037
   {
1038
      MESA_FORMAT_LA_LATC2,
1039
      fetch_compressed,
1040
      fetch_compressed,
1041
      fetch_compressed
1042
   },
1043
   {
1044
      MESA_FORMAT_SIGNED_LA_LATC2,
1045
      fetch_compressed,
1046
      fetch_compressed,
1047
      fetch_compressed
1048
   },
1049
   {
1050
      MESA_FORMAT_ETC1_RGB8,
1051
      fetch_compressed,
1052
      fetch_compressed,
1053
      fetch_compressed
1054
   },
1055
   {
1056
      MESA_FORMAT_ETC2_RGB8,
1057
      fetch_compressed,
1058
      fetch_compressed,
1059
      fetch_compressed
1060
   },
1061
   {
1062
      MESA_FORMAT_ETC2_SRGB8,
1063
      fetch_compressed,
1064
      fetch_compressed,
1065
      fetch_compressed
1066
   },
1067
   {
1068
      MESA_FORMAT_ETC2_RGBA8_EAC,
1069
      fetch_compressed,
1070
      fetch_compressed,
1071
      fetch_compressed
1072
   },
1073
   {
1074
      MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
1075
      fetch_compressed,
1076
      fetch_compressed,
1077
      fetch_compressed
1078
   },
1079
   {
1080
      MESA_FORMAT_ETC2_R11_EAC,
1081
      fetch_compressed,
1082
      fetch_compressed,
1083
      fetch_compressed
1084
   },
1085
   {
1086
      MESA_FORMAT_ETC2_RG11_EAC,
1087
      fetch_compressed,
1088
      fetch_compressed,
1089
      fetch_compressed
1090
   },
1091
   {
1092
      MESA_FORMAT_ETC2_SIGNED_R11_EAC,
1093
      fetch_compressed,
1094
      fetch_compressed,
1095
      fetch_compressed
1096
   },
1097
   {
1098
      MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
1099
      fetch_compressed,
1100
      fetch_compressed,
1101
      fetch_compressed
1102
   },
1103
   {
1104
      MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
1105
      fetch_compressed,
1106
      fetch_compressed,
1107
      fetch_compressed
1108
   },
1109
   {
1110
      MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
1111
      fetch_compressed,
1112
      fetch_compressed,
1113
      fetch_compressed
1114
   },
1115
   {
1116
      MESA_FORMAT_SIGNED_A8,
1117
      fetch_texel_1d_signed_a8,
1118
      fetch_texel_2d_signed_a8,
1119
      fetch_texel_3d_signed_a8
1120
   },
1121
   {
1122
      MESA_FORMAT_SIGNED_L8,
1123
      fetch_texel_1d_signed_l8,
1124
      fetch_texel_2d_signed_l8,
1125
      fetch_texel_3d_signed_l8
1126
   },
1127
   {
1128
      MESA_FORMAT_SIGNED_AL88,
1129
      fetch_texel_1d_signed_al88,
1130
      fetch_texel_2d_signed_al88,
1131
      fetch_texel_3d_signed_al88
1132
   },
1133
   {
1134
      MESA_FORMAT_SIGNED_I8,
1135
      fetch_texel_1d_signed_i8,
1136
      fetch_texel_2d_signed_i8,
1137
      fetch_texel_3d_signed_i8
1138
   },
1139
   {
1140
      MESA_FORMAT_SIGNED_A16,
1141
      fetch_texel_1d_signed_a16,
1142
      fetch_texel_2d_signed_a16,
1143
      fetch_texel_3d_signed_a16
1144
   },
1145
   {
1146
      MESA_FORMAT_SIGNED_L16,
1147
      fetch_texel_1d_signed_l16,
1148
      fetch_texel_2d_signed_l16,
1149
      fetch_texel_3d_signed_l16
1150
   },
1151
   {
1152
      MESA_FORMAT_SIGNED_AL1616,
1153
      fetch_texel_1d_signed_al1616,
1154
      fetch_texel_2d_signed_al1616,
1155
      fetch_texel_3d_signed_al1616
1156
   },
1157
   {
1158
      MESA_FORMAT_SIGNED_I16,
1159
      fetch_texel_1d_signed_i16,
1160
      fetch_texel_2d_signed_i16,
1161
      fetch_texel_3d_signed_i16
1162
   },
1163
   {
1164
      MESA_FORMAT_RGB9_E5_FLOAT,
1165
      fetch_texel_1d_rgb9_e5,
1166
      fetch_texel_2d_rgb9_e5,
1167
      fetch_texel_3d_rgb9_e5
1168
   },
1169
   {
1170
      MESA_FORMAT_R11_G11_B10_FLOAT,
1171
      fetch_texel_1d_r11_g11_b10f,
1172
      fetch_texel_2d_r11_g11_b10f,
1173
      fetch_texel_3d_r11_g11_b10f
1174
   },
1175
   {
1176
      MESA_FORMAT_Z32_FLOAT,
1177
      fetch_texel_1d_f_r_f32, /* Reuse the R32F functions. */
1178
      fetch_texel_2d_f_r_f32,
1179
      fetch_texel_3d_f_r_f32
1180
   },
1181
   {
1182
      MESA_FORMAT_Z32_FLOAT_X24S8,
1183
      fetch_texel_1d_z32f_x24s8,
1184
      fetch_texel_2d_z32f_x24s8,
1185
      fetch_texel_3d_z32f_x24s8
1186
   },
1187
   {
1188
      MESA_FORMAT_ARGB2101010_UINT,
1189
      NULL,
1190
      NULL,
1191
      NULL
1192
   },
1193
   {
1194
      MESA_FORMAT_ABGR2101010_UINT,
1195
      NULL,
1196
      NULL,
1197
      NULL
1198
   },
1199
   {
1200
      MESA_FORMAT_XRGB4444_UNORM,
1201
      NULL,
1202
      NULL,
1203
      NULL
1204
   },
1205
   {
1206
      MESA_FORMAT_XRGB1555_UNORM,
1207
      NULL,
1208
      NULL,
1209
      NULL
1210
   },
1211
   {
1212
      MESA_FORMAT_XBGR8888_SNORM,
1213
      NULL,
1214
      NULL,
1215
      NULL
1216
   },
1217
   {
1218
      MESA_FORMAT_XBGR8888_SRGB,
1219
      NULL,
1220
      NULL,
1221
      NULL
1222
   },
1223
   {
1224
      MESA_FORMAT_XBGR8888_UINT,
1225
      NULL,
1226
      NULL,
1227
      NULL
1228
   },
1229
   {
1230
      MESA_FORMAT_XBGR8888_SINT,
1231
      NULL,
1232
      NULL,
1233
      NULL
1234
   },
1235
   {
1236
      MESA_FORMAT_XRGB2101010_UNORM,
1237
      NULL,
1238
      NULL,
1239
      NULL
1240
   },
1241
   {
1242
      MESA_FORMAT_XBGR16161616_UNORM,
1243
      fetch_texel_1d_xbgr16161616_unorm,
1244
      fetch_texel_2d_xbgr16161616_unorm,
1245
      fetch_texel_3d_xbgr16161616_unorm
1246
   },
1247
   {
1248
      MESA_FORMAT_XBGR16161616_SNORM,
1249
      NULL,
1250
      NULL,
1251
      NULL
1252
   },
1253
   {
1254
      MESA_FORMAT_XBGR16161616_FLOAT,
1255
      fetch_texel_1d_xbgr16161616_float,
1256
      fetch_texel_2d_xbgr16161616_float,
1257
      fetch_texel_3d_xbgr16161616_float
1258
   },
1259
   {
1260
      MESA_FORMAT_XBGR16161616_UINT,
1261
      NULL,
1262
      NULL,
1263
      NULL
1264
   },
1265
   {
1266
      MESA_FORMAT_XBGR16161616_SINT,
1267
      NULL,
1268
      NULL,
1269
      NULL
1270
   },
1271
   {
1272
      MESA_FORMAT_XBGR32323232_FLOAT,
1273
      fetch_texel_1d_xbgr32323232_float,
1274
      fetch_texel_2d_xbgr32323232_float,
1275
      fetch_texel_3d_xbgr32323232_float
1276
   },
1277
   {
1278
      MESA_FORMAT_XBGR32323232_UINT,
1279
      NULL,
1280
      NULL,
1281
      NULL
1282
   },
1283
   {
1284
      MESA_FORMAT_XBGR32323232_SINT,
1285
      NULL,
1286
      NULL,
1287
      NULL
1288
   },
1289
};
1290
 
1291
 
1292
/**
1293
 * Initialize the texture image's FetchTexel methods.
1294
 */
1295
static void
1296
set_fetch_functions(const struct gl_sampler_object *samp,
1297
                    struct swrast_texture_image *texImage, GLuint dims)
1298
{
1299
   gl_format format = texImage->Base.TexFormat;
1300
 
1301
#ifdef DEBUG
1302
   /* check that the table entries are sorted by format name */
1303
   gl_format fmt;
1304
   for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
1305
      assert(texfetch_funcs[fmt].Name == fmt);
1306
   }
1307
#endif
1308
 
1309
   STATIC_ASSERT(Elements(texfetch_funcs) == MESA_FORMAT_COUNT);
1310
 
1311
   if (samp->sRGBDecode == GL_SKIP_DECODE_EXT &&
1312
       _mesa_get_format_color_encoding(format) == GL_SRGB) {
1313
      format = _mesa_get_srgb_format_linear(format);
1314
   }
1315
 
1316
   assert(format < MESA_FORMAT_COUNT);
1317
 
1318
   switch (dims) {
1319
   case 1:
1320
      texImage->FetchTexel = texfetch_funcs[format].Fetch1D;
1321
      break;
1322
   case 2:
1323
      texImage->FetchTexel = texfetch_funcs[format].Fetch2D;
1324
      break;
1325
   case 3:
1326
      texImage->FetchTexel = texfetch_funcs[format].Fetch3D;
1327
      break;
1328
   default:
1329
      assert(!"Bad dims in set_fetch_functions()");
1330
   }
1331
 
1332
   texImage->FetchCompressedTexel = _mesa_get_compressed_fetch_func(format);
1333
 
1334
   ASSERT(texImage->FetchTexel);
1335
}
1336
 
1337
void
1338
_mesa_update_fetch_functions(struct gl_context *ctx, GLuint unit)
1339
{
1340
   struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
1341
   struct gl_sampler_object *samp;
1342
   GLuint face, i;
1343
   GLuint dims;
1344
 
1345
   if (!texObj)
1346
      return;
1347
 
1348
   samp = _mesa_get_samplerobj(ctx, unit);
1349
 
1350
   dims = _mesa_get_texture_dimensions(texObj->Target);
1351
 
1352
   for (face = 0; face < 6; face++) {
1353
      for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
1354
         if (texObj->Image[face][i]) {
1355
	    set_fetch_functions(samp,
1356
                                swrast_texture_image(texObj->Image[face][i]),
1357
                                dims);
1358
         }
1359
      }
1360
   }
1361
}