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/macros.h"
  37. #include "main/texcompress.h"
  38. #include "main/texcompress_fxt1.h"
  39. #include "main/texcompress_s3tc.h"
  40. #include "main/texcompress_rgtc.h"
  41. #include "main/texcompress_etc.h"
  42. #include "main/teximage.h"
  43. #include "main/samplerobj.h"
  44. #include "s_context.h"
  45. #include "s_texfetch.h"
  46. #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
  47. #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
  48. #include "util/format_srgb.h"
  49.  
  50.  
  51. /* Texel fetch routines for all supported formats
  52.  */
  53. #define DIM 1
  54. #include "s_texfetch_tmp.h"
  55.  
  56. #define DIM 2
  57. #include "s_texfetch_tmp.h"
  58.  
  59. #define DIM 3
  60. #include "s_texfetch_tmp.h"
  61.  
  62.  
  63. /**
  64.  * All compressed texture texel fetching is done though this function.
  65.  * Basically just call a core-Mesa texel fetch function.
  66.  */
  67. static void
  68. fetch_compressed(const struct swrast_texture_image *swImage,
  69.                  GLint i, GLint j, GLint k, GLfloat *texel)
  70. {
  71.    /* The FetchCompressedTexel function takes an integer pixel rowstride,
  72.     * while the image's rowstride is bytes per row of blocks.
  73.     */
  74.    GLuint bw, bh;
  75.    GLuint texelBytes = _mesa_get_format_bytes(swImage->Base.TexFormat);
  76.    _mesa_get_format_block_size(swImage->Base.TexFormat, &bw, &bh);
  77.    assert(swImage->RowStride * bw % texelBytes == 0);
  78.  
  79.    swImage->FetchCompressedTexel(swImage->ImageSlices[k],
  80.                                  swImage->RowStride * bw / texelBytes,
  81.                                  i, j, texel);
  82. }
  83.  
  84.  
  85.  
  86. /**
  87.  * Null texel fetch function.
  88.  *
  89.  * Have to have this so the FetchTexel function pointer is never NULL.
  90.  */
  91. static void fetch_null_texelf( const struct swrast_texture_image *texImage,
  92.                                GLint i, GLint j, GLint k, GLfloat *texel )
  93. {
  94.    (void) texImage; (void) i; (void) j; (void) k;
  95.    texel[RCOMP] = 0.0;
  96.    texel[GCOMP] = 0.0;
  97.    texel[BCOMP] = 0.0;
  98.    texel[ACOMP] = 0.0;
  99.    _mesa_warning(NULL, "fetch_null_texelf() called!");
  100. }
  101.  
  102.  
  103. #define FETCH_FUNCS(NAME)       \
  104.    {                            \
  105.       MESA_FORMAT_ ## NAME,     \
  106.       fetch_texel_1d_ ## NAME,  \
  107.       fetch_texel_2d_ ## NAME,  \
  108.       fetch_texel_3d_ ## NAME,  \
  109.    }
  110.  
  111. #define FETCH_NULL(NAME)        \
  112.    {                            \
  113.       MESA_FORMAT_ ## NAME,     \
  114.       NULL,                     \
  115.       NULL,                     \
  116.       NULL                      \
  117.    }
  118.  
  119. /**
  120.  * Table to map MESA_FORMAT_ to texel fetch/store funcs.
  121.  */
  122. static struct {
  123.    mesa_format Name;
  124.    FetchTexelFunc Fetch1D;
  125.    FetchTexelFunc Fetch2D;
  126.    FetchTexelFunc Fetch3D;
  127. }
  128. texfetch_funcs[] =
  129. {
  130.    {
  131.       MESA_FORMAT_NONE,
  132.       fetch_null_texelf,
  133.       fetch_null_texelf,
  134.       fetch_null_texelf
  135.    },
  136.  
  137.    /* Packed unorm formats */
  138.    FETCH_FUNCS(A8B8G8R8_UNORM),
  139.    FETCH_FUNCS(X8B8G8R8_UNORM),
  140.    FETCH_FUNCS(R8G8B8A8_UNORM),
  141.    FETCH_FUNCS(R8G8B8X8_UNORM),
  142.    FETCH_FUNCS(B8G8R8A8_UNORM),
  143.    FETCH_FUNCS(B8G8R8X8_UNORM),
  144.    FETCH_FUNCS(A8R8G8B8_UNORM),
  145.    FETCH_FUNCS(X8R8G8B8_UNORM),
  146.    FETCH_FUNCS(L16A16_UNORM),
  147.    FETCH_FUNCS(A16L16_UNORM),
  148.    FETCH_FUNCS(B5G6R5_UNORM),
  149.    FETCH_FUNCS(R5G6B5_UNORM),
  150.    FETCH_FUNCS(B4G4R4A4_UNORM),
  151.    FETCH_NULL(B4G4R4X4_UNORM),
  152.    FETCH_FUNCS(A4R4G4B4_UNORM),
  153.    FETCH_FUNCS(A1B5G5R5_UNORM),
  154.    FETCH_FUNCS(B5G5R5A1_UNORM),
  155.    FETCH_NULL(B5G5R5X1_UNORM),
  156.    FETCH_FUNCS(A1R5G5B5_UNORM),
  157.    FETCH_FUNCS(L8A8_UNORM),
  158.    FETCH_FUNCS(A8L8_UNORM),
  159.    FETCH_FUNCS(R8G8_UNORM),
  160.    FETCH_FUNCS(G8R8_UNORM),
  161.    FETCH_FUNCS(L4A4_UNORM),
  162.    FETCH_FUNCS(B2G3R3_UNORM),
  163.    FETCH_FUNCS(R16G16_UNORM),
  164.    FETCH_FUNCS(G16R16_UNORM),
  165.    FETCH_FUNCS(B10G10R10A2_UNORM),
  166.    FETCH_NULL(B10G10R10X2_UNORM),
  167.    FETCH_FUNCS(R10G10B10A2_UNORM),
  168.    FETCH_NULL(R10G10B10X2_UNORM),
  169.  
  170.    FETCH_FUNCS(S8_UINT_Z24_UNORM),
  171.    {
  172.       MESA_FORMAT_X8_UINT_Z24_UNORM,
  173.       fetch_texel_1d_S8_UINT_Z24_UNORM,
  174.       fetch_texel_2d_S8_UINT_Z24_UNORM,
  175.       fetch_texel_3d_S8_UINT_Z24_UNORM
  176.    },
  177.    FETCH_FUNCS(Z24_UNORM_S8_UINT),
  178.    {
  179.       MESA_FORMAT_Z24_UNORM_X8_UINT,
  180.       fetch_texel_1d_Z24_UNORM_S8_UINT,
  181.       fetch_texel_2d_Z24_UNORM_S8_UINT,
  182.       fetch_texel_3d_Z24_UNORM_S8_UINT
  183.    },
  184.    FETCH_NULL(R3G3B2_UNORM),
  185.    FETCH_NULL(A4B4G4R4_UNORM),
  186.    FETCH_NULL(R4G4B4A4_UNORM),
  187.    FETCH_NULL(R5G5B5A1_UNORM),
  188.    FETCH_NULL(A2B10G10R10_UNORM),
  189.    FETCH_NULL(A2R10G10B10_UNORM),
  190.  
  191.    FETCH_FUNCS(YCBCR),
  192.    FETCH_FUNCS(YCBCR_REV),
  193.  
  194.    /* Array unorm formats */
  195.    FETCH_FUNCS(A_UNORM8),
  196.    FETCH_FUNCS(A_UNORM16),
  197.    FETCH_FUNCS(L_UNORM8),
  198.    FETCH_FUNCS(L_UNORM16),
  199.    FETCH_FUNCS(I_UNORM8),
  200.    FETCH_FUNCS(I_UNORM16),
  201.    FETCH_FUNCS(R_UNORM8),
  202.    FETCH_FUNCS(R_UNORM16),
  203.    FETCH_FUNCS(BGR_UNORM8),
  204.    FETCH_FUNCS(RGB_UNORM8),
  205.    FETCH_FUNCS(RGBA_UNORM16),
  206.    FETCH_FUNCS(RGBX_UNORM16),
  207.    FETCH_FUNCS(Z_UNORM16),
  208.    FETCH_FUNCS(Z_UNORM32),
  209.    FETCH_NULL(S_UINT8),
  210.  
  211.    /* Packed signed/normalized formats */
  212.    FETCH_FUNCS(A8B8G8R8_SNORM),
  213.    FETCH_FUNCS(X8B8G8R8_SNORM),
  214.    FETCH_FUNCS(R8G8B8A8_SNORM),
  215.    FETCH_NULL(R8G8B8X8_SNORM),
  216.    FETCH_FUNCS(R16G16_SNORM),
  217.    FETCH_NULL(G16R16_SNORM),
  218.    FETCH_FUNCS(R8G8_SNORM),
  219.    FETCH_NULL(G8R8_SNORM),
  220.    FETCH_FUNCS(L8A8_SNORM),
  221.    FETCH_FUNCS(A8L8_SNORM),
  222.  
  223.    /* Array signed/normalized formats */
  224.    FETCH_FUNCS(A_SNORM8),
  225.    FETCH_FUNCS(A_SNORM16),
  226.    FETCH_FUNCS(L_SNORM8),
  227.    FETCH_FUNCS(L_SNORM16),
  228.    FETCH_FUNCS(I_SNORM8),
  229.    FETCH_FUNCS(I_SNORM16),
  230.    FETCH_FUNCS(R_SNORM8),
  231.    FETCH_FUNCS(R_SNORM16),
  232.    FETCH_FUNCS(LA_SNORM16),
  233.    FETCH_FUNCS(RGB_SNORM16),
  234.    FETCH_FUNCS(RGBA_SNORM16),
  235.    FETCH_NULL(RGBX_SNORM16),
  236.  
  237.    /* Packed sRGB formats */
  238.    FETCH_FUNCS(A8B8G8R8_SRGB),
  239.    FETCH_FUNCS(B8G8R8A8_SRGB),
  240.    FETCH_FUNCS(A8R8G8B8_SRGB),
  241.    FETCH_NULL(B8G8R8X8_SRGB),
  242.    FETCH_NULL(X8R8G8B8_SRGB),
  243.    FETCH_FUNCS(R8G8B8A8_SRGB),
  244.    FETCH_FUNCS(R8G8B8X8_SRGB),
  245.    FETCH_FUNCS(X8B8G8R8_SRGB),
  246.    FETCH_FUNCS(L8A8_SRGB),
  247.    FETCH_FUNCS(A8L8_SRGB),
  248.  
  249.    /* Array sRGB formats */
  250.    FETCH_FUNCS(L_SRGB8),
  251.    FETCH_FUNCS(BGR_SRGB8),
  252.  
  253.    /* Packed float formats */
  254.    FETCH_FUNCS(R9G9B9E5_FLOAT),
  255.    FETCH_FUNCS(R11G11B10_FLOAT),
  256.    FETCH_FUNCS(Z32_FLOAT_S8X24_UINT),
  257.  
  258.    /* Array float formats */
  259.    FETCH_FUNCS(A_FLOAT16),
  260.    FETCH_FUNCS(A_FLOAT32),
  261.    FETCH_FUNCS(L_FLOAT16),
  262.    FETCH_FUNCS(L_FLOAT32),
  263.    FETCH_FUNCS(LA_FLOAT16),
  264.    FETCH_FUNCS(LA_FLOAT32),
  265.    FETCH_FUNCS(I_FLOAT16),
  266.    FETCH_FUNCS(I_FLOAT32),
  267.    FETCH_FUNCS(R_FLOAT16),
  268.    FETCH_FUNCS(R_FLOAT32),
  269.    FETCH_FUNCS(RG_FLOAT16),
  270.    FETCH_FUNCS(RG_FLOAT32),
  271.    FETCH_FUNCS(RGB_FLOAT16),
  272.    FETCH_FUNCS(RGB_FLOAT32),
  273.    FETCH_FUNCS(RGBA_FLOAT16),
  274.    FETCH_FUNCS(RGBA_FLOAT32),
  275.    FETCH_FUNCS(RGBX_FLOAT16),
  276.    FETCH_FUNCS(RGBX_FLOAT32),
  277.    {
  278.       MESA_FORMAT_Z_FLOAT32,
  279.       fetch_texel_1d_R_FLOAT32, /* Reuse the R32F functions. */
  280.       fetch_texel_2d_R_FLOAT32,
  281.       fetch_texel_3d_R_FLOAT32
  282.    },
  283.  
  284.    /* Packed signed/unsigned non-normalized integer formats */
  285.    FETCH_NULL(B10G10R10A2_UINT),
  286.    FETCH_NULL(R10G10B10A2_UINT),
  287.    FETCH_NULL(A2B10G10R10_UINT),
  288.    FETCH_NULL(A2R10G10B10_UINT),
  289.  
  290.    /* Array signed/unsigned non-normalized integer formats */
  291.    FETCH_NULL(A_UINT8),
  292.    FETCH_NULL(A_UINT16),
  293.    FETCH_NULL(A_UINT32),
  294.    FETCH_NULL(A_SINT8),
  295.    FETCH_NULL(A_SINT16),
  296.    FETCH_NULL(A_SINT32),
  297.    FETCH_NULL(I_UINT8),
  298.    FETCH_NULL(I_UINT16),
  299.    FETCH_NULL(I_UINT32),
  300.    FETCH_NULL(I_SINT8),
  301.    FETCH_NULL(I_SINT16),
  302.    FETCH_NULL(I_SINT32),
  303.    FETCH_NULL(L_UINT8),
  304.    FETCH_NULL(L_UINT16),
  305.    FETCH_NULL(L_UINT32),
  306.    FETCH_NULL(L_SINT8),
  307.    FETCH_NULL(L_SINT16),
  308.    FETCH_NULL(L_SINT32),
  309.    FETCH_NULL(LA_UINT8),
  310.    FETCH_NULL(LA_UINT16),
  311.    FETCH_NULL(LA_UINT32),
  312.    FETCH_NULL(LA_SINT8),
  313.    FETCH_NULL(LA_SINT16),
  314.    FETCH_NULL(LA_SINT32),
  315.    FETCH_NULL(R_UINT8),
  316.    FETCH_NULL(R_UINT16),
  317.    FETCH_NULL(R_UINT32),
  318.    FETCH_NULL(R_SINT8),
  319.    FETCH_NULL(R_SINT16),
  320.    FETCH_NULL(R_SINT32),
  321.    FETCH_NULL(RG_UINT8),
  322.    FETCH_NULL(RG_UINT16),
  323.    FETCH_NULL(RG_UINT32),
  324.    FETCH_NULL(RG_SINT8),
  325.    FETCH_NULL(RG_SINT16),
  326.    FETCH_NULL(RG_SINT32),
  327.    FETCH_NULL(RGB_UINT8),
  328.    FETCH_NULL(RGB_UINT16),
  329.    FETCH_NULL(RGB_UINT32),
  330.    FETCH_NULL(RGB_SINT8),
  331.    FETCH_NULL(RGB_SINT16),
  332.    FETCH_NULL(RGB_SINT32),
  333.    FETCH_FUNCS(RGBA_UINT8),
  334.    FETCH_FUNCS(RGBA_UINT16),
  335.    FETCH_FUNCS(RGBA_UINT32),
  336.    FETCH_FUNCS(RGBA_SINT8),
  337.    FETCH_FUNCS(RGBA_SINT16),
  338.    FETCH_FUNCS(RGBA_SINT32),
  339.    FETCH_NULL(RGBX_UINT8),
  340.    FETCH_NULL(RGBX_UINT16),
  341.    FETCH_NULL(RGBX_UINT32),
  342.    FETCH_NULL(RGBX_SINT8),
  343.    FETCH_NULL(RGBX_SINT16),
  344.    FETCH_NULL(RGBX_SINT32),
  345.  
  346.    /* DXT compressed formats */
  347.    {
  348.       MESA_FORMAT_RGB_DXT1,
  349.       fetch_compressed,
  350.       fetch_compressed,
  351.       fetch_compressed
  352.    },
  353.    {
  354.       MESA_FORMAT_RGBA_DXT1,
  355.       fetch_compressed,
  356.       fetch_compressed,
  357.       fetch_compressed
  358.    },
  359.    {
  360.       MESA_FORMAT_RGBA_DXT3,
  361.       fetch_compressed,
  362.       fetch_compressed,
  363.       fetch_compressed
  364.    },
  365.    {
  366.       MESA_FORMAT_RGBA_DXT5,
  367.       fetch_compressed,
  368.       fetch_compressed,
  369.       fetch_compressed
  370.    },
  371.  
  372.    /* DXT sRGB compressed formats */
  373.    {
  374.       MESA_FORMAT_SRGB_DXT1,
  375.       fetch_compressed,
  376.       fetch_compressed,
  377.       fetch_compressed
  378.    },
  379.    {
  380.       MESA_FORMAT_SRGBA_DXT1,
  381.       fetch_compressed,
  382.       fetch_compressed,
  383.       fetch_compressed
  384.    },
  385.    {
  386.       MESA_FORMAT_SRGBA_DXT3,
  387.       fetch_compressed,
  388.       fetch_compressed,
  389.       fetch_compressed
  390.    },
  391.    {
  392.       MESA_FORMAT_SRGBA_DXT5,
  393.       fetch_compressed,
  394.       fetch_compressed,
  395.       fetch_compressed
  396.    },
  397.  
  398.    /* FXT1 compressed formats */
  399.    {
  400.       MESA_FORMAT_RGB_FXT1,
  401.       fetch_compressed,
  402.       fetch_compressed,
  403.       fetch_compressed
  404.    },
  405.    {
  406.       MESA_FORMAT_RGBA_FXT1,
  407.       fetch_compressed,
  408.       fetch_compressed,
  409.       fetch_compressed
  410.    },
  411.  
  412.    /* RGTC compressed formats */
  413.    {
  414.       MESA_FORMAT_R_RGTC1_UNORM,
  415.       fetch_compressed,
  416.       fetch_compressed,
  417.       fetch_compressed
  418.    },
  419.    {
  420.       MESA_FORMAT_R_RGTC1_SNORM,
  421.       fetch_compressed,
  422.       fetch_compressed,
  423.       fetch_compressed
  424.    },
  425.    {
  426.       MESA_FORMAT_RG_RGTC2_UNORM,
  427.       fetch_compressed,
  428.       fetch_compressed,
  429.       fetch_compressed
  430.    },
  431.    {
  432.       MESA_FORMAT_RG_RGTC2_SNORM,
  433.       fetch_compressed,
  434.       fetch_compressed,
  435.       fetch_compressed
  436.    },
  437.  
  438.    /* LATC1/2 compressed formats */
  439.    {
  440.       MESA_FORMAT_L_LATC1_UNORM,
  441.       fetch_compressed,
  442.       fetch_compressed,
  443.       fetch_compressed
  444.    },
  445.    {
  446.       MESA_FORMAT_L_LATC1_SNORM,
  447.       fetch_compressed,
  448.       fetch_compressed,
  449.       fetch_compressed
  450.    },
  451.    {
  452.       MESA_FORMAT_LA_LATC2_UNORM,
  453.       fetch_compressed,
  454.       fetch_compressed,
  455.       fetch_compressed
  456.    },
  457.    {
  458.       MESA_FORMAT_LA_LATC2_SNORM,
  459.       fetch_compressed,
  460.       fetch_compressed,
  461.       fetch_compressed
  462.    },
  463.  
  464.    /* ETC1/2 compressed formats */
  465.    {
  466.       MESA_FORMAT_ETC1_RGB8,
  467.       fetch_compressed,
  468.       fetch_compressed,
  469.       fetch_compressed
  470.    },
  471.    {
  472.       MESA_FORMAT_ETC2_RGB8,
  473.       fetch_compressed,
  474.       fetch_compressed,
  475.       fetch_compressed
  476.    },
  477.    {
  478.       MESA_FORMAT_ETC2_SRGB8,
  479.       fetch_compressed,
  480.       fetch_compressed,
  481.       fetch_compressed
  482.    },
  483.    {
  484.       MESA_FORMAT_ETC2_RGBA8_EAC,
  485.       fetch_compressed,
  486.       fetch_compressed,
  487.       fetch_compressed
  488.    },
  489.    {
  490.       MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
  491.       fetch_compressed,
  492.       fetch_compressed,
  493.       fetch_compressed
  494.    },
  495.    {
  496.       MESA_FORMAT_ETC2_R11_EAC,
  497.       fetch_compressed,
  498.       fetch_compressed,
  499.       fetch_compressed
  500.    },
  501.    {
  502.       MESA_FORMAT_ETC2_RG11_EAC,
  503.       fetch_compressed,
  504.       fetch_compressed,
  505.       fetch_compressed
  506.    },
  507.    {
  508.       MESA_FORMAT_ETC2_SIGNED_R11_EAC,
  509.       fetch_compressed,
  510.       fetch_compressed,
  511.       fetch_compressed
  512.    },
  513.    {
  514.       MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
  515.       fetch_compressed,
  516.       fetch_compressed,
  517.       fetch_compressed
  518.    },
  519.    {
  520.       MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
  521.       fetch_compressed,
  522.       fetch_compressed,
  523.       fetch_compressed
  524.    },
  525.    {
  526.       MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
  527.       fetch_compressed,
  528.       fetch_compressed,
  529.       fetch_compressed
  530.    },
  531.    {
  532.       MESA_FORMAT_BPTC_RGBA_UNORM,
  533.       fetch_compressed,
  534.       fetch_compressed,
  535.       fetch_compressed
  536.    },
  537.    {
  538.       MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM,
  539.       fetch_compressed,
  540.       fetch_compressed,
  541.       fetch_compressed
  542.    },
  543.    {
  544.       MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT,
  545.       fetch_compressed,
  546.       fetch_compressed,
  547.       fetch_compressed
  548.    },
  549.    {
  550.       MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT,
  551.       fetch_compressed,
  552.       fetch_compressed,
  553.       fetch_compressed
  554.    }
  555. };
  556.  
  557.  
  558. /**
  559.  * Initialize the texture image's FetchTexel methods.
  560.  */
  561. static void
  562. set_fetch_functions(const struct gl_sampler_object *samp,
  563.                     struct swrast_texture_image *texImage, GLuint dims)
  564. {
  565.    mesa_format format = texImage->Base.TexFormat;
  566.  
  567. #ifdef DEBUG
  568.    /* check that the table entries are sorted by format name */
  569.    mesa_format fmt;
  570.    for (fmt = 0; fmt < MESA_FORMAT_COUNT; fmt++) {
  571.       assert(texfetch_funcs[fmt].Name == fmt);
  572.    }
  573. #endif
  574.  
  575.    STATIC_ASSERT(ARRAY_SIZE(texfetch_funcs) == MESA_FORMAT_COUNT);
  576.  
  577.    if (samp->sRGBDecode == GL_SKIP_DECODE_EXT &&
  578.        _mesa_get_format_color_encoding(format) == GL_SRGB) {
  579.       format = _mesa_get_srgb_format_linear(format);
  580.    }
  581.  
  582.    assert(format < MESA_FORMAT_COUNT);
  583.  
  584.    switch (dims) {
  585.    case 1:
  586.       texImage->FetchTexel = texfetch_funcs[format].Fetch1D;
  587.       break;
  588.    case 2:
  589.       texImage->FetchTexel = texfetch_funcs[format].Fetch2D;
  590.       break;
  591.    case 3:
  592.       texImage->FetchTexel = texfetch_funcs[format].Fetch3D;
  593.       break;
  594.    default:
  595.       assert(!"Bad dims in set_fetch_functions()");
  596.    }
  597.  
  598.    texImage->FetchCompressedTexel = _mesa_get_compressed_fetch_func(format);
  599.  
  600.    assert(texImage->FetchTexel);
  601. }
  602.  
  603. void
  604. _mesa_update_fetch_functions(struct gl_context *ctx, GLuint unit)
  605. {
  606.    struct gl_texture_object *texObj = ctx->Texture.Unit[unit]._Current;
  607.    struct gl_sampler_object *samp;
  608.    GLuint face, i;
  609.    GLuint dims;
  610.  
  611.    if (!texObj)
  612.       return;
  613.  
  614.    samp = _mesa_get_samplerobj(ctx, unit);
  615.  
  616.    dims = _mesa_get_texture_dimensions(texObj->Target);
  617.  
  618.    for (face = 0; face < 6; face++) {
  619.       for (i = 0; i < MAX_TEXTURE_LEVELS; i++) {
  620.          if (texObj->Image[face][i]) {
  621.             set_fetch_functions(samp,
  622.                                 swrast_texture_image(texObj->Image[face][i]),
  623.                                 dims);
  624.          }
  625.       }
  626.    }
  627. }
  628.