Mesa (master): python: More efficient blits from surfaces.

Jose Fonseca jrfonseca at kemper.freedesktop.org
Mon Feb 23 17:21:44 UTC 2009


Module: Mesa
Branch: master
Commit: 60e35ebf1476c31eb5d7c207ab8e9db77fcad896
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=60e35ebf1476c31eb5d7c207ab8e9db77fcad896

Author: José Fonseca <jfonseca at vmware.com>
Date:   Fri Feb 20 16:50:02 2009 +0000

python: More efficient blits from surfaces.

C code instead of interpreted python code.

---

 src/gallium/state_trackers/python/gallium.i        |    1 +
 src/gallium/state_trackers/python/p_texture.i      |   44 ++++++++++++++++++++
 .../state_trackers/python/retrace/interpreter.py   |   14 +-----
 src/gallium/state_trackers/python/samples/tri.py   |   14 +-----
 4 files changed, 49 insertions(+), 24 deletions(-)

diff --git a/src/gallium/state_trackers/python/gallium.i b/src/gallium/state_trackers/python/gallium.i
index f4c4b36..bd30d90 100644
--- a/src/gallium/state_trackers/python/gallium.i
+++ b/src/gallium/state_trackers/python/gallium.i
@@ -47,6 +47,7 @@
 #include "cso_cache/cso_context.h"
 #include "util/u_draw_quad.h" 
 #include "util/u_tile.h" 
+#include "util/u_math.h" 
 #include "tgsi/tgsi_text.h" 
 #include "tgsi/tgsi_dump.h" 
 
diff --git a/src/gallium/state_trackers/python/p_texture.i b/src/gallium/state_trackers/python/p_texture.i
index 08ba0eb..9396522 100644
--- a/src/gallium/state_trackers/python/p_texture.i
+++ b/src/gallium/state_trackers/python/p_texture.i
@@ -121,6 +121,50 @@
       pipe_put_tile_rgba($self, x, y, w, h, rgba);
    }
 
+   %cstring_output_allocate_size(char **STRING, int *LENGTH, free(*$1));
+   void
+   get_tile_rgba8(unsigned x, unsigned y, unsigned w, unsigned h, char **STRING, int *LENGTH) 
+   {
+      unsigned surface_usage;
+      float *rgba;
+      unsigned char *rgba8;
+      unsigned i, j, k;
+
+      *LENGTH = 0;
+      *STRING = NULL;
+      
+      if (!$self)
+         return;
+
+      *LENGTH = h*w*4;
+      *STRING = (char *) malloc(*LENGTH);
+      if(!*STRING)
+         return;
+      
+      rgba = malloc(w*4*sizeof(float));
+      if(!rgba)
+         return;
+      
+      rgba8 = (unsigned char *) *STRING;
+
+      /* XXX: force mappable surface */
+      surface_usage = $self->usage;
+      $self->usage |= PIPE_BUFFER_USAGE_CPU_READ;
+
+      for(j = 0; j < h; ++j) {
+         pipe_get_tile_rgba($self,
+                            x, y + j, w, 1,
+                            rgba);
+         for(i = 0; i < w; ++i)
+            for(k = 0; k <4; ++k)
+               rgba8[j*w*4 + i*4 + k] = float_to_ubyte(rgba[i*4 + k]);
+      }
+      
+      $self->usage = surface_usage;
+      
+      free(rgba);
+   }
+
    void
    get_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, unsigned *z) {
       pipe_get_tile_z($self, x, y, w, h, z);
diff --git a/src/gallium/state_trackers/python/retrace/interpreter.py b/src/gallium/state_trackers/python/retrace/interpreter.py
index 2a75ee8..e6999a2 100755
--- a/src/gallium/state_trackers/python/retrace/interpreter.py
+++ b/src/gallium/state_trackers/python/retrace/interpreter.py
@@ -44,20 +44,10 @@ except ImportError:
 
 
 def make_image(surface):
-    pixels = gallium.FloatArray(surface.height*surface.width*4)
-    surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels)
+    data = surface.get_tile_rgba8(0, 0, surface.width, surface.height)
 
     import Image
-    outimage = Image.new(
-        mode='RGB',
-        size=(surface.width, surface.height),
-        color=(0,0,0))
-    outpixels = outimage.load()
-    for y in range(0, surface.height):
-        for x in range(0, surface.width):
-            offset = (y*surface.width + x)*4
-            r, g, b, a = [int(pixels[offset + ch]*255) for ch in range(4)]
-            outpixels[x, y] = r, g, b
+    outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
     return outimage
 
 def save_image(filename, surface):
diff --git a/src/gallium/state_trackers/python/samples/tri.py b/src/gallium/state_trackers/python/samples/tri.py
index 193479f..d3ccb6c 100644
--- a/src/gallium/state_trackers/python/samples/tri.py
+++ b/src/gallium/state_trackers/python/samples/tri.py
@@ -31,20 +31,10 @@ from gallium import *
 
 
 def make_image(surface):
-    pixels = FloatArray(surface.height*surface.width*4)
-    surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels)
+    data = surface.get_tile_rgba8(0, 0, surface.width, surface.height)
 
     import Image
-    outimage = Image.new(
-        mode='RGB',
-        size=(surface.width, surface.height),
-        color=(0,0,0))
-    outpixels = outimage.load()
-    for y in range(0, surface.height):
-        for x in range(0, surface.width):
-            offset = (y*surface.width + x)*4
-            r, g, b, a = [int(pixels[offset + ch]*255) for ch in range(4)]
-            outpixels[x, y] = r, g, b
+    outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
     return outimage
 
 def save_image(filename, surface):




More information about the mesa-commit mailing list