Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* This file is autogenerated by u_format_table.py from u_format.csv. Do not edit directly. */
  2.  
  3. /**************************************************************************
  4.  *
  5.  * Copyright 2010 VMware, Inc.
  6.  * All Rights Reserved.
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a
  9.  * copy of this software and associated documentation files (the
  10.  * "Software"), to deal in the Software without restriction, including
  11.  * without limitation the rights to use, copy, modify, merge, publish,
  12.  * distribute, sub license, and/or sell copies of the Software, and to
  13.  * permit persons to whom the Software is furnished to do so, subject to
  14.  * the following conditions:
  15.  *
  16.  * The above copyright notice and this permission notice (including the
  17.  * next paragraph) shall be included in all copies or substantial portions
  18.  * of the Software.
  19.  *
  20.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  23.  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
  24.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27.  *
  28.  **************************************************************************/
  29.  
  30. #include "u_format.h"
  31. #include "u_format_s3tc.h"
  32. #include "u_format_rgtc.h"
  33. #include "u_format_latc.h"
  34. #include "u_format_etc.h"
  35.  
  36.  
  37. #include "pipe/p_compiler.h"
  38. #include "u_math.h"
  39. #include "u_half.h"
  40. #include "u_format.h"
  41. #include "u_format_other.h"
  42. #include "u_format_srgb.h"
  43. #include "u_format_yuv.h"
  44. #include "u_format_zs.h"
  45.  
  46. union util_format_none {
  47.    uint8_t value;
  48.    struct {
  49.       uint8_t r;
  50.    } chan;
  51. };
  52.  
  53. static INLINE void
  54. util_format_none_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  55. {
  56.    unsigned x, y;
  57.    for(y = 0; y < height; y += 1) {
  58.       float *dst = dst_row;
  59.       const uint8_t *src = src_row;
  60.       for(x = 0; x < width; x += 1) {
  61.          uint8_t value = *(const uint8_t *)src;
  62.          uint8_t r;
  63.          r = value;
  64.          dst[0] = (float)r; /* r */
  65.          dst[1] = 0; /* g */
  66.          dst[2] = 0; /* b */
  67.          dst[3] = 1; /* a */
  68.          src += 1;
  69.          dst += 4;
  70.       }
  71.       src_row += src_stride;
  72.       dst_row += dst_stride/sizeof(*dst_row);
  73.    }
  74. }
  75.  
  76. static INLINE void
  77. util_format_none_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  78. {
  79.    unsigned x, y;
  80.    for(y = 0; y < height; y += 1) {
  81.       const float *src = src_row;
  82.       uint8_t *dst = dst_row;
  83.       for(x = 0; x < width; x += 1) {
  84.          uint8_t value = 0;
  85.          value |= (uint8_t)CLAMP(src[0], 0, 255);
  86.          *(uint8_t *)dst = value;
  87.          src += 4;
  88.          dst += 1;
  89.       }
  90.       dst_row += dst_stride;
  91.       src_row += src_stride/sizeof(*src_row);
  92.    }
  93. }
  94.  
  95. static INLINE void
  96. util_format_none_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  97. {
  98.          uint8_t value = *(const uint8_t *)src;
  99.          uint8_t r;
  100.          r = value;
  101.          dst[0] = (float)r; /* r */
  102.          dst[1] = 0; /* g */
  103.          dst[2] = 0; /* b */
  104.          dst[3] = 1; /* a */
  105. }
  106.  
  107. static INLINE void
  108. util_format_none_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  109. {
  110.    unsigned x, y;
  111.    for(y = 0; y < height; y += 1) {
  112.       uint8_t *dst = dst_row;
  113.       const uint8_t *src = src_row;
  114.       for(x = 0; x < width; x += 1) {
  115.          uint8_t value = *(const uint8_t *)src;
  116.          uint8_t r;
  117.          r = value;
  118.          dst[0] = (uint8_t)(((uint32_t)MIN2(r, 1)) * 0xff / 0x1); /* r */
  119.          dst[1] = 0; /* g */
  120.          dst[2] = 0; /* b */
  121.          dst[3] = 255; /* a */
  122.          src += 1;
  123.          dst += 4;
  124.       }
  125.       src_row += src_stride;
  126.       dst_row += dst_stride/sizeof(*dst_row);
  127.    }
  128. }
  129.  
  130. static INLINE void
  131. util_format_none_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  132. {
  133.    unsigned x, y;
  134.    for(y = 0; y < height; y += 1) {
  135.       const uint8_t *src = src_row;
  136.       uint8_t *dst = dst_row;
  137.       for(x = 0; x < width; x += 1) {
  138.          uint8_t value = 0;
  139.          value |= (uint8_t)(((uint32_t)src[0]) * 0x1 / 0xff);
  140.          *(uint8_t *)dst = value;
  141.          src += 4;
  142.          dst += 1;
  143.       }
  144.       dst_row += dst_stride;
  145.       src_row += src_stride/sizeof(*src_row);
  146.    }
  147. }
  148.  
  149. union util_format_b8g8r8a8_unorm {
  150.    uint32_t value;
  151.    struct {
  152.       uint8_t b;
  153.       uint8_t g;
  154.       uint8_t r;
  155.       uint8_t a;
  156.    } chan;
  157. };
  158.  
  159. static INLINE void
  160. util_format_b8g8r8a8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  161. {
  162.    unsigned x, y;
  163.    for(y = 0; y < height; y += 1) {
  164.       float *dst = dst_row;
  165.       const uint8_t *src = src_row;
  166.       for(x = 0; x < width; x += 1) {
  167.          uint32_t value = *(const uint32_t *)src;
  168.          uint32_t b;
  169.          uint32_t g;
  170.          uint32_t r;
  171.          uint32_t a;
  172.          b = (value) & 0xff;
  173.          g = (value >> 8) & 0xff;
  174.          r = (value >> 16) & 0xff;
  175.          a = value >> 24;
  176.          dst[0] = ubyte_to_float(r); /* r */
  177.          dst[1] = ubyte_to_float(g); /* g */
  178.          dst[2] = ubyte_to_float(b); /* b */
  179.          dst[3] = ubyte_to_float(a); /* a */
  180.          src += 4;
  181.          dst += 4;
  182.       }
  183.       src_row += src_stride;
  184.       dst_row += dst_stride/sizeof(*dst_row);
  185.    }
  186. }
  187.  
  188. static INLINE void
  189. util_format_b8g8r8a8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  190. {
  191.    unsigned x, y;
  192.    for(y = 0; y < height; y += 1) {
  193.       const float *src = src_row;
  194.       uint8_t *dst = dst_row;
  195.       for(x = 0; x < width; x += 1) {
  196.          uint32_t value = 0;
  197.          value |= (float_to_ubyte(src[2])) & 0xff;
  198.          value |= ((float_to_ubyte(src[1])) & 0xff) << 8;
  199.          value |= ((float_to_ubyte(src[0])) & 0xff) << 16;
  200.          value |= (float_to_ubyte(src[3])) << 24;
  201.          *(uint32_t *)dst = value;
  202.          src += 4;
  203.          dst += 4;
  204.       }
  205.       dst_row += dst_stride;
  206.       src_row += src_stride/sizeof(*src_row);
  207.    }
  208. }
  209.  
  210. static INLINE void
  211. util_format_b8g8r8a8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  212. {
  213.          uint32_t value = *(const uint32_t *)src;
  214.          uint32_t b;
  215.          uint32_t g;
  216.          uint32_t r;
  217.          uint32_t a;
  218.          b = (value) & 0xff;
  219.          g = (value >> 8) & 0xff;
  220.          r = (value >> 16) & 0xff;
  221.          a = value >> 24;
  222.          dst[0] = ubyte_to_float(r); /* r */
  223.          dst[1] = ubyte_to_float(g); /* g */
  224.          dst[2] = ubyte_to_float(b); /* b */
  225.          dst[3] = ubyte_to_float(a); /* a */
  226. }
  227.  
  228. static INLINE void
  229. util_format_b8g8r8a8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  230. {
  231.    unsigned x, y;
  232.    for(y = 0; y < height; y += 1) {
  233.       uint8_t *dst = dst_row;
  234.       const uint8_t *src = src_row;
  235.       for(x = 0; x < width; x += 1) {
  236.          uint32_t value = *(const uint32_t *)src;
  237.          uint32_t b;
  238.          uint32_t g;
  239.          uint32_t r;
  240.          uint32_t a;
  241.          b = (value) & 0xff;
  242.          g = (value >> 8) & 0xff;
  243.          r = (value >> 16) & 0xff;
  244.          a = value >> 24;
  245.          dst[0] = r; /* r */
  246.          dst[1] = g; /* g */
  247.          dst[2] = b; /* b */
  248.          dst[3] = a; /* a */
  249.          src += 4;
  250.          dst += 4;
  251.       }
  252.       src_row += src_stride;
  253.       dst_row += dst_stride/sizeof(*dst_row);
  254.    }
  255. }
  256.  
  257. static INLINE void
  258. util_format_b8g8r8a8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  259. {
  260.    unsigned x, y;
  261.    for(y = 0; y < height; y += 1) {
  262.       const uint8_t *src = src_row;
  263.       uint8_t *dst = dst_row;
  264.       for(x = 0; x < width; x += 1) {
  265.          uint32_t value = 0;
  266.          value |= (src[2]) & 0xff;
  267.          value |= ((src[1]) & 0xff) << 8;
  268.          value |= ((src[0]) & 0xff) << 16;
  269.          value |= (src[3]) << 24;
  270.          *(uint32_t *)dst = value;
  271.          src += 4;
  272.          dst += 4;
  273.       }
  274.       dst_row += dst_stride;
  275.       src_row += src_stride/sizeof(*src_row);
  276.    }
  277. }
  278.  
  279. union util_format_b8g8r8x8_unorm {
  280.    uint32_t value;
  281.    struct {
  282.       uint8_t b;
  283.       uint8_t g;
  284.       uint8_t r;
  285.       uint8_t x;
  286.    } chan;
  287. };
  288.  
  289. static INLINE void
  290. util_format_b8g8r8x8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  291. {
  292.    unsigned x, y;
  293.    for(y = 0; y < height; y += 1) {
  294.       float *dst = dst_row;
  295.       const uint8_t *src = src_row;
  296.       for(x = 0; x < width; x += 1) {
  297.          uint32_t value = *(const uint32_t *)src;
  298.          uint32_t b;
  299.          uint32_t g;
  300.          uint32_t r;
  301.          b = (value) & 0xff;
  302.          g = (value >> 8) & 0xff;
  303.          r = (value >> 16) & 0xff;
  304.          dst[0] = ubyte_to_float(r); /* r */
  305.          dst[1] = ubyte_to_float(g); /* g */
  306.          dst[2] = ubyte_to_float(b); /* b */
  307.          dst[3] = 1; /* a */
  308.          src += 4;
  309.          dst += 4;
  310.       }
  311.       src_row += src_stride;
  312.       dst_row += dst_stride/sizeof(*dst_row);
  313.    }
  314. }
  315.  
  316. static INLINE void
  317. util_format_b8g8r8x8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  318. {
  319.    unsigned x, y;
  320.    for(y = 0; y < height; y += 1) {
  321.       const float *src = src_row;
  322.       uint8_t *dst = dst_row;
  323.       for(x = 0; x < width; x += 1) {
  324.          uint32_t value = 0;
  325.          value |= (float_to_ubyte(src[2])) & 0xff;
  326.          value |= ((float_to_ubyte(src[1])) & 0xff) << 8;
  327.          value |= ((float_to_ubyte(src[0])) & 0xff) << 16;
  328.          *(uint32_t *)dst = value;
  329.          src += 4;
  330.          dst += 4;
  331.       }
  332.       dst_row += dst_stride;
  333.       src_row += src_stride/sizeof(*src_row);
  334.    }
  335. }
  336.  
  337. static INLINE void
  338. util_format_b8g8r8x8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  339. {
  340.          uint32_t value = *(const uint32_t *)src;
  341.          uint32_t b;
  342.          uint32_t g;
  343.          uint32_t r;
  344.          b = (value) & 0xff;
  345.          g = (value >> 8) & 0xff;
  346.          r = (value >> 16) & 0xff;
  347.          dst[0] = ubyte_to_float(r); /* r */
  348.          dst[1] = ubyte_to_float(g); /* g */
  349.          dst[2] = ubyte_to_float(b); /* b */
  350.          dst[3] = 1; /* a */
  351. }
  352.  
  353. static INLINE void
  354. util_format_b8g8r8x8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  355. {
  356.    unsigned x, y;
  357.    for(y = 0; y < height; y += 1) {
  358.       uint8_t *dst = dst_row;
  359.       const uint8_t *src = src_row;
  360.       for(x = 0; x < width; x += 1) {
  361.          uint32_t value = *(const uint32_t *)src;
  362.          uint32_t b;
  363.          uint32_t g;
  364.          uint32_t r;
  365.          b = (value) & 0xff;
  366.          g = (value >> 8) & 0xff;
  367.          r = (value >> 16) & 0xff;
  368.          dst[0] = r; /* r */
  369.          dst[1] = g; /* g */
  370.          dst[2] = b; /* b */
  371.          dst[3] = 255; /* a */
  372.          src += 4;
  373.          dst += 4;
  374.       }
  375.       src_row += src_stride;
  376.       dst_row += dst_stride/sizeof(*dst_row);
  377.    }
  378. }
  379.  
  380. static INLINE void
  381. util_format_b8g8r8x8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  382. {
  383.    unsigned x, y;
  384.    for(y = 0; y < height; y += 1) {
  385.       const uint8_t *src = src_row;
  386.       uint8_t *dst = dst_row;
  387.       for(x = 0; x < width; x += 1) {
  388.          uint32_t value = 0;
  389.          value |= (src[2]) & 0xff;
  390.          value |= ((src[1]) & 0xff) << 8;
  391.          value |= ((src[0]) & 0xff) << 16;
  392.          *(uint32_t *)dst = value;
  393.          src += 4;
  394.          dst += 4;
  395.       }
  396.       dst_row += dst_stride;
  397.       src_row += src_stride/sizeof(*src_row);
  398.    }
  399. }
  400.  
  401. union util_format_a8r8g8b8_unorm {
  402.    uint32_t value;
  403.    struct {
  404.       uint8_t a;
  405.       uint8_t r;
  406.       uint8_t g;
  407.       uint8_t b;
  408.    } chan;
  409. };
  410.  
  411. static INLINE void
  412. util_format_a8r8g8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  413. {
  414.    unsigned x, y;
  415.    for(y = 0; y < height; y += 1) {
  416.       float *dst = dst_row;
  417.       const uint8_t *src = src_row;
  418.       for(x = 0; x < width; x += 1) {
  419.          uint32_t value = *(const uint32_t *)src;
  420.          uint32_t a;
  421.          uint32_t r;
  422.          uint32_t g;
  423.          uint32_t b;
  424.          a = (value) & 0xff;
  425.          r = (value >> 8) & 0xff;
  426.          g = (value >> 16) & 0xff;
  427.          b = value >> 24;
  428.          dst[0] = ubyte_to_float(r); /* r */
  429.          dst[1] = ubyte_to_float(g); /* g */
  430.          dst[2] = ubyte_to_float(b); /* b */
  431.          dst[3] = ubyte_to_float(a); /* a */
  432.          src += 4;
  433.          dst += 4;
  434.       }
  435.       src_row += src_stride;
  436.       dst_row += dst_stride/sizeof(*dst_row);
  437.    }
  438. }
  439.  
  440. static INLINE void
  441. util_format_a8r8g8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  442. {
  443.    unsigned x, y;
  444.    for(y = 0; y < height; y += 1) {
  445.       const float *src = src_row;
  446.       uint8_t *dst = dst_row;
  447.       for(x = 0; x < width; x += 1) {
  448.          uint32_t value = 0;
  449.          value |= (float_to_ubyte(src[3])) & 0xff;
  450.          value |= ((float_to_ubyte(src[0])) & 0xff) << 8;
  451.          value |= ((float_to_ubyte(src[1])) & 0xff) << 16;
  452.          value |= (float_to_ubyte(src[2])) << 24;
  453.          *(uint32_t *)dst = value;
  454.          src += 4;
  455.          dst += 4;
  456.       }
  457.       dst_row += dst_stride;
  458.       src_row += src_stride/sizeof(*src_row);
  459.    }
  460. }
  461.  
  462. static INLINE void
  463. util_format_a8r8g8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  464. {
  465.          uint32_t value = *(const uint32_t *)src;
  466.          uint32_t a;
  467.          uint32_t r;
  468.          uint32_t g;
  469.          uint32_t b;
  470.          a = (value) & 0xff;
  471.          r = (value >> 8) & 0xff;
  472.          g = (value >> 16) & 0xff;
  473.          b = value >> 24;
  474.          dst[0] = ubyte_to_float(r); /* r */
  475.          dst[1] = ubyte_to_float(g); /* g */
  476.          dst[2] = ubyte_to_float(b); /* b */
  477.          dst[3] = ubyte_to_float(a); /* a */
  478. }
  479.  
  480. static INLINE void
  481. util_format_a8r8g8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  482. {
  483.    unsigned x, y;
  484.    for(y = 0; y < height; y += 1) {
  485.       uint8_t *dst = dst_row;
  486.       const uint8_t *src = src_row;
  487.       for(x = 0; x < width; x += 1) {
  488.          uint32_t value = *(const uint32_t *)src;
  489.          uint32_t a;
  490.          uint32_t r;
  491.          uint32_t g;
  492.          uint32_t b;
  493.          a = (value) & 0xff;
  494.          r = (value >> 8) & 0xff;
  495.          g = (value >> 16) & 0xff;
  496.          b = value >> 24;
  497.          dst[0] = r; /* r */
  498.          dst[1] = g; /* g */
  499.          dst[2] = b; /* b */
  500.          dst[3] = a; /* a */
  501.          src += 4;
  502.          dst += 4;
  503.       }
  504.       src_row += src_stride;
  505.       dst_row += dst_stride/sizeof(*dst_row);
  506.    }
  507. }
  508.  
  509. static INLINE void
  510. util_format_a8r8g8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  511. {
  512.    unsigned x, y;
  513.    for(y = 0; y < height; y += 1) {
  514.       const uint8_t *src = src_row;
  515.       uint8_t *dst = dst_row;
  516.       for(x = 0; x < width; x += 1) {
  517.          uint32_t value = 0;
  518.          value |= (src[3]) & 0xff;
  519.          value |= ((src[0]) & 0xff) << 8;
  520.          value |= ((src[1]) & 0xff) << 16;
  521.          value |= (src[2]) << 24;
  522.          *(uint32_t *)dst = value;
  523.          src += 4;
  524.          dst += 4;
  525.       }
  526.       dst_row += dst_stride;
  527.       src_row += src_stride/sizeof(*src_row);
  528.    }
  529. }
  530.  
  531. union util_format_x8r8g8b8_unorm {
  532.    uint32_t value;
  533.    struct {
  534.       uint8_t x;
  535.       uint8_t r;
  536.       uint8_t g;
  537.       uint8_t b;
  538.    } chan;
  539. };
  540.  
  541. static INLINE void
  542. util_format_x8r8g8b8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  543. {
  544.    unsigned x, y;
  545.    for(y = 0; y < height; y += 1) {
  546.       float *dst = dst_row;
  547.       const uint8_t *src = src_row;
  548.       for(x = 0; x < width; x += 1) {
  549.          uint32_t value = *(const uint32_t *)src;
  550.          uint32_t r;
  551.          uint32_t g;
  552.          uint32_t b;
  553.          r = (value >> 8) & 0xff;
  554.          g = (value >> 16) & 0xff;
  555.          b = value >> 24;
  556.          dst[0] = ubyte_to_float(r); /* r */
  557.          dst[1] = ubyte_to_float(g); /* g */
  558.          dst[2] = ubyte_to_float(b); /* b */
  559.          dst[3] = 1; /* a */
  560.          src += 4;
  561.          dst += 4;
  562.       }
  563.       src_row += src_stride;
  564.       dst_row += dst_stride/sizeof(*dst_row);
  565.    }
  566. }
  567.  
  568. static INLINE void
  569. util_format_x8r8g8b8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  570. {
  571.    unsigned x, y;
  572.    for(y = 0; y < height; y += 1) {
  573.       const float *src = src_row;
  574.       uint8_t *dst = dst_row;
  575.       for(x = 0; x < width; x += 1) {
  576.          uint32_t value = 0;
  577.          value |= ((float_to_ubyte(src[0])) & 0xff) << 8;
  578.          value |= ((float_to_ubyte(src[1])) & 0xff) << 16;
  579.          value |= (float_to_ubyte(src[2])) << 24;
  580.          *(uint32_t *)dst = value;
  581.          src += 4;
  582.          dst += 4;
  583.       }
  584.       dst_row += dst_stride;
  585.       src_row += src_stride/sizeof(*src_row);
  586.    }
  587. }
  588.  
  589. static INLINE void
  590. util_format_x8r8g8b8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  591. {
  592.          uint32_t value = *(const uint32_t *)src;
  593.          uint32_t r;
  594.          uint32_t g;
  595.          uint32_t b;
  596.          r = (value >> 8) & 0xff;
  597.          g = (value >> 16) & 0xff;
  598.          b = value >> 24;
  599.          dst[0] = ubyte_to_float(r); /* r */
  600.          dst[1] = ubyte_to_float(g); /* g */
  601.          dst[2] = ubyte_to_float(b); /* b */
  602.          dst[3] = 1; /* a */
  603. }
  604.  
  605. static INLINE void
  606. util_format_x8r8g8b8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  607. {
  608.    unsigned x, y;
  609.    for(y = 0; y < height; y += 1) {
  610.       uint8_t *dst = dst_row;
  611.       const uint8_t *src = src_row;
  612.       for(x = 0; x < width; x += 1) {
  613.          uint32_t value = *(const uint32_t *)src;
  614.          uint32_t r;
  615.          uint32_t g;
  616.          uint32_t b;
  617.          r = (value >> 8) & 0xff;
  618.          g = (value >> 16) & 0xff;
  619.          b = value >> 24;
  620.          dst[0] = r; /* r */
  621.          dst[1] = g; /* g */
  622.          dst[2] = b; /* b */
  623.          dst[3] = 255; /* a */
  624.          src += 4;
  625.          dst += 4;
  626.       }
  627.       src_row += src_stride;
  628.       dst_row += dst_stride/sizeof(*dst_row);
  629.    }
  630. }
  631.  
  632. static INLINE void
  633. util_format_x8r8g8b8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  634. {
  635.    unsigned x, y;
  636.    for(y = 0; y < height; y += 1) {
  637.       const uint8_t *src = src_row;
  638.       uint8_t *dst = dst_row;
  639.       for(x = 0; x < width; x += 1) {
  640.          uint32_t value = 0;
  641.          value |= ((src[0]) & 0xff) << 8;
  642.          value |= ((src[1]) & 0xff) << 16;
  643.          value |= (src[2]) << 24;
  644.          *(uint32_t *)dst = value;
  645.          src += 4;
  646.          dst += 4;
  647.       }
  648.       dst_row += dst_stride;
  649.       src_row += src_stride/sizeof(*src_row);
  650.    }
  651. }
  652.  
  653. union util_format_a8b8g8r8_unorm {
  654.    uint32_t value;
  655.    struct {
  656.       uint8_t a;
  657.       uint8_t b;
  658.       uint8_t g;
  659.       uint8_t r;
  660.    } chan;
  661. };
  662.  
  663. static INLINE void
  664. util_format_a8b8g8r8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  665. {
  666.    unsigned x, y;
  667.    for(y = 0; y < height; y += 1) {
  668.       float *dst = dst_row;
  669.       const uint8_t *src = src_row;
  670.       for(x = 0; x < width; x += 1) {
  671.          uint32_t value = *(const uint32_t *)src;
  672.          uint32_t a;
  673.          uint32_t b;
  674.          uint32_t g;
  675.          uint32_t r;
  676.          a = (value) & 0xff;
  677.          b = (value >> 8) & 0xff;
  678.          g = (value >> 16) & 0xff;
  679.          r = value >> 24;
  680.          dst[0] = ubyte_to_float(r); /* r */
  681.          dst[1] = ubyte_to_float(g); /* g */
  682.          dst[2] = ubyte_to_float(b); /* b */
  683.          dst[3] = ubyte_to_float(a); /* a */
  684.          src += 4;
  685.          dst += 4;
  686.       }
  687.       src_row += src_stride;
  688.       dst_row += dst_stride/sizeof(*dst_row);
  689.    }
  690. }
  691.  
  692. static INLINE void
  693. util_format_a8b8g8r8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  694. {
  695.    unsigned x, y;
  696.    for(y = 0; y < height; y += 1) {
  697.       const float *src = src_row;
  698.       uint8_t *dst = dst_row;
  699.       for(x = 0; x < width; x += 1) {
  700.          uint32_t value = 0;
  701.          value |= (float_to_ubyte(src[3])) & 0xff;
  702.          value |= ((float_to_ubyte(src[2])) & 0xff) << 8;
  703.          value |= ((float_to_ubyte(src[1])) & 0xff) << 16;
  704.          value |= (float_to_ubyte(src[0])) << 24;
  705.          *(uint32_t *)dst = value;
  706.          src += 4;
  707.          dst += 4;
  708.       }
  709.       dst_row += dst_stride;
  710.       src_row += src_stride/sizeof(*src_row);
  711.    }
  712. }
  713.  
  714. static INLINE void
  715. util_format_a8b8g8r8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  716. {
  717.          uint32_t value = *(const uint32_t *)src;
  718.          uint32_t a;
  719.          uint32_t b;
  720.          uint32_t g;
  721.          uint32_t r;
  722.          a = (value) & 0xff;
  723.          b = (value >> 8) & 0xff;
  724.          g = (value >> 16) & 0xff;
  725.          r = value >> 24;
  726.          dst[0] = ubyte_to_float(r); /* r */
  727.          dst[1] = ubyte_to_float(g); /* g */
  728.          dst[2] = ubyte_to_float(b); /* b */
  729.          dst[3] = ubyte_to_float(a); /* a */
  730. }
  731.  
  732. static INLINE void
  733. util_format_a8b8g8r8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  734. {
  735.    unsigned x, y;
  736.    for(y = 0; y < height; y += 1) {
  737.       uint8_t *dst = dst_row;
  738.       const uint8_t *src = src_row;
  739.       for(x = 0; x < width; x += 1) {
  740.          uint32_t value = *(const uint32_t *)src;
  741.          uint32_t a;
  742.          uint32_t b;
  743.          uint32_t g;
  744.          uint32_t r;
  745.          a = (value) & 0xff;
  746.          b = (value >> 8) & 0xff;
  747.          g = (value >> 16) & 0xff;
  748.          r = value >> 24;
  749.          dst[0] = r; /* r */
  750.          dst[1] = g; /* g */
  751.          dst[2] = b; /* b */
  752.          dst[3] = a; /* a */
  753.          src += 4;
  754.          dst += 4;
  755.       }
  756.       src_row += src_stride;
  757.       dst_row += dst_stride/sizeof(*dst_row);
  758.    }
  759. }
  760.  
  761. static INLINE void
  762. util_format_a8b8g8r8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  763. {
  764.    unsigned x, y;
  765.    for(y = 0; y < height; y += 1) {
  766.       const uint8_t *src = src_row;
  767.       uint8_t *dst = dst_row;
  768.       for(x = 0; x < width; x += 1) {
  769.          uint32_t value = 0;
  770.          value |= (src[3]) & 0xff;
  771.          value |= ((src[2]) & 0xff) << 8;
  772.          value |= ((src[1]) & 0xff) << 16;
  773.          value |= (src[0]) << 24;
  774.          *(uint32_t *)dst = value;
  775.          src += 4;
  776.          dst += 4;
  777.       }
  778.       dst_row += dst_stride;
  779.       src_row += src_stride/sizeof(*src_row);
  780.    }
  781. }
  782.  
  783. union util_format_x8b8g8r8_unorm {
  784.    uint32_t value;
  785.    struct {
  786.       uint8_t x;
  787.       uint8_t b;
  788.       uint8_t g;
  789.       uint8_t r;
  790.    } chan;
  791. };
  792.  
  793. static INLINE void
  794. util_format_x8b8g8r8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  795. {
  796.    unsigned x, y;
  797.    for(y = 0; y < height; y += 1) {
  798.       float *dst = dst_row;
  799.       const uint8_t *src = src_row;
  800.       for(x = 0; x < width; x += 1) {
  801.          uint32_t value = *(const uint32_t *)src;
  802.          uint32_t b;
  803.          uint32_t g;
  804.          uint32_t r;
  805.          b = (value >> 8) & 0xff;
  806.          g = (value >> 16) & 0xff;
  807.          r = value >> 24;
  808.          dst[0] = ubyte_to_float(r); /* r */
  809.          dst[1] = ubyte_to_float(g); /* g */
  810.          dst[2] = ubyte_to_float(b); /* b */
  811.          dst[3] = 1; /* a */
  812.          src += 4;
  813.          dst += 4;
  814.       }
  815.       src_row += src_stride;
  816.       dst_row += dst_stride/sizeof(*dst_row);
  817.    }
  818. }
  819.  
  820. static INLINE void
  821. util_format_x8b8g8r8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  822. {
  823.    unsigned x, y;
  824.    for(y = 0; y < height; y += 1) {
  825.       const float *src = src_row;
  826.       uint8_t *dst = dst_row;
  827.       for(x = 0; x < width; x += 1) {
  828.          uint32_t value = 0;
  829.          value |= ((float_to_ubyte(src[2])) & 0xff) << 8;
  830.          value |= ((float_to_ubyte(src[1])) & 0xff) << 16;
  831.          value |= (float_to_ubyte(src[0])) << 24;
  832.          *(uint32_t *)dst = value;
  833.          src += 4;
  834.          dst += 4;
  835.       }
  836.       dst_row += dst_stride;
  837.       src_row += src_stride/sizeof(*src_row);
  838.    }
  839. }
  840.  
  841. static INLINE void
  842. util_format_x8b8g8r8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  843. {
  844.          uint32_t value = *(const uint32_t *)src;
  845.          uint32_t b;
  846.          uint32_t g;
  847.          uint32_t r;
  848.          b = (value >> 8) & 0xff;
  849.          g = (value >> 16) & 0xff;
  850.          r = value >> 24;
  851.          dst[0] = ubyte_to_float(r); /* r */
  852.          dst[1] = ubyte_to_float(g); /* g */
  853.          dst[2] = ubyte_to_float(b); /* b */
  854.          dst[3] = 1; /* a */
  855. }
  856.  
  857. static INLINE void
  858. util_format_x8b8g8r8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  859. {
  860.    unsigned x, y;
  861.    for(y = 0; y < height; y += 1) {
  862.       uint8_t *dst = dst_row;
  863.       const uint8_t *src = src_row;
  864.       for(x = 0; x < width; x += 1) {
  865.          uint32_t value = *(const uint32_t *)src;
  866.          uint32_t b;
  867.          uint32_t g;
  868.          uint32_t r;
  869.          b = (value >> 8) & 0xff;
  870.          g = (value >> 16) & 0xff;
  871.          r = value >> 24;
  872.          dst[0] = r; /* r */
  873.          dst[1] = g; /* g */
  874.          dst[2] = b; /* b */
  875.          dst[3] = 255; /* a */
  876.          src += 4;
  877.          dst += 4;
  878.       }
  879.       src_row += src_stride;
  880.       dst_row += dst_stride/sizeof(*dst_row);
  881.    }
  882. }
  883.  
  884. static INLINE void
  885. util_format_x8b8g8r8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  886. {
  887.    unsigned x, y;
  888.    for(y = 0; y < height; y += 1) {
  889.       const uint8_t *src = src_row;
  890.       uint8_t *dst = dst_row;
  891.       for(x = 0; x < width; x += 1) {
  892.          uint32_t value = 0;
  893.          value |= ((src[2]) & 0xff) << 8;
  894.          value |= ((src[1]) & 0xff) << 16;
  895.          value |= (src[0]) << 24;
  896.          *(uint32_t *)dst = value;
  897.          src += 4;
  898.          dst += 4;
  899.       }
  900.       dst_row += dst_stride;
  901.       src_row += src_stride/sizeof(*src_row);
  902.    }
  903. }
  904.  
  905. union util_format_r8g8b8x8_unorm {
  906.    uint32_t value;
  907.    struct {
  908.       uint8_t r;
  909.       uint8_t g;
  910.       uint8_t b;
  911.       uint8_t x;
  912.    } chan;
  913. };
  914.  
  915. static INLINE void
  916. util_format_r8g8b8x8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  917. {
  918.    unsigned x, y;
  919.    for(y = 0; y < height; y += 1) {
  920.       float *dst = dst_row;
  921.       const uint8_t *src = src_row;
  922.       for(x = 0; x < width; x += 1) {
  923.          uint32_t value = *(const uint32_t *)src;
  924.          uint32_t r;
  925.          uint32_t g;
  926.          uint32_t b;
  927.          r = (value) & 0xff;
  928.          g = (value >> 8) & 0xff;
  929.          b = (value >> 16) & 0xff;
  930.          dst[0] = ubyte_to_float(r); /* r */
  931.          dst[1] = ubyte_to_float(g); /* g */
  932.          dst[2] = ubyte_to_float(b); /* b */
  933.          dst[3] = 1; /* a */
  934.          src += 4;
  935.          dst += 4;
  936.       }
  937.       src_row += src_stride;
  938.       dst_row += dst_stride/sizeof(*dst_row);
  939.    }
  940. }
  941.  
  942. static INLINE void
  943. util_format_r8g8b8x8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  944. {
  945.    unsigned x, y;
  946.    for(y = 0; y < height; y += 1) {
  947.       const float *src = src_row;
  948.       uint8_t *dst = dst_row;
  949.       for(x = 0; x < width; x += 1) {
  950.          uint32_t value = 0;
  951.          value |= (float_to_ubyte(src[0])) & 0xff;
  952.          value |= ((float_to_ubyte(src[1])) & 0xff) << 8;
  953.          value |= ((float_to_ubyte(src[2])) & 0xff) << 16;
  954.          *(uint32_t *)dst = value;
  955.          src += 4;
  956.          dst += 4;
  957.       }
  958.       dst_row += dst_stride;
  959.       src_row += src_stride/sizeof(*src_row);
  960.    }
  961. }
  962.  
  963. static INLINE void
  964. util_format_r8g8b8x8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  965. {
  966.          uint32_t value = *(const uint32_t *)src;
  967.          uint32_t r;
  968.          uint32_t g;
  969.          uint32_t b;
  970.          r = (value) & 0xff;
  971.          g = (value >> 8) & 0xff;
  972.          b = (value >> 16) & 0xff;
  973.          dst[0] = ubyte_to_float(r); /* r */
  974.          dst[1] = ubyte_to_float(g); /* g */
  975.          dst[2] = ubyte_to_float(b); /* b */
  976.          dst[3] = 1; /* a */
  977. }
  978.  
  979. static INLINE void
  980. util_format_r8g8b8x8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  981. {
  982.    unsigned x, y;
  983.    for(y = 0; y < height; y += 1) {
  984.       uint8_t *dst = dst_row;
  985.       const uint8_t *src = src_row;
  986.       for(x = 0; x < width; x += 1) {
  987.          uint32_t value = *(const uint32_t *)src;
  988.          uint32_t r;
  989.          uint32_t g;
  990.          uint32_t b;
  991.          r = (value) & 0xff;
  992.          g = (value >> 8) & 0xff;
  993.          b = (value >> 16) & 0xff;
  994.          dst[0] = r; /* r */
  995.          dst[1] = g; /* g */
  996.          dst[2] = b; /* b */
  997.          dst[3] = 255; /* a */
  998.          src += 4;
  999.          dst += 4;
  1000.       }
  1001.       src_row += src_stride;
  1002.       dst_row += dst_stride/sizeof(*dst_row);
  1003.    }
  1004. }
  1005.  
  1006. static INLINE void
  1007. util_format_r8g8b8x8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1008. {
  1009.    unsigned x, y;
  1010.    for(y = 0; y < height; y += 1) {
  1011.       const uint8_t *src = src_row;
  1012.       uint8_t *dst = dst_row;
  1013.       for(x = 0; x < width; x += 1) {
  1014.          uint32_t value = 0;
  1015.          value |= (src[0]) & 0xff;
  1016.          value |= ((src[1]) & 0xff) << 8;
  1017.          value |= ((src[2]) & 0xff) << 16;
  1018.          *(uint32_t *)dst = value;
  1019.          src += 4;
  1020.          dst += 4;
  1021.       }
  1022.       dst_row += dst_stride;
  1023.       src_row += src_stride/sizeof(*src_row);
  1024.    }
  1025. }
  1026.  
  1027. union util_format_l8_unorm {
  1028.    uint8_t value;
  1029.    struct {
  1030.       uint8_t rgb;
  1031.    } chan;
  1032. };
  1033.  
  1034. static INLINE void
  1035. util_format_l8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1036. {
  1037.    unsigned x, y;
  1038.    for(y = 0; y < height; y += 1) {
  1039.       float *dst = dst_row;
  1040.       const uint8_t *src = src_row;
  1041.       for(x = 0; x < width; x += 1) {
  1042.          uint8_t value = *(const uint8_t *)src;
  1043.          uint8_t rgb;
  1044.          rgb = value;
  1045.          dst[0] = ubyte_to_float(rgb); /* r */
  1046.          dst[1] = ubyte_to_float(rgb); /* g */
  1047.          dst[2] = ubyte_to_float(rgb); /* b */
  1048.          dst[3] = 1; /* a */
  1049.          src += 1;
  1050.          dst += 4;
  1051.       }
  1052.       src_row += src_stride;
  1053.       dst_row += dst_stride/sizeof(*dst_row);
  1054.    }
  1055. }
  1056.  
  1057. static INLINE void
  1058. util_format_l8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1059. {
  1060.    unsigned x, y;
  1061.    for(y = 0; y < height; y += 1) {
  1062.       const float *src = src_row;
  1063.       uint8_t *dst = dst_row;
  1064.       for(x = 0; x < width; x += 1) {
  1065.          uint8_t value = 0;
  1066.          value |= float_to_ubyte(src[0]);
  1067.          *(uint8_t *)dst = value;
  1068.          src += 4;
  1069.          dst += 1;
  1070.       }
  1071.       dst_row += dst_stride;
  1072.       src_row += src_stride/sizeof(*src_row);
  1073.    }
  1074. }
  1075.  
  1076. static INLINE void
  1077. util_format_l8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1078. {
  1079.          uint8_t value = *(const uint8_t *)src;
  1080.          uint8_t rgb;
  1081.          rgb = value;
  1082.          dst[0] = ubyte_to_float(rgb); /* r */
  1083.          dst[1] = ubyte_to_float(rgb); /* g */
  1084.          dst[2] = ubyte_to_float(rgb); /* b */
  1085.          dst[3] = 1; /* a */
  1086. }
  1087.  
  1088. static INLINE void
  1089. util_format_l8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1090. {
  1091.    unsigned x, y;
  1092.    for(y = 0; y < height; y += 1) {
  1093.       uint8_t *dst = dst_row;
  1094.       const uint8_t *src = src_row;
  1095.       for(x = 0; x < width; x += 1) {
  1096.          uint8_t value = *(const uint8_t *)src;
  1097.          uint8_t rgb;
  1098.          rgb = value;
  1099.          dst[0] = rgb; /* r */
  1100.          dst[1] = rgb; /* g */
  1101.          dst[2] = rgb; /* b */
  1102.          dst[3] = 255; /* a */
  1103.          src += 1;
  1104.          dst += 4;
  1105.       }
  1106.       src_row += src_stride;
  1107.       dst_row += dst_stride/sizeof(*dst_row);
  1108.    }
  1109. }
  1110.  
  1111. static INLINE void
  1112. util_format_l8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1113. {
  1114.    unsigned x, y;
  1115.    for(y = 0; y < height; y += 1) {
  1116.       const uint8_t *src = src_row;
  1117.       uint8_t *dst = dst_row;
  1118.       for(x = 0; x < width; x += 1) {
  1119.          uint8_t value = 0;
  1120.          value |= src[0];
  1121.          *(uint8_t *)dst = value;
  1122.          src += 4;
  1123.          dst += 1;
  1124.       }
  1125.       dst_row += dst_stride;
  1126.       src_row += src_stride/sizeof(*src_row);
  1127.    }
  1128. }
  1129.  
  1130. union util_format_a8_unorm {
  1131.    uint8_t value;
  1132.    struct {
  1133.       uint8_t a;
  1134.    } chan;
  1135. };
  1136.  
  1137. static INLINE void
  1138. util_format_a8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1139. {
  1140.    unsigned x, y;
  1141.    for(y = 0; y < height; y += 1) {
  1142.       float *dst = dst_row;
  1143.       const uint8_t *src = src_row;
  1144.       for(x = 0; x < width; x += 1) {
  1145.          uint8_t value = *(const uint8_t *)src;
  1146.          uint8_t a;
  1147.          a = value;
  1148.          dst[0] = 0; /* r */
  1149.          dst[1] = 0; /* g */
  1150.          dst[2] = 0; /* b */
  1151.          dst[3] = ubyte_to_float(a); /* a */
  1152.          src += 1;
  1153.          dst += 4;
  1154.       }
  1155.       src_row += src_stride;
  1156.       dst_row += dst_stride/sizeof(*dst_row);
  1157.    }
  1158. }
  1159.  
  1160. static INLINE void
  1161. util_format_a8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1162. {
  1163.    unsigned x, y;
  1164.    for(y = 0; y < height; y += 1) {
  1165.       const float *src = src_row;
  1166.       uint8_t *dst = dst_row;
  1167.       for(x = 0; x < width; x += 1) {
  1168.          uint8_t value = 0;
  1169.          value |= float_to_ubyte(src[3]);
  1170.          *(uint8_t *)dst = value;
  1171.          src += 4;
  1172.          dst += 1;
  1173.       }
  1174.       dst_row += dst_stride;
  1175.       src_row += src_stride/sizeof(*src_row);
  1176.    }
  1177. }
  1178.  
  1179. static INLINE void
  1180. util_format_a8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1181. {
  1182.          uint8_t value = *(const uint8_t *)src;
  1183.          uint8_t a;
  1184.          a = value;
  1185.          dst[0] = 0; /* r */
  1186.          dst[1] = 0; /* g */
  1187.          dst[2] = 0; /* b */
  1188.          dst[3] = ubyte_to_float(a); /* a */
  1189. }
  1190.  
  1191. static INLINE void
  1192. util_format_a8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1193. {
  1194.    unsigned x, y;
  1195.    for(y = 0; y < height; y += 1) {
  1196.       uint8_t *dst = dst_row;
  1197.       const uint8_t *src = src_row;
  1198.       for(x = 0; x < width; x += 1) {
  1199.          uint8_t value = *(const uint8_t *)src;
  1200.          uint8_t a;
  1201.          a = value;
  1202.          dst[0] = 0; /* r */
  1203.          dst[1] = 0; /* g */
  1204.          dst[2] = 0; /* b */
  1205.          dst[3] = a; /* a */
  1206.          src += 1;
  1207.          dst += 4;
  1208.       }
  1209.       src_row += src_stride;
  1210.       dst_row += dst_stride/sizeof(*dst_row);
  1211.    }
  1212. }
  1213.  
  1214. static INLINE void
  1215. util_format_a8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1216. {
  1217.    unsigned x, y;
  1218.    for(y = 0; y < height; y += 1) {
  1219.       const uint8_t *src = src_row;
  1220.       uint8_t *dst = dst_row;
  1221.       for(x = 0; x < width; x += 1) {
  1222.          uint8_t value = 0;
  1223.          value |= src[3];
  1224.          *(uint8_t *)dst = value;
  1225.          src += 4;
  1226.          dst += 1;
  1227.       }
  1228.       dst_row += dst_stride;
  1229.       src_row += src_stride/sizeof(*src_row);
  1230.    }
  1231. }
  1232.  
  1233. union util_format_i8_unorm {
  1234.    uint8_t value;
  1235.    struct {
  1236.       uint8_t rgba;
  1237.    } chan;
  1238. };
  1239.  
  1240. static INLINE void
  1241. util_format_i8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1242. {
  1243.    unsigned x, y;
  1244.    for(y = 0; y < height; y += 1) {
  1245.       float *dst = dst_row;
  1246.       const uint8_t *src = src_row;
  1247.       for(x = 0; x < width; x += 1) {
  1248.          uint8_t value = *(const uint8_t *)src;
  1249.          uint8_t rgba;
  1250.          rgba = value;
  1251.          dst[0] = ubyte_to_float(rgba); /* r */
  1252.          dst[1] = ubyte_to_float(rgba); /* g */
  1253.          dst[2] = ubyte_to_float(rgba); /* b */
  1254.          dst[3] = ubyte_to_float(rgba); /* a */
  1255.          src += 1;
  1256.          dst += 4;
  1257.       }
  1258.       src_row += src_stride;
  1259.       dst_row += dst_stride/sizeof(*dst_row);
  1260.    }
  1261. }
  1262.  
  1263. static INLINE void
  1264. util_format_i8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1265. {
  1266.    unsigned x, y;
  1267.    for(y = 0; y < height; y += 1) {
  1268.       const float *src = src_row;
  1269.       uint8_t *dst = dst_row;
  1270.       for(x = 0; x < width; x += 1) {
  1271.          uint8_t value = 0;
  1272.          value |= float_to_ubyte(src[0]);
  1273.          *(uint8_t *)dst = value;
  1274.          src += 4;
  1275.          dst += 1;
  1276.       }
  1277.       dst_row += dst_stride;
  1278.       src_row += src_stride/sizeof(*src_row);
  1279.    }
  1280. }
  1281.  
  1282. static INLINE void
  1283. util_format_i8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1284. {
  1285.          uint8_t value = *(const uint8_t *)src;
  1286.          uint8_t rgba;
  1287.          rgba = value;
  1288.          dst[0] = ubyte_to_float(rgba); /* r */
  1289.          dst[1] = ubyte_to_float(rgba); /* g */
  1290.          dst[2] = ubyte_to_float(rgba); /* b */
  1291.          dst[3] = ubyte_to_float(rgba); /* a */
  1292. }
  1293.  
  1294. static INLINE void
  1295. util_format_i8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1296. {
  1297.    unsigned x, y;
  1298.    for(y = 0; y < height; y += 1) {
  1299.       uint8_t *dst = dst_row;
  1300.       const uint8_t *src = src_row;
  1301.       for(x = 0; x < width; x += 1) {
  1302.          uint8_t value = *(const uint8_t *)src;
  1303.          uint8_t rgba;
  1304.          rgba = value;
  1305.          dst[0] = rgba; /* r */
  1306.          dst[1] = rgba; /* g */
  1307.          dst[2] = rgba; /* b */
  1308.          dst[3] = rgba; /* a */
  1309.          src += 1;
  1310.          dst += 4;
  1311.       }
  1312.       src_row += src_stride;
  1313.       dst_row += dst_stride/sizeof(*dst_row);
  1314.    }
  1315. }
  1316.  
  1317. static INLINE void
  1318. util_format_i8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1319. {
  1320.    unsigned x, y;
  1321.    for(y = 0; y < height; y += 1) {
  1322.       const uint8_t *src = src_row;
  1323.       uint8_t *dst = dst_row;
  1324.       for(x = 0; x < width; x += 1) {
  1325.          uint8_t value = 0;
  1326.          value |= src[0];
  1327.          *(uint8_t *)dst = value;
  1328.          src += 4;
  1329.          dst += 1;
  1330.       }
  1331.       dst_row += dst_stride;
  1332.       src_row += src_stride/sizeof(*src_row);
  1333.    }
  1334. }
  1335.  
  1336. union util_format_l4a4_unorm {
  1337.    uint8_t value;
  1338.    struct {
  1339.       unsigned rgb:4;
  1340.       unsigned a:4;
  1341.    } chan;
  1342. };
  1343.  
  1344. static INLINE void
  1345. util_format_l4a4_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1346. {
  1347.    unsigned x, y;
  1348.    for(y = 0; y < height; y += 1) {
  1349.       float *dst = dst_row;
  1350.       const uint8_t *src = src_row;
  1351.       for(x = 0; x < width; x += 1) {
  1352.          uint8_t value = *(const uint8_t *)src;
  1353.          uint8_t rgb;
  1354.          uint8_t a;
  1355.          rgb = (value) & 0xf;
  1356.          a = value >> 4;
  1357.          dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
  1358.          dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
  1359.          dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
  1360.          dst[3] = (float)(a * (1.0f/0xf)); /* a */
  1361.          src += 1;
  1362.          dst += 4;
  1363.       }
  1364.       src_row += src_stride;
  1365.       dst_row += dst_stride/sizeof(*dst_row);
  1366.    }
  1367. }
  1368.  
  1369. static INLINE void
  1370. util_format_l4a4_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1371. {
  1372.    unsigned x, y;
  1373.    for(y = 0; y < height; y += 1) {
  1374.       const float *src = src_row;
  1375.       uint8_t *dst = dst_row;
  1376.       for(x = 0; x < width; x += 1) {
  1377.          uint8_t value = 0;
  1378.          value |= ((uint8_t)util_iround(CLAMP(src[0], 0, 1) * 0xf)) & 0xf;
  1379.          value |= ((uint8_t)util_iround(CLAMP(src[3], 0, 1) * 0xf)) << 4;
  1380.          *(uint8_t *)dst = value;
  1381.          src += 4;
  1382.          dst += 1;
  1383.       }
  1384.       dst_row += dst_stride;
  1385.       src_row += src_stride/sizeof(*src_row);
  1386.    }
  1387. }
  1388.  
  1389. static INLINE void
  1390. util_format_l4a4_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1391. {
  1392.          uint8_t value = *(const uint8_t *)src;
  1393.          uint8_t rgb;
  1394.          uint8_t a;
  1395.          rgb = (value) & 0xf;
  1396.          a = value >> 4;
  1397.          dst[0] = (float)(rgb * (1.0f/0xf)); /* r */
  1398.          dst[1] = (float)(rgb * (1.0f/0xf)); /* g */
  1399.          dst[2] = (float)(rgb * (1.0f/0xf)); /* b */
  1400.          dst[3] = (float)(a * (1.0f/0xf)); /* a */
  1401. }
  1402.  
  1403. static INLINE void
  1404. util_format_l4a4_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1405. {
  1406.    unsigned x, y;
  1407.    for(y = 0; y < height; y += 1) {
  1408.       uint8_t *dst = dst_row;
  1409.       const uint8_t *src = src_row;
  1410.       for(x = 0; x < width; x += 1) {
  1411.          uint8_t value = *(const uint8_t *)src;
  1412.          uint8_t rgb;
  1413.          uint8_t a;
  1414.          rgb = (value) & 0xf;
  1415.          a = value >> 4;
  1416.          dst[0] = (uint8_t)(((uint32_t)rgb) * 0xff / 0xf); /* r */
  1417.          dst[1] = (uint8_t)(((uint32_t)rgb) * 0xff / 0xf); /* g */
  1418.          dst[2] = (uint8_t)(((uint32_t)rgb) * 0xff / 0xf); /* b */
  1419.          dst[3] = (uint8_t)(((uint32_t)a) * 0xff / 0xf); /* a */
  1420.          src += 1;
  1421.          dst += 4;
  1422.       }
  1423.       src_row += src_stride;
  1424.       dst_row += dst_stride/sizeof(*dst_row);
  1425.    }
  1426. }
  1427.  
  1428. static INLINE void
  1429. util_format_l4a4_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1430. {
  1431.    unsigned x, y;
  1432.    for(y = 0; y < height; y += 1) {
  1433.       const uint8_t *src = src_row;
  1434.       uint8_t *dst = dst_row;
  1435.       for(x = 0; x < width; x += 1) {
  1436.          uint8_t value = 0;
  1437.          value |= ((uint8_t)(src[0] >> 4)) & 0xf;
  1438.          value |= ((uint8_t)(src[3] >> 4)) << 4;
  1439.          *(uint8_t *)dst = value;
  1440.          src += 4;
  1441.          dst += 1;
  1442.       }
  1443.       dst_row += dst_stride;
  1444.       src_row += src_stride/sizeof(*src_row);
  1445.    }
  1446. }
  1447.  
  1448. union util_format_l8a8_unorm {
  1449.    uint16_t value;
  1450.    struct {
  1451.       uint8_t rgb;
  1452.       uint8_t a;
  1453.    } chan;
  1454. };
  1455.  
  1456. static INLINE void
  1457. util_format_l8a8_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1458. {
  1459.    unsigned x, y;
  1460.    for(y = 0; y < height; y += 1) {
  1461.       float *dst = dst_row;
  1462.       const uint8_t *src = src_row;
  1463.       for(x = 0; x < width; x += 1) {
  1464.          uint16_t value = *(const uint16_t *)src;
  1465.          uint16_t rgb;
  1466.          uint16_t a;
  1467.          rgb = (value) & 0xff;
  1468.          a = value >> 8;
  1469.          dst[0] = ubyte_to_float(rgb); /* r */
  1470.          dst[1] = ubyte_to_float(rgb); /* g */
  1471.          dst[2] = ubyte_to_float(rgb); /* b */
  1472.          dst[3] = ubyte_to_float(a); /* a */
  1473.          src += 2;
  1474.          dst += 4;
  1475.       }
  1476.       src_row += src_stride;
  1477.       dst_row += dst_stride/sizeof(*dst_row);
  1478.    }
  1479. }
  1480.  
  1481. static INLINE void
  1482. util_format_l8a8_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1483. {
  1484.    unsigned x, y;
  1485.    for(y = 0; y < height; y += 1) {
  1486.       const float *src = src_row;
  1487.       uint8_t *dst = dst_row;
  1488.       for(x = 0; x < width; x += 1) {
  1489.          uint16_t value = 0;
  1490.          value |= (float_to_ubyte(src[0])) & 0xff;
  1491.          value |= (float_to_ubyte(src[3])) << 8;
  1492.          *(uint16_t *)dst = value;
  1493.          src += 4;
  1494.          dst += 2;
  1495.       }
  1496.       dst_row += dst_stride;
  1497.       src_row += src_stride/sizeof(*src_row);
  1498.    }
  1499. }
  1500.  
  1501. static INLINE void
  1502. util_format_l8a8_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1503. {
  1504.          uint16_t value = *(const uint16_t *)src;
  1505.          uint16_t rgb;
  1506.          uint16_t a;
  1507.          rgb = (value) & 0xff;
  1508.          a = value >> 8;
  1509.          dst[0] = ubyte_to_float(rgb); /* r */
  1510.          dst[1] = ubyte_to_float(rgb); /* g */
  1511.          dst[2] = ubyte_to_float(rgb); /* b */
  1512.          dst[3] = ubyte_to_float(a); /* a */
  1513. }
  1514.  
  1515. static INLINE void
  1516. util_format_l8a8_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1517. {
  1518.    unsigned x, y;
  1519.    for(y = 0; y < height; y += 1) {
  1520.       uint8_t *dst = dst_row;
  1521.       const uint8_t *src = src_row;
  1522.       for(x = 0; x < width; x += 1) {
  1523.          uint16_t value = *(const uint16_t *)src;
  1524.          uint16_t rgb;
  1525.          uint16_t a;
  1526.          rgb = (value) & 0xff;
  1527.          a = value >> 8;
  1528.          dst[0] = rgb; /* r */
  1529.          dst[1] = rgb; /* g */
  1530.          dst[2] = rgb; /* b */
  1531.          dst[3] = a; /* a */
  1532.          src += 2;
  1533.          dst += 4;
  1534.       }
  1535.       src_row += src_stride;
  1536.       dst_row += dst_stride/sizeof(*dst_row);
  1537.    }
  1538. }
  1539.  
  1540. static INLINE void
  1541. util_format_l8a8_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1542. {
  1543.    unsigned x, y;
  1544.    for(y = 0; y < height; y += 1) {
  1545.       const uint8_t *src = src_row;
  1546.       uint8_t *dst = dst_row;
  1547.       for(x = 0; x < width; x += 1) {
  1548.          uint16_t value = 0;
  1549.          value |= (src[0]) & 0xff;
  1550.          value |= (src[3]) << 8;
  1551.          *(uint16_t *)dst = value;
  1552.          src += 4;
  1553.          dst += 2;
  1554.       }
  1555.       dst_row += dst_stride;
  1556.       src_row += src_stride/sizeof(*src_row);
  1557.    }
  1558. }
  1559.  
  1560. union util_format_l16_unorm {
  1561.    uint16_t value;
  1562.    struct {
  1563.       uint16_t rgb;
  1564.    } chan;
  1565. };
  1566.  
  1567. static INLINE void
  1568. util_format_l16_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1569. {
  1570.    unsigned x, y;
  1571.    for(y = 0; y < height; y += 1) {
  1572.       float *dst = dst_row;
  1573.       const uint8_t *src = src_row;
  1574.       for(x = 0; x < width; x += 1) {
  1575.          uint16_t value = *(const uint16_t *)src;
  1576.          uint16_t rgb;
  1577.          rgb = value;
  1578.          dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
  1579.          dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
  1580.          dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
  1581.          dst[3] = 1; /* a */
  1582.          src += 2;
  1583.          dst += 4;
  1584.       }
  1585.       src_row += src_stride;
  1586.       dst_row += dst_stride/sizeof(*dst_row);
  1587.    }
  1588. }
  1589.  
  1590. static INLINE void
  1591. util_format_l16_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1592. {
  1593.    unsigned x, y;
  1594.    for(y = 0; y < height; y += 1) {
  1595.       const float *src = src_row;
  1596.       uint8_t *dst = dst_row;
  1597.       for(x = 0; x < width; x += 1) {
  1598.          uint16_t value = 0;
  1599.          value |= (uint16_t)util_iround(CLAMP(src[0], 0, 1) * 0xffff);
  1600.          *(uint16_t *)dst = value;
  1601.          src += 4;
  1602.          dst += 2;
  1603.       }
  1604.       dst_row += dst_stride;
  1605.       src_row += src_stride/sizeof(*src_row);
  1606.    }
  1607. }
  1608.  
  1609. static INLINE void
  1610. util_format_l16_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1611. {
  1612.          uint16_t value = *(const uint16_t *)src;
  1613.          uint16_t rgb;
  1614.          rgb = value;
  1615.          dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
  1616.          dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
  1617.          dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
  1618.          dst[3] = 1; /* a */
  1619. }
  1620.  
  1621. static INLINE void
  1622. util_format_l16_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1623. {
  1624.    unsigned x, y;
  1625.    for(y = 0; y < height; y += 1) {
  1626.       uint8_t *dst = dst_row;
  1627.       const uint8_t *src = src_row;
  1628.       for(x = 0; x < width; x += 1) {
  1629.          uint16_t value = *(const uint16_t *)src;
  1630.          uint16_t rgb;
  1631.          rgb = value;
  1632.          dst[0] = (uint8_t)(rgb >> 8); /* r */
  1633.          dst[1] = (uint8_t)(rgb >> 8); /* g */
  1634.          dst[2] = (uint8_t)(rgb >> 8); /* b */
  1635.          dst[3] = 255; /* a */
  1636.          src += 2;
  1637.          dst += 4;
  1638.       }
  1639.       src_row += src_stride;
  1640.       dst_row += dst_stride/sizeof(*dst_row);
  1641.    }
  1642. }
  1643.  
  1644. static INLINE void
  1645. util_format_l16_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1646. {
  1647.    unsigned x, y;
  1648.    for(y = 0; y < height; y += 1) {
  1649.       const uint8_t *src = src_row;
  1650.       uint8_t *dst = dst_row;
  1651.       for(x = 0; x < width; x += 1) {
  1652.          uint16_t value = 0;
  1653.          value |= (uint16_t)(((uint32_t)src[0]) * 0xffff / 0xff);
  1654.          *(uint16_t *)dst = value;
  1655.          src += 4;
  1656.          dst += 2;
  1657.       }
  1658.       dst_row += dst_stride;
  1659.       src_row += src_stride/sizeof(*src_row);
  1660.    }
  1661. }
  1662.  
  1663. union util_format_a16_unorm {
  1664.    uint16_t value;
  1665.    struct {
  1666.       uint16_t a;
  1667.    } chan;
  1668. };
  1669.  
  1670. static INLINE void
  1671. util_format_a16_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1672. {
  1673.    unsigned x, y;
  1674.    for(y = 0; y < height; y += 1) {
  1675.       float *dst = dst_row;
  1676.       const uint8_t *src = src_row;
  1677.       for(x = 0; x < width; x += 1) {
  1678.          uint16_t value = *(const uint16_t *)src;
  1679.          uint16_t a;
  1680.          a = value;
  1681.          dst[0] = 0; /* r */
  1682.          dst[1] = 0; /* g */
  1683.          dst[2] = 0; /* b */
  1684.          dst[3] = (float)(a * (1.0f/0xffff)); /* a */
  1685.          src += 2;
  1686.          dst += 4;
  1687.       }
  1688.       src_row += src_stride;
  1689.       dst_row += dst_stride/sizeof(*dst_row);
  1690.    }
  1691. }
  1692.  
  1693. static INLINE void
  1694. util_format_a16_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1695. {
  1696.    unsigned x, y;
  1697.    for(y = 0; y < height; y += 1) {
  1698.       const float *src = src_row;
  1699.       uint8_t *dst = dst_row;
  1700.       for(x = 0; x < width; x += 1) {
  1701.          uint16_t value = 0;
  1702.          value |= (uint16_t)util_iround(CLAMP(src[3], 0, 1) * 0xffff);
  1703.          *(uint16_t *)dst = value;
  1704.          src += 4;
  1705.          dst += 2;
  1706.       }
  1707.       dst_row += dst_stride;
  1708.       src_row += src_stride/sizeof(*src_row);
  1709.    }
  1710. }
  1711.  
  1712. static INLINE void
  1713. util_format_a16_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1714. {
  1715.          uint16_t value = *(const uint16_t *)src;
  1716.          uint16_t a;
  1717.          a = value;
  1718.          dst[0] = 0; /* r */
  1719.          dst[1] = 0; /* g */
  1720.          dst[2] = 0; /* b */
  1721.          dst[3] = (float)(a * (1.0f/0xffff)); /* a */
  1722. }
  1723.  
  1724. static INLINE void
  1725. util_format_a16_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1726. {
  1727.    unsigned x, y;
  1728.    for(y = 0; y < height; y += 1) {
  1729.       uint8_t *dst = dst_row;
  1730.       const uint8_t *src = src_row;
  1731.       for(x = 0; x < width; x += 1) {
  1732.          uint16_t value = *(const uint16_t *)src;
  1733.          uint16_t a;
  1734.          a = value;
  1735.          dst[0] = 0; /* r */
  1736.          dst[1] = 0; /* g */
  1737.          dst[2] = 0; /* b */
  1738.          dst[3] = (uint8_t)(a >> 8); /* a */
  1739.          src += 2;
  1740.          dst += 4;
  1741.       }
  1742.       src_row += src_stride;
  1743.       dst_row += dst_stride/sizeof(*dst_row);
  1744.    }
  1745. }
  1746.  
  1747. static INLINE void
  1748. util_format_a16_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1749. {
  1750.    unsigned x, y;
  1751.    for(y = 0; y < height; y += 1) {
  1752.       const uint8_t *src = src_row;
  1753.       uint8_t *dst = dst_row;
  1754.       for(x = 0; x < width; x += 1) {
  1755.          uint16_t value = 0;
  1756.          value |= (uint16_t)(((uint32_t)src[3]) * 0xffff / 0xff);
  1757.          *(uint16_t *)dst = value;
  1758.          src += 4;
  1759.          dst += 2;
  1760.       }
  1761.       dst_row += dst_stride;
  1762.       src_row += src_stride/sizeof(*src_row);
  1763.    }
  1764. }
  1765.  
  1766. union util_format_i16_unorm {
  1767.    uint16_t value;
  1768.    struct {
  1769.       uint16_t rgba;
  1770.    } chan;
  1771. };
  1772.  
  1773. static INLINE void
  1774. util_format_i16_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1775. {
  1776.    unsigned x, y;
  1777.    for(y = 0; y < height; y += 1) {
  1778.       float *dst = dst_row;
  1779.       const uint8_t *src = src_row;
  1780.       for(x = 0; x < width; x += 1) {
  1781.          uint16_t value = *(const uint16_t *)src;
  1782.          uint16_t rgba;
  1783.          rgba = value;
  1784.          dst[0] = (float)(rgba * (1.0f/0xffff)); /* r */
  1785.          dst[1] = (float)(rgba * (1.0f/0xffff)); /* g */
  1786.          dst[2] = (float)(rgba * (1.0f/0xffff)); /* b */
  1787.          dst[3] = (float)(rgba * (1.0f/0xffff)); /* a */
  1788.          src += 2;
  1789.          dst += 4;
  1790.       }
  1791.       src_row += src_stride;
  1792.       dst_row += dst_stride/sizeof(*dst_row);
  1793.    }
  1794. }
  1795.  
  1796. static INLINE void
  1797. util_format_i16_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1798. {
  1799.    unsigned x, y;
  1800.    for(y = 0; y < height; y += 1) {
  1801.       const float *src = src_row;
  1802.       uint8_t *dst = dst_row;
  1803.       for(x = 0; x < width; x += 1) {
  1804.          uint16_t value = 0;
  1805.          value |= (uint16_t)util_iround(CLAMP(src[0], 0, 1) * 0xffff);
  1806.          *(uint16_t *)dst = value;
  1807.          src += 4;
  1808.          dst += 2;
  1809.       }
  1810.       dst_row += dst_stride;
  1811.       src_row += src_stride/sizeof(*src_row);
  1812.    }
  1813. }
  1814.  
  1815. static INLINE void
  1816. util_format_i16_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1817. {
  1818.          uint16_t value = *(const uint16_t *)src;
  1819.          uint16_t rgba;
  1820.          rgba = value;
  1821.          dst[0] = (float)(rgba * (1.0f/0xffff)); /* r */
  1822.          dst[1] = (float)(rgba * (1.0f/0xffff)); /* g */
  1823.          dst[2] = (float)(rgba * (1.0f/0xffff)); /* b */
  1824.          dst[3] = (float)(rgba * (1.0f/0xffff)); /* a */
  1825. }
  1826.  
  1827. static INLINE void
  1828. util_format_i16_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1829. {
  1830.    unsigned x, y;
  1831.    for(y = 0; y < height; y += 1) {
  1832.       uint8_t *dst = dst_row;
  1833.       const uint8_t *src = src_row;
  1834.       for(x = 0; x < width; x += 1) {
  1835.          uint16_t value = *(const uint16_t *)src;
  1836.          uint16_t rgba;
  1837.          rgba = value;
  1838.          dst[0] = (uint8_t)(rgba >> 8); /* r */
  1839.          dst[1] = (uint8_t)(rgba >> 8); /* g */
  1840.          dst[2] = (uint8_t)(rgba >> 8); /* b */
  1841.          dst[3] = (uint8_t)(rgba >> 8); /* a */
  1842.          src += 2;
  1843.          dst += 4;
  1844.       }
  1845.       src_row += src_stride;
  1846.       dst_row += dst_stride/sizeof(*dst_row);
  1847.    }
  1848. }
  1849.  
  1850. static INLINE void
  1851. util_format_i16_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1852. {
  1853.    unsigned x, y;
  1854.    for(y = 0; y < height; y += 1) {
  1855.       const uint8_t *src = src_row;
  1856.       uint8_t *dst = dst_row;
  1857.       for(x = 0; x < width; x += 1) {
  1858.          uint16_t value = 0;
  1859.          value |= (uint16_t)(((uint32_t)src[0]) * 0xffff / 0xff);
  1860.          *(uint16_t *)dst = value;
  1861.          src += 4;
  1862.          dst += 2;
  1863.       }
  1864.       dst_row += dst_stride;
  1865.       src_row += src_stride/sizeof(*src_row);
  1866.    }
  1867. }
  1868.  
  1869. union util_format_l16a16_unorm {
  1870.    uint32_t value;
  1871.    struct {
  1872.       uint16_t rgb;
  1873.       uint16_t a;
  1874.    } chan;
  1875. };
  1876.  
  1877. static INLINE void
  1878. util_format_l16a16_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1879. {
  1880.    unsigned x, y;
  1881.    for(y = 0; y < height; y += 1) {
  1882.       float *dst = dst_row;
  1883.       const uint8_t *src = src_row;
  1884.       for(x = 0; x < width; x += 1) {
  1885.          uint32_t value = *(const uint32_t *)src;
  1886.          uint32_t rgb;
  1887.          uint32_t a;
  1888.          rgb = (value) & 0xffff;
  1889.          a = value >> 16;
  1890.          dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
  1891.          dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
  1892.          dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
  1893.          dst[3] = (float)(a * (1.0f/0xffff)); /* a */
  1894.          src += 4;
  1895.          dst += 4;
  1896.       }
  1897.       src_row += src_stride;
  1898.       dst_row += dst_stride/sizeof(*dst_row);
  1899.    }
  1900. }
  1901.  
  1902. static INLINE void
  1903. util_format_l16a16_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  1904. {
  1905.    unsigned x, y;
  1906.    for(y = 0; y < height; y += 1) {
  1907.       const float *src = src_row;
  1908.       uint8_t *dst = dst_row;
  1909.       for(x = 0; x < width; x += 1) {
  1910.          uint32_t value = 0;
  1911.          value |= ((uint16_t)util_iround(CLAMP(src[0], 0, 1) * 0xffff)) & 0xffff;
  1912.          value |= ((uint16_t)util_iround(CLAMP(src[3], 0, 1) * 0xffff)) << 16;
  1913.          *(uint32_t *)dst = value;
  1914.          src += 4;
  1915.          dst += 4;
  1916.       }
  1917.       dst_row += dst_stride;
  1918.       src_row += src_stride/sizeof(*src_row);
  1919.    }
  1920. }
  1921.  
  1922. static INLINE void
  1923. util_format_l16a16_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  1924. {
  1925.          uint32_t value = *(const uint32_t *)src;
  1926.          uint32_t rgb;
  1927.          uint32_t a;
  1928.          rgb = (value) & 0xffff;
  1929.          a = value >> 16;
  1930.          dst[0] = (float)(rgb * (1.0f/0xffff)); /* r */
  1931.          dst[1] = (float)(rgb * (1.0f/0xffff)); /* g */
  1932.          dst[2] = (float)(rgb * (1.0f/0xffff)); /* b */
  1933.          dst[3] = (float)(a * (1.0f/0xffff)); /* a */
  1934. }
  1935.  
  1936. static INLINE void
  1937. util_format_l16a16_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1938. {
  1939.    unsigned x, y;
  1940.    for(y = 0; y < height; y += 1) {
  1941.       uint8_t *dst = dst_row;
  1942.       const uint8_t *src = src_row;
  1943.       for(x = 0; x < width; x += 1) {
  1944.          uint32_t value = *(const uint32_t *)src;
  1945.          uint32_t rgb;
  1946.          uint32_t a;
  1947.          rgb = (value) & 0xffff;
  1948.          a = value >> 16;
  1949.          dst[0] = (uint8_t)(rgb >> 8); /* r */
  1950.          dst[1] = (uint8_t)(rgb >> 8); /* g */
  1951.          dst[2] = (uint8_t)(rgb >> 8); /* b */
  1952.          dst[3] = (uint8_t)(a >> 8); /* a */
  1953.          src += 4;
  1954.          dst += 4;
  1955.       }
  1956.       src_row += src_stride;
  1957.       dst_row += dst_stride/sizeof(*dst_row);
  1958.    }
  1959. }
  1960.  
  1961. static INLINE void
  1962. util_format_l16a16_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1963. {
  1964.    unsigned x, y;
  1965.    for(y = 0; y < height; y += 1) {
  1966.       const uint8_t *src = src_row;
  1967.       uint8_t *dst = dst_row;
  1968.       for(x = 0; x < width; x += 1) {
  1969.          uint32_t value = 0;
  1970.          value |= ((uint16_t)(((uint32_t)src[0]) * 0xffff / 0xff)) & 0xffff;
  1971.          value |= ((uint16_t)(((uint32_t)src[3]) * 0xffff / 0xff)) << 16;
  1972.          *(uint32_t *)dst = value;
  1973.          src += 4;
  1974.          dst += 4;
  1975.       }
  1976.       dst_row += dst_stride;
  1977.       src_row += src_stride/sizeof(*src_row);
  1978.    }
  1979. }
  1980.  
  1981. union util_format_a8_snorm {
  1982.    uint8_t value;
  1983.    struct {
  1984.       int8_t a;
  1985.    } chan;
  1986. };
  1987.  
  1988. static INLINE void
  1989. util_format_a8_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  1990. {
  1991.    unsigned x, y;
  1992.    for(y = 0; y < height; y += 1) {
  1993.       float *dst = dst_row;
  1994.       const uint8_t *src = src_row;
  1995.       for(x = 0; x < width; x += 1) {
  1996.          uint8_t value = *(const uint8_t *)src;
  1997.          int8_t a;
  1998.          a = (int8_t)(value) ;
  1999.          dst[0] = 0; /* r */
  2000.          dst[1] = 0; /* g */
  2001.          dst[2] = 0; /* b */
  2002.          dst[3] = (float)(a * (1.0f/0x7f)); /* a */
  2003.          src += 1;
  2004.          dst += 4;
  2005.       }
  2006.       src_row += src_stride;
  2007.       dst_row += dst_stride/sizeof(*dst_row);
  2008.    }
  2009. }
  2010.  
  2011. static INLINE void
  2012. util_format_a8_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  2013. {
  2014.    unsigned x, y;
  2015.    for(y = 0; y < height; y += 1) {
  2016.       const float *src = src_row;
  2017.       uint8_t *dst = dst_row;
  2018.       for(x = 0; x < width; x += 1) {
  2019.          uint8_t value = 0;
  2020.          value |= (uint8_t)((int8_t)util_iround(CLAMP(src[3], -1, 1) * 0x7f)) ;
  2021.          *(uint8_t *)dst = value;
  2022.          src += 4;
  2023.          dst += 1;
  2024.       }
  2025.       dst_row += dst_stride;
  2026.       src_row += src_stride/sizeof(*src_row);
  2027.    }
  2028. }
  2029.  
  2030. static INLINE void
  2031. util_format_a8_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  2032. {
  2033.          uint8_t value = *(const uint8_t *)src;
  2034.          int8_t a;
  2035.          a = (int8_t)(value) ;
  2036.          dst[0] = 0; /* r */
  2037.          dst[1] = 0; /* g */
  2038.          dst[2] = 0; /* b */
  2039.          dst[3] = (float)(a * (1.0f/0x7f)); /* a */
  2040. }
  2041.  
  2042. static INLINE void
  2043. util_format_a8_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2044. {
  2045.    unsigned x, y;
  2046.    for(y = 0; y < height; y += 1) {
  2047.       uint8_t *dst = dst_row;
  2048.       const uint8_t *src = src_row;
  2049.       for(x = 0; x < width; x += 1) {
  2050.          uint8_t value = *(const uint8_t *)src;
  2051.          int8_t a;
  2052.          a = (int8_t)(value) ;
  2053.          dst[0] = 0; /* r */
  2054.          dst[1] = 0; /* g */
  2055.          dst[2] = 0; /* b */
  2056.          dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x7f); /* a */
  2057.          src += 1;
  2058.          dst += 4;
  2059.       }
  2060.       src_row += src_stride;
  2061.       dst_row += dst_stride/sizeof(*dst_row);
  2062.    }
  2063. }
  2064.  
  2065. static INLINE void
  2066. util_format_a8_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2067. {
  2068.    unsigned x, y;
  2069.    for(y = 0; y < height; y += 1) {
  2070.       const uint8_t *src = src_row;
  2071.       uint8_t *dst = dst_row;
  2072.       for(x = 0; x < width; x += 1) {
  2073.          uint8_t value = 0;
  2074.          value |= (uint8_t)((int8_t)(src[3] >> 1)) ;
  2075.          *(uint8_t *)dst = value;
  2076.          src += 4;
  2077.          dst += 1;
  2078.       }
  2079.       dst_row += dst_stride;
  2080.       src_row += src_stride/sizeof(*src_row);
  2081.    }
  2082. }
  2083.  
  2084. union util_format_l8_snorm {
  2085.    uint8_t value;
  2086.    struct {
  2087.       int8_t rgb;
  2088.    } chan;
  2089. };
  2090.  
  2091. static INLINE void
  2092. util_format_l8_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2093. {
  2094.    unsigned x, y;
  2095.    for(y = 0; y < height; y += 1) {
  2096.       float *dst = dst_row;
  2097.       const uint8_t *src = src_row;
  2098.       for(x = 0; x < width; x += 1) {
  2099.          uint8_t value = *(const uint8_t *)src;
  2100.          int8_t rgb;
  2101.          rgb = (int8_t)(value) ;
  2102.          dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
  2103.          dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
  2104.          dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
  2105.          dst[3] = 1; /* a */
  2106.          src += 1;
  2107.          dst += 4;
  2108.       }
  2109.       src_row += src_stride;
  2110.       dst_row += dst_stride/sizeof(*dst_row);
  2111.    }
  2112. }
  2113.  
  2114. static INLINE void
  2115. util_format_l8_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  2116. {
  2117.    unsigned x, y;
  2118.    for(y = 0; y < height; y += 1) {
  2119.       const float *src = src_row;
  2120.       uint8_t *dst = dst_row;
  2121.       for(x = 0; x < width; x += 1) {
  2122.          uint8_t value = 0;
  2123.          value |= (uint8_t)((int8_t)util_iround(CLAMP(src[0], -1, 1) * 0x7f)) ;
  2124.          *(uint8_t *)dst = value;
  2125.          src += 4;
  2126.          dst += 1;
  2127.       }
  2128.       dst_row += dst_stride;
  2129.       src_row += src_stride/sizeof(*src_row);
  2130.    }
  2131. }
  2132.  
  2133. static INLINE void
  2134. util_format_l8_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  2135. {
  2136.          uint8_t value = *(const uint8_t *)src;
  2137.          int8_t rgb;
  2138.          rgb = (int8_t)(value) ;
  2139.          dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
  2140.          dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
  2141.          dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
  2142.          dst[3] = 1; /* a */
  2143. }
  2144.  
  2145. static INLINE void
  2146. util_format_l8_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2147. {
  2148.    unsigned x, y;
  2149.    for(y = 0; y < height; y += 1) {
  2150.       uint8_t *dst = dst_row;
  2151.       const uint8_t *src = src_row;
  2152.       for(x = 0; x < width; x += 1) {
  2153.          uint8_t value = *(const uint8_t *)src;
  2154.          int8_t rgb;
  2155.          rgb = (int8_t)(value) ;
  2156.          dst[0] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* r */
  2157.          dst[1] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* g */
  2158.          dst[2] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* b */
  2159.          dst[3] = 255; /* a */
  2160.          src += 1;
  2161.          dst += 4;
  2162.       }
  2163.       src_row += src_stride;
  2164.       dst_row += dst_stride/sizeof(*dst_row);
  2165.    }
  2166. }
  2167.  
  2168. static INLINE void
  2169. util_format_l8_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2170. {
  2171.    unsigned x, y;
  2172.    for(y = 0; y < height; y += 1) {
  2173.       const uint8_t *src = src_row;
  2174.       uint8_t *dst = dst_row;
  2175.       for(x = 0; x < width; x += 1) {
  2176.          uint8_t value = 0;
  2177.          value |= (uint8_t)((int8_t)(src[0] >> 1)) ;
  2178.          *(uint8_t *)dst = value;
  2179.          src += 4;
  2180.          dst += 1;
  2181.       }
  2182.       dst_row += dst_stride;
  2183.       src_row += src_stride/sizeof(*src_row);
  2184.    }
  2185. }
  2186.  
  2187. union util_format_l8a8_snorm {
  2188.    uint16_t value;
  2189.    struct {
  2190.       int8_t rgb;
  2191.       int8_t a;
  2192.    } chan;
  2193. };
  2194.  
  2195. static INLINE void
  2196. util_format_l8a8_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2197. {
  2198.    unsigned x, y;
  2199.    for(y = 0; y < height; y += 1) {
  2200.       float *dst = dst_row;
  2201.       const uint8_t *src = src_row;
  2202.       for(x = 0; x < width; x += 1) {
  2203.          uint16_t value = *(const uint16_t *)src;
  2204.          int16_t rgb;
  2205.          int16_t a;
  2206.          rgb = ((int16_t)(value << 8) ) >> 8;
  2207.          a = ((int16_t)(value) ) >> 8;
  2208.          dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
  2209.          dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
  2210.          dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
  2211.          dst[3] = (float)(a * (1.0f/0x7f)); /* a */
  2212.          src += 2;
  2213.          dst += 4;
  2214.       }
  2215.       src_row += src_stride;
  2216.       dst_row += dst_stride/sizeof(*dst_row);
  2217.    }
  2218. }
  2219.  
  2220. static INLINE void
  2221. util_format_l8a8_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  2222. {
  2223.    unsigned x, y;
  2224.    for(y = 0; y < height; y += 1) {
  2225.       const float *src = src_row;
  2226.       uint8_t *dst = dst_row;
  2227.       for(x = 0; x < width; x += 1) {
  2228.          uint16_t value = 0;
  2229.          value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[0], -1, 1) * 0x7f)) & 0xff) ;
  2230.          value |= (uint16_t)(((int8_t)util_iround(CLAMP(src[3], -1, 1) * 0x7f)) << 8) ;
  2231.          *(uint16_t *)dst = value;
  2232.          src += 4;
  2233.          dst += 2;
  2234.       }
  2235.       dst_row += dst_stride;
  2236.       src_row += src_stride/sizeof(*src_row);
  2237.    }
  2238. }
  2239.  
  2240. static INLINE void
  2241. util_format_l8a8_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  2242. {
  2243.          uint16_t value = *(const uint16_t *)src;
  2244.          int16_t rgb;
  2245.          int16_t a;
  2246.          rgb = ((int16_t)(value << 8) ) >> 8;
  2247.          a = ((int16_t)(value) ) >> 8;
  2248.          dst[0] = (float)(rgb * (1.0f/0x7f)); /* r */
  2249.          dst[1] = (float)(rgb * (1.0f/0x7f)); /* g */
  2250.          dst[2] = (float)(rgb * (1.0f/0x7f)); /* b */
  2251.          dst[3] = (float)(a * (1.0f/0x7f)); /* a */
  2252. }
  2253.  
  2254. static INLINE void
  2255. util_format_l8a8_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2256. {
  2257.    unsigned x, y;
  2258.    for(y = 0; y < height; y += 1) {
  2259.       uint8_t *dst = dst_row;
  2260.       const uint8_t *src = src_row;
  2261.       for(x = 0; x < width; x += 1) {
  2262.          uint16_t value = *(const uint16_t *)src;
  2263.          int16_t rgb;
  2264.          int16_t a;
  2265.          rgb = ((int16_t)(value << 8) ) >> 8;
  2266.          a = ((int16_t)(value) ) >> 8;
  2267.          dst[0] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* r */
  2268.          dst[1] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* g */
  2269.          dst[2] = (uint8_t)(((uint32_t)MAX2(rgb, 0)) * 0xff / 0x7f); /* b */
  2270.          dst[3] = (uint8_t)(((uint32_t)MAX2(a, 0)) * 0xff / 0x7f); /* a */
  2271.          src += 2;
  2272.          dst += 4;
  2273.       }
  2274.       src_row += src_stride;
  2275.       dst_row += dst_stride/sizeof(*dst_row);
  2276.    }
  2277. }
  2278.  
  2279. static INLINE void
  2280. util_format_l8a8_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2281. {
  2282.    unsigned x, y;
  2283.    for(y = 0; y < height; y += 1) {
  2284.       const uint8_t *src = src_row;
  2285.       uint8_t *dst = dst_row;
  2286.       for(x = 0; x < width; x += 1) {
  2287.          uint16_t value = 0;
  2288.          value |= (uint16_t)(((int8_t)(src[0] >> 1)) & 0xff) ;
  2289.          value |= (uint16_t)(((int8_t)(src[3] >> 1)) << 8) ;
  2290.          *(uint16_t *)dst = value;
  2291.          src += 4;
  2292.          dst += 2;
  2293.       }
  2294.       dst_row += dst_stride;
  2295.       src_row += src_stride/sizeof(*src_row);
  2296.    }
  2297. }
  2298.  
  2299. union util_format_i8_snorm {
  2300.    uint8_t value;
  2301.    struct {
  2302.       int8_t rgba;
  2303.    } chan;
  2304. };
  2305.  
  2306. static INLINE void
  2307. util_format_i8_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2308. {
  2309.    unsigned x, y;
  2310.    for(y = 0; y < height; y += 1) {
  2311.       float *dst = dst_row;
  2312.       const uint8_t *src = src_row;
  2313.       for(x = 0; x < width; x += 1) {
  2314.          uint8_t value = *(const uint8_t *)src;
  2315.          int8_t rgba;
  2316.          rgba = (int8_t)(value) ;
  2317.          dst[0] = (float)(rgba * (1.0f/0x7f)); /* r */
  2318.          dst[1] = (float)(rgba * (1.0f/0x7f)); /* g */
  2319.          dst[2] = (float)(rgba * (1.0f/0x7f)); /* b */
  2320.          dst[3] = (float)(rgba * (1.0f/0x7f)); /* a */
  2321.          src += 1;
  2322.          dst += 4;
  2323.       }
  2324.       src_row += src_stride;
  2325.       dst_row += dst_stride/sizeof(*dst_row);
  2326.    }
  2327. }
  2328.  
  2329. static INLINE void
  2330. util_format_i8_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  2331. {
  2332.    unsigned x, y;
  2333.    for(y = 0; y < height; y += 1) {
  2334.       const float *src = src_row;
  2335.       uint8_t *dst = dst_row;
  2336.       for(x = 0; x < width; x += 1) {
  2337.          uint8_t value = 0;
  2338.          value |= (uint8_t)((int8_t)util_iround(CLAMP(src[0], -1, 1) * 0x7f)) ;
  2339.          *(uint8_t *)dst = value;
  2340.          src += 4;
  2341.          dst += 1;
  2342.       }
  2343.       dst_row += dst_stride;
  2344.       src_row += src_stride/sizeof(*src_row);
  2345.    }
  2346. }
  2347.  
  2348. static INLINE void
  2349. util_format_i8_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  2350. {
  2351.          uint8_t value = *(const uint8_t *)src;
  2352.          int8_t rgba;
  2353.          rgba = (int8_t)(value) ;
  2354.          dst[0] = (float)(rgba * (1.0f/0x7f)); /* r */
  2355.          dst[1] = (float)(rgba * (1.0f/0x7f)); /* g */
  2356.          dst[2] = (float)(rgba * (1.0f/0x7f)); /* b */
  2357.          dst[3] = (float)(rgba * (1.0f/0x7f)); /* a */
  2358. }
  2359.  
  2360. static INLINE void
  2361. util_format_i8_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  2362. {
  2363.    unsigned x, y;
  2364.    for(y = 0; y < height; y += 1) {
  2365.       uint8_t *dst = dst_row;
  2366.       const uint8_t *src = src_row;
  2367.       for(x = 0; x < width; x += 1) {
  2368.          uint8_t value = *(const uint8_t *)src;
  2369.          int8_t rgba;
  2370.          rgba = (int8_t)(value) ;
  2371.          dst[0] = (uint8_t)(((uint32_t)MAX2(rgba, 0)) * 0xff / 0x7f); /* r */
  2372.          dst[1] = (uint8_t)(((uint32_t)MAX2(rgba, 0)) * 0xff / 0x7f); /* g */
  2373.          dst[2] = (uint8_t)(((uint32_t)MAX2(rgba, 0)) * 0xff / 0x7f