[PATCH weston v2 04/14] tests: Add surface checks
Daniel Stone
daniel at fooishbar.org
Fri May 15 03:12:45 PDT 2015
Hi,
On 15 May 2015 at 09:21, Bryce Harrington <bryce at osg.samsung.com> wrote:
> +/**
> + * check_surfaces_equal() - tests if two surfaces are pixel-identical
> + *
> + * Returns true if surface buffers have all the same byte values,
> + * false if the surfaces don't match or can't be compared due to
> + * different dimensions.
> + */
> +bool
> +check_surfaces_equal(const struct surface *a, const struct surface *b)
> +{
> + int y;
> + void *p, *q;
> +
> + if (a == NULL || b == NULL)
> + return false;
> + if (a->width != b->width || a->height != a->height)
> + return false;
I realise you're going to hate me here, but I have led you astray a bit ...
> + if (a->stride == b->stride) {
/* Second comparison needed to avoid checking potentially garbage
values in the padding. */
if (a->stride == b->stride && a->stride == (a->width * a->bpp))
> + printf("Checking data for equivalent strides\n");
> + return (memcmp(a->data, b->data, a->stride * a->height) == 0);
> + } else {
> + printf("Manually comparing due to differing strides\n");
> + for (y = 0; y < a->height; y++) {
> + p = a->data + (y * a->stride);
> + q = b->data + (y * b->stride);
> + if (memcmp(p, q, a->stride) != 0)
if (memcmp(p, q, a->width * a->bpp) != 0) /* don't check the garbage
values in the stride */
So sorry.
If you just fix these up (and a->bpp is actually a real thing which is
bytes per pixel), then I'm happy for it to get merged without a third
pass through the list.
> + printf("Bytewise comparison inside clip\n");
> + a_bpp = a->stride / a->width;
> + b_bpp = b->stride / b->width;
This isn't necessarily true, e.g. if you have a 1366x768 buffer padded
out to 1344px to meet a 32px alignment requirement, at 32bpp, then
deriving bpp from stride/width would give you a bpp of 3.9355.
Probably enough to get away with, but really bpp needs to come from
the format.
> + for (i=y0; i<y1; i++) {
> + p = a->data + i * a->stride + x0 * a_bpp;
> + q = b->data + i * b->stride + x0 * b_bpp;
> + if (a->stride == b->stride) {
> + if (memcmp(p, q, (x1-x0)*a_bpp) != 0) {
> + // Dump the bad row
Stray C++ comment.
> + printf("Mismatched image on row %d\n", i);
> + for (j=0; j<(x1-x0)*a_bpp; j++) {
> + a_char = *((char*)(p+j*a_bpp));
> + b_char = *((char*)(q+j*b_bpp));
> + printf("%d,%d: %8x %8x %s\n", i, j, a_char, b_char,
> + (a_char != b_char)? " <---": "");
> + }
> + return false;
> + }
> + } else {
> + /* account for bpp differences */
> + for (j=0; j<x1-x0; j++) {
> + a_char = *((char*)(p+j*a_bpp));
> + b_char = *((char*)(q+j*b_bpp));
> + if (a_char != b_char) {
> + printf("%d,%d: %8x %8x %s\n", i, j, a_char, b_char,
> + (a_char != b_char)? " <---": "");
> + return false;
> + }
> + }
> + }
Hmm, maybe a stupid question, but don't these branches fundamentally
do the same thing ... ? Except that in the 'account for bpp
differences' branch, it only iterates for as many bytes as there are
pixels to compare, which probably isn't what you want. I think the
memcmp should be perfectly sufficient, and you don't need to test the
stride at all.
Cheers,
Daniel
More information about the wayland-devel
mailing list