python: Reimplement tile comparison in C to speed up tests.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 01:27:10 +0000 (10:27 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 17 Jul 2008 16:20:44 +0000 (01:20 +0900)
src/gallium/state_trackers/python/gallium.i
src/gallium/state_trackers/python/tests/texture.py

index fe0afb18a908d34364e53a0fe95b15ee6d1d0996..1c207a41b9cf892c52b74f3b9598105b8ac20449 100644 (file)
@@ -425,23 +425,23 @@ error1:
    void unmap( void );
 
    void
-   get_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, unsigned char *p, unsigned stride) {
-      pipe_get_tile_raw($self, x, y, w, h, p, stride);
+   get_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, unsigned char *raw, unsigned stride) {
+      pipe_get_tile_raw($self, x, y, w, h, raw, stride);
    }
 
    void
-   put_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned char *p, unsigned stride) {
-      pipe_put_tile_raw($self, x, y, w, h, p, stride);
+   put_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned char *raw, unsigned stride) {
+      pipe_put_tile_raw($self, x, y, w, h, raw, stride);
    }
 
    void
-   get_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, float *p) {
-      pipe_get_tile_rgba($self, x, y, w, h, p);
+   get_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, float *rgba) {
+      pipe_get_tile_rgba($self, x, y, w, h, rgba);
    }
 
    void
-   put_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *p) {
-      pipe_put_tile_rgba($self, x, y, w, h, p);
+   put_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba) {
+      pipe_put_tile_rgba($self, x, y, w, h, rgba);
    }
 
    void
@@ -454,6 +454,38 @@ error1:
       pipe_put_tile_z($self, x, y, w, h, z);
    }
    
+   unsigned
+   compare_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba, float tol = 0.0) 
+   {
+      float *rgba2;
+      const float *p1;
+      const float *p2;
+      unsigned i, j, n;
+      
+      rgba2 = MALLOC(h*w*4*sizeof(float));
+      if(!rgba2)
+         return ~0;
+
+      pipe_get_tile_rgba($self, x, y, w, h, rgba2);
+
+      p1 = rgba;
+      p2 = rgba2;
+      n = 0;
+      for(i = h*w; i; --i) {
+         unsigned differs = 0;
+         for(j = 4; j; --j) {
+            float delta = *p2++ - *p1++;
+            if (delta < -tol || delta > tol)
+                differs = 1;
+         }
+         n += differs;
+      }
+      
+      FREE(rgba2);
+      
+      return n;
+   }
+
 };
 
 
index edaa2b8b26f09793ac34dbaaaa21fa2d58337573..3d76953126988baba01534c5d564e53babbe9562 100644 (file)
@@ -304,15 +304,21 @@ class TextureTest(TestCase):
     
         ctx.flush()
     
-        rgba = FloatArray(h*w*4)
-
-        cbuf_tex.get_surface(usage = PIPE_BUFFER_USAGE_CPU_READ).get_tile_rgba(x, y, w, h, rgba)
+        cbuf = cbuf_tex.get_surface(usage = PIPE_BUFFER_USAGE_CPU_READ)
+        
+        total = h*w
+        different = cbuf.compare_tile_rgba(x, y, w, h, expected_rgba, tol=4.0/256)
+        if different:
+            sys.stderr.write("%u out of %u pixels differ\n" % (different, total))
 
-        if not compare_rgba(w, h, rgba, expected_rgba):
+        if float(total - different)/float(total) < 0.85:
         
-            #show_image(w, h, Result=rgba, Expected=expected_rgba)
-            #save_image(w, h, rgba, "result.png")
-            #save_image(w, h, expected_rgba, "expected.png")
+            if 0:
+                rgba = FloatArray(h*w*4)
+                cbuf.get_tile_rgba(x, y, w, h, rgba)
+                show_image(w, h, Result=rgba, Expected=expected_rgba)
+                save_image(w, h, rgba, "result.png")
+                save_image(w, h, expected_rgba, "expected.png")
             #sys.exit(0)
             
             raise TestFailure