Home | History | Annotate | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  *
      4  * Copyright (c) 2011 VMware, Inc.
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be included
     14  * in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     19  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     20  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     21  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 
     25 /**
     26  * Color, depth, stencil packing functions.
     27  * Used to pack basic color, depth and stencil formats to specific
     28  * hardware formats.
     29  *
     30  * There are both per-pixel and per-row packing functions:
     31  * - The former will be used by swrast to write values to the color, depth,
     32  *   stencil buffers when drawing points, lines and masked spans.
     33  * - The later will be used for image-oriented functions like glDrawPixels,
     34  *   glAccum, and glTexImage.
     35  */
     36 
     37 
     38 #include "colormac.h"
     39 #include "format_pack.h"
     40 #include "macros.h"
     41 #include "../../gallium/auxiliary/util/u_format_rgb9e5.h"
     42 #include "../../gallium/auxiliary/util/u_format_r11g11b10f.h"
     43 
     44 
     45 /** Helper struct for MESA_FORMAT_Z32_FLOAT_X24S8 */
     46 struct z32f_x24s8
     47 {
     48    float z;
     49    uint32_t x24s8;
     50 };
     51 
     52 
     53 typedef void (*pack_ubyte_rgba_row_func)(GLuint n,
     54                                          const GLubyte src[][4], void *dst);
     55 
     56 typedef void (*pack_float_rgba_row_func)(GLuint n,
     57                                          const GLfloat src[][4], void *dst);
     58 
     59 
     60 
     61 static inline GLfloat
     62 linear_to_srgb(GLfloat cl)
     63 {
     64    if (cl < 0.0f)
     65       return 0.0f;
     66    else if (cl < 0.0031308f)
     67       return 12.92f * cl;
     68    else if (cl < 1.0f)
     69       return 1.055f * powf(cl, 0.41666f) - 0.055f;
     70    else
     71       return 1.0f;
     72 }
     73 
     74 
     75 static inline GLubyte
     76 linear_float_to_srgb_ubyte(GLfloat cl)
     77 {
     78    GLubyte res = FLOAT_TO_UBYTE(linear_to_srgb(cl));
     79    return res;
     80 }
     81 
     82 
     83 static inline GLubyte
     84 linear_ubyte_to_srgb_ubyte(GLubyte cl)
     85 {
     86    GLubyte res = FLOAT_TO_UBYTE(linear_to_srgb(cl / 255.0f));
     87    return res;
     88 }
     89 
     90 
     91 
     92 
     93 /*
     94  * MESA_FORMAT_RGBA8888
     95  */
     96 
     97 static void
     98 pack_ubyte_RGBA8888(const GLubyte src[4], void *dst)
     99 {
    100    GLuint *d = ((GLuint *) dst);
    101    *d = PACK_COLOR_8888(src[RCOMP], src[GCOMP], src[BCOMP], src[ACOMP]);
    102 }
    103 
    104 static void
    105 pack_float_RGBA8888(const GLfloat src[4], void *dst)
    106 {
    107    GLubyte v[4];
    108    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    109    pack_ubyte_RGBA8888(v, dst);
    110 }
    111 
    112 static void
    113 pack_row_ubyte_RGBA8888(GLuint n, const GLubyte src[][4], void *dst)
    114 {
    115    GLuint *d = ((GLuint *) dst);
    116    GLuint i;
    117    for (i = 0; i < n; i++) {
    118       d[i] = PACK_COLOR_8888(src[i][RCOMP], src[i][GCOMP],
    119                              src[i][BCOMP], src[i][ACOMP]);
    120    }
    121 }
    122 
    123 static void
    124 pack_row_float_RGBA8888(GLuint n, const GLfloat src[][4], void *dst)
    125 {
    126    GLuint *d = ((GLuint *) dst);
    127    GLuint i;
    128    for (i = 0; i < n; i++) {
    129       GLubyte v[4];
    130       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    131       pack_ubyte_RGBA8888(v, d + i);
    132    }
    133 }
    134 
    135 
    136 
    137 /*
    138  * MESA_FORMAT_RGBA8888_REV
    139  */
    140 
    141 static void
    142 pack_ubyte_RGBA8888_REV(const GLubyte src[4], void *dst)
    143 {
    144    GLuint *d = ((GLuint *) dst);
    145    *d = PACK_COLOR_8888(src[ACOMP], src[BCOMP], src[GCOMP], src[RCOMP]);
    146 }
    147 
    148 static void
    149 pack_float_RGBA8888_REV(const GLfloat src[4], void *dst)
    150 {
    151    GLubyte v[4];
    152    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    153    pack_ubyte_RGBA8888_REV(v, dst);
    154 }
    155 
    156 static void
    157 pack_row_ubyte_RGBA8888_REV(GLuint n, const GLubyte src[][4], void *dst)
    158 {
    159    GLuint *d = ((GLuint *) dst);
    160    GLuint i;
    161    for (i = 0; i < n; i++) {
    162       d[i] = PACK_COLOR_8888(src[i][ACOMP], src[i][BCOMP],
    163                              src[i][GCOMP], src[i][RCOMP]);
    164    }
    165 }
    166 
    167 static void
    168 pack_row_float_RGBA8888_REV(GLuint n, const GLfloat src[][4], void *dst)
    169 {
    170    GLuint *d = ((GLuint *) dst);
    171    GLuint i;
    172    for (i = 0; i < n; i++) {
    173       GLubyte v[4];
    174       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    175       pack_ubyte_RGBA8888_REV(v, d + i);
    176    }
    177 }
    178 
    179 
    180 /*
    181  * MESA_FORMAT_ARGB8888
    182  */
    183 
    184 static void
    185 pack_ubyte_ARGB8888(const GLubyte src[4], void *dst)
    186 {
    187    GLuint *d = ((GLuint *) dst);
    188    *d = PACK_COLOR_8888(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
    189 }
    190 
    191 static void
    192 pack_float_ARGB8888(const GLfloat src[4], void *dst)
    193 {
    194    GLubyte v[4];
    195    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    196    pack_ubyte_ARGB8888(v, dst);
    197 }
    198 
    199 static void
    200 pack_row_ubyte_ARGB8888(GLuint n, const GLubyte src[][4], void *dst)
    201 {
    202    GLuint *d = ((GLuint *) dst);
    203    GLuint i;
    204    for (i = 0; i < n; i++) {
    205       d[i] = PACK_COLOR_8888(src[i][ACOMP], src[i][RCOMP],
    206                              src[i][GCOMP], src[i][BCOMP]);
    207    }
    208 }
    209 
    210 static void
    211 pack_row_float_ARGB8888(GLuint n, const GLfloat src[][4], void *dst)
    212 {
    213    GLuint *d = ((GLuint *) dst);
    214    GLuint i;
    215    for (i = 0; i < n; i++) {
    216       GLubyte v[4];
    217       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    218       pack_ubyte_ARGB8888(v, d + i);
    219    }
    220 }
    221 
    222 
    223 /*
    224  * MESA_FORMAT_ARGB8888_REV
    225  */
    226 
    227 static void
    228 pack_ubyte_ARGB8888_REV(const GLubyte src[4], void *dst)
    229 {
    230    GLuint *d = ((GLuint *) dst);
    231    *d = PACK_COLOR_8888(src[BCOMP], src[GCOMP], src[RCOMP], src[ACOMP]);
    232 }
    233 
    234 static void
    235 pack_float_ARGB8888_REV(const GLfloat src[4], void *dst)
    236 {
    237    GLubyte v[4];
    238    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    239    pack_ubyte_ARGB8888_REV(v, dst);
    240 }
    241 
    242 static void
    243 pack_row_ubyte_ARGB8888_REV(GLuint n, const GLubyte src[][4], void *dst)
    244 {
    245    GLuint *d = ((GLuint *) dst);
    246    GLuint i;
    247    for (i = 0; i < n; i++) {
    248       d[i] = PACK_COLOR_8888(src[i][BCOMP], src[i][GCOMP],
    249                              src[i][RCOMP], src[i][ACOMP]);
    250    }
    251 }
    252 
    253 static void
    254 pack_row_float_ARGB8888_REV(GLuint n, const GLfloat src[][4], void *dst)
    255 {
    256    GLuint *d = ((GLuint *) dst);
    257    GLuint i;
    258    for (i = 0; i < n; i++) {
    259       GLubyte v[4];
    260       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    261       pack_ubyte_ARGB8888_REV(v, d + i);
    262    }
    263 }
    264 
    265 
    266 /*
    267  * MESA_FORMAT_XRGB8888
    268  */
    269 
    270 static void
    271 pack_ubyte_XRGB8888(const GLubyte src[4], void *dst)
    272 {
    273    GLuint *d = ((GLuint *) dst);
    274    *d = PACK_COLOR_8888(0x0, src[RCOMP], src[GCOMP], src[BCOMP]);
    275 }
    276 
    277 static void
    278 pack_float_XRGB8888(const GLfloat src[4], void *dst)
    279 {
    280    GLubyte v[4];
    281    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    282    pack_ubyte_XRGB8888(v, dst);
    283 }
    284 
    285 static void
    286 pack_row_ubyte_XRGB8888(GLuint n, const GLubyte src[][4], void *dst)
    287 {
    288    GLuint *d = ((GLuint *) dst);
    289    GLuint i;
    290    for (i = 0; i < n; i++) {
    291       d[i] = PACK_COLOR_8888(0, src[i][RCOMP], src[i][GCOMP], src[i][BCOMP]);
    292    }
    293 }
    294 
    295 static void
    296 pack_row_float_XRGB8888(GLuint n, const GLfloat src[][4], void *dst)
    297 {
    298    GLuint *d = ((GLuint *) dst);
    299    GLuint i;
    300    for (i = 0; i < n; i++) {
    301       GLubyte v[4];
    302       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    303       pack_ubyte_XRGB8888(v, d + i);
    304    }
    305 }
    306 
    307 
    308 /*
    309  * MESA_FORMAT_XRGB8888_REV
    310  */
    311 
    312 static void
    313 pack_ubyte_XRGB8888_REV(const GLubyte src[4], void *dst)
    314 {
    315    GLuint *d = ((GLuint *) dst);
    316    *d = PACK_COLOR_8888(src[BCOMP], src[GCOMP], src[RCOMP], 0);
    317 }
    318 
    319 static void
    320 pack_float_XRGB8888_REV(const GLfloat src[4], void *dst)
    321 {
    322    GLubyte v[4];
    323    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    324    pack_ubyte_XRGB8888_REV(v, dst);
    325 }
    326 
    327 static void
    328 pack_row_ubyte_XRGB8888_REV(GLuint n, const GLubyte src[][4], void *dst)
    329 {
    330    GLuint *d = ((GLuint *) dst);
    331    GLuint i;
    332    for (i = 0; i < n; i++) {
    333       d[i] = PACK_COLOR_8888(src[i][BCOMP], src[i][GCOMP], src[i][RCOMP], 0);
    334    }
    335 }
    336 
    337 static void
    338 pack_row_float_XRGB8888_REV(GLuint n, const GLfloat src[][4], void *dst)
    339 {
    340    GLuint *d = ((GLuint *) dst);
    341    GLuint i;
    342    for (i = 0; i < n; i++) {
    343       GLubyte v[4];
    344       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    345       pack_ubyte_XRGB8888_REV(v, d + i);
    346    }
    347 }
    348 
    349 
    350 /*
    351  * MESA_FORMAT_RGB888
    352  */
    353 
    354 static void
    355 pack_ubyte_RGB888(const GLubyte src[4], void *dst)
    356 {
    357    GLubyte *d = ((GLubyte *) dst);
    358    d[2] = src[RCOMP];
    359    d[1] = src[GCOMP];
    360    d[0] = src[BCOMP];
    361 }
    362 
    363 static void
    364 pack_float_RGB888(const GLfloat src[4], void *dst)
    365 {
    366    GLubyte *d = ((GLubyte *) dst);
    367    UNCLAMPED_FLOAT_TO_UBYTE(d[2], src[RCOMP]);
    368    UNCLAMPED_FLOAT_TO_UBYTE(d[1], src[GCOMP]);
    369    UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[BCOMP]);
    370 }
    371 
    372 static void
    373 pack_row_ubyte_RGB888(GLuint n, const GLubyte src[][4], void *dst)
    374 {
    375    GLubyte *d = ((GLubyte *) dst);
    376    GLuint i;
    377    for (i = 0; i < n; i++) {
    378       d[i*3+2] = src[i][RCOMP];
    379       d[i*3+1] = src[i][GCOMP];
    380       d[i*3+0] = src[i][BCOMP];
    381    }
    382 }
    383 
    384 static void
    385 pack_row_float_RGB888(GLuint n, const GLfloat src[][4], void *dst)
    386 {
    387    GLubyte *d = ((GLubyte *) dst);
    388    GLuint i;
    389    for (i = 0; i < n; i++) {
    390       GLubyte v[4];
    391       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    392       d[i*3+2] = v[RCOMP];
    393       d[i*3+1] = v[GCOMP];
    394       d[i*3+0] = v[BCOMP];
    395    }
    396 }
    397 
    398 
    399 /*
    400  * MESA_FORMAT_BGR888
    401  */
    402 
    403 static void
    404 pack_ubyte_BGR888(const GLubyte src[4], void *dst)
    405 {
    406    GLubyte *d = ((GLubyte *) dst);
    407    d[2] = src[BCOMP];
    408    d[1] = src[GCOMP];
    409    d[0] = src[RCOMP];
    410 }
    411 
    412 static void
    413 pack_float_BGR888(const GLfloat src[4], void *dst)
    414 {
    415    GLubyte *d = ((GLubyte *) dst);
    416    UNCLAMPED_FLOAT_TO_UBYTE(d[2], src[BCOMP]);
    417    UNCLAMPED_FLOAT_TO_UBYTE(d[1], src[GCOMP]);
    418    UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[RCOMP]);
    419 }
    420 
    421 static void
    422 pack_row_ubyte_BGR888(GLuint n, const GLubyte src[][4], void *dst)
    423 {
    424    GLubyte *d = ((GLubyte *) dst);
    425    GLuint i;
    426    for (i = 0; i < n; i++) {
    427       d[i*3+2] = src[i][BCOMP];
    428       d[i*3+1] = src[i][GCOMP];
    429       d[i*3+0] = src[i][RCOMP];
    430    }
    431 }
    432 
    433 static void
    434 pack_row_float_BGR888(GLuint n, const GLfloat src[][4], void *dst)
    435 {
    436    GLubyte *d = ((GLubyte *) dst);
    437    GLuint i;
    438    for (i = 0; i < n; i++) {
    439       GLubyte v[4];
    440       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    441       d[i*3+2] = v[BCOMP];
    442       d[i*3+1] = v[GCOMP];
    443       d[i*3+0] = v[RCOMP];
    444    }
    445 }
    446 
    447 
    448 /*
    449  * MESA_FORMAT_RGB565
    450  */
    451 
    452 static void
    453 pack_ubyte_RGB565(const GLubyte src[4], void *dst)
    454 {
    455    GLushort *d = ((GLushort *) dst);
    456    *d = PACK_COLOR_565(src[RCOMP], src[GCOMP], src[BCOMP]);
    457 }
    458 
    459 static void
    460 pack_float_RGB565(const GLfloat src[4], void *dst)
    461 {
    462    GLubyte v[3];
    463    UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
    464    UNCLAMPED_FLOAT_TO_UBYTE(v[1], src[GCOMP]);
    465    UNCLAMPED_FLOAT_TO_UBYTE(v[2], src[BCOMP]);
    466    pack_ubyte_RGB565(v, dst);
    467 }
    468 
    469 static void
    470 pack_row_ubyte_RGB565(GLuint n, const GLubyte src[][4], void *dst)
    471 {
    472    GLushort *d = ((GLushort *) dst);
    473    GLuint i;
    474    for (i = 0; i < n; i++) {
    475       pack_ubyte_RGB565(src[i], d + i);
    476    }
    477 }
    478 
    479 static void
    480 pack_row_float_RGB565(GLuint n, const GLfloat src[][4], void *dst)
    481 {
    482    GLushort *d = ((GLushort *) dst);
    483    GLuint i;
    484    for (i = 0; i < n; i++) {
    485       GLubyte v[4];
    486       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    487       pack_ubyte_RGB565(v, d + i);
    488    }
    489 }
    490 
    491 
    492 /*
    493  * MESA_FORMAT_RGB565_REV
    494  */
    495 
    496 static void
    497 pack_ubyte_RGB565_REV(const GLubyte src[4], void *dst)
    498 {
    499    GLushort *d = ((GLushort *) dst);
    500    *d = PACK_COLOR_565_REV(src[RCOMP], src[GCOMP], src[BCOMP]);
    501 }
    502 
    503 static void
    504 pack_float_RGB565_REV(const GLfloat src[4], void *dst)
    505 {
    506    GLushort *d = ((GLushort *) dst);
    507    GLubyte r, g, b;
    508    UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
    509    UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
    510    UNCLAMPED_FLOAT_TO_UBYTE(b, src[BCOMP]);
    511    *d = PACK_COLOR_565_REV(r, g, b);
    512 }
    513 
    514 static void
    515 pack_row_ubyte_RGB565_REV(GLuint n, const GLubyte src[][4], void *dst)
    516 {
    517    GLushort *d = ((GLushort *) dst);
    518    GLuint i;
    519    for (i = 0; i < n; i++) {
    520       pack_ubyte_RGB565_REV(src[i], d + i);
    521    }
    522 }
    523 
    524 static void
    525 pack_row_float_RGB565_REV(GLuint n, const GLfloat src[][4], void *dst)
    526 {
    527    GLushort *d = ((GLushort *) dst);
    528    GLuint i;
    529    for (i = 0; i < n; i++) {
    530       GLubyte v[4];
    531       _mesa_unclamped_float_rgba_to_ubyte(v, src[i]);
    532       pack_ubyte_RGB565_REV(v, d + i);
    533    }
    534 }
    535 
    536 
    537 /*
    538  * MESA_FORMAT_ARGB4444
    539  */
    540 
    541 static void
    542 pack_ubyte_ARGB4444(const GLubyte src[4], void *dst)
    543 {
    544    GLushort *d = ((GLushort *) dst);
    545    *d = PACK_COLOR_4444(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
    546 }
    547 
    548 static void
    549 pack_float_ARGB4444(const GLfloat src[4], void *dst)
    550 {
    551    GLubyte v[4];
    552    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    553    pack_ubyte_ARGB4444(v, dst);
    554 }
    555 
    556 /* use fallback row packing functions */
    557 
    558 
    559 /*
    560  * MESA_FORMAT_ARGB4444_REV
    561  */
    562 
    563 static void
    564 pack_ubyte_ARGB4444_REV(const GLubyte src[4], void *dst)
    565 {
    566    GLushort *d = ((GLushort *) dst);
    567    *d = PACK_COLOR_4444(src[GCOMP], src[BCOMP], src[ACOMP], src[RCOMP]);
    568 }
    569 
    570 static void
    571 pack_float_ARGB4444_REV(const GLfloat src[4], void *dst)
    572 {
    573    GLubyte v[4];
    574    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    575    pack_ubyte_ARGB4444_REV(v, dst);
    576 }
    577 
    578 /* use fallback row packing functions */
    579 
    580 
    581 /*
    582  * MESA_FORMAT_RGBA5551
    583  */
    584 
    585 static void
    586 pack_ubyte_RGBA5551(const GLubyte src[4], void *dst)
    587 {
    588    GLushort *d = ((GLushort *) dst);
    589    *d = PACK_COLOR_5551(src[RCOMP], src[GCOMP], src[BCOMP], src[ACOMP]);
    590 }
    591 
    592 static void
    593 pack_float_RGBA5551(const GLfloat src[4], void *dst)
    594 {
    595    GLubyte v[4];
    596    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    597    pack_ubyte_RGBA5551(v, dst);
    598 }
    599 
    600 /* use fallback row packing functions */
    601 
    602 
    603 /*
    604  * MESA_FORMAT_ARGB1555
    605  */
    606 
    607 static void
    608 pack_ubyte_ARGB1555(const GLubyte src[4], void *dst)
    609 {
    610    GLushort *d = ((GLushort *) dst);
    611    *d = PACK_COLOR_1555(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
    612 }
    613 
    614 static void
    615 pack_float_ARGB1555(const GLfloat src[4], void *dst)
    616 {
    617    GLubyte v[4];
    618    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    619    pack_ubyte_ARGB1555(v, dst);
    620 }
    621 
    622 
    623 /* MESA_FORMAT_ARGB1555_REV */
    624 
    625 static void
    626 pack_ubyte_ARGB1555_REV(const GLubyte src[4], void *dst)
    627 {
    628    GLushort *d = ((GLushort *) dst), tmp;
    629    tmp = PACK_COLOR_1555(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
    630    *d = (tmp >> 8) | (tmp << 8);
    631 }
    632 
    633 static void
    634 pack_float_ARGB1555_REV(const GLfloat src[4], void *dst)
    635 {
    636    GLubyte v[4];
    637    _mesa_unclamped_float_rgba_to_ubyte(v, src);
    638    pack_ubyte_ARGB1555_REV(v, dst);
    639 }
    640 
    641 
    642 /* MESA_FORMAT_AL44 */
    643 
    644 static void
    645 pack_ubyte_AL44(const GLubyte src[4], void *dst)
    646 {
    647    GLubyte *d = ((GLubyte *) dst);
    648    *d = PACK_COLOR_44(src[ACOMP], src[RCOMP]);
    649 }
    650 
    651 static void
    652 pack_float_AL44(const GLfloat src[4], void *dst)
    653 {
    654    GLubyte v[4];
    655    UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
    656    UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
    657    pack_ubyte_AL44(v, dst);
    658 }
    659 
    660 
    661 /* MESA_FORMAT_AL88 */
    662 
    663 static void
    664 pack_ubyte_AL88(const GLubyte src[4], void *dst)
    665 {
    666    GLushort *d = ((GLushort *) dst);
    667    *d = PACK_COLOR_88(src[ACOMP], src[RCOMP]);
    668 }
    669 
    670 static void
    671 pack_float_AL88(const GLfloat src[4], void *dst)
    672 {
    673    GLubyte v[4];
    674    UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
    675    UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
    676    pack_ubyte_AL88(v, dst);
    677 }
    678 
    679 
    680 /* MESA_FORMAT_AL88_REV */
    681 
    682 static void
    683 pack_ubyte_AL88_REV(const GLubyte src[4], void *dst)
    684 {
    685    GLushort *d = ((GLushort *) dst);
    686    *d = PACK_COLOR_88(src[RCOMP], src[ACOMP]);
    687 }
    688 
    689 static void
    690 pack_float_AL88_REV(const GLfloat src[4], void *dst)
    691 {
    692    GLubyte v[4];
    693    UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
    694    UNCLAMPED_FLOAT_TO_UBYTE(v[3], src[ACOMP]);
    695    pack_ubyte_AL88_REV(v, dst);
    696 }
    697 
    698 
    699 /* MESA_FORMAT_AL1616 */
    700 
    701 static void
    702 pack_ubyte_AL1616(const GLubyte src[4], void *dst)
    703 {
    704    GLuint *d = ((GLuint *) dst);
    705    GLushort l = UBYTE_TO_USHORT(src[RCOMP]);
    706    GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
    707    *d = PACK_COLOR_1616(a, l);
    708 }
    709 
    710 static void
    711 pack_float_AL1616(const GLfloat src[4], void *dst)
    712 {
    713    GLuint *d = ((GLuint *) dst);
    714    GLushort l, a;
    715    UNCLAMPED_FLOAT_TO_USHORT(l, src[RCOMP]);
    716    UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
    717    *d = PACK_COLOR_1616(a, l);
    718 }
    719 
    720 
    721 /* MESA_FORMAT_AL1616_REV */
    722 
    723 static void
    724 pack_ubyte_AL1616_REV(const GLubyte src[4], void *dst)
    725 {
    726    GLuint *d = ((GLuint *) dst);
    727    GLushort l = UBYTE_TO_USHORT(src[RCOMP]);
    728    GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
    729    *d = PACK_COLOR_1616(l, a);
    730 }
    731 
    732 static void
    733 pack_float_AL1616_REV(const GLfloat src[4], void *dst)
    734 {
    735    GLuint *d = ((GLuint *) dst);
    736    GLushort l, a;
    737    UNCLAMPED_FLOAT_TO_USHORT(l, src[RCOMP]);
    738    UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
    739    *d = PACK_COLOR_1616(l, a);
    740 }
    741 
    742 
    743 /* MESA_FORMAT_RGB332 */
    744 
    745 static void
    746 pack_ubyte_RGB332(const GLubyte src[4], void *dst)
    747 {
    748    GLubyte *d = ((GLubyte *) dst);
    749    *d = PACK_COLOR_332(src[RCOMP], src[GCOMP], src[BCOMP]);
    750 }
    751 
    752 static void
    753 pack_float_RGB332(const GLfloat src[4], void *dst)
    754 {
    755    GLubyte v[4];
    756    UNCLAMPED_FLOAT_TO_UBYTE(v[0], src[RCOMP]);
    757    UNCLAMPED_FLOAT_TO_UBYTE(v[1], src[GCOMP]);
    758    UNCLAMPED_FLOAT_TO_UBYTE(v[2], src[BCOMP]);
    759    pack_ubyte_RGB332(v, dst);
    760 }
    761 
    762 
    763 /* MESA_FORMAT_A8 */
    764 
    765 static void
    766 pack_ubyte_A8(const GLubyte src[4], void *dst)
    767 {
    768    GLubyte *d = ((GLubyte *) dst);
    769    *d = src[ACOMP];
    770 }
    771 
    772 static void
    773 pack_float_A8(const GLfloat src[4], void *dst)
    774 {
    775    GLubyte *d = ((GLubyte *) dst);
    776    UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[ACOMP]);
    777 }
    778 
    779 
    780 /* MESA_FORMAT_A16 */
    781 
    782 static void
    783 pack_ubyte_A16(const GLubyte src[4], void *dst)
    784 {
    785    GLushort *d = ((GLushort *) dst);
    786    *d = UBYTE_TO_USHORT(src[ACOMP]);
    787 }
    788 
    789 static void
    790 pack_float_A16(const GLfloat src[4], void *dst)
    791 {
    792    GLushort *d = ((GLushort *) dst);
    793    UNCLAMPED_FLOAT_TO_USHORT(d[0], src[ACOMP]);
    794 }
    795 
    796 
    797 /* MESA_FORMAT_L8 */
    798 
    799 static void
    800 pack_ubyte_L8(const GLubyte src[4], void *dst)
    801 {
    802    GLubyte *d = ((GLubyte *) dst);
    803    *d = src[RCOMP];
    804 }
    805 
    806 static void
    807 pack_float_L8(const GLfloat src[4], void *dst)
    808 {
    809    GLubyte *d = ((GLubyte *) dst);
    810    UNCLAMPED_FLOAT_TO_UBYTE(d[0], src[RCOMP]);
    811 }
    812 
    813 
    814 /* MESA_FORMAT_L16 */
    815 
    816 static void
    817 pack_ubyte_L16(const GLubyte src[4], void *dst)
    818 {
    819    GLushort *d = ((GLushort *) dst);
    820    *d = UBYTE_TO_USHORT(src[RCOMP]);
    821 }
    822 
    823 static void
    824 pack_float_L16(const GLfloat src[4], void *dst)
    825 {
    826    GLushort *d = ((GLushort *) dst);
    827    UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
    828 }
    829 
    830 
    831 /* MESA_FORMAT_YCBCR */
    832 
    833 static void
    834 pack_ubyte_YCBCR(const GLubyte src[4], void *dst)
    835 {
    836    /* todo */
    837 }
    838 
    839 static void
    840 pack_float_YCBCR(const GLfloat src[4], void *dst)
    841 {
    842    /* todo */
    843 }
    844 
    845 
    846 /* MESA_FORMAT_YCBCR_REV */
    847 
    848 static void
    849 pack_ubyte_YCBCR_REV(const GLubyte src[4], void *dst)
    850 {
    851    /* todo */
    852 }
    853 
    854 static void
    855 pack_float_YCBCR_REV(const GLfloat src[4], void *dst)
    856 {
    857    /* todo */
    858 }
    859 
    860 
    861 /* MESA_FORMAT_R8 */
    862 
    863 static void
    864 pack_ubyte_R8(const GLubyte src[4], void *dst)
    865 {
    866    GLubyte *d = ((GLubyte *) dst);
    867    *d = src[RCOMP];
    868 }
    869 
    870 static void
    871 pack_float_R8(const GLfloat src[4], void *dst)
    872 {
    873    GLubyte *d = ((GLubyte *) dst);
    874    GLubyte r;
    875    UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
    876    d[0] = r;
    877 }
    878 
    879 
    880 /* MESA_FORMAT_GR88 */
    881 
    882 static void
    883 pack_ubyte_GR88(const GLubyte src[4], void *dst)
    884 {
    885    GLubyte *d = ((GLubyte *) dst);
    886    *d = PACK_COLOR_88(src[GCOMP], src[RCOMP]);
    887 }
    888 
    889 static void
    890 pack_float_GR88(const GLfloat src[4], void *dst)
    891 {
    892    GLushort *d = ((GLushort *) dst);
    893    GLubyte r, g;
    894    UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
    895    UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
    896    *d = PACK_COLOR_88(g, r);
    897 }
    898 
    899 
    900 /* MESA_FORMAT_RG88 */
    901 
    902 static void
    903 pack_ubyte_RG88(const GLubyte src[4], void *dst)
    904 {
    905    GLubyte *d = ((GLubyte *) dst);
    906    *d = PACK_COLOR_88(src[RCOMP], src[GCOMP]);
    907 }
    908 
    909 static void
    910 pack_float_RG88(const GLfloat src[4], void *dst)
    911 {
    912    GLushort *d = ((GLushort *) dst);
    913    GLubyte r, g;
    914    UNCLAMPED_FLOAT_TO_UBYTE(r, src[RCOMP]);
    915    UNCLAMPED_FLOAT_TO_UBYTE(g, src[GCOMP]);
    916    *d = PACK_COLOR_88(r, g);
    917 }
    918 
    919 
    920 /* MESA_FORMAT_R16 */
    921 
    922 static void
    923 pack_ubyte_R16(const GLubyte src[4], void *dst)
    924 {
    925    GLushort *d = ((GLushort *) dst);
    926    *d = UBYTE_TO_USHORT(src[RCOMP]);
    927 }
    928 
    929 static void
    930 pack_float_R16(const GLfloat src[4], void *dst)
    931 {
    932    GLushort *d = ((GLushort *) dst);
    933    UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
    934 }
    935 
    936 
    937 /* MESA_FORMAT_RG1616 */
    938 
    939 static void
    940 pack_ubyte_RG1616(const GLubyte src[4], void *dst)
    941 {
    942    GLuint *d = ((GLuint *) dst);
    943    GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
    944    GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
    945    *d = PACK_COLOR_1616(g, r);
    946 }
    947 
    948 static void
    949 pack_float_RG1616(const GLfloat src[4], void *dst)
    950 {
    951    GLuint *d = ((GLuint *) dst);
    952    GLushort r, g;
    953    UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
    954    UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
    955    *d = PACK_COLOR_1616(g, r);
    956 }
    957 
    958 
    959 /* MESA_FORMAT_RG1616_REV */
    960 
    961 static void
    962 pack_ubyte_RG1616_REV(const GLubyte src[4], void *dst)
    963 {
    964    GLuint *d = ((GLuint *) dst);
    965    GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
    966    GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
    967    *d = PACK_COLOR_1616(r, g);
    968 }
    969 
    970 
    971 static void
    972 pack_float_RG1616_REV(const GLfloat src[4], void *dst)
    973 {
    974    GLuint *d = ((GLuint *) dst);
    975    GLushort r, g;
    976    UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
    977    UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
    978    *d = PACK_COLOR_1616(r, g);
    979 }
    980 
    981 
    982 /* MESA_FORMAT_ARGB2101010 */
    983 
    984 static void
    985 pack_ubyte_ARGB2101010(const GLubyte src[4], void *dst)
    986 {
    987    GLuint *d = ((GLuint *) dst);
    988    GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
    989    GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
    990    GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
    991    GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
    992    *d = PACK_COLOR_2101010_US(a, r, g, b);
    993 }
    994 
    995 static void
    996 pack_float_ARGB2101010(const GLfloat src[4], void *dst)
    997 {
    998    GLuint *d = ((GLuint *) dst);
    999    GLushort r, g, b, a;
   1000    UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
   1001    UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
   1002    UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
   1003    UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
   1004    *d = PACK_COLOR_2101010_US(a, r, g, b);
   1005 }
   1006 
   1007 
   1008 /* MESA_FORMAT_ABGR2101010_UINT */
   1009 
   1010 static void
   1011 pack_ubyte_ABGR2101010_UINT(const GLubyte src[4], void *dst)
   1012 {
   1013    GLuint *d = ((GLuint *) dst);
   1014    GLushort r = UBYTE_TO_USHORT(src[RCOMP]);
   1015    GLushort g = UBYTE_TO_USHORT(src[GCOMP]);
   1016    GLushort b = UBYTE_TO_USHORT(src[BCOMP]);
   1017    GLushort a = UBYTE_TO_USHORT(src[ACOMP]);
   1018    *d = PACK_COLOR_2101010_US(a, b, g, r);
   1019 }
   1020 
   1021 static void
   1022 pack_float_ABGR2101010_UINT(const GLfloat src[4], void *dst)
   1023 {
   1024    GLuint *d = ((GLuint *) dst);
   1025    GLushort r, g, b, a;
   1026    UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
   1027    UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
   1028    UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
   1029    UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
   1030    *d = PACK_COLOR_2101010_US(a, b, g, r);
   1031 }
   1032 
   1033 
   1034 /* MESA_FORMAT_SRGB8 */
   1035 
   1036 static void
   1037 pack_ubyte_SRGB8(const GLubyte src[4], void *dst)
   1038 {
   1039    GLubyte *d = ((GLubyte *) dst);
   1040    d[2] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1041    d[1] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1042    d[0] = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1043 }
   1044 
   1045 static void
   1046 pack_float_SRGB8(const GLfloat src[4], void *dst)
   1047 {
   1048    GLubyte *d = ((GLubyte *) dst);
   1049    d[2] = linear_float_to_srgb_ubyte(src[RCOMP]);
   1050    d[1] = linear_float_to_srgb_ubyte(src[GCOMP]);
   1051    d[0] = linear_float_to_srgb_ubyte(src[BCOMP]);
   1052 }
   1053 
   1054 
   1055 /* MESA_FORMAT_SRGBA8 */
   1056 
   1057 static void
   1058 pack_ubyte_SRGBA8(const GLubyte src[4], void *dst)
   1059 {
   1060    GLuint *d = ((GLuint *) dst);
   1061    GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1062    GLubyte g = linear_ubyte_to_srgb_ubyte(src[GCOMP]);
   1063    GLubyte b = linear_ubyte_to_srgb_ubyte(src[BCOMP]);
   1064    *d = PACK_COLOR_8888(r, g, b, src[ACOMP]);
   1065 }
   1066 
   1067 static void
   1068 pack_float_SRGBA8(const GLfloat src[4], void *dst)
   1069 {
   1070    GLuint *d = ((GLuint *) dst);
   1071    GLubyte r, g, b, a;
   1072    r = linear_float_to_srgb_ubyte(src[RCOMP]);
   1073    g = linear_float_to_srgb_ubyte(src[GCOMP]);
   1074    b = linear_float_to_srgb_ubyte(src[BCOMP]);
   1075    UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
   1076    *d = PACK_COLOR_8888(r, g, b, a);
   1077 }
   1078 
   1079 
   1080 /* MESA_FORMAT_SARGB8 */
   1081 
   1082 static void
   1083 pack_ubyte_SARGB8(const GLubyte src[4], void *dst)
   1084 {
   1085    GLuint *d = ((GLuint *) dst);
   1086    GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1087    GLubyte g = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1088    GLubyte b = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1089    *d = PACK_COLOR_8888(src[ACOMP], r, g, b);
   1090 }
   1091 
   1092 static void
   1093 pack_float_SARGB8(const GLfloat src[4], void *dst)
   1094 {
   1095    GLuint *d = ((GLuint *) dst);
   1096    GLubyte r, g, b, a;
   1097    r = linear_float_to_srgb_ubyte(src[RCOMP]);
   1098    g = linear_float_to_srgb_ubyte(src[GCOMP]);
   1099    b = linear_float_to_srgb_ubyte(src[BCOMP]);
   1100    UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
   1101    *d = PACK_COLOR_8888(a, r, g, b);
   1102 }
   1103 
   1104 
   1105 /* MESA_FORMAT_SL8 */
   1106 
   1107 static void
   1108 pack_ubyte_SL8(const GLubyte src[4], void *dst)
   1109 {
   1110    GLubyte *d = ((GLubyte *) dst);
   1111    *d = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1112 }
   1113 
   1114 static void
   1115 pack_float_SL8(const GLfloat src[4], void *dst)
   1116 {
   1117    GLubyte *d = ((GLubyte *) dst);
   1118    GLubyte l = linear_float_to_srgb_ubyte(src[RCOMP]);
   1119    *d = l;
   1120 }
   1121 
   1122 
   1123 /* MESA_FORMAT_SLA8 */
   1124 
   1125 static void
   1126 pack_ubyte_SLA8(const GLubyte src[4], void *dst)
   1127 {
   1128    GLushort *d = ((GLushort *) dst);
   1129    GLubyte l = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
   1130    *d = PACK_COLOR_88(src[ACOMP], l);
   1131 }
   1132 
   1133 static void
   1134 pack_float_SLA8(const GLfloat src[4], void *dst)
   1135 {
   1136    GLushort *d = ((GLushort *) dst);
   1137    GLubyte a, l = linear_float_to_srgb_ubyte(src[RCOMP]);
   1138    CLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
   1139    *d = PACK_COLOR_88(a, l);
   1140 }
   1141 
   1142 
   1143 /* MESA_FORMAT_RGBA_FLOAT32 */
   1144 
   1145 static void
   1146 pack_ubyte_RGBA_FLOAT32(const GLubyte src[4], void *dst)
   1147 {
   1148    GLfloat *d = ((GLfloat *) dst);
   1149    d[0] = UBYTE_TO_FLOAT(src[0]);
   1150    d[1] = UBYTE_TO_FLOAT(src[1]);
   1151    d[2] = UBYTE_TO_FLOAT(src[2]);
   1152    d[3] = UBYTE_TO_FLOAT(src[3]);
   1153 }
   1154 
   1155 static void
   1156 pack_float_RGBA_FLOAT32(const GLfloat src[4], void *dst)
   1157 {
   1158    GLfloat *d = ((GLfloat *) dst);
   1159    d[0] = src[0];
   1160    d[1] = src[1];
   1161    d[2] = src[2];
   1162    d[3] = src[3];
   1163 }
   1164 
   1165 
   1166 /* MESA_FORMAT_RGBA_FLOAT16 */
   1167 
   1168 static void
   1169 pack_ubyte_RGBA_FLOAT16(const GLubyte src[4], void *dst)
   1170 {
   1171    GLhalfARB *d = ((GLhalfARB *) dst);
   1172    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
   1173    d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
   1174    d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
   1175    d[3] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[3]));
   1176 }
   1177 
   1178 static void
   1179 pack_float_RGBA_FLOAT16(const GLfloat src[4], void *dst)
   1180 {
   1181    GLhalfARB *d = ((GLhalfARB *) dst);
   1182    d[0] = _mesa_float_to_half(src[0]);
   1183    d[1] = _mesa_float_to_half(src[1]);
   1184    d[2] = _mesa_float_to_half(src[2]);
   1185    d[3] = _mesa_float_to_half(src[3]);
   1186 }
   1187 
   1188 
   1189 /* MESA_FORMAT_RGB_FLOAT32 */
   1190 
   1191 static void
   1192 pack_ubyte_RGB_FLOAT32(const GLubyte src[4], void *dst)
   1193 {
   1194    GLfloat *d = ((GLfloat *) dst);
   1195    d[0] = UBYTE_TO_FLOAT(src[0]);
   1196    d[1] = UBYTE_TO_FLOAT(src[1]);
   1197    d[2] = UBYTE_TO_FLOAT(src[2]);
   1198 }
   1199 
   1200 static void
   1201 pack_float_RGB_FLOAT32(const GLfloat src[4], void *dst)
   1202 {
   1203    GLfloat *d = ((GLfloat *) dst);
   1204    d[0] = src[0];
   1205    d[1] = src[1];
   1206    d[2] = src[2];
   1207 }
   1208 
   1209 
   1210 /* MESA_FORMAT_RGB_FLOAT16 */
   1211 
   1212 static void
   1213 pack_ubyte_RGB_FLOAT16(const GLubyte src[4], void *dst)
   1214 {
   1215    GLhalfARB *d = ((GLhalfARB *) dst);
   1216    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[0]));
   1217    d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[1]));
   1218    d[2] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[2]));
   1219 }
   1220 
   1221 static void
   1222 pack_float_RGB_FLOAT16(const GLfloat src[4], void *dst)
   1223 {
   1224    GLhalfARB *d = ((GLhalfARB *) dst);
   1225    d[0] = _mesa_float_to_half(src[0]);
   1226    d[1] = _mesa_float_to_half(src[1]);
   1227    d[2] = _mesa_float_to_half(src[2]);
   1228 }
   1229 
   1230 
   1231 /* MESA_FORMAT_ALPHA_FLOAT32 */
   1232 
   1233 static void
   1234 pack_ubyte_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
   1235 {
   1236    GLfloat *d = ((GLfloat *) dst);
   1237    d[0] = UBYTE_TO_FLOAT(src[ACOMP]);
   1238 }
   1239 
   1240 static void
   1241 pack_float_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
   1242 {
   1243    GLfloat *d = ((GLfloat *) dst);
   1244    d[0] = src[ACOMP];
   1245 }
   1246 
   1247 
   1248 /* MESA_FORMAT_ALPHA_FLOAT16 */
   1249 
   1250 static void
   1251 pack_ubyte_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
   1252 {
   1253    GLhalfARB *d = ((GLhalfARB *) dst);
   1254    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
   1255 }
   1256 
   1257 static void
   1258 pack_float_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
   1259 {
   1260    GLhalfARB *d = ((GLhalfARB *) dst);
   1261    d[0] = _mesa_float_to_half(src[ACOMP]);
   1262 }
   1263 
   1264 
   1265 /* MESA_FORMAT_LUMINANCE_FLOAT32 (and INTENSITY_FLOAT32, R_FLOAT32) */
   1266 
   1267 static void
   1268 pack_ubyte_LUMINANCE_FLOAT32(const GLubyte src[4], void *dst)
   1269 {
   1270    GLfloat *d = ((GLfloat *) dst);
   1271    d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
   1272 }
   1273 
   1274 static void
   1275 pack_float_LUMINANCE_FLOAT32(const GLfloat src[4], void *dst)
   1276 {
   1277    GLfloat *d = ((GLfloat *) dst);
   1278    d[0] = src[RCOMP];
   1279 }
   1280 
   1281 
   1282 /* MESA_FORMAT_LUMINANCE_FLOAT16 (and INTENSITY_FLOAT16, R_FLOAT32) */
   1283 
   1284 static void
   1285 pack_ubyte_LUMINANCE_FLOAT16(const GLubyte src[4], void *dst)
   1286 {
   1287    GLhalfARB *d = ((GLhalfARB *) dst);
   1288    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
   1289 }
   1290 
   1291 static void
   1292 pack_float_LUMINANCE_FLOAT16(const GLfloat src[4], void *dst)
   1293 {
   1294    GLhalfARB *d = ((GLhalfARB *) dst);
   1295    d[0] = _mesa_float_to_half(src[RCOMP]);
   1296 }
   1297 
   1298 
   1299 /* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 */
   1300 
   1301 static void
   1302 pack_ubyte_LUMINANCE_ALPHA_FLOAT32(const GLubyte src[4], void *dst)
   1303 {
   1304    GLfloat *d = ((GLfloat *) dst);
   1305    d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
   1306    d[1] = UBYTE_TO_FLOAT(src[ACOMP]);
   1307 }
   1308 
   1309 static void
   1310 pack_float_LUMINANCE_ALPHA_FLOAT32(const GLfloat src[4], void *dst)
   1311 {
   1312    GLfloat *d = ((GLfloat *) dst);
   1313    d[0] = src[RCOMP];
   1314    d[1] = src[ACOMP];
   1315 }
   1316 
   1317 
   1318 /* MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 */
   1319 
   1320 static void
   1321 pack_ubyte_LUMINANCE_ALPHA_FLOAT16(const GLubyte src[4], void *dst)
   1322 {
   1323    GLhalfARB *d = ((GLhalfARB *) dst);
   1324    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
   1325    d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[ACOMP]));
   1326 }
   1327 
   1328 static void
   1329 pack_float_LUMINANCE_ALPHA_FLOAT16(const GLfloat src[4], void *dst)
   1330 {
   1331    GLhalfARB *d = ((GLhalfARB *) dst);
   1332    d[0] = _mesa_float_to_half(src[RCOMP]);
   1333    d[1] = _mesa_float_to_half(src[ACOMP]);
   1334 }
   1335 
   1336 
   1337 /* MESA_FORMAT_RG_FLOAT32 */
   1338 
   1339 static void
   1340 pack_ubyte_RG_FLOAT32(const GLubyte src[4], void *dst)
   1341 {
   1342    GLfloat *d = ((GLfloat *) dst);
   1343    d[0] = UBYTE_TO_FLOAT(src[RCOMP]);
   1344    d[1] = UBYTE_TO_FLOAT(src[GCOMP]);
   1345 }
   1346 
   1347 static void
   1348 pack_float_RG_FLOAT32(const GLfloat src[4], void *dst)
   1349 {
   1350    GLfloat *d = ((GLfloat *) dst);
   1351    d[0] = src[RCOMP];
   1352    d[1] = src[GCOMP];
   1353 }
   1354 
   1355 
   1356 /* MESA_FORMAT_RG_FLOAT16 */
   1357 
   1358 static void
   1359 pack_ubyte_RG_FLOAT16(const GLubyte src[4], void *dst)
   1360 {
   1361    GLhalfARB *d = ((GLhalfARB *) dst);
   1362    d[0] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[RCOMP]));
   1363    d[1] = _mesa_float_to_half(UBYTE_TO_FLOAT(src[GCOMP]));
   1364 }
   1365 
   1366 static void
   1367 pack_float_RG_FLOAT16(const GLfloat src[4], void *dst)
   1368 {
   1369    GLhalfARB *d = ((GLhalfARB *) dst);
   1370    d[0] = _mesa_float_to_half(src[RCOMP]);
   1371    d[1] = _mesa_float_to_half(src[GCOMP]);
   1372 }
   1373 
   1374 
   1375 /* MESA_FORMAT_DUDV8 */
   1376 
   1377 static void
   1378 pack_ubyte_DUDV8(const GLubyte src[4], void *dst)
   1379 {
   1380    /* XXX is this ever used? */
   1381    GLushort *d = ((GLushort *) dst);
   1382    *d = PACK_COLOR_88(src[0], src[1]);
   1383 }
   1384 
   1385 static void
   1386 pack_float_DUDV8(const GLfloat src[4], void *dst)
   1387 {
   1388    GLushort *d = ((GLushort *) dst);
   1389    GLbyte du, dv;
   1390    du = FLOAT_TO_BYTE(CLAMP(src[0], 0.0F, 1.0F));
   1391    dv = FLOAT_TO_BYTE(CLAMP(src[1], 0.0F, 1.0F));
   1392    *d = PACK_COLOR_88(du, dv);
   1393 }
   1394 
   1395 
   1396 /* MESA_FORMAT_RGBA_16 */
   1397 
   1398 static void
   1399 pack_ubyte_RGBA_16(const GLubyte src[4], void *dst)
   1400 {
   1401    GLushort *d = ((GLushort *) dst);
   1402    d[0] = UBYTE_TO_USHORT(src[RCOMP]);
   1403    d[1] = UBYTE_TO_USHORT(src[GCOMP]);
   1404    d[2] = UBYTE_TO_USHORT(src[BCOMP]);
   1405    d[3] = UBYTE_TO_USHORT(src[ACOMP]);
   1406 }
   1407 
   1408 static void
   1409 pack_float_RGBA_16(const GLfloat src[4], void *dst)
   1410 {
   1411    GLushort *d = ((GLushort *) dst);
   1412    UNCLAMPED_FLOAT_TO_USHORT(d[0], src[RCOMP]);
   1413    UNCLAMPED_FLOAT_TO_USHORT(d[1], src[GCOMP]);
   1414    UNCLAMPED_FLOAT_TO_USHORT(d[2], src[BCOMP]);
   1415    UNCLAMPED_FLOAT_TO_USHORT(d[3], src[ACOMP]);
   1416 }
   1417 
   1418 
   1419 
   1420 /*
   1421  * MESA_FORMAT_SIGNED_R8
   1422  */
   1423 
   1424 static void
   1425 pack_float_SIGNED_R8(const GLfloat src[4], void *dst)
   1426 {
   1427    GLbyte *d = (GLbyte *) dst;
   1428    *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1429 }
   1430 
   1431 
   1432 /*
   1433  * MESA_FORMAT_SIGNED_RG88_REV
   1434  */
   1435 
   1436 static void
   1437 pack_float_SIGNED_RG88_REV(const GLfloat src[4], void *dst)
   1438 {
   1439    GLushort *d = (GLushort *) dst;
   1440    GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1441    GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1442    *d = (g << 8) | r;
   1443 }
   1444 
   1445 
   1446 /*
   1447  * MESA_FORMAT_SIGNED_RGBX8888
   1448  */
   1449 
   1450 static void
   1451 pack_float_SIGNED_RGBX8888(const GLfloat src[4], void *dst)
   1452 {
   1453    GLuint *d = (GLuint *) dst;
   1454    GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1455    GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1456    GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
   1457    GLbyte a = 127;
   1458    *d = PACK_COLOR_8888(r, g, b, a);
   1459 }
   1460 
   1461 
   1462 /*
   1463  * MESA_FORMAT_SIGNED_RGBA8888
   1464  */
   1465 
   1466 static void
   1467 pack_float_SIGNED_RGBA8888(const GLfloat src[4], void *dst)
   1468 {
   1469    GLuint *d = (GLuint *) dst;
   1470    GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1471    GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1472    GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
   1473    GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1474    *d = PACK_COLOR_8888(r, g, b, a);
   1475 }
   1476 
   1477 
   1478 /*
   1479  * MESA_FORMAT_SIGNED_RGBA8888_REV
   1480  */
   1481 
   1482 static void
   1483 pack_float_SIGNED_RGBA8888_REV(const GLfloat src[4], void *dst)
   1484 {
   1485    GLuint *d = (GLuint *) dst;
   1486    GLbyte r = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1487    GLbyte g = FLOAT_TO_BYTE(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1488    GLbyte b = FLOAT_TO_BYTE(CLAMP(src[BCOMP], -1.0f, 1.0f));
   1489    GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1490    *d = PACK_COLOR_8888(a, b, g, r);
   1491 }
   1492 
   1493 
   1494 /*
   1495  * MESA_FORMAT_SIGNED_R16
   1496  */
   1497 
   1498 static void
   1499 pack_float_SIGNED_R16(const GLfloat src[4], void *dst)
   1500 {
   1501    GLshort *d = (GLshort *) dst;
   1502    *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1503 }
   1504 
   1505 
   1506 /*
   1507  * MESA_FORMAT_SIGNED_GR1616
   1508  */
   1509 
   1510 static void
   1511 pack_float_SIGNED_GR1616(const GLfloat src[4], void *dst)
   1512 {
   1513    GLuint *d = (GLuint *) dst;
   1514    GLshort r = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1515    GLshort g = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1516    *d = (g << 16) | (r & 0xffff);
   1517 }
   1518 
   1519 
   1520 /*
   1521  * MESA_FORMAT_SIGNED_RGB_16
   1522  */
   1523 
   1524 static void
   1525 pack_float_SIGNED_RGB_16(const GLfloat src[4], void *dst)
   1526 {
   1527    GLshort *d = (GLshort *) dst;
   1528    d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1529    d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1530    d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
   1531 }
   1532 
   1533 
   1534 /*
   1535  * MESA_FORMAT_SIGNED_RGBA_16
   1536  */
   1537 
   1538 static void
   1539 pack_float_SIGNED_RGBA_16(const GLfloat src[4], void *dst)
   1540 {
   1541    GLshort *d = (GLshort *) dst;
   1542    d[0] = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1543    d[1] = FLOAT_TO_SHORT(CLAMP(src[GCOMP], -1.0f, 1.0f));
   1544    d[2] = FLOAT_TO_SHORT(CLAMP(src[BCOMP], -1.0f, 1.0f));
   1545    d[3] = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1546 }
   1547 
   1548 
   1549 /*
   1550  * MESA_FORMAT_SIGNED_A8
   1551  */
   1552 
   1553 static void
   1554 pack_float_SIGNED_A8(const GLfloat src[4], void *dst)
   1555 {
   1556    GLbyte *d = (GLbyte *) dst;
   1557    *d = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1558 }
   1559 
   1560 
   1561 /*
   1562  * MESA_FORMAT_SIGNED_L8
   1563  */
   1564 
   1565 static void
   1566 pack_float_SIGNED_L8(const GLfloat src[4], void *dst)
   1567 {
   1568    GLbyte *d = (GLbyte *) dst;
   1569    *d = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1570 }
   1571 
   1572 
   1573 /*
   1574  * MESA_FORMAT_SIGNED_AL88
   1575  */
   1576 
   1577 static void
   1578 pack_float_SIGNED_AL88(const GLfloat src[4], void *dst)
   1579 {
   1580    GLushort *d = (GLushort *) dst;
   1581    GLbyte l = FLOAT_TO_BYTE(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1582    GLbyte a = FLOAT_TO_BYTE(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1583    *d = (a << 8) | l;
   1584 }
   1585 
   1586 
   1587 /*
   1588  * MESA_FORMAT_SIGNED_A16
   1589  */
   1590 
   1591 static void
   1592 pack_float_SIGNED_A16(const GLfloat src[4], void *dst)
   1593 {
   1594    GLshort *d = (GLshort *) dst;
   1595    *d = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1596 }
   1597 
   1598 
   1599 /*
   1600  * MESA_FORMAT_SIGNED_L16
   1601  */
   1602 
   1603 static void
   1604 pack_float_SIGNED_L16(const GLfloat src[4], void *dst)
   1605 {
   1606    GLshort *d = (GLshort *) dst;
   1607    *d = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1608 }
   1609 
   1610 
   1611 /*
   1612  * MESA_FORMAT_SIGNED_AL1616
   1613  */
   1614 
   1615 static void
   1616 pack_float_SIGNED_AL1616(const GLfloat src[4], void *dst)
   1617 {
   1618    GLuint *d = (GLuint *) dst;
   1619    GLshort l = FLOAT_TO_SHORT(CLAMP(src[RCOMP], -1.0f, 1.0f));
   1620    GLshort a = FLOAT_TO_SHORT(CLAMP(src[ACOMP], -1.0f, 1.0f));
   1621    *d = PACK_COLOR_1616(a, l);
   1622 }
   1623 
   1624 
   1625 /*
   1626  * MESA_FORMAT_RGB9_E5_FLOAT;
   1627  */
   1628 
   1629 static void
   1630 pack_float_RGB9_E5_FLOAT(const GLfloat src[4], void *dst)
   1631 {
   1632    GLuint *d = (GLuint *) dst;
   1633    *d = float3_to_rgb9e5(src);
   1634 }
   1635 
   1636 static void
   1637 pack_ubyte_RGB9_E5_FLOAT(const GLubyte src[4], void *dst)
   1638 {
   1639    GLuint *d = (GLuint *) dst;
   1640    GLfloat rgb[3];
   1641    rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
   1642    rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
   1643    rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
   1644    *d = float3_to_rgb9e5(rgb);
   1645 }
   1646 
   1647 
   1648 
   1649 /*
   1650  * MESA_FORMAT_R11_G11_B10_FLOAT;
   1651  */
   1652 
   1653 static void
   1654 pack_ubyte_R11_G11_B10_FLOAT(const GLubyte src[4], void *dst)
   1655 {
   1656    GLuint *d = (GLuint *) dst;
   1657    GLfloat rgb[3];
   1658    rgb[0] = UBYTE_TO_FLOAT(src[RCOMP]);
   1659    rgb[1] = UBYTE_TO_FLOAT(src[GCOMP]);
   1660    rgb[2] = UBYTE_TO_FLOAT(src[BCOMP]);
   1661    *d = float3_to_r11g11b10f(rgb);
   1662 }
   1663 
   1664 static void
   1665 pack_float_R11_G11_B10_FLOAT(const GLfloat src[4], void *dst)
   1666 {
   1667    GLuint *d = (GLuint *) dst;
   1668    *d = float3_to_r11g11b10f(src);
   1669 }
   1670 
   1671 
   1672 
   1673 /**
   1674  * Return a function that can pack a GLubyte rgba[4] color.
   1675  */
   1676 gl_pack_ubyte_rgba_func
   1677 _mesa_get_pack_ubyte_rgba_function(gl_format format)
   1678 {
   1679    static gl_pack_ubyte_rgba_func table[MESA_FORMAT_COUNT];
   1680    static GLboolean initialized = GL_FALSE;
   1681 
   1682    if (!initialized) {
   1683       memset(table, 0, sizeof(table));
   1684 
   1685       table[MESA_FORMAT_NONE] = NULL;
   1686 
   1687       table[MESA_FORMAT_RGBA8888] = pack_ubyte_RGBA8888;
   1688       table[MESA_FORMAT_RGBA8888_REV] = pack_ubyte_RGBA8888_REV;
   1689       table[MESA_FORMAT_ARGB8888] = pack_ubyte_ARGB8888;
   1690       table[MESA_FORMAT_ARGB8888_REV] = pack_ubyte_ARGB8888_REV;
   1691       table[MESA_FORMAT_RGBX8888] = pack_ubyte_RGBA8888; /* reused */
   1692       table[MESA_FORMAT_RGBX8888_REV] = pack_ubyte_RGBA8888_REV; /* reused */
   1693       table[MESA_FORMAT_XRGB8888] = pack_ubyte_XRGB8888;
   1694       table[MESA_FORMAT_XRGB8888_REV] = pack_ubyte_XRGB8888_REV;
   1695       table[MESA_FORMAT_RGB888] = pack_ubyte_RGB888;
   1696       table[MESA_FORMAT_BGR888] = pack_ubyte_BGR888;
   1697       table[MESA_FORMAT_RGB565] = pack_ubyte_RGB565;
   1698       table[MESA_FORMAT_RGB565_REV] = pack_ubyte_RGB565_REV;
   1699       table[MESA_FORMAT_ARGB4444] = pack_ubyte_ARGB4444;
   1700       table[MESA_FORMAT_ARGB4444_REV] = pack_ubyte_ARGB4444_REV;
   1701       table[MESA_FORMAT_RGBA5551] = pack_ubyte_RGBA5551;
   1702       table[MESA_FORMAT_ARGB1555] = pack_ubyte_ARGB1555;
   1703       table[MESA_FORMAT_ARGB1555_REV] = pack_ubyte_ARGB1555_REV;
   1704       table[MESA_FORMAT_AL44] = pack_ubyte_AL44;
   1705       table[MESA_FORMAT_AL88] = pack_ubyte_AL88;
   1706       table[MESA_FORMAT_AL88_REV] = pack_ubyte_AL88_REV;
   1707       table[MESA_FORMAT_AL1616] = pack_ubyte_AL1616;
   1708       table[MESA_FORMAT_AL1616_REV] = pack_ubyte_AL1616_REV;
   1709       table[MESA_FORMAT_RGB332] = pack_ubyte_RGB332;
   1710       table[MESA_FORMAT_A8] = pack_ubyte_A8;
   1711       table[MESA_FORMAT_A16] = pack_ubyte_A16;
   1712       table[MESA_FORMAT_L8] = pack_ubyte_L8;
   1713       table[MESA_FORMAT_L16] = pack_ubyte_L16;
   1714       table[MESA_FORMAT_I8] = pack_ubyte_L8; /* reuse pack_ubyte_L8 */
   1715       table[MESA_FORMAT_I16] = pack_ubyte_L16; /* reuse pack_ubyte_L16 */
   1716       table[MESA_FORMAT_YCBCR] = pack_ubyte_YCBCR;
   1717       table[MESA_FORMAT_YCBCR_REV] = pack_ubyte_YCBCR_REV;
   1718       table[MESA_FORMAT_R8] = pack_ubyte_R8;
   1719       table[MESA_FORMAT_GR88] = pack_ubyte_GR88;
   1720       table[MESA_FORMAT_RG88] = pack_ubyte_RG88;
   1721       table[MESA_FORMAT_R16] = pack_ubyte_R16;
   1722       table[MESA_FORMAT_RG1616] = pack_ubyte_RG1616;
   1723       table[MESA_FORMAT_RG1616_REV] = pack_ubyte_RG1616_REV;
   1724       table[MESA_FORMAT_ARGB2101010] = pack_ubyte_ARGB2101010;
   1725       table[MESA_FORMAT_ABGR2101010_UINT] = pack_ubyte_ABGR2101010_UINT;
   1726 
   1727       /* should never convert RGBA to these formats */
   1728       table[MESA_FORMAT_Z24_S8] = NULL;
   1729       table[MESA_FORMAT_S8_Z24] = NULL;
   1730       table[MESA_FORMAT_Z16] = NULL;
   1731       table[MESA_FORMAT_X8_Z24] = NULL;
   1732       table[MESA_FORMAT_Z24_X8] = NULL;
   1733       table[MESA_FORMAT_Z32] = NULL;
   1734       table[MESA_FORMAT_S8] = NULL;
   1735 
   1736       /* sRGB */
   1737       table[MESA_FORMAT_SRGB8] = pack_ubyte_SRGB8;
   1738       table[MESA_FORMAT_SRGBA8] = pack_ubyte_SRGBA8;
   1739       table[MESA_FORMAT_SARGB8] = pack_ubyte_SARGB8;
   1740       table[MESA_FORMAT_SL8] = pack_ubyte_SL8;
   1741       table[MESA_FORMAT_SLA8] = pack_ubyte_SLA8;
   1742 
   1743       /* n/a */
   1744       table[MESA_FORMAT_SRGB_DXT1] = NULL; /* pack_ubyte_SRGB_DXT1; */
   1745       table[MESA_FORMAT_SRGBA_DXT1] = NULL; /* pack_ubyte_SRGBA_DXT1; */
   1746       table[MESA_FORMAT_SRGBA_DXT3] = NULL; /* pack_ubyte_SRGBA_DXT3; */
   1747       table[MESA_FORMAT_SRGBA_DXT5] = NULL; /* pack_ubyte_SRGBA_DXT5; */
   1748 
   1749       table[MESA_FORMAT_RGB_FXT1] = NULL; /* pack_ubyte_RGB_FXT1; */
   1750       table[MESA_FORMAT_RGBA_FXT1] = NULL; /* pack_ubyte_RGBA_FXT1; */
   1751       table[MESA_FORMAT_RGB_DXT1] = NULL; /* pack_ubyte_RGB_DXT1; */
   1752       table[MESA_FORMAT_RGBA_DXT1] = NULL; /* pack_ubyte_RGBA_DXT1; */
   1753       table[MESA_FORMAT_RGBA_DXT3] = NULL; /* pack_ubyte_RGBA_DXT3; */
   1754       table[MESA_FORMAT_RGBA_DXT5] = NULL; /* pack_ubyte_RGBA_DXT5; */
   1755 
   1756       table[MESA_FORMAT_RGBA_FLOAT32] = pack_ubyte_RGBA_FLOAT32;
   1757       table[MESA_FORMAT_RGBA_FLOAT16] = pack_ubyte_RGBA_FLOAT16;
   1758       table[MESA_FORMAT_RGB_FLOAT32] = pack_ubyte_RGB_FLOAT32;
   1759       table[MESA_FORMAT_RGB_FLOAT16] = pack_ubyte_RGB_FLOAT16;
   1760       table[MESA_FORMAT_ALPHA_FLOAT32] = pack_ubyte_ALPHA_FLOAT32;
   1761       table[MESA_FORMAT_ALPHA_FLOAT16] = pack_ubyte_ALPHA_FLOAT16;
   1762       table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
   1763       table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
   1764       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_ubyte_LUMINANCE_ALPHA_FLOAT32;
   1765       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_ubyte_LUMINANCE_ALPHA_FLOAT16;
   1766       table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
   1767       table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
   1768       table[MESA_FORMAT_R_FLOAT32] = pack_ubyte_LUMINANCE_FLOAT32;
   1769       table[MESA_FORMAT_R_FLOAT16] = pack_ubyte_LUMINANCE_FLOAT16;
   1770       table[MESA_FORMAT_RG_FLOAT32] = pack_ubyte_RG_FLOAT32;
   1771       table[MESA_FORMAT_RG_FLOAT16] = pack_ubyte_RG_FLOAT16;
   1772 
   1773       /* n/a */
   1774       table[MESA_FORMAT_RGBA_INT8] = NULL; /* pack_ubyte_RGBA_INT8 */
   1775       table[MESA_FORMAT_RGBA_INT16] = NULL; /* pack_ubyte_RGBA_INT16 */
   1776       table[MESA_FORMAT_RGBA_INT32] = NULL; /* pack_ubyte_RGBA_INT32 */
   1777       table[MESA_FORMAT_RGBA_UINT8] = NULL; /* pack_ubyte_RGBA_UINT8 */
   1778       table[MESA_FORMAT_RGBA_UINT16] = NULL; /* pack_ubyte_RGBA_UINT16 */
   1779       table[MESA_FORMAT_RGBA_UINT32] = NULL; /* pack_ubyte_RGBA_UINT32 */
   1780 
   1781       table[MESA_FORMAT_DUDV8] = pack_ubyte_DUDV8;
   1782 
   1783       table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
   1784 
   1785       /* n/a */
   1786       table[MESA_FORMAT_SIGNED_R8] = NULL;
   1787       table[MESA_FORMAT_SIGNED_RG88_REV] = NULL;
   1788       table[MESA_FORMAT_SIGNED_RGBX8888] = NULL;
   1789       table[MESA_FORMAT_SIGNED_RGBA8888] = NULL;
   1790       table[MESA_FORMAT_SIGNED_RGBA8888_REV] = NULL;
   1791       table[MESA_FORMAT_SIGNED_R16] = NULL;
   1792       table[MESA_FORMAT_SIGNED_GR1616] = NULL;
   1793       table[MESA_FORMAT_SIGNED_RGB_16] = NULL;
   1794       table[MESA_FORMAT_SIGNED_RGBA_16] = NULL;
   1795       table[MESA_FORMAT_SIGNED_A8] = NULL;
   1796       table[MESA_FORMAT_SIGNED_L8] = NULL;
   1797       table[MESA_FORMAT_SIGNED_AL88] = NULL;
   1798       table[MESA_FORMAT_SIGNED_I8] = NULL;
   1799       table[MESA_FORMAT_SIGNED_A16] = NULL;
   1800       table[MESA_FORMAT_SIGNED_L16] = NULL;
   1801       table[MESA_FORMAT_SIGNED_AL1616] = NULL;
   1802       table[MESA_FORMAT_SIGNED_I16] = NULL;
   1803 
   1804 
   1805       table[MESA_FORMAT_RGBA_16] = pack_ubyte_RGBA_16;
   1806 
   1807       table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_ubyte_RGB9_E5_FLOAT;
   1808       table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_ubyte_R11_G11_B10_FLOAT;
   1809 
   1810       initialized = GL_TRUE;
   1811    }
   1812 
   1813    return table[format];
   1814 }
   1815 
   1816 
   1817 
   1818 /**
   1819  * Return a function that can pack a GLfloat rgba[4] color.
   1820  */
   1821 gl_pack_float_rgba_func
   1822 _mesa_get_pack_float_rgba_function(gl_format format)
   1823 {
   1824    static gl_pack_float_rgba_func table[MESA_FORMAT_COUNT];
   1825    static GLboolean initialized = GL_FALSE;
   1826 
   1827    if (!initialized) {
   1828       memset(table, 0, sizeof(table));
   1829 
   1830       table[MESA_FORMAT_NONE] = NULL;
   1831 
   1832       table[MESA_FORMAT_RGBA8888] = pack_float_RGBA8888;
   1833       table[MESA_FORMAT_RGBA8888_REV] = pack_float_RGBA8888_REV;
   1834       table[MESA_FORMAT_ARGB8888] = pack_float_ARGB8888;
   1835       table[MESA_FORMAT_ARGB8888_REV] = pack_float_ARGB8888_REV;
   1836       table[MESA_FORMAT_RGBX8888] = pack_float_RGBA8888; /* reused */
   1837       table[MESA_FORMAT_RGBX8888_REV] = pack_float_RGBA8888_REV; /* reused */
   1838       table[MESA_FORMAT_XRGB8888] = pack_float_XRGB8888;
   1839       table[MESA_FORMAT_XRGB8888_REV] = pack_float_XRGB8888_REV;
   1840       table[MESA_FORMAT_RGB888] = pack_float_RGB888;
   1841       table[MESA_FORMAT_BGR888] = pack_float_BGR888;
   1842       table[MESA_FORMAT_RGB565] = pack_float_RGB565;
   1843       table[MESA_FORMAT_RGB565_REV] = pack_float_RGB565_REV;
   1844       table[MESA_FORMAT_ARGB4444] = pack_float_ARGB4444;
   1845       table[MESA_FORMAT_ARGB4444_REV] = pack_float_ARGB4444_REV;
   1846       table[MESA_FORMAT_RGBA5551] = pack_float_RGBA5551;
   1847       table[MESA_FORMAT_ARGB1555] = pack_float_ARGB1555;
   1848       table[MESA_FORMAT_ARGB1555_REV] = pack_float_ARGB1555_REV;
   1849 
   1850       table[MESA_FORMAT_AL44] = pack_float_AL44;
   1851       table[MESA_FORMAT_AL88] = pack_float_AL88;
   1852       table[MESA_FORMAT_AL88_REV] = pack_float_AL88_REV;
   1853       table[MESA_FORMAT_AL1616] = pack_float_AL1616;
   1854       table[MESA_FORMAT_AL1616_REV] = pack_float_AL1616_REV;
   1855       table[MESA_FORMAT_RGB332] = pack_float_RGB332;
   1856       table[MESA_FORMAT_A8] = pack_float_A8;
   1857       table[MESA_FORMAT_A16] = pack_float_A16;
   1858       table[MESA_FORMAT_L8] = pack_float_L8;
   1859       table[MESA_FORMAT_L16] = pack_float_L16;
   1860       table[MESA_FORMAT_I8] = pack_float_L8; /* reuse pack_float_L8 */
   1861       table[MESA_FORMAT_I16] = pack_float_L16; /* reuse pack_float_L16 */
   1862       table[MESA_FORMAT_YCBCR] = pack_float_YCBCR;
   1863       table[MESA_FORMAT_YCBCR_REV] = pack_float_YCBCR_REV;
   1864       table[MESA_FORMAT_R8] = pack_float_R8;
   1865       table[MESA_FORMAT_GR88] = pack_float_GR88;
   1866       table[MESA_FORMAT_RG88] = pack_float_RG88;
   1867       table[MESA_FORMAT_R16] = pack_float_R16;
   1868       table[MESA_FORMAT_RG1616] = pack_float_RG1616;
   1869       table[MESA_FORMAT_RG1616_REV] = pack_float_RG1616_REV;
   1870       table[MESA_FORMAT_ARGB2101010] = pack_float_ARGB2101010;
   1871       table[MESA_FORMAT_ABGR2101010_UINT] = pack_float_ABGR2101010_UINT;
   1872 
   1873       /* should never convert RGBA to these formats */
   1874       table[MESA_FORMAT_Z24_S8] = NULL;
   1875       table[MESA_FORMAT_S8_Z24] = NULL;
   1876       table[MESA_FORMAT_Z16] = NULL;
   1877       table[MESA_FORMAT_X8_Z24] = NULL;
   1878       table[MESA_FORMAT_Z24_X8] = NULL;
   1879       table[MESA_FORMAT_Z32] = NULL;
   1880       table[MESA_FORMAT_S8] = NULL;
   1881 
   1882       table[MESA_FORMAT_SRGB8] = pack_float_SRGB8;
   1883       table[MESA_FORMAT_SRGBA8] = pack_float_SRGBA8;
   1884       table[MESA_FORMAT_SARGB8] = pack_float_SARGB8;
   1885       table[MESA_FORMAT_SL8] = pack_float_SL8;
   1886       table[MESA_FORMAT_SLA8] = pack_float_SLA8;
   1887 
   1888       /* n/a */
   1889       table[MESA_FORMAT_SRGB_DXT1] = NULL;
   1890       table[MESA_FORMAT_SRGBA_DXT1] = NULL;
   1891       table[MESA_FORMAT_SRGBA_DXT3] = NULL;
   1892       table[MESA_FORMAT_SRGBA_DXT5] = NULL;
   1893 
   1894       table[MESA_FORMAT_RGB_FXT1] = NULL;
   1895       table[MESA_FORMAT_RGBA_FXT1] = NULL;
   1896       table[MESA_FORMAT_RGB_DXT1] = NULL;
   1897       table[MESA_FORMAT_RGBA_DXT1] = NULL;
   1898       table[MESA_FORMAT_RGBA_DXT3] = NULL;
   1899       table[MESA_FORMAT_RGBA_DXT5] = NULL;
   1900 
   1901       table[MESA_FORMAT_RGBA_FLOAT32] = pack_float_RGBA_FLOAT32;
   1902       table[MESA_FORMAT_RGBA_FLOAT16] = pack_float_RGBA_FLOAT16;
   1903       table[MESA_FORMAT_RGB_FLOAT32] = pack_float_RGB_FLOAT32;
   1904       table[MESA_FORMAT_RGB_FLOAT16] = pack_float_RGB_FLOAT16;
   1905       table[MESA_FORMAT_ALPHA_FLOAT32] = pack_float_ALPHA_FLOAT32;
   1906       table[MESA_FORMAT_ALPHA_FLOAT16] = pack_float_ALPHA_FLOAT16;
   1907       table[MESA_FORMAT_LUMINANCE_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
   1908       table[MESA_FORMAT_LUMINANCE_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
   1909       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = pack_float_LUMINANCE_ALPHA_FLOAT32;
   1910       table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = pack_float_LUMINANCE_ALPHA_FLOAT16;
   1911 
   1912       table[MESA_FORMAT_INTENSITY_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
   1913       table[MESA_FORMAT_INTENSITY_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
   1914       table[MESA_FORMAT_R_FLOAT32] = pack_float_LUMINANCE_FLOAT32;
   1915       table[MESA_FORMAT_R_FLOAT16] = pack_float_LUMINANCE_FLOAT16;
   1916       table[MESA_FORMAT_RG_FLOAT32] = pack_float_RG_FLOAT32;
   1917       table[MESA_FORMAT_RG_FLOAT16] = pack_float_RG_FLOAT16;
   1918 
   1919       /* n/a */
   1920       table[MESA_FORMAT_RGBA_INT8] = NULL;
   1921       table[MESA_FORMAT_RGBA_INT16] = NULL;
   1922       table[MESA_FORMAT_RGBA_INT32] = NULL;
   1923       table[MESA_FORMAT_RGBA_UINT8] = NULL;
   1924       table[MESA_FORMAT_RGBA_UINT16] = NULL;
   1925       table[MESA_FORMAT_RGBA_UINT32] = NULL;
   1926 
   1927       table[MESA_FORMAT_DUDV8] = pack_float_DUDV8;
   1928 
   1929       table[MESA_FORMAT_RGBA_16] = pack_float_RGBA_16;
   1930 
   1931       table[MESA_FORMAT_SIGNED_R8] = pack_float_SIGNED_R8;
   1932       table[MESA_FORMAT_SIGNED_RG88_REV] = pack_float_SIGNED_RG88_REV;
   1933       table[MESA_FORMAT_SIGNED_RGBX8888] = pack_float_SIGNED_RGBX8888;
   1934       table[MESA_FORMAT_SIGNED_RGBA8888] = pack_float_SIGNED_RGBA8888;
   1935       table[MESA_FORMAT_SIGNED_RGBA8888_REV] = pack_float_SIGNED_RGBA8888_REV;
   1936       table[MESA_FORMAT_SIGNED_R16] = pack_float_SIGNED_R16;
   1937       table[MESA_FORMAT_SIGNED_GR1616] = pack_float_SIGNED_GR1616;
   1938       table[MESA_FORMAT_SIGNED_RGB_16] = pack_float_SIGNED_RGB_16;
   1939       table[MESA_FORMAT_SIGNED_RGBA_16] = pack_float_SIGNED_RGBA_16;
   1940       table[MESA_FORMAT_SIGNED_A8] = pack_float_SIGNED_A8;
   1941       table[MESA_FORMAT_SIGNED_L8] = pack_float_SIGNED_L8;
   1942       table[MESA_FORMAT_SIGNED_AL88] = pack_float_SIGNED_AL88;
   1943       table[MESA_FORMAT_SIGNED_I8] = pack_float_SIGNED_L8; /* reused */
   1944       table[MESA_FORMAT_SIGNED_A16] = pack_float_SIGNED_A16;
   1945       table[MESA_FORMAT_SIGNED_L16] = pack_float_SIGNED_L16;
   1946       table[MESA_FORMAT_SIGNED_AL1616] = pack_float_SIGNED_AL1616;
   1947       table[MESA_FORMAT_SIGNED_I16] = pack_float_SIGNED_L16; /* reused */
   1948 
   1949       table[MESA_FORMAT_RGB9_E5_FLOAT] = pack_float_RGB9_E5_FLOAT;
   1950       table[MESA_FORMAT_R11_G11_B10_FLOAT] = pack_float_R11_G11_B10_FLOAT;
   1951 
   1952       initialized = GL_TRUE;
   1953    }
   1954 
   1955    return table[format];
   1956 }
   1957 
   1958 
   1959 
   1960 static pack_float_rgba_row_func
   1961 get_pack_float_rgba_row_function(gl_format format)
   1962 {
   1963    static pack_float_rgba_row_func table[MESA_FORMAT_COUNT];
   1964    static GLboolean initialized = GL_FALSE;
   1965 
   1966    if (!initialized) {
   1967       /* We don't need a special row packing function for each format.
   1968        * There's a generic fallback which uses a per-pixel packing function.
   1969        */
   1970       memset(table, 0, sizeof(table));
   1971 
   1972       table[MESA_FORMAT_RGBA8888] = pack_row_float_RGBA8888;
   1973       table[MESA_FORMAT_RGBA8888_REV] = pack_row_float_RGBA8888_REV;
   1974       table[MESA_FORMAT_ARGB8888] = pack_row_float_ARGB8888;
   1975       table[MESA_FORMAT_ARGB8888_REV] = pack_row_float_ARGB8888_REV;
   1976       table[MESA_FORMAT_RGBX8888] = pack_row_float_RGBA8888; /* reused */
   1977       table[MESA_FORMAT_RGBX8888_REV] = pack_row_float_RGBA8888_REV; /* reused */
   1978       table[MESA_FORMAT_XRGB8888] = pack_row_float_XRGB8888;
   1979       table[MESA_FORMAT_XRGB8888_REV] = pack_row_float_XRGB8888_REV;
   1980       table[MESA_FORMAT_RGB888] = pack_row_float_RGB888;
   1981       table[MESA_FORMAT_BGR888] = pack_row_float_BGR888;
   1982       table[MESA_FORMAT_RGB565] = pack_row_float_RGB565;
   1983       table[MESA_FORMAT_RGB565_REV] = pack_row_float_RGB565_REV;
   1984 
   1985       initialized = GL_TRUE;
   1986    }
   1987 
   1988    return table[format];
   1989 }
   1990 
   1991 
   1992 
   1993 static pack_ubyte_rgba_row_func
   1994 get_pack_ubyte_rgba_row_function(gl_format format)
   1995 {
   1996    static pack_ubyte_rgba_row_func table[MESA_FORMAT_COUNT];
   1997    static GLboolean initialized = GL_FALSE;
   1998 
   1999    if (!initialized) {
   2000       /* We don't need a special row packing function for each format.
   2001        * There's a generic fallback which uses a per-pixel packing function.
   2002        */
   2003       memset(table, 0, sizeof(table));
   2004 
   2005       table[MESA_FORMAT_RGBA8888] = pack_row_ubyte_RGBA8888;
   2006       table[MESA_FORMAT_RGBA8888_REV] = pack_row_ubyte_RGBA8888_REV;
   2007       table[MESA_FORMAT_ARGB8888] = pack_row_ubyte_ARGB8888;
   2008       table[MESA_FORMAT_ARGB8888_REV] = pack_row_ubyte_ARGB8888_REV;
   2009       table[MESA_FORMAT_RGBX8888] = pack_row_ubyte_RGBA8888; /* reused */
   2010       table[MESA_FORMAT_RGBX8888_REV] = pack_row_ubyte_RGBA8888_REV; /* reused */
   2011       table[MESA_FORMAT_XRGB8888] = pack_row_ubyte_XRGB8888;
   2012       table[MESA_FORMAT_XRGB8888_REV] = pack_row_ubyte_XRGB8888_REV;
   2013       table[MESA_FORMAT_RGB888] = pack_row_ubyte_RGB888;
   2014       table[MESA_FORMAT_BGR888] = pack_row_ubyte_BGR888;
   2015       table[MESA_FORMAT_RGB565] = pack_row_ubyte_RGB565;
   2016       table[MESA_FORMAT_RGB565_REV] = pack_row_ubyte_RGB565_REV;
   2017 
   2018       initialized = GL_TRUE;
   2019    }
   2020 
   2021    return table[format];
   2022 }
   2023 
   2024 
   2025 
   2026 /**
   2027  * Pack a row of GLfloat rgba[4] values to the destination.
   2028  */
   2029 void
   2030 _mesa_pack_float_rgba_row(gl_format format, GLuint n,
   2031                           const GLfloat src[][4], void *dst)
   2032 {
   2033    pack_float_rgba_row_func packrow = get_pack_float_rgba_row_function(format);
   2034    if (packrow) {
   2035       /* use "fast" function */
   2036       packrow(n, src, dst);
   2037    }
   2038    else {
   2039       /* slower fallback */
   2040       gl_pack_float_rgba_func pack = _mesa_get_pack_float_rgba_function(format);
   2041       GLuint dstStride = _mesa_get_format_bytes(format);
   2042       GLubyte *dstPtr = (GLubyte *) dst;
   2043       GLuint i;
   2044 
   2045       assert(pack);
   2046       if (!pack)
   2047          return;
   2048 
   2049       for (i = 0; i < n; i++) {
   2050          pack(src[i], dstPtr);
   2051          dstPtr += dstStride;
   2052       }
   2053    }
   2054 }
   2055 
   2056 
   2057 /**
   2058  * Pack a row of GLubyte rgba[4] values to the destination.
   2059  */
   2060 void
   2061 _mesa_pack_ubyte_rgba_row(gl_format format, GLuint n,
   2062                           const GLubyte src[][4], void *dst)
   2063 {
   2064    pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
   2065    if (packrow) {
   2066       /* use "fast" function */
   2067       packrow(n, src, dst);
   2068    }
   2069    else {
   2070       /* slower fallback */
   2071       gl_pack_ubyte_rgba_func pack = _mesa_get_pack_ubyte_rgba_function(format);
   2072       const GLuint stride = _mesa_get_format_bytes(format);
   2073       GLubyte *d = ((GLubyte *) dst);
   2074       GLuint i;
   2075 
   2076       assert(pack);
   2077       if (!pack)
   2078          return;
   2079 
   2080       for (i = 0; i < n; i++) {
   2081          pack(src[i], d);
   2082          d += stride;
   2083       }
   2084    }
   2085 }
   2086 
   2087 
   2088 /**
   2089  * Pack a 2D image of ubyte RGBA pixels in the given format.
   2090  * \param srcRowStride  source image row stride in bytes
   2091  * \param dstRowStride  destination image row stride in bytes
   2092  */
   2093 void
   2094 _mesa_pack_ubyte_rgba_rect(gl_format format, GLuint width, GLuint height,
   2095                            const GLubyte *src, GLint srcRowStride,
   2096                            void *dst, GLint dstRowStride)
   2097 {
   2098    pack_ubyte_rgba_row_func packrow = get_pack_ubyte_rgba_row_function(format);
   2099    GLubyte *dstUB = (GLubyte *) dst;
   2100    GLuint i;
   2101 
   2102    if (packrow) {
   2103       if (srcRowStride == width * 4 * sizeof(GLubyte) &&
   2104           dstRowStride == _mesa_format_row_stride(format, width)) {
   2105          /* do whole image at once */
   2106          packrow(width * height, (const GLubyte (*)[4]) src, dst);
   2107       }
   2108       else {
   2109          /* row by row */
   2110          for (i = 0; i < height; i++) {
   2111             packrow(width, (const GLubyte (*)[4]) src, dstUB);
   2112             src += srcRowStride;
   2113             dstUB += dstRowStride;
   2114          }
   2115       }
   2116    }
   2117    else {
   2118       /* slower fallback */
   2119       for (i = 0; i < height; i++) {
   2120          _mesa_pack_ubyte_rgba_row(format, width,
   2121                                    (const GLubyte (*)[4]) src, dstUB);
   2122          src += srcRowStride;
   2123          dstUB += dstRowStride;
   2124       }
   2125    }
   2126 }
   2127 
   2128 
   2129 
   2130 /**
   2131  ** Pack float Z pixels
   2132  **/
   2133 
   2134 static void
   2135 pack_float_z_Z24_S8(const GLfloat *src, void *dst)
   2136 {
   2137    /* don't disturb the stencil values */
   2138    GLuint *d = ((GLuint *) dst);
   2139    const GLdouble scale = (GLdouble) 0xffffff;
   2140    GLuint s = *d & 0xff;
   2141    GLuint z = (GLuint) (*src * scale);
   2142    assert(z <= 0xffffff);
   2143    *d = (z << 8) | s;
   2144 }
   2145 
   2146 static void
   2147 pack_float_z_S8_Z24(const GLfloat *src, void *dst)
   2148 {
   2149    /* don't disturb the stencil values */
   2150    GLuint *d = ((GLuint *) dst);
   2151    const GLdouble scale = (GLdouble) 0xffffff;
   2152    GLuint s = *d & 0xff000000;
   2153    GLuint z = (GLuint) (*src * scale);
   2154    assert(z <= 0xffffff);
   2155    *d = s | z;
   2156 }
   2157 
   2158 static void
   2159 pack_float_z_Z16(const GLfloat *src, void *dst)
   2160 {
   2161    GLushort *d = ((GLushort *) dst);
   2162    const GLfloat scale = (GLfloat) 0xffff;
   2163    *d = (GLushort) (*src * scale);
   2164 }
   2165 
   2166 static void
   2167 pack_float_z_Z32(const GLfloat *src, void *dst)
   2168 {
   2169    GLuint *d = ((GLuint *) dst);
   2170    const GLdouble scale = (GLdouble) 0xffffffff;
   2171    *d = (GLuint) (*src * scale);
   2172 }
   2173 
   2174 static void
   2175 pack_float_z_Z32_FLOAT(const GLfloat *src, void *dst)
   2176 {
   2177    GLfloat *d = (GLfloat *) dst;
   2178    *d = *src;
   2179 }
   2180 
   2181 gl_pack_float_z_func
   2182 _mesa_get_pack_float_z_func(gl_format format)
   2183 {
   2184    switch (format) {
   2185    case MESA_FORMAT_Z24_S8:
   2186    case MESA_FORMAT_Z24_X8:
   2187       return pack_float_z_Z24_S8;
   2188    case MESA_FORMAT_S8_Z24:
   2189    case MESA_FORMAT_X8_Z24:
   2190       return pack_float_z_S8_Z24;
   2191    case MESA_FORMAT_Z16:
   2192       return pack_float_z_Z16;
   2193    case MESA_FORMAT_Z32:
   2194       return pack_float_z_Z32;
   2195    case MESA_FORMAT_Z32_FLOAT:
   2196    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2197       return pack_float_z_Z32_FLOAT;
   2198    default:
   2199       _mesa_problem(NULL,
   2200                     "unexpected format in _mesa_get_pack_float_z_func()");
   2201       return NULL;
   2202    }
   2203 }
   2204 
   2205 
   2206 
   2207 /**
   2208  ** Pack uint Z pixels.  The incoming src value is always in
   2209  ** the range [0, 2^32-1].
   2210  **/
   2211 
   2212 static void
   2213 pack_uint_z_Z24_S8(const GLuint *src, void *dst)
   2214 {
   2215    /* don't disturb the stencil values */
   2216    GLuint *d = ((GLuint *) dst);
   2217    GLuint s = *d & 0xff;
   2218    GLuint z = *src & 0xffffff00;
   2219    *d = z | s;
   2220 }
   2221 
   2222 static void
   2223 pack_uint_z_S8_Z24(const GLuint *src, void *dst)
   2224 {
   2225    /* don't disturb the stencil values */
   2226    GLuint *d = ((GLuint *) dst);
   2227    GLuint s = *d & 0xff000000;
   2228    GLuint z = *src >> 8;
   2229    *d = s | z;
   2230 }
   2231 
   2232 static void
   2233 pack_uint_z_Z16(const GLuint *src, void *dst)
   2234 {
   2235    GLushort *d = ((GLushort *) dst);
   2236    *d = *src >> 16;
   2237 }
   2238 
   2239 static void
   2240 pack_uint_z_Z32(const GLuint *src, void *dst)
   2241 {
   2242    GLuint *d = ((GLuint *) dst);
   2243    *d = *src;
   2244 }
   2245 
   2246 static void
   2247 pack_uint_z_Z32_FLOAT(const GLuint *src, void *dst)
   2248 {
   2249    GLuint *d = ((GLuint *) dst);
   2250    const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
   2251    *d = *src * scale;
   2252    assert(*d >= 0.0f);
   2253    assert(*d <= 1.0f);
   2254 }
   2255 
   2256 static void
   2257 pack_uint_z_Z32_FLOAT_X24S8(const GLuint *src, void *dst)
   2258 {
   2259    GLfloat *d = ((GLfloat *) dst);
   2260    const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
   2261    *d = *src * scale;
   2262    assert(*d >= 0.0f);
   2263    assert(*d <= 1.0f);
   2264 }
   2265 
   2266 gl_pack_uint_z_func
   2267 _mesa_get_pack_uint_z_func(gl_format format)
   2268 {
   2269    switch (format) {
   2270    case MESA_FORMAT_Z24_S8:
   2271    case MESA_FORMAT_Z24_X8:
   2272       return pack_uint_z_Z24_S8;
   2273    case MESA_FORMAT_S8_Z24:
   2274    case MESA_FORMAT_X8_Z24:
   2275       return pack_uint_z_S8_Z24;
   2276    case MESA_FORMAT_Z16:
   2277       return pack_uint_z_Z16;
   2278    case MESA_FORMAT_Z32:
   2279       return pack_uint_z_Z32;
   2280    case MESA_FORMAT_Z32_FLOAT:
   2281       return pack_uint_z_Z32_FLOAT;
   2282    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2283       return pack_uint_z_Z32_FLOAT_X24S8;
   2284    default:
   2285       _mesa_problem(NULL, "unexpected format in _mesa_get_pack_uint_z_func()");
   2286       return NULL;
   2287    }
   2288 }
   2289 
   2290 
   2291 /**
   2292  ** Pack ubyte stencil pixels
   2293  **/
   2294 
   2295 static void
   2296 pack_ubyte_stencil_Z24_S8(const GLubyte *src, void *dst)
   2297 {
   2298    /* don't disturb the Z values */
   2299    GLuint *d = ((GLuint *) dst);
   2300    GLuint s = *src;
   2301    GLuint z = *d & 0xffffff00;
   2302    *d = z | s;
   2303 }
   2304 
   2305 static void
   2306 pack_ubyte_stencil_S8_Z24(const GLubyte *src, void *dst)
   2307 {
   2308    /* don't disturb the Z values */
   2309    GLuint *d = ((GLuint *) dst);
   2310    GLuint s = *src << 24;
   2311    GLuint z = *d & 0xffffff;
   2312    *d = s | z;
   2313 }
   2314 
   2315 static void
   2316 pack_ubyte_stencil_S8(const GLubyte *src, void *dst)
   2317 {
   2318    GLubyte *d = (GLubyte *) dst;
   2319    *d = *src;
   2320 }
   2321 
   2322 static void
   2323 pack_ubyte_stencil_Z32_FLOAT_X24S8(const GLubyte *src, void *dst)
   2324 {
   2325    GLfloat *d = ((GLfloat *) dst);
   2326    d[1] = *src;
   2327 }
   2328 
   2329 
   2330 gl_pack_ubyte_stencil_func
   2331 _mesa_get_pack_ubyte_stencil_func(gl_format format)
   2332 {
   2333    switch (format) {
   2334    case MESA_FORMAT_Z24_S8:
   2335       return pack_ubyte_stencil_Z24_S8;
   2336    case MESA_FORMAT_S8_Z24:
   2337       return pack_ubyte_stencil_S8_Z24;
   2338    case MESA_FORMAT_S8:
   2339       return pack_ubyte_stencil_S8;
   2340    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2341       return pack_ubyte_stencil_Z32_FLOAT_X24S8;
   2342    default:
   2343       _mesa_problem(NULL,
   2344                     "unexpected format in _mesa_pack_ubyte_stencil_func()");
   2345       return NULL;
   2346    }
   2347 }
   2348 
   2349 
   2350 
   2351 void
   2352 _mesa_pack_float_z_row(gl_format format, GLuint n,
   2353                        const GLfloat *src, void *dst)
   2354 {
   2355    switch (format) {
   2356    case MESA_FORMAT_Z24_S8:
   2357    case MESA_FORMAT_Z24_X8:
   2358       {
   2359          /* don't disturb the stencil values */
   2360          GLuint *d = ((GLuint *) dst);
   2361          const GLdouble scale = (GLdouble) 0xffffff;
   2362          GLuint i;
   2363          for (i = 0; i < n; i++) {
   2364             GLuint s = d[i] & 0xff;
   2365             GLuint z = (GLuint) (src[i] * scale);
   2366             assert(z <= 0xffffff);
   2367             d[i] = (z << 8) | s;
   2368          }
   2369       }
   2370       break;
   2371    case MESA_FORMAT_S8_Z24:
   2372    case MESA_FORMAT_X8_Z24:
   2373       {
   2374          /* don't disturb the stencil values */
   2375          GLuint *d = ((GLuint *) dst);
   2376          const GLdouble scale = (GLdouble) 0xffffff;
   2377          GLuint i;
   2378          for (i = 0; i < n; i++) {
   2379             GLuint s = d[i] & 0xff000000;
   2380             GLuint z = (GLuint) (src[i] * scale);
   2381             assert(z <= 0xffffff);
   2382             d[i] = s | z;
   2383          }
   2384       }
   2385       break;
   2386    case MESA_FORMAT_Z16:
   2387       {
   2388          GLushort *d = ((GLushort *) dst);
   2389          const GLfloat scale = (GLfloat) 0xffff;
   2390          GLuint i;
   2391          for (i = 0; i < n; i++) {
   2392             d[i] = (GLushort) (src[i] * scale);
   2393          }
   2394       }
   2395       break;
   2396    case MESA_FORMAT_Z32:
   2397       {
   2398          GLuint *d = ((GLuint *) dst);
   2399          const GLdouble scale = (GLdouble) 0xffffffff;
   2400          GLuint i;
   2401          for (i = 0; i < n; i++) {
   2402             d[i] = (GLuint) (src[i] * scale);
   2403          }
   2404       }
   2405       break;
   2406    case MESA_FORMAT_Z32_FLOAT:
   2407       memcpy(dst, src, n * sizeof(GLfloat));
   2408       break;
   2409    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2410       {
   2411          struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
   2412          GLuint i;
   2413          for (i = 0; i < n; i++) {
   2414             d[i].z = src[i];
   2415          }
   2416       }
   2417       break;
   2418    default:
   2419       _mesa_problem(NULL, "unexpected format in _mesa_pack_float_z_row()");
   2420    }
   2421 }
   2422 
   2423 
   2424 /**
   2425  * The incoming Z values are always in the range [0, 0xffffffff].
   2426  */
   2427 void
   2428 _mesa_pack_uint_z_row(gl_format format, GLuint n,
   2429                       const GLuint *src, void *dst)
   2430 {
   2431    switch (format) {
   2432    case MESA_FORMAT_Z24_S8:
   2433    case MESA_FORMAT_Z24_X8:
   2434       {
   2435          /* don't disturb the stencil values */
   2436          GLuint *d = ((GLuint *) dst);
   2437          GLuint i;
   2438          for (i = 0; i < n; i++) {
   2439             GLuint s = d[i] & 0xff;
   2440             GLuint z = src[i] & 0xffffff00;
   2441             d[i] = z | s;
   2442          }
   2443       }
   2444       break;
   2445    case MESA_FORMAT_S8_Z24:
   2446    case MESA_FORMAT_X8_Z24:
   2447       {
   2448          /* don't disturb the stencil values */
   2449          GLuint *d = ((GLuint *) dst);
   2450          GLuint i;
   2451          for (i = 0; i < n; i++) {
   2452             GLuint s = d[i] & 0xff000000;
   2453             GLuint z = src[i] >> 8;
   2454             d[i] = s | z;
   2455          }
   2456       }
   2457       break;
   2458    case MESA_FORMAT_Z16:
   2459       {
   2460          GLushort *d = ((GLushort *) dst);
   2461          GLuint i;
   2462          for (i = 0; i < n; i++) {
   2463             d[i] = src[i] >> 16;
   2464          }
   2465       }
   2466       break;
   2467    case MESA_FORMAT_Z32:
   2468       memcpy(dst, src, n * sizeof(GLfloat));
   2469       break;
   2470    case MESA_FORMAT_Z32_FLOAT:
   2471       {
   2472          GLuint *d = ((GLuint *) dst);
   2473          const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
   2474          GLuint i;
   2475          for (i = 0; i < n; i++) {
   2476             d[i] = src[i] * scale;
   2477             assert(d[i] >= 0.0f);
   2478             assert(d[i] <= 1.0f);
   2479          }
   2480       }
   2481       break;
   2482    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2483       {
   2484          struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
   2485          const GLdouble scale = 1.0 / (GLdouble) 0xffffffff;
   2486          GLuint i;
   2487          for (i = 0; i < n; i++) {
   2488             d[i].z = src[i] * scale;
   2489             assert(d[i].z >= 0.0f);
   2490             assert(d[i].z <= 1.0f);
   2491          }
   2492       }
   2493       break;
   2494    default:
   2495       _mesa_problem(NULL, "unexpected format in _mesa_pack_uint_z_row()");
   2496    }
   2497 }
   2498 
   2499 
   2500 void
   2501 _mesa_pack_ubyte_stencil_row(gl_format format, GLuint n,
   2502                              const GLubyte *src, void *dst)
   2503 {
   2504    switch (format) {
   2505    case MESA_FORMAT_Z24_S8:
   2506       {
   2507          /* don't disturb the Z values */
   2508          GLuint *d = ((GLuint *) dst);
   2509          GLuint i;
   2510          for (i = 0; i < n; i++) {
   2511             GLuint s = src[i];
   2512             GLuint z = d[i] & 0xffffff00;
   2513             d[i] = z | s;
   2514          }
   2515       }
   2516       break;
   2517    case MESA_FORMAT_S8_Z24:
   2518       {
   2519          /* don't disturb the Z values */
   2520          GLuint *d = ((GLuint *) dst);
   2521          GLuint i;
   2522          for (i = 0; i < n; i++) {
   2523             GLuint s = src[i] << 24;
   2524             GLuint z = d[i] & 0xffffff;
   2525             d[i] = s | z;
   2526          }
   2527       }
   2528       break;
   2529    case MESA_FORMAT_S8:
   2530       memcpy(dst, src, n * sizeof(GLubyte));
   2531       break;
   2532    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2533       {
   2534          struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
   2535          GLuint i;
   2536          for (i = 0; i < n; i++) {
   2537             d[i].x24s8 = src[i];
   2538          }
   2539       }
   2540       break;
   2541    default:
   2542       _mesa_problem(NULL, "unexpected format in _mesa_pack_ubyte_stencil_row()");
   2543    }
   2544 }
   2545 
   2546 
   2547 /**
   2548  * Incoming Z/stencil values are always in uint_24_8 format.
   2549  */
   2550 void
   2551 _mesa_pack_uint_24_8_depth_stencil_row(gl_format format, GLuint n,
   2552                                        const GLuint *src, void *dst)
   2553 {
   2554    switch (format) {
   2555    case MESA_FORMAT_Z24_S8:
   2556       memcpy(dst, src, n * sizeof(GLuint));
   2557       break;
   2558    case MESA_FORMAT_S8_Z24:
   2559       {
   2560          GLuint *d = ((GLuint *) dst);
   2561          GLuint i;
   2562          for (i = 0; i < n; i++) {
   2563             GLuint s = src[i] << 24;
   2564             GLuint z = src[i] >> 8;
   2565             d[i] = s | z;
   2566          }
   2567       }
   2568       break;
   2569    case MESA_FORMAT_Z32_FLOAT_X24S8:
   2570       {
   2571          const GLdouble scale = 1.0 / (GLdouble) 0xffffff;
   2572          struct z32f_x24s8 *d = (struct z32f_x24s8 *) dst;
   2573          GLint i;
   2574          for (i = 0; i < n; i++) {
   2575             GLfloat z = (src[i] >> 8) * scale;
   2576             d[i].z = z;
   2577             d[i].x24s8 = src[i];
   2578          }
   2579       }
   2580       break;
   2581    default:
   2582       _mesa_problem(NULL, "bad format %s in _mesa_pack_ubyte_s_row",
   2583                     _mesa_get_format_name(format));
   2584       return;
   2585    }
   2586 }
   2587 
   2588 
   2589 
   2590 /**
   2591  * Convert a boolean color mask to a packed color where each channel of
   2592  * the packed value at dst will be 0 or ~0 depending on the colorMask.
   2593  */
   2594 void
   2595 _mesa_pack_colormask(gl_format format, const GLubyte colorMask[4], void *dst)
   2596 {
   2597    GLfloat maskColor[4];
   2598 
   2599    switch (_mesa_get_format_datatype(format)) {
   2600    case GL_UNSIGNED_NORMALIZED:
   2601       /* simple: 1.0 will convert to ~0 in the right bit positions */
   2602       maskColor[0] = colorMask[0] ? 1.0 : 0.0;
   2603       maskColor[1] = colorMask[1] ? 1.0 : 0.0;
   2604       maskColor[2] = colorMask[2] ? 1.0 : 0.0;
   2605       maskColor[3] = colorMask[3] ? 1.0 : 0.0;
   2606       _mesa_pack_float_rgba_row(format, 1,
   2607                                 (const GLfloat (*)[4]) maskColor, dst);
   2608       break;
   2609    case GL_SIGNED_NORMALIZED:
   2610    case GL_FLOAT:
   2611       /* These formats are harder because it's hard to know the floating
   2612        * point values that will convert to ~0 for each color channel's bits.
   2613        * This solution just generates a non-zero value for each color channel
   2614        * then fixes up the non-zero values to be ~0.
   2615        * Note: we'll need to add special case code if we ever have to deal
   2616        * with formats with unequal color channel sizes, like R11_G11_B10.
   2617        * We issue a warning below for channel sizes other than 8,16,32.
   2618        */
   2619       {
   2620          GLuint bits = _mesa_get_format_max_bits(format); /* bits per chan */
   2621          GLuint bytes = _mesa_get_format_bytes(format);
   2622          GLuint i;
   2623 
   2624          /* this should put non-zero values into the channels of dst */
   2625          maskColor[0] = colorMask[0] ? -1.0f : 0.0f;
   2626          maskColor[1] = colorMask[1] ? -1.0f : 0.0f;
   2627          maskColor[2] = colorMask[2] ? -1.0f : 0.0f;
   2628          maskColor[3] = colorMask[3] ? -1.0f : 0.0f;
   2629          _mesa_pack_float_rgba_row(format, 1,
   2630                                    (const GLfloat (*)[4]) maskColor, dst);
   2631 
   2632          /* fix-up the dst channels by converting non-zero values to ~0 */
   2633          if (bits == 8) {
   2634             GLubyte *d = (GLubyte *) dst;
   2635             for (i = 0; i < bytes; i++) {
   2636                d[i] = d[i] ? 0xff : 0x0;
   2637             }
   2638          }
   2639          else if (bits == 16) {
   2640             GLushort *d = (GLushort *) dst;
   2641             for (i = 0; i < bytes / 2; i++) {
   2642                d[i] = d[i] ? 0xffff : 0x0;
   2643             }
   2644          }
   2645          else if (bits == 32) {
   2646             GLuint *d = (GLuint *) dst;
   2647             for (i = 0; i < bytes / 4; i++) {
   2648                d[i] = d[i] ? 0xffffffffU : 0x0;
   2649             }
   2650          }
   2651          else {
   2652             _mesa_problem(NULL, "unexpected size in _mesa_pack_colormask()");
   2653             return;
   2654          }
   2655       }
   2656       break;
   2657    default:
   2658       _mesa_problem(NULL, "unexpected format data type in gen_color_mask()");
   2659       return;
   2660    }
   2661 }
   2662