python: More efficient blits from surfaces.
C code instead of interpreted python code.
This commit is contained in:
@@ -47,6 +47,7 @@
|
|||||||
#include "cso_cache/cso_context.h"
|
#include "cso_cache/cso_context.h"
|
||||||
#include "util/u_draw_quad.h"
|
#include "util/u_draw_quad.h"
|
||||||
#include "util/u_tile.h"
|
#include "util/u_tile.h"
|
||||||
|
#include "util/u_math.h"
|
||||||
#include "tgsi/tgsi_text.h"
|
#include "tgsi/tgsi_text.h"
|
||||||
#include "tgsi/tgsi_dump.h"
|
#include "tgsi/tgsi_dump.h"
|
||||||
|
|
||||||
|
@@ -121,6 +121,50 @@
|
|||||||
pipe_put_tile_rgba($self, x, y, w, h, rgba);
|
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
|
void
|
||||||
get_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, unsigned *z) {
|
get_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, unsigned *z) {
|
||||||
pipe_get_tile_z($self, x, y, w, h, z);
|
pipe_get_tile_z($self, x, y, w, h, z);
|
||||||
|
@@ -44,20 +44,10 @@ except ImportError:
|
|||||||
|
|
||||||
|
|
||||||
def make_image(surface):
|
def make_image(surface):
|
||||||
pixels = gallium.FloatArray(surface.height*surface.width*4)
|
data = surface.get_tile_rgba8(0, 0, surface.width, surface.height)
|
||||||
surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels)
|
|
||||||
|
|
||||||
import Image
|
import Image
|
||||||
outimage = Image.new(
|
outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
|
||||||
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
|
|
||||||
return outimage
|
return outimage
|
||||||
|
|
||||||
def save_image(filename, surface):
|
def save_image(filename, surface):
|
||||||
|
@@ -31,20 +31,10 @@ from gallium import *
|
|||||||
|
|
||||||
|
|
||||||
def make_image(surface):
|
def make_image(surface):
|
||||||
pixels = FloatArray(surface.height*surface.width*4)
|
data = surface.get_tile_rgba8(0, 0, surface.width, surface.height)
|
||||||
surface.get_tile_rgba(0, 0, surface.width, surface.height, pixels)
|
|
||||||
|
|
||||||
import Image
|
import Image
|
||||||
outimage = Image.new(
|
outimage = Image.fromstring('RGBA', (surface.width, surface.height), data, "raw", 'RGBA', 0, 1)
|
||||||
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
|
|
||||||
return outimage
|
return outimage
|
||||||
|
|
||||||
def save_image(filename, surface):
|
def save_image(filename, surface):
|
||||||
|
Reference in New Issue
Block a user