u_blitter: do error checking assertions for shader caching
[mesa.git] / src / gallium / auxiliary / util / u_format_rgtc.c
index 6ffcd7e99ef93db2a01e1c33f2d05e7b04eb9d2e..15969174358eb5cc616bea942e1b9e459f501881 100644 (file)
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
  *
  **************************************************************************/
 
 #include "u_math.h"
 #include "u_format.h"
 #include "u_format_rgtc.h"
-
-static void u_format_unsigned_encode_rgtc_chan(uint8_t *blkaddr, uint8_t srccolors[4][4],
-                                              int numxpixels, int numypixels);
-
-static void u_format_unsigned_fetch_texel_rgtc(unsigned srcRowStride, const uint8_t *pixdata,
-                                              unsigned i, unsigned j, uint8_t *value, unsigned comps);
-
-static void u_format_signed_encode_rgtc_chan(int8_t *blkaddr, int8_t srccolors[4][4],
-                                            int numxpixels, int numypixels);
-
-static void u_format_signed_fetch_texel_rgtc(unsigned srcRowStride, const int8_t *pixdata,
-                                              unsigned i, unsigned j, int8_t *value, unsigned comps);
+#include "util/rgtc.h"
 
 void
 util_format_rgtc1_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
 {
-   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
+   util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
+   dst[1] = 0;
+   dst[2] = 0;
+   dst[3] = 255;
 }
 
 void
@@ -57,7 +50,10 @@ util_format_rgtc1_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride
          for(j = 0; j < bh; ++j) {
             for(i = 0; i < bw; ++i) {
                uint8_t *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*comps;
-              u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
+              util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
+              dst[1] = 0;
+              dst[2] = 0;
+              dst[3] = 255;
            }
         }
         src += block_size;
@@ -82,7 +78,7 @@ util_format_rgtc1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
               tmp[j][i] = src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4];
             }
          }
-         u_format_unsigned_encode_rgtc_chan(dst, tmp, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst, tmp, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
@@ -101,7 +97,7 @@ util_format_rgtc1_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, c
             for(i = 0; i < 4; ++i) {
                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
                uint8_t tmp_r;
-               u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
+               util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
                dst[0] = ubyte_to_float(tmp_r);
                dst[1] = 0.0;
                dst[2] = 0.0;
@@ -129,7 +125,7 @@ util_format_rgtc1_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, c
               tmp[j][i] = float_to_ubyte(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4]);
             }
          }
-         u_format_unsigned_encode_rgtc_chan(dst, tmp, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst, tmp, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
@@ -140,7 +136,7 @@ void
 util_format_rgtc1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
 {
    uint8_t tmp_r;
-   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
+   util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
    dst[0] = ubyte_to_float(tmp_r);
    dst[1] = 0.0;
    dst[2] = 0.0;
@@ -180,7 +176,7 @@ util_format_rgtc1_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, c
               tmp[j][i] = float_to_byte_tex(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4]);
             }
          }
-         u_format_signed_encode_rgtc_chan(dst, tmp, 4, 4);
+         util_format_signed_encode_rgtc_ubyte(dst, tmp, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
@@ -199,7 +195,7 @@ util_format_rgtc1_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, c
             for(i = 0; i < 4; ++i) {
                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
                int8_t tmp_r;
-               u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
+               util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
                dst[0] = byte_to_float_tex(tmp_r);
                dst[1] = 0.0;
                dst[2] = 0.0;
@@ -216,7 +212,7 @@ void
 util_format_rgtc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
 {
    int8_t tmp_r;
-   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1);
+   util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1);
    dst[0] = byte_to_float_tex(tmp_r);
    dst[1] = 0.0;
    dst[2] = 0.0;
@@ -227,8 +223,10 @@ util_format_rgtc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigne
 void
 util_format_rgtc2_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
 {
-   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
-   u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 1, 2);
+   util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
+   util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 1, 2);
+   dst[2] = 0;
+   dst[3] = 255;
 }
 
 void
@@ -244,9 +242,10 @@ util_format_rgtc2_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride
          for(j = 0; j < bh; ++j) {
             for(i = 0; i < bw; ++i) {
                uint8_t *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*comps;
-              u_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
-              u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 1, 2);
-
+              util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
+              util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 1, 2);
+              dst[2] = 0;
+              dst[3] = 255;
            }
         }
         src += block_size;
@@ -272,8 +271,8 @@ util_format_rgtc2_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
               tmp_g[j][i] = src_row[((y + j)*src_stride/sizeof(*src_row) + (x + i)*4) + 1];
             }
          }
-         u_format_unsigned_encode_rgtc_chan(dst, tmp_r, 4, 4);
-         u_format_unsigned_encode_rgtc_chan(dst + 8, tmp_g, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst, tmp_r, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst + 8, tmp_g, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
@@ -281,7 +280,7 @@ util_format_rgtc2_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride,
 }
 
 void
-util_format_rgtc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
+util_format_rxtc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height, unsigned chan2off)
 {
    const unsigned bw = 4, bh = 4, bytes_per_block = 16;
    unsigned x, y, i, j;
@@ -294,17 +293,23 @@ util_format_rgtc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, c
          for(j = 0; j < bh; ++j) {
             for(i = 0; i < bw; ++i) {
               tmp_r[j][i] = float_to_ubyte(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4]);
-              tmp_g[j][i] = float_to_ubyte(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4 + 1]);
+               tmp_g[j][i] = float_to_ubyte(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4 + chan2off]);
             }
          }
-         u_format_unsigned_encode_rgtc_chan(dst, tmp_r, 4, 4);
-         u_format_unsigned_encode_rgtc_chan(dst + 8, tmp_g, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst, tmp_r, 4, 4);
+         util_format_unsigned_encode_rgtc_ubyte(dst + 8, tmp_g, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
    }
 }
 
+void
+util_format_rgtc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
+{
+   util_format_rxtc2_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 1);
+}
+
 void
 util_format_rgtc2_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
 {
@@ -317,8 +322,8 @@ util_format_rgtc2_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, c
             for(i = 0; i < 4; ++i) {
                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
                uint8_t tmp_r, tmp_g;
-               u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
-               u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
+               util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
+               util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
                dst[0] = ubyte_to_float(tmp_r);
                dst[1] = ubyte_to_float(tmp_g);
                dst[2] = 0.0;
@@ -335,8 +340,8 @@ void
 util_format_rgtc2_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
 {
    uint8_t tmp_r, tmp_g;
-   u_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
-   u_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
+   util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
+   util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
    dst[0] = ubyte_to_float(tmp_r);
    dst[1] = ubyte_to_float(tmp_g);
    dst[2] = 0.0;
@@ -374,8 +379,8 @@ util_format_rgtc2_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, c
             for(i = 0; i < 4; ++i) {
                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
                int8_t tmp_r, tmp_g;
-               u_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
-               u_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
+               util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
+               util_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
                dst[0] = byte_to_float_tex(tmp_r);
                dst[1] = byte_to_float_tex(tmp_g);
                dst[2] = 0.0;
@@ -389,7 +394,7 @@ util_format_rgtc2_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, c
 }
 
 void
-util_format_rgtc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
+util_format_rxtc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height, unsigned chan2off)
 {
    const unsigned bw = 4, bh = 4, bytes_per_block = 16;
    unsigned x, y, i, j;
@@ -402,51 +407,32 @@ util_format_rgtc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, c
          for(j = 0; j < bh; ++j) {
             for(i = 0; i < bw; ++i) {
               tmp_r[j][i] = float_to_byte_tex(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4]);
-              tmp_g[j][i] = float_to_byte_tex(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4 + 1]);
+               tmp_g[j][i] = float_to_byte_tex(src_row[(y + j)*src_stride/sizeof(*src_row) + (x + i)*4 + chan2off]);
             }
          }
-         u_format_signed_encode_rgtc_chan(dst, tmp_r, 4, 4);
-         u_format_signed_encode_rgtc_chan(dst + 8, tmp_g, 4, 4);
+         util_format_signed_encode_rgtc_ubyte(dst, tmp_r, 4, 4);
+         util_format_signed_encode_rgtc_ubyte(dst + 8, tmp_g, 4, 4);
          dst += bytes_per_block;
       }
       dst_row += dst_stride / sizeof(*dst_row);
    }
 }
 
+void
+util_format_rgtc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
+{
+   util_format_rxtc2_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 1);
+}
+
 void
 util_format_rgtc2_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
 {
    int8_t tmp_r, tmp_g;
-   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2);
-   u_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2);
+   util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2);
+   util_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2);
    dst[0] = byte_to_float_tex(tmp_r);
    dst[1] = byte_to_float_tex(tmp_g);
    dst[2] = 0.0;
    dst[3] = 1.0;
 }
 
-
-#define TAG(x) u_format_unsigned_##x
-#define TYPE uint8_t
-#define T_MIN 0
-#define T_MAX 255
-
-#include "../../../mesa/main/texcompress_rgtc_tmp.h"
-
-#undef TYPE
-#undef TAG
-#undef T_MIN
-#undef T_MAX
-
-
-#define TAG(x) u_format_signed_##x
-#define TYPE int8_t
-#define T_MIN (int8_t)-128
-#define T_MAX (int8_t)127
-
-#include "../../../mesa/main/texcompress_rgtc_tmp.h"
-
-#undef TYPE
-#undef TAG
-#undef T_MIN
-#undef T_MAX