python: Reimplement tile comparison in C to speed up tests.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
@@ -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)
|
||||
|
||||
if not compare_rgba(w, h, rgba, expected_rgba):
|
||||
cbuf = cbuf_tex.get_surface(usage = PIPE_BUFFER_USAGE_CPU_READ)
|
||||
|
||||
#show_image(w, h, Result=rgba, Expected=expected_rgba)
|
||||
#save_image(w, h, rgba, "result.png")
|
||||
#save_image(w, h, expected_rgba, "expected.png")
|
||||
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 float(total - different)/float(total) < 0.85:
|
||||
|
||||
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
|
||||
|
Reference in New Issue
Block a user