python: Reimplement the generation of random texture samples in C.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 16:08:06 +0000 (01:08 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 16:20:44 +0000 (01:20 +0900)
src/gallium/state_trackers/python/SConscript
src/gallium/state_trackers/python/gallium.i
src/gallium/state_trackers/python/st_sample.c [new file with mode: 0644]
src/gallium/state_trackers/python/st_sample.h [new file with mode: 0644]
src/gallium/state_trackers/python/tests/data.py [deleted file]
src/gallium/state_trackers/python/tests/texture.py

index b284d2020bcdd33e1114c1ee80c4601d6c5b8beb..973d96d55a1c0354e17113757d41258424919330 100644 (file)
@@ -20,6 +20,7 @@ if 'python' in env['statetrackers']:
         source = [
             'gallium.i',
             'st_device.c',
+            'st_sample.c',
             'st_softpipe_winsys.c',
         ],
     )
index 1c207a41b9cf892c52b74f3b9598105b8ac20449..d5b24b04ff822ea701518732b5e8678e112d2590 100644 (file)
@@ -51,6 +51,7 @@
 #include "tgsi/util/tgsi_dump.h" 
 
 #include "st_device.h"
+#include "st_sample.h"
 
 %}
 
@@ -454,6 +455,11 @@ error1:
       pipe_put_tile_z($self, x, y, w, h, z);
    }
    
+   void
+   sample_rgba(float *rgba) {
+      st_sample_surface($self, rgba);
+   }
+   
    unsigned
    compare_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba, float tol = 0.0) 
    {
diff --git a/src/gallium/state_trackers/python/st_sample.c b/src/gallium/state_trackers/python/st_sample.c
new file mode 100644 (file)
index 0000000..b47c7be
--- /dev/null
@@ -0,0 +1,548 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * 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 NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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 "pipe/p_compiler.h"
+#include "pipe/p_format.h"
+#include "pipe/p_state.h"
+#include "pipe/p_util.h"
+#include "pipe/p_inlines.h"
+#include "util/p_tile.h"
+
+#include "st_sample.h"
+
+
+/**
+ * Use our own pseudo random generator to ensure consistent runs among
+ * multiple runs and platforms.
+ * 
+ * @sa http://en.wikipedia.org/wiki/Linear_congruential_generator
+ */
+static uint32_t st_random(void) {
+   static uint64_t seed = UINT64_C(0xbb9a063afb0a739d);
+
+   seed = UINT64_C(134775813) * seed + UINT64_C(1);
+   
+   return (uint16_t)(seed >> 32); 
+}
+
+
+/**
+ * We don't want to include the patent-encumbered DXT code here, so instead
+ * we store several uncompressed/compressed data pairs for hardware testing
+ * purposes. 
+ */
+struct dxt_data
+{
+   uint8_t rgba[16*4];
+   uint8_t raw[16];
+};
+
+
+static const struct dxt_data 
+dxt1_rgb_data[] = {
+   {
+      {
+         0x99, 0xb0, 0x8e, 0xff,
+         0x5d, 0x62, 0x89, 0xff,
+         0x99, 0xb0, 0x8e, 0xff,
+         0x99, 0xb0, 0x8e, 0xff,
+         0xd6, 0xff, 0x94, 0xff,
+         0x5d, 0x62, 0x89, 0xff,
+         0x99, 0xb0, 0x8e, 0xff,
+         0xd6, 0xff, 0x94, 0xff,
+         0x5d, 0x62, 0x89, 0xff,
+         0x5d, 0x62, 0x89, 0xff,
+         0x99, 0xb0, 0x8e, 0xff,
+         0x21, 0x14, 0x84, 0xff,
+         0x5d, 0x62, 0x89, 0xff,
+         0x21, 0x14, 0x84, 0xff,
+         0x21, 0x14, 0x84, 0xff,
+         0x99, 0xb0, 0x8e, 0xff
+      },
+      {0xf2, 0xd7, 0xb0, 0x20, 0xae, 0x2c, 0x6f, 0x97}
+   },
+   {
+      {
+         0xb5, 0xcf, 0x9c, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0x21, 0x08, 0x6b, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0x52, 0x4a, 0x7b, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0xb5, 0xcf, 0x9c, 0xff,
+         0x21, 0x08, 0x6b, 0xff,
+         0xb5, 0xcf, 0x9c, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0x52, 0x4a, 0x7b, 0xff,
+         0xb5, 0xcf, 0x9c, 0xff,
+         0x83, 0x8c, 0x8b, 0xff,
+         0x52, 0x4a, 0x7b, 0xff,
+         0x83, 0x8c, 0x8b, 0xff
+      },
+      {0x73, 0xb6, 0x4d, 0x20, 0x98, 0x2b, 0xe1, 0xb8}
+   },
+   {
+      {
+         0x00, 0x2c, 0xff, 0xff,
+         0x94, 0x8d, 0x7b, 0xff,
+         0x4a, 0x5c, 0xbd, 0xff,
+         0x4a, 0x5c, 0xbd, 0xff,
+         0x4a, 0x5c, 0xbd, 0xff,
+         0x94, 0x8d, 0x7b, 0xff,
+         0x94, 0x8d, 0x7b, 0xff,
+         0x94, 0x8d, 0x7b, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0x94, 0x8d, 0x7b, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0xde, 0xbe, 0x39, 0xff,
+         0x94, 0x8d, 0x7b, 0xff
+      },
+      {0xe7, 0xdd, 0x7f, 0x01, 0xf9, 0xab, 0x08, 0x80}
+   },
+   {
+      {
+         0x6b, 0x24, 0x21, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x8b, 0x7a, 0x99, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x6b, 0x24, 0x21, 0xff,
+         0x8b, 0x7a, 0x99, 0xff,
+         0x9c, 0xa6, 0xd6, 0xff,
+         0x6b, 0x24, 0x21, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x8b, 0x7a, 0x99, 0xff,
+         0x6b, 0x24, 0x21, 0xff,
+         0x8b, 0x7a, 0x99, 0xff,
+         0x7b, 0x4f, 0x5d, 0xff,
+         0x9c, 0xa6, 0xd6, 0xff
+      },
+      {0x3a, 0x9d, 0x24, 0x69, 0xbd, 0x9f, 0xb4, 0x39}
+   }
+};
+
+
+static const struct dxt_data 
+dxt1_rgba_data[] = {
+   {
+      {
+         0x00, 0x00, 0x00, 0x00,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x29, 0xff, 0xff, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x73, 0x55, 0x21, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x4e, 0xaa, 0x90, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x4e, 0xaa, 0x90, 0xff
+      },
+      {0xff, 0x2f, 0xa4, 0x72, 0xeb, 0xb2, 0xbd, 0xbe}
+   },
+   {
+      {
+         0xb5, 0xe3, 0x63, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x6b, 0x24, 0x84, 0xff,
+         0xb5, 0xe3, 0x63, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0xb5, 0xe3, 0x63, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x6b, 0x24, 0x84, 0xff,
+         0x6b, 0x24, 0x84, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0xb5, 0xe3, 0x63, 0xff,
+         0x90, 0x83, 0x73, 0xff,
+         0xb5, 0xe3, 0x63, 0xff
+      },
+      {0x30, 0x69, 0x0c, 0xb7, 0x4d, 0xf7, 0x0f, 0x67}
+   },
+   {
+      {
+         0x00, 0x00, 0x00, 0x00,
+         0xc6, 0x86, 0x8c, 0xff,
+         0xc6, 0x86, 0x8c, 0xff,
+         0x21, 0x65, 0x42, 0xff,
+         0x21, 0x65, 0x42, 0xff,
+         0x21, 0x65, 0x42, 0xff,
+         0x21, 0x65, 0x42, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x21, 0x65, 0x42, 0xff,
+         0xc6, 0x86, 0x8c, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0xc6, 0x86, 0x8c, 0xff
+      },
+      {0x28, 0x23, 0x31, 0xc4, 0x17, 0xc0, 0xd3, 0x7f}
+   },
+   {
+      {
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0xc6, 0xe3, 0x9c, 0xff,
+         0x7b, 0x1c, 0x52, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x00, 0x00, 0x00, 0x00,
+         0x7b, 0x1c, 0x52, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0x7b, 0x1c, 0x52, 0xff,
+         0xa0, 0x7f, 0x77, 0xff,
+         0xc6, 0xe3, 0x9c, 0xff,
+         0x00, 0x00, 0x00, 0x00,
+         0xa0, 0x7f, 0x77, 0xff
+      },
+      {0xea, 0x78, 0x13, 0xc7, 0x7f, 0xfc, 0x33, 0xb6}
+   },
+};
+
+
+static const struct dxt_data 
+dxt3_rgba_data[] = {
+   {
+      {
+         0x6d, 0xc6, 0x96, 0x77,
+         0x6d, 0xc6, 0x96, 0xee,
+         0x6d, 0xc6, 0x96, 0xaa,
+         0x8c, 0xff, 0xb5, 0x44,
+         0x6d, 0xc6, 0x96, 0xff,
+         0x6d, 0xc6, 0x96, 0x88,
+         0x31, 0x55, 0x5a, 0x66,
+         0x6d, 0xc6, 0x96, 0x99,
+         0x31, 0x55, 0x5a, 0xbb,
+         0x31, 0x55, 0x5a, 0x55,
+         0x31, 0x55, 0x5a, 0x11,
+         0x6d, 0xc6, 0x96, 0xcc,
+         0x6d, 0xc6, 0x96, 0xcc,
+         0x6d, 0xc6, 0x96, 0x11,
+         0x31, 0x55, 0x5a, 0x44,
+         0x31, 0x55, 0x5a, 0x88
+      },
+      {0xe7, 0x4a, 0x8f, 0x96, 0x5b, 0xc1, 0x1c, 0x84, 0xf6, 0x8f, 0xab, 0x32, 0x2a, 0x9a, 0x95, 0x5a}
+   },
+   {
+      {
+         0xad, 0xeb, 0x73, 0x99,
+         0x97, 0xaa, 0x86, 0x66,
+         0x6b, 0x28, 0xad, 0x99,
+         0xad, 0xeb, 0x73, 0x99,
+         0x6b, 0x28, 0xad, 0x22,
+         0xad, 0xeb, 0x73, 0xff,
+         0x97, 0xaa, 0x86, 0x55,
+         0x6b, 0x28, 0xad, 0x55,
+         0x6b, 0x28, 0xad, 0x44,
+         0xad, 0xeb, 0x73, 0x33,
+         0x6b, 0x28, 0xad, 0xee,
+         0x6b, 0x28, 0xad, 0x99,
+         0x97, 0xaa, 0x86, 0x66,
+         0xad, 0xeb, 0x73, 0xbb,
+         0x97, 0xaa, 0x86, 0x99,
+         0xad, 0xeb, 0x73, 0xbb
+      },
+      {0x69, 0x99, 0xf2, 0x55, 0x34, 0x9e, 0xb6, 0xb9, 0x4e, 0xaf, 0x55, 0x69, 0x18, 0x61, 0x51, 0x22}
+   },
+   {
+      {
+         0x63, 0xd7, 0xd6, 0x00,
+         0x57, 0x62, 0x5d, 0xdd,
+         0x57, 0x62, 0x5d, 0xcc,
+         0x57, 0x62, 0x5d, 0xbb,
+         0x52, 0x28, 0x21, 0xaa,
+         0x57, 0x62, 0x5d, 0xcc,
+         0x57, 0x62, 0x5d, 0xcc,
+         0x57, 0x62, 0x5d, 0x66,
+         0x57, 0x62, 0x5d, 0x22,
+         0x57, 0x62, 0x5d, 0xdd,
+         0x63, 0xd7, 0xd6, 0xee,
+         0x57, 0x62, 0x5d, 0x33,
+         0x63, 0xd7, 0xd6, 0x55,
+         0x52, 0x28, 0x21, 0x55,
+         0x57, 0x62, 0x5d, 0x11,
+         0x5d, 0x9c, 0x99, 0xee
+      },
+      {0xd0, 0xbc, 0xca, 0x6c, 0xd2, 0x3e, 0x55, 0xe1, 0xba, 0x66, 0x44, 0x51, 0xfc, 0xfd, 0xcf, 0xb4}
+   },
+   {
+      {
+         0x94, 0x6f, 0x60, 0x22,
+         0x94, 0x6f, 0x60, 0x22,
+         0xc5, 0xab, 0x76, 0x11,
+         0xc5, 0xab, 0x76, 0xee,
+         0x63, 0x34, 0x4a, 0xdd,
+         0x63, 0x34, 0x4a, 0x33,
+         0x94, 0x6f, 0x60, 0x77,
+         0xf7, 0xe7, 0x8c, 0x00,
+         0x94, 0x6f, 0x60, 0x33,
+         0x63, 0x34, 0x4a, 0xaa,
+         0x94, 0x6f, 0x60, 0x77,
+         0x63, 0x34, 0x4a, 0xcc,
+         0x94, 0x6f, 0x60, 0xaa,
+         0xf7, 0xe7, 0x8c, 0x99,
+         0x63, 0x34, 0x4a, 0x44,
+         0xc5, 0xab, 0x76, 0xaa
+      },
+      {0x22, 0xe1, 0x3d, 0x07, 0xa3, 0xc7, 0x9a, 0xa4, 0x31, 0xf7, 0xa9, 0x61, 0xaf, 0x35, 0x77, 0x93}
+   },
+};
+
+
+static const struct dxt_data 
+dxt5_rgba_data[] = {
+   {
+      {
+         0x6d, 0xc6, 0x96, 0x74,
+         0x6d, 0xc6, 0x96, 0xf8,
+         0x6d, 0xc6, 0x96, 0xb6,
+         0x8c, 0xff, 0xb5, 0x53,
+         0x6d, 0xc6, 0x96, 0xf8,
+         0x6d, 0xc6, 0x96, 0x95,
+         0x31, 0x55, 0x5a, 0x53,
+         0x6d, 0xc6, 0x96, 0x95,
+         0x31, 0x55, 0x5a, 0xb6,
+         0x31, 0x55, 0x5a, 0x53,
+         0x31, 0x55, 0x5a, 0x11,
+         0x6d, 0xc6, 0x96, 0xd7,
+         0x6d, 0xc6, 0x96, 0xb6,
+         0x6d, 0xc6, 0x96, 0x11,
+         0x31, 0x55, 0x5a, 0x32,
+         0x31, 0x55, 0x5a, 0x95
+      },
+      {0xf8, 0x11, 0xc5, 0x0c, 0x9a, 0x73, 0xb4, 0x9c, 0xf6, 0x8f, 0xab, 0x32, 0x2a, 0x9a, 0x95, 0x5a}
+   },
+   {
+      {
+         0xad, 0xeb, 0x73, 0xa1,
+         0x97, 0xaa, 0x86, 0x65,
+         0x6b, 0x28, 0xad, 0xa1,
+         0xad, 0xeb, 0x73, 0xa1,
+         0x6b, 0x28, 0xad, 0x2a,
+         0xad, 0xeb, 0x73, 0xfb,
+         0x97, 0xaa, 0x86, 0x47,
+         0x6b, 0x28, 0xad, 0x65,
+         0x6b, 0x28, 0xad, 0x47,
+         0xad, 0xeb, 0x73, 0x47,
+         0x6b, 0x28, 0xad, 0xdd,
+         0x6b, 0x28, 0xad, 0xa1,
+         0x97, 0xaa, 0x86, 0x65,
+         0xad, 0xeb, 0x73, 0xbf,
+         0x97, 0xaa, 0x86, 0xa1,
+         0xad, 0xeb, 0x73, 0xbf
+      },
+      {0xfb, 0x2a, 0x34, 0x19, 0xdc, 0xbf, 0xe8, 0x71, 0x4e, 0xaf, 0x55, 0x69, 0x18, 0x61, 0x51, 0x22}
+   },
+   {
+      {
+         0x63, 0xd7, 0xd6, 0x00,
+         0x57, 0x62, 0x5d, 0xf5,
+         0x57, 0x62, 0x5d, 0xd2,
+         0x57, 0x62, 0x5d, 0xaf,
+         0x52, 0x28, 0x21, 0xaf,
+         0x57, 0x62, 0x5d, 0xd2,
+         0x57, 0x62, 0x5d, 0xd2,
+         0x57, 0x62, 0x5d, 0x69,
+         0x57, 0x62, 0x5d, 0x23,
+         0x57, 0x62, 0x5d, 0xd2,
+         0x63, 0xd7, 0xd6, 0xf5,
+         0x57, 0x62, 0x5d, 0x46,
+         0x63, 0xd7, 0xd6, 0x46,
+         0x52, 0x28, 0x21, 0x69,
+         0x57, 0x62, 0x5d, 0x23,
+         0x5d, 0x9c, 0x99, 0xf5
+      },
+      {0xf5, 0x00, 0x81, 0x36, 0xa9, 0x17, 0xec, 0x1e, 0xba, 0x66, 0x44, 0x51, 0xfc, 0xfd, 0xcf, 0xb4}
+   },
+   {
+      {
+         0x94, 0x6f, 0x60, 0x25,
+         0x94, 0x6f, 0x60, 0x25,
+         0xc5, 0xab, 0x76, 0x05,
+         0xc5, 0xab, 0x76, 0xe8,
+         0x63, 0x34, 0x4a, 0xe8,
+         0x63, 0x34, 0x4a, 0x25,
+         0x94, 0x6f, 0x60, 0x86,
+         0xf7, 0xe7, 0x8c, 0x05,
+         0x94, 0x6f, 0x60, 0x25,
+         0x63, 0x34, 0x4a, 0xa7,
+         0x94, 0x6f, 0x60, 0x66,
+         0x63, 0x34, 0x4a, 0xc7,
+         0x94, 0x6f, 0x60, 0xa7,
+         0xf7, 0xe7, 0x8c, 0xa7,
+         0x63, 0x34, 0x4a, 0x45,
+         0xc5, 0xab, 0x76, 0xa7
+      },
+      {0xe8, 0x05, 0x7f, 0x80, 0x33, 0x5f, 0xb5, 0x79, 0x31, 0xf7, 0xa9, 0x61, 0xaf, 0x35, 0x77, 0x93}
+   },
+};
+
+
+static INLINE void 
+st_sample_dxt_pixel_block(enum pipe_format format, 
+                          const struct pipe_format_block *block,
+                          uint8_t *raw,
+                          float *rgba, unsigned rgba_stride, 
+                          unsigned w, unsigned h)
+{
+   const struct dxt_data *data;
+   unsigned n;
+   unsigned i;
+   unsigned x, y, ch;
+   
+   switch(format) {
+   case PIPE_FORMAT_DXT1_RGB:
+      data = dxt1_rgb_data;
+      n = sizeof(dxt1_rgb_data)/sizeof(dxt1_rgb_data[0]);
+      break;
+   case PIPE_FORMAT_DXT1_RGBA:
+      data = dxt1_rgba_data;
+      n = sizeof(dxt1_rgba_data)/sizeof(dxt1_rgba_data[0]);
+      break;
+   case PIPE_FORMAT_DXT3_RGBA:
+      data = dxt3_rgba_data;
+      n = sizeof(dxt3_rgba_data)/sizeof(dxt3_rgba_data[0]);
+      break;
+   case PIPE_FORMAT_DXT5_RGBA:
+      data = dxt5_rgba_data;
+      n = sizeof(dxt5_rgba_data)/sizeof(dxt5_rgba_data[0]);
+      break;
+   default:
+      assert(0);
+   }
+   
+   i = st_random() % n;
+   
+   for(y = 0; y < h; ++y)
+      for(x = 0; x < w; ++x)
+         for(ch = 0; ch < 4; ++ch)
+            rgba[y*rgba_stride + x*4 + ch] = (float)(data[i].rgba[y*4*4 + x*4 + ch])/255.0f;
+   
+   memcpy(raw, data[i].raw, block->size);
+}
+
+
+static INLINE void 
+st_sample_generic_pixel_block(enum pipe_format format, 
+                              const struct pipe_format_block *block,
+                              uint8_t *raw,
+                              float *rgba, unsigned rgba_stride,
+                              unsigned w, unsigned h)
+{
+   unsigned i;
+   unsigned x, y, ch;
+   
+   for(i = 0; i < block->size; ++i)
+      raw[i] = (uint8_t)st_random();
+   
+   
+   pipe_tile_raw_to_rgba(format,
+                         raw,
+                         w, h,
+                         rgba, rgba_stride);
+   if(format == PIPE_FORMAT_YCBCR || format == PIPE_FORMAT_YCBCR_REV) {
+      for(y = 0; y < h; ++y) {
+         for(x = 0; x < w; ++x) {
+            for(ch = 0; ch < 4; ++ch) {
+               unsigned offset = y*rgba_stride + x*4 + ch;
+               rgba[offset] = CLAMP(rgba[offset], 0.0f, 1.0f);
+            }
+         }
+      }
+   }
+}
+
+
+/**
+ * Randomly sample pixels.
+ */
+void 
+st_sample_pixel_block(enum pipe_format format,
+                      const struct pipe_format_block *block,
+                      void *raw,
+                      float *rgba, unsigned rgba_stride,
+                      unsigned w, unsigned h)
+{
+   switch(format) {
+   case PIPE_FORMAT_DXT1_RGB:
+   case PIPE_FORMAT_DXT1_RGBA:
+   case PIPE_FORMAT_DXT3_RGBA:
+   case PIPE_FORMAT_DXT5_RGBA:
+      st_sample_dxt_pixel_block(format, block, raw, rgba, rgba_stride, w, h);
+      break;
+
+   default:
+      st_sample_generic_pixel_block(format, block, raw, rgba, rgba_stride, w, h);
+      break;
+   }
+}
+
+
+void
+st_sample_surface(struct pipe_surface *surface, float *rgba) 
+{
+   const struct pipe_format_block *block = &surface->block;
+   unsigned rgba_stride = surface->width*4;
+   void *raw;
+   unsigned x, y;
+
+   raw = pipe_surface_map(surface, PIPE_BUFFER_USAGE_CPU_READ);
+   if(!raw)
+      return;
+
+   for (y = 0; y < surface->nblocksy; ++y) {
+      for(x = 0; x < surface->nblocksx; ++x) {
+         st_sample_pixel_block(surface->format,
+                               block,
+                               (uint8_t*)raw + y*surface->stride + x*block->size, 
+                               rgba + y*block->height*rgba_stride + x*block->width*4,
+                               rgba_stride,
+                               MIN2(block->width, surface->width - x*block->width), 
+                               MIN2(block->height, surface->height - y*block->height));
+       }
+   }
+   
+   pipe_surface_unmap(surface);
+}
diff --git a/src/gallium/state_trackers/python/st_sample.h b/src/gallium/state_trackers/python/st_sample.h
new file mode 100644 (file)
index 0000000..ff04a12
--- /dev/null
@@ -0,0 +1,47 @@
+/**************************************************************************
+ * 
+ * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * 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 NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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.
+ * 
+ **************************************************************************/
+
+
+#ifndef ST_SAMPLE_H_
+#define ST_SAMPLE_H_
+
+
+#include "pipe/p_format.h"
+
+
+void 
+st_sample_pixel_block(enum pipe_format format,
+                      const struct pipe_format_block *block,
+                      void *raw,
+                      float *rgba, unsigned rgba_stride,
+                      unsigned w, unsigned h);
+
+void
+st_sample_surface(struct pipe_surface *surface, float *rgba);
+
+
+#endif /* ST_SAMPLE_H_ */
diff --git a/src/gallium/state_trackers/python/tests/data.py b/src/gallium/state_trackers/python/tests/data.py
deleted file mode 100644 (file)
index 3c1cda5..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-#!/usr/bin/env python
-##########################################################################
-# 
-# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
-# All Rights Reserved.
-# 
-# Permission is hereby granted, free of charge, to any person obtaining a
-# copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sub license, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-# 
-# The above copyright notice and this permission notice (including the
-# next paragraph) shall be included in all copies or substantial portions
-# of the Software.
-# 
-# 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 NON-INFRINGEMENT.
-# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS 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.
-# 
-##########################################################################
-
-"""Texture data generation for use in testing."""
-
-
-import random
-
-from gallium import *
-
-
-dxt1_rgb_data = [
-    (
-        [
-            [0x99, 0xb0, 0x8e, 0xff],
-            [0x5d, 0x62, 0x89, 0xff],
-            [0x99, 0xb0, 0x8e, 0xff],
-            [0x99, 0xb0, 0x8e, 0xff],
-            [0xd6, 0xff, 0x94, 0xff],
-            [0x5d, 0x62, 0x89, 0xff],
-            [0x99, 0xb0, 0x8e, 0xff],
-            [0xd6, 0xff, 0x94, 0xff],
-            [0x5d, 0x62, 0x89, 0xff],
-            [0x5d, 0x62, 0x89, 0xff],
-            [0x99, 0xb0, 0x8e, 0xff],
-            [0x21, 0x14, 0x84, 0xff],
-            [0x5d, 0x62, 0x89, 0xff],
-            [0x21, 0x14, 0x84, 0xff],
-            [0x21, 0x14, 0x84, 0xff],
-            [0x99, 0xb0, 0x8e, 0xff],
-        ],
-        [0xf2, 0xd7, 0xb0, 0x20, 0xae, 0x2c, 0x6f, 0x97],
-    ),
-    (
-        [
-            [0xb5, 0xcf, 0x9c, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0x21, 0x08, 0x6b, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0x52, 0x4a, 0x7b, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0xb5, 0xcf, 0x9c, 0xff],
-            [0x21, 0x08, 0x6b, 0xff],
-            [0xb5, 0xcf, 0x9c, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0x52, 0x4a, 0x7b, 0xff],
-            [0xb5, 0xcf, 0x9c, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-            [0x52, 0x4a, 0x7b, 0xff],
-            [0x83, 0x8c, 0x8b, 0xff],
-        ],
-        [0x73, 0xb6, 0x4d, 0x20, 0x98, 0x2b, 0xe1, 0xb8],
-    ),
-    (
-        [
-            [0x00, 0x2c, 0xff, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-            [0x4a, 0x5c, 0xbd, 0xff],
-            [0x4a, 0x5c, 0xbd, 0xff],
-            [0x4a, 0x5c, 0xbd, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0xde, 0xbe, 0x39, 0xff],
-            [0x94, 0x8d, 0x7b, 0xff],
-        ],
-        [0xe7, 0xdd, 0x7f, 0x01, 0xf9, 0xab, 0x08, 0x80],
-    ),
-    (
-        [
-            [0x6b, 0x24, 0x21, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x8b, 0x7a, 0x99, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x6b, 0x24, 0x21, 0xff],
-            [0x8b, 0x7a, 0x99, 0xff],
-            [0x9c, 0xa6, 0xd6, 0xff],
-            [0x6b, 0x24, 0x21, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x8b, 0x7a, 0x99, 0xff],
-            [0x6b, 0x24, 0x21, 0xff],
-            [0x8b, 0x7a, 0x99, 0xff],
-            [0x7b, 0x4f, 0x5d, 0xff],
-            [0x9c, 0xa6, 0xd6, 0xff],
-        ],
-        [0x3a, 0x9d, 0x24, 0x69, 0xbd, 0x9f, 0xb4, 0x39],
-    ),
-]
-
-dxt1_rgba = [
-    (
-        [
-            [0x00, 0x00, 0x00, 0x00],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x29, 0xff, 0xff, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x73, 0x55, 0x21, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x4e, 0xaa, 0x90, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x4e, 0xaa, 0x90, 0xff],
-        ],
-        [0xff, 0x2f, 0xa4, 0x72, 0xeb, 0xb2, 0xbd, 0xbe],
-    ),
-    (
-        [
-            [0xb5, 0xe3, 0x63, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x6b, 0x24, 0x84, 0xff],
-            [0xb5, 0xe3, 0x63, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0xb5, 0xe3, 0x63, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x6b, 0x24, 0x84, 0xff],
-            [0x6b, 0x24, 0x84, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0xb5, 0xe3, 0x63, 0xff],
-            [0x90, 0x83, 0x73, 0xff],
-            [0xb5, 0xe3, 0x63, 0xff],
-        ],
-        [0x30, 0x69, 0x0c, 0xb7, 0x4d, 0xf7, 0x0f, 0x67],
-    ),
-    (
-        [
-            [0x00, 0x00, 0x00, 0x00],
-            [0xc6, 0x86, 0x8c, 0xff],
-            [0xc6, 0x86, 0x8c, 0xff],
-            [0x21, 0x65, 0x42, 0xff],
-            [0x21, 0x65, 0x42, 0xff],
-            [0x21, 0x65, 0x42, 0xff],
-            [0x21, 0x65, 0x42, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x21, 0x65, 0x42, 0xff],
-            [0xc6, 0x86, 0x8c, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0xc6, 0x86, 0x8c, 0xff],
-        ],
-        [0x28, 0x23, 0x31, 0xc4, 0x17, 0xc0, 0xd3, 0x7f],
-    ),
-    (
-        [
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0xc6, 0xe3, 0x9c, 0xff],
-            [0x7b, 0x1c, 0x52, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x7b, 0x1c, 0x52, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0x7b, 0x1c, 0x52, 0xff],
-            [0xa0, 0x7f, 0x77, 0xff],
-            [0xc6, 0xe3, 0x9c, 0xff],
-            [0x00, 0x00, 0x00, 0x00],
-            [0xa0, 0x7f, 0x77, 0xff],
-        ],
-        [0xea, 0x78, 0x13, 0xc7, 0x7f, 0xfc, 0x33, 0xb6],
-    ),
-]
-
-
-
-def generate_data_compressed(surface, blocks):
-    
-    stride = surface.nblocksx*surface.block.size
-    size = surface.nblocksy*stride
-
-    raw = ByteArray(size)
-    rgba = FloatArray(surface.height*surface.width*4)
-    
-    for yj in range(0, surface.nblocksy):
-        for xj in range(0, surface.nblocksx):
-            pixels, block = blocks[random.randint(0, len(blocks) - 1)]
-            
-            offset = (yj*surface.nblocksx + xj)*surface.block.size
-            for i in range(0, surface.block.size):
-                raw[offset + i] = block[i]
-            
-            for yi in range(0, surface.block.height):
-                for xi in range(0, surface.block.width):
-                    y = yj*surface.block.height + yi
-                    x = xj*surface.block.width + xi
-                    if y < surface.height and x < surface.width:
-                        offset = (y*surface.width + x)*4 
-                        pixel = pixels[yi*surface.block.width + xi]
-                        for ch in range(0, 4):
-                            rgba[offset + ch] = float(pixel[ch])/255.0
-    
-    surface.put_tile_raw(0, 0, surface.width, surface.height, raw, stride)
-
-    return rgba
-
-
-def generate_data_simple(surface):
-    stride = surface.nblocksx*surface.block.size
-    size = surface.nblocksy*stride
-    
-    raw = ByteArray(size)
-    rgba = FloatArray(surface.height*surface.width*4)
-    
-    for i in range(0, size):
-        raw[i] = random.randint(0, 255)
-        
-    surface.put_tile_raw(0, 0, surface.width, surface.height, raw, stride)
-    
-    surface.get_tile_rgba(0, 0, surface.width, surface.height, rgba)
-    
-    if surface.format in (PIPE_FORMAT_YCBCR, PIPE_FORMAT_YCBCR_REV):
-        # normalize
-        for y in range(0, surface.height):
-            for x in range(0, surface.width):
-                for ch in range(4):
-                    offset = (y*surface.width + x)*4 + ch
-                    rgba[offset] = min(max(rgba[offset], 0.0), 1.0)
-    
-    return rgba
-
-
-def generate_data(surface):
-    width = surface.width
-    height = surface.height
-    
-    if surface.format == PIPE_FORMAT_DXT1_RGB:
-        return generate_data_compressed(surface, dxt1_rgb_data)
-    if surface.format == PIPE_FORMAT_DXT1_RGBA:
-        return generate_data_compressed(surface, dxt1_rgba_data)
-    if surface.format == PIPE_FORMAT_DXT3_RGBA:
-        assert 0
-    if surface.format == PIPE_FORMAT_DXT5_RGBA:
-        assert 0
-
-    return generate_data_simple(surface)
-
-
-
index 3d76953126988baba01534c5d564e53babbe9562..2c9231349f41f82738eb4335a87c7ee7680f5d62 100644 (file)
 import sys
 from gallium import *
 from base import *
-from data import generate_data
-
-
-def compare_rgba(width, height, rgba1, rgba2, tol=4.0/256, ratio=0.85):
-    errors = 0
-    for y in range(0, height):
-        for x in range(0, width):
-            differs = 0
-            for ch in range(4):
-                offset = (y*width + x)*4 + ch
-                v1 = rgba1[offset]
-                v2 = rgba2[offset]
-                if abs(v1 - v2) > tol:
-                    if errors == 0:
-                        sys.stderr.write("x=%u, y=%u, ch=%u differ: %f vs %f\n" % (x, y, ch, v1, v2))
-                    if errors == 1 and ch == 0:
-                        sys.stderr.write("...\n")
-                    differs = 1
-            errors += differs
-    total = height*width
-    if errors:
-        sys.stderr.write("%u out of %u pixels differ\n" % (errors, total))
-    return float(total - errors)/float(total) >= ratio 
 
 
 def lods(*dims):
@@ -214,10 +191,12 @@ class TextureTest(TestCase):
                                      height=height,
                                      last_level = last_level)
         
-        expected_rgba = generate_data(texture.get_surface(
+        expected_rgba = FloatArray(height*width*4) 
+        texture.get_surface(
             usage = PIPE_BUFFER_USAGE_CPU_READ|PIPE_BUFFER_USAGE_CPU_WRITE,
             face = face,
-            level = level))
+            level = level,
+        ).sample_rgba(expected_rgba)
         
         ctx.set_sampler_texture(0, texture)