Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. }
  1362.