home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mesa5.zip / mesa5src.zip / texutil_tmp.h < prev    next >
Text File  |  2002-10-29  |  16KB  |  480 lines

  1. /* $Id: texutil_tmp.h,v 1.12 2002/10/29 20:28:55 brianp Exp $ */
  2.  
  3. /*
  4.  * Mesa 3-D graphics library
  5.  * Version:  4.0.2
  6.  *
  7.  * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
  8.  *
  9.  * Permission is hereby granted, free of charge, to any person obtaining a
  10.  * copy of this software and associated documentation files (the "Software"),
  11.  * to deal in the Software without restriction, including without limitation
  12.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13.  * and/or sell copies of the Software, and to permit persons to whom the
  14.  * Software is furnished to do so, subject to the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice shall be included
  17.  * in all copies or substantial portions of the Software.
  18.  *
  19.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  20.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  23.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  25.  *
  26.  * Author:
  27.  *    Gareth Hughes
  28.  */
  29.  
  30.  
  31. /*
  32.  * For 2D and 3D texture images, we generate functions for
  33.  *  - conversion without pixel unpacking and standard stride
  34.  *  - conversion without pixel unpacking and non-standard stride
  35.  *  - conversion with pixel unpacking and standard stride
  36.  *  - conversion with pixel unpacking and non-standard stride
  37.  *
  38.  *
  39.  * Macros which need to be defined before including this file:
  40.  *  TAG(x)  - the function name wrapper
  41.  *  DST_TYPE - the destination texel datatype (GLuint, GLushort, etc)
  42.  *  DST_TEXELS_PER_DWORD - number of dest texels that'll fit in 4 bytes
  43.  *  CONVERT_TEXEL - code to convert from source to dest texel
  44.  *  CONVER_TEXEL_DWORD - if multiple texels fit in 4 bytes, this macros
  45.  *                       will convert/store multiple texels at once
  46.  *  CONVERT_DIRECT - if defined, just memcpy texels from src to dest
  47.  *  SRC_TEXEL_BYTES - bytes per source texel
  48.  *  PRESERVE_DST_TYPE - if defined, don't undefined these macros at end
  49.  */
  50.  
  51.  
  52. #define DST_TEXEL_BYTES        (4 / DST_TEXELS_PER_DWORD)
  53. #define DST_ROW_BYTES        (convert->width * DST_TEXEL_BYTES)
  54. #define DST_ROW_STRIDE        (convert->dstImageWidth * DST_TEXEL_BYTES)
  55. #define DST_IMG_STRIDE        (convert->dstImageWidth *        \
  56.                  convert->dstImageHeight * DST_TEXEL_BYTES)
  57.  
  58.  
  59. /* =============================================================
  60.  * PRE: No pixelstore attribs, width == dstImageWidth.
  61.  */
  62. static GLboolean
  63. TAG(texsubimage2d)( const struct convert_info *convert )
  64. {
  65.    const GLubyte *src = (const GLubyte *)convert->srcImage;
  66.    GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
  67.                 (convert->yoffset * convert->dstImageWidth +
  68.                  convert->xoffset) * DST_TEXEL_BYTES);
  69.  
  70. #if DEBUG_TEXUTIL
  71.    _mesa_debug( NULL, __FUNCTION__ "\n" );
  72. #endif
  73.  
  74. #ifdef CONVERT_DIRECT
  75.    MEMCPY( dst, src, convert->height * DST_ROW_BYTES );
  76. #else
  77.    {
  78.       const GLint texels = convert->width * convert->height;
  79.       const GLint dwords = texels / DST_TEXELS_PER_DWORD;
  80.       const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
  81.       GLint i;
  82.       for ( i = 0 ; i < dwords ; i++ ) {
  83.          CONVERT_TEXEL_DWORD( *dst++, src );
  84.          src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
  85.       }
  86.       for ( i = 0; i < leftover; i++ ) {
  87.          CONVERT_TEXEL( *dst++, src );
  88.          src += SRC_TEXEL_BYTES;
  89.       }
  90.    }
  91. #endif
  92.  
  93.    return GL_TRUE;
  94. }
  95.  
  96. /* PRE: As above, height == dstImageHeight also.
  97.  */
  98. static GLboolean
  99. TAG(texsubimage3d)( const struct convert_info *convert )
  100. {
  101.    const GLubyte *src = (const GLubyte *)convert->srcImage;
  102.    GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
  103.                 ((convert->zoffset * convert->height +
  104.                   convert->yoffset) * convert->width +
  105.                  convert->xoffset) * DST_TEXEL_BYTES);
  106. #if DEBUG_TEXUTIL
  107.    _mesa_debug( NULL, __FUNCTION__ "\n" );
  108. #endif
  109.  
  110. #ifdef CONVERT_DIRECT
  111.    MEMCPY( dst, src, convert->depth * convert->height * DST_ROW_BYTES );
  112. #else
  113.    {
  114.       const GLint texels = convert->width * convert->height * convert->depth;
  115.       const GLint dwords = texels / DST_TEXELS_PER_DWORD;
  116.       const GLint leftover = texels - dwords * DST_TEXELS_PER_DWORD;
  117.       GLint i;
  118.       for ( i = 0 ; i < dwords ; i++ ) {
  119.          CONVERT_TEXEL_DWORD( *dst++, src );
  120.          src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
  121.       }
  122.       for ( i = 0; i < leftover; i++ ) {
  123.          CONVERT_TEXEL( *dst++, src );
  124.          src += SRC_TEXEL_BYTES;
  125.       }
  126.    }
  127. #endif
  128.  
  129.    return GL_TRUE;
  130. }
  131.  
  132.  
  133.  
  134. /* =============================================================
  135.  * PRE: No pixelstore attribs, width != dstImageWidth.
  136.  */
  137. static GLboolean
  138. TAG(texsubimage2d_stride)( const struct convert_info *convert )
  139. {
  140.    const GLubyte *src = (const GLubyte *)convert->srcImage;
  141.    DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  142.                 (convert->yoffset * convert->dstImageWidth +
  143.                  convert->xoffset) * DST_TEXEL_BYTES);
  144.    GLint adjust;
  145.    GLint row, col;
  146.  
  147.    adjust = convert->dstImageWidth - convert->width;
  148.  
  149. #if DEBUG_TEXUTIL
  150.    _mesa_debug( NULL, __FUNCTION__ ":\n" );
  151.    _mesa_debug( NULL, "   x=%d y=%d w=%d h=%d s=%d\n",
  152.             convert->xoffset, convert->yoffset, convert->width,
  153.             convert->height, convert->dstImageWidth );
  154.    _mesa_debug( NULL, "   adjust=%d\n", adjust );
  155. #endif
  156.  
  157.    for ( row = 0 ; row < convert->height ; row++ ) {
  158.       for ( col = 0 ; col < convert->width ; col++ ) {
  159.      CONVERT_TEXEL( *dst++, src );
  160.      src += SRC_TEXEL_BYTES;
  161.       }
  162.       dst += adjust;
  163.    }
  164.  
  165.    return GL_TRUE;
  166. }
  167.  
  168. /* PRE: As above, or height != dstImageHeight also.
  169.  */
  170. static GLboolean
  171. TAG(texsubimage3d_stride)( const struct convert_info *convert )
  172. {
  173.    const GLubyte *src = (const GLubyte *)convert->srcImage;
  174.    DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  175.                 ((convert->zoffset * convert->dstImageHeight +
  176.                   convert->yoffset) * convert->dstImageWidth +
  177.                  convert->xoffset) * DST_TEXEL_BYTES);
  178.    GLint adjust;
  179.    GLint row, col, img;
  180.  
  181.    adjust = convert->dstImageWidth - convert->width;
  182.  
  183. #if DEBUG_TEXUTIL
  184.    _mesa_debug( NULL, __FUNCTION__ ":\n" );
  185.    _mesa_debug( NULL, "   x=%d y=%d w=%d h=%d s=%d\n",
  186.             convert->xoffset, convert->yoffset, convert->width,
  187.             convert->height, convert->dstImageWidth );
  188.    _mesa_debug( NULL, "   adjust=%d\n", adjust );
  189. #endif
  190.  
  191.    for ( img = 0 ; img < convert->depth ; img++ ) {
  192.       for ( row = 0 ; row < convert->height ; row++ ) {
  193.      for ( col = 0 ; col < convert->width ; col++ ) {
  194.         CONVERT_TEXEL( *dst++, src );
  195.         src += SRC_TEXEL_BYTES;
  196.      }
  197.      dst += adjust;
  198.       }
  199.       /* FIXME: ... */
  200.    }
  201.  
  202.    return GL_TRUE;
  203. }
  204.  
  205.  
  206.  
  207. /* =============================================================
  208.  * PRE: Require pixelstore attribs, width == dstImageWidth.
  209.  */
  210. static GLboolean
  211. TAG(texsubimage2d_unpack)( const struct convert_info *convert )
  212. {
  213.    const GLubyte *src = (const GLubyte *)
  214.       _mesa_image_address( convert->unpacking, convert->srcImage,
  215.                convert->width, convert->height,
  216.                convert->format, convert->type, 0, 0, 0 );
  217.    const GLint srcRowStride =
  218.       _mesa_image_row_stride( convert->unpacking, convert->width,
  219.                   convert->format, convert->type );
  220.    GLint row, col;
  221.  
  222. #if DEBUG_TEXUTIL
  223.    _mesa_debug( NULL, __FUNCTION__ "\n" );
  224. #endif
  225.  
  226.    if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
  227.       /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
  228.        * or width = 2 and texels/dword = 4).
  229.        */
  230.       DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  231.                                    (convert->yoffset * convert->width +
  232.                                     convert->xoffset) * DST_TEXEL_BYTES);
  233.       for ( row = 0 ; row < convert->height ; row++ ) {
  234.          const GLubyte *srcRow = src;
  235.          for ( col = 0; col < convert->width; col++ ) {
  236.             CONVERT_TEXEL(*dst, src);
  237.             src += SRC_TEXEL_BYTES;
  238.          }
  239.          src = srcRow + srcRowStride;
  240.       }
  241.    }
  242.    else {
  243.       /* the common case */
  244.       GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
  245.                                (convert->yoffset * convert->width +
  246.                                 convert->xoffset) * DST_TEXEL_BYTES);
  247.       for ( row = 0 ; row < convert->height ; row++ ) {
  248. #ifdef CONVERT_DIRECT
  249.          MEMCPY( dst, src, DST_ROW_STRIDE );
  250.          src += srcRowStride;
  251.          dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
  252. #else
  253.          const GLubyte *srcRow = src;
  254.          for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
  255.             CONVERT_TEXEL_DWORD( *dst++, src );
  256.             src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
  257.          }
  258.          src = srcRow + srcRowStride;
  259. #endif
  260.       }
  261.    }
  262.  
  263.    return GL_TRUE;
  264. }
  265.  
  266. /* PRE: as above, height == dstImageHeight also.
  267.  */
  268. static GLboolean
  269. TAG(texsubimage3d_unpack)( const struct convert_info *convert )
  270. {
  271.    const GLubyte *src = (const GLubyte *)
  272.       _mesa_image_address( convert->unpacking, convert->srcImage,
  273.                convert->width, convert->height,
  274.                convert->format, convert->type, 0, 0, 0 );
  275.    const GLint srcImgStride = (const GLubyte *)
  276.       _mesa_image_address( convert->unpacking, convert->srcImage,
  277.                convert->width, convert->height,
  278.                convert->format, convert->type, 1, 0, 0 ) - src;
  279.    const GLint srcRowStride =
  280.       _mesa_image_row_stride( convert->unpacking, convert->width,
  281.                   convert->format, convert->type );
  282.    GLint row, col, img;
  283.  
  284. #if DEBUG_TEXUTIL
  285.    _mesa_debug( NULL, __FUNCTION__ "\n" );
  286. #endif
  287.  
  288.    if (convert->width & (DST_TEXELS_PER_DWORD - 1)) {
  289.       /* Can't use dword conversion (i.e. when width = 1 and texels/dword = 2
  290.        * or width = 2 and texels/dword = 4).
  291.        */
  292.       DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  293.                                    ((convert->zoffset * convert->height +
  294.                                      convert->yoffset) * convert->width +
  295.                                     convert->xoffset) * DST_TEXEL_BYTES);
  296.       for ( img = 0 ; img < convert->depth ; img++ ) {
  297.          const GLubyte *srcImage = src;
  298.          for ( row = 0 ; row < convert->height ; row++ ) {
  299.             const GLubyte *srcRow = src;
  300.             for ( col = 0; col < convert->width; col++ ) {
  301.                CONVERT_TEXEL(*dst, src);
  302.                src += SRC_TEXEL_BYTES;
  303.             }
  304.             src = srcRow + srcRowStride;
  305.          }
  306.          src = srcImage + srcImgStride;
  307.       }
  308.    }
  309.    else {
  310.       /* the common case */
  311.       GLuint *dst = (GLuint *)((GLubyte *)convert->dstImage +
  312.                                ((convert->zoffset * convert->height +
  313.                                  convert->yoffset) * convert->width +
  314.                                 convert->xoffset) * DST_TEXEL_BYTES);
  315.       for ( img = 0 ; img < convert->depth ; img++ ) {
  316.          const GLubyte *srcImage = src;
  317.          for ( row = 0 ; row < convert->height ; row++ ) {
  318. #ifdef CONVERT_DIRECT
  319.             MEMCPY( dst, src, DST_ROW_STRIDE );
  320.             src += srcRowStride;
  321.             dst = (GLuint *)((GLubyte *)dst + DST_ROW_STRIDE);
  322. #else
  323.             const GLubyte *srcRow = src;
  324.             for ( col = convert->width / DST_TEXELS_PER_DWORD ; col ; col-- ) {
  325.                CONVERT_TEXEL_DWORD( *dst++, src );
  326.                src += SRC_TEXEL_BYTES * DST_TEXELS_PER_DWORD;
  327.             }
  328.             src = srcRow + srcRowStride;
  329. #endif
  330.          }
  331.          src = srcImage + srcImgStride;
  332.       }
  333.    }
  334.  
  335.    return GL_TRUE;
  336. }
  337.  
  338.  
  339.  
  340. /* =============================================================
  341.  * PRE: Require pixelstore attribs, width != dstImageWidth.
  342.  */
  343. static GLboolean
  344. TAG(texsubimage2d_stride_unpack)( const struct convert_info *convert )
  345. {
  346.    const GLubyte *src = (const GLubyte *)
  347.       _mesa_image_address( convert->unpacking, convert->srcImage,
  348.                convert->width, convert->height,
  349.                convert->format, convert->type, 0, 0, 0 );
  350.    const GLint srcRowStride =
  351.       _mesa_image_row_stride( convert->unpacking, convert->width,
  352.                   convert->format, convert->type );
  353.    DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  354.                 (convert->yoffset * convert->dstImageWidth +
  355.                  convert->xoffset) * DST_TEXEL_BYTES);
  356.    GLint adjust;
  357.    GLint row, col;
  358.    (void) col;
  359.  
  360.    adjust = convert->dstImageWidth - convert->width;
  361.  
  362. #if DEBUG_TEXUTIL
  363.    _mesa_debug( NULL, __FUNCTION__ ":\n" );
  364.    _mesa_debug( NULL, "   x=%d y=%d w=%d h=%d s=%d\n",
  365.             convert->xoffset, convert->yoffset, convert->width,
  366.             convert->height, convert->dstImageWidth );
  367.    _mesa_debug( NULL, "   adjust=%d\n", adjust );
  368. #endif
  369.  
  370.    for ( row = 0 ; row < convert->height ; row++ ) {
  371. #ifdef CONVERT_DIRECT
  372.       MEMCPY( dst, src, DST_ROW_BYTES );
  373.       src += srcRowStride;
  374.       dst += convert->dstImageWidth;
  375. #else
  376.       const GLubyte *srcRow = src;
  377.       for ( col = 0 ; col < convert->width ; col++ ) {
  378.      CONVERT_TEXEL( *dst++, src );
  379.      src += SRC_TEXEL_BYTES;
  380.       }
  381.       src = srcRow + srcRowStride;
  382.       dst += adjust;
  383. #endif
  384.    }
  385.  
  386.    return GL_TRUE;
  387. }
  388.  
  389. /* PRE: As above, or height != dstImageHeight also.
  390.  */
  391. static GLboolean
  392. TAG(texsubimage3d_stride_unpack)( const struct convert_info *convert )
  393. {
  394.    const GLubyte *src = (const GLubyte *)
  395.       _mesa_image_address( convert->unpacking, convert->srcImage,
  396.                convert->width, convert->height,
  397.                convert->format, convert->type, 0, 0, 0 );
  398.    const GLint srcImgStride = (const GLubyte *)
  399.       _mesa_image_address( convert->unpacking, convert->srcImage,
  400.                convert->width, convert->height,
  401.                convert->format, convert->type, 1, 0, 0 ) - src;
  402.    const GLint srcRowStride =
  403.       _mesa_image_row_stride( convert->unpacking, convert->width,
  404.                   convert->format, convert->type );
  405.    DST_TYPE *dst = (DST_TYPE *)((GLubyte *)convert->dstImage +
  406.                 ((convert->zoffset * convert->dstImageHeight +
  407.                   convert->yoffset) * convert->dstImageWidth +
  408.                  convert->xoffset) * DST_TEXEL_BYTES);
  409.    GLint adjust;
  410.    GLint row, col, img;
  411.    (void) col;
  412.  
  413.    adjust = convert->dstImageWidth - convert->width;
  414.  
  415. #if DEBUG_TEXUTIL
  416.    _mesa_debug( NULL, __FUNCTION__ ":\n" );
  417.    _mesa_debug( NULL, "   x=%d y=%d w=%d h=%d s=%d\n",
  418.             convert->xoffset, convert->yoffset, convert->width,
  419.             convert->height, convert->dstImageWidth );
  420.    _mesa_debug( NULL, "   adjust=%d\n", adjust );
  421. #endif
  422.  
  423.    for ( img = 0 ; img < convert->depth ; img++ ) {
  424.       const GLubyte *srcImage = src;
  425.       for ( row = 0 ; row < convert->height ; row++ ) {
  426. #ifdef CONVERT_DIRECT
  427.      MEMCPY( dst, src, DST_ROW_BYTES );
  428.      src += srcRowStride;
  429.      dst += convert->dstImageWidth;
  430. #else
  431.      const GLubyte *srcRow = src;
  432.      for ( col = 0 ; col < convert->width ; col++ ) {
  433.         CONVERT_TEXEL( *dst++, src );
  434.         src += SRC_TEXEL_BYTES;
  435.      }
  436.      src = srcRow + srcRowStride;
  437.      dst += adjust;
  438. #endif
  439.       }
  440.       src = srcImage + srcImgStride;
  441.    }
  442.  
  443.    return GL_TRUE;
  444. }
  445.  
  446.  
  447.  
  448. static convert_func TAG(texsubimage2d_tab)[] = {
  449.    TAG(texsubimage2d),
  450.    TAG(texsubimage2d_stride),
  451.    TAG(texsubimage2d_unpack),
  452.    TAG(texsubimage2d_stride_unpack),
  453. };
  454.  
  455. static convert_func TAG(texsubimage3d_tab)[] = {
  456.    TAG(texsubimage3d),
  457.    TAG(texsubimage3d_stride),
  458.    TAG(texsubimage3d_unpack),
  459.    TAG(texsubimage3d_stride_unpack),
  460. };
  461.  
  462.  
  463. #ifndef PRESERVE_DST_TYPE
  464. #undef DST_TYPE
  465. #undef DST_TEXELS_PER_DWORD
  466. #endif
  467.  
  468. #undef SRC_TEXEL_BYTES
  469. #undef DST_TEXEL_BYTES
  470. #undef DST_ROW_BYTES
  471. #undef DST_ROW_STRIDE
  472.  
  473. #undef CONVERT_TEXEL
  474. #undef CONVERT_TEXEL_DWORD
  475. #undef CONVERT_DIRECT
  476.  
  477. #undef TAG
  478.  
  479. #undef PRESERVE_DST_TYPE
  480.