util: Add dedicated depth-stencil packing/unpacking functions.
[mesa.git] / progs / gallium / unit / u_format_test.c
index 2fb7badd6295f5c15f6749107be96486526439f1..d404fb598bc92752311e886919bbf52d9bc9d95e 100644 (file)
 #include <stdio.h>
 #include <float.h>
 
+#include "util/u_half.h"
 #include "util/u_format.h"
 #include "util/u_format_tests.h"
+#include "util/u_format_s3tc.h"
 
 
 static boolean
@@ -92,7 +94,7 @@ print_unpacked_doubl(const struct util_format_description *format_desc,
 static void
 print_unpacked_float(const struct util_format_description *format_desc,
                      const char *prefix,
-                     const float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
+                     float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
                      const char *suffix)
 {
    unsigned i, j;
@@ -113,7 +115,7 @@ print_unpacked_float(const struct util_format_description *format_desc,
 static void
 print_unpacked_8unorm(const struct util_format_description *format_desc,
                       const char *prefix,
-                      const uint8_t unpacked[][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
+                      uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4],
                       const char *suffix)
 {
    unsigned i, j;
@@ -131,17 +133,17 @@ print_unpacked_8unorm(const struct util_format_description *format_desc,
 
 
 static boolean
-test_format_fetch_float(const struct util_format_description *format_desc,
-                        const struct util_format_test_case *test)
+test_format_fetch_rgba_float(const struct util_format_description *format_desc,
+                             const struct util_format_test_case *test)
 {
-   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
+   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
    unsigned i, j, k;
    boolean success;
 
    success = TRUE;
    for (i = 0; i < format_desc->block.height; ++i) {
       for (j = 0; j < format_desc->block.width; ++j) {
-         format_desc->fetch_float(unpacked[i][j], test->packed, j, i);
+         format_desc->fetch_rgba_float(unpacked[i][j], test->packed, j, i);
          for (k = 0; k < 4; ++k) {
             if (!compare_float(test->unpacked[i][j][k], unpacked[i][j][k])) {
                success = FALSE;
@@ -160,14 +162,16 @@ test_format_fetch_float(const struct util_format_description *format_desc,
 
 
 static boolean
-test_format_unpack_float(const struct util_format_description *format_desc,
-                         const struct util_format_test_case *test)
+test_format_unpack_rgba_float(const struct util_format_description *format_desc,
+                              const struct util_format_test_case *test)
 {
-   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
+   float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
    unsigned i, j, k;
    boolean success;
 
-   format_desc->unpack_float(&unpacked[0][0][0], sizeof unpacked[0], test->packed, 0, format_desc->block.width, format_desc->block.height);
+   format_desc->unpack_rgba_float(&unpacked[0][0][0], sizeof unpacked[0],
+                             test->packed, 0,
+                             format_desc->block.width, format_desc->block.height);
 
    success = TRUE;
    for (i = 0; i < format_desc->block.height; ++i) {
@@ -191,8 +195,8 @@ test_format_unpack_float(const struct util_format_description *format_desc,
 
 static boolean
 
-test_format_pack_float(const struct util_format_description *format_desc,
-                       const struct util_format_test_case *test)
+test_format_pack_rgba_float(const struct util_format_description *format_desc,
+                            const struct util_format_test_case *test)
 {
    float unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
    uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
@@ -217,7 +221,9 @@ test_format_pack_float(const struct util_format_description *format_desc,
       }
    }
 
-   format_desc->pack_float(packed, 0, &unpacked[0][0][0], sizeof unpacked[0], format_desc->block.width, format_desc->block.height);
+   format_desc->pack_rgba_float(packed, 0,
+                           &unpacked[0][0][0], sizeof unpacked[0],
+                           format_desc->block.width, format_desc->block.height);
 
    success = TRUE;
    for (i = 0; i < format_desc->block.bits/8; ++i)
@@ -258,15 +264,17 @@ convert_float_to_8unorm(uint8_t *dst, const double *src)
 
 
 static boolean
-test_format_unpack_8unorm(const struct util_format_description *format_desc,
-                          const struct util_format_test_case *test)
+test_format_unpack_rgba_8unorm(const struct util_format_description *format_desc,
+                               const struct util_format_test_case *test)
 {
-   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
-   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
+   uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
+   uint8_t expected[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4] = { { { 0 } } };
    unsigned i, j, k;
    boolean success;
 
-   format_desc->unpack_8unorm(&unpacked[0][0][0], sizeof unpacked[0], test->packed, 0, 1, 1);
+   format_desc->unpack_rgba_8unorm(&unpacked[0][0][0], sizeof unpacked[0],
+                              test->packed, 0,
+                              format_desc->block.width, format_desc->block.height);
 
    convert_float_to_8unorm(&expected[0][0][0], &test->unpacked[0][0][0]);
 
@@ -291,8 +299,8 @@ test_format_unpack_8unorm(const struct util_format_description *format_desc,
 
 
 static boolean
-test_format_pack_8unorm(const struct util_format_description *format_desc,
-                        const struct util_format_test_case *test)
+test_format_pack_rgba_8unorm(const struct util_format_description *format_desc,
+                             const struct util_format_test_case *test)
 {
    uint8_t unpacked[UTIL_FORMAT_MAX_UNPACKED_HEIGHT][UTIL_FORMAT_MAX_UNPACKED_WIDTH][4];
    uint8_t packed[UTIL_FORMAT_MAX_PACKED_BYTES];
@@ -317,7 +325,9 @@ test_format_pack_8unorm(const struct util_format_description *format_desc,
 
    memset(packed, 0, sizeof packed);
 
-   format_desc->pack_8unorm(packed, 0, &unpacked[0][0][0], sizeof unpacked[0], 1, 1);
+   format_desc->pack_rgba_8unorm(packed, 0,
+                            &unpacked[0][0][0], sizeof unpacked[0],
+                            format_desc->block.width, format_desc->block.height);
 
    success = TRUE;
    for (i = 0; i < format_desc->block.bits/8; ++i)
@@ -352,8 +362,10 @@ test_one(test_func_t func, const char *suffix)
 
       format_desc = util_format_description(test->format);
 
-      if (!util_format_is_supported(test->format))
+      if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC &&
+          !util_format_s3tc_enabled) {
          skip = TRUE;
+      }
 
       if (test->format != last_format) {
          printf("%s util_format_%s_%s ...\n",
@@ -377,19 +389,19 @@ test_all(void)
 {
    bool success = TRUE;
 
-   if (!test_one(&test_format_fetch_float, "fetch_float"))
+   if (!test_one(&test_format_fetch_rgba_float, "fetch_rgba_float"))
      success = FALSE;
 
-   if (!test_one(&test_format_pack_float, "pack_float"))
+   if (!test_one(&test_format_pack_rgba_float, "pack_rgba_float"))
      success = FALSE;
 
-   if (!test_one(&test_format_unpack_float, "unpack_float"))
+   if (!test_one(&test_format_unpack_rgba_float, "unpack_rgba_float"))
      success = FALSE;
 
-   if (!test_one(&test_format_pack_8unorm, "pack_8unorm"))
+   if (!test_one(&test_format_pack_rgba_8unorm, "pack_rgba_8unorm"))
      success = FALSE;
 
-   if (!test_one(&test_format_unpack_8unorm, "unpack_8unorm"))
+   if (!test_one(&test_format_unpack_rgba_8unorm, "unpack_rgba_8unorm"))
      success = FALSE;
 
    return success;
@@ -400,6 +412,8 @@ int main(int argc, char **argv)
 {
    boolean success;
 
+   util_format_s3tc_init();
+
    success = test_all();
 
    return success ? 0 : 1;