[Intel-gfx] [Intel gfx][i-g-t PATCH 1/4] tests: add gem_media_fill

Xiang, Haihao haihao.xiang at intel.com
Mon Dec 2 02:06:55 CET 2013


On Fri, 2013-11-29 at 09:02 +0100, Daniel Vetter wrote: 
> On Fri, Nov 29, 2013 at 02:57:13PM +0800, Xiang, Haihao wrote:
> > From: "Xiang, Haihao" <haihao.xiang at intel.com>
> > 
> > It is to check whether media pipeline on render ring works. Codes
> > are copied and modified from the rendercopy case which uses 3D pipeline.
> > However media pipeline is simpler than 3D pipeline and there is few changes
> > between gen6,gen7 and gen8
> > 
> > Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
> 
> Really awesome. This should also help in writing crazy multi-ring tests
> which check correctness. I don't have any clue about media stuff, so
> please let someone else from your team quickly review it before you push.
> Otherwise lgtm.

Thanks for your comments. I will fix the issue Yakui pointed out first
then push the code.


> -Daniel
> 
> > ---
> >  lib/Makefile.sources   |    2 +
> >  lib/media_fill.c       |    9 ++++
> >  lib/media_fill.h       |   50 ++++++++++++++++++
> >  tests/Makefile.sources |    1 +
> >  tests/gem_media_fill.c |  132 ++++++++++++++++++++++++++++++++++++++++++++++++
> >  5 files changed, 194 insertions(+)
> >  create mode 100644 lib/media_fill.c
> >  create mode 100644 lib/media_fill.h
> >  create mode 100644 tests/gem_media_fill.c
> > 
> > diff --git a/lib/Makefile.sources b/lib/Makefile.sources
> > index 699621b..cad238a 100644
> > --- a/lib/Makefile.sources
> > +++ b/lib/Makefile.sources
> > @@ -19,6 +19,8 @@ libintel_tools_la_SOURCES = 	\
> >  	intel_mmio.c		\
> >  	intel_pci.c		\
> >  	intel_reg.h		\
> > +	media_fill.c            \
> > +	media_fill.h            \
> >  	rendercopy_i915.c	\
> >  	rendercopy_i830.c	\
> >  	gen6_render.h		\
> > diff --git a/lib/media_fill.c b/lib/media_fill.c
> > new file mode 100644
> > index 0000000..8ee5db6
> > --- /dev/null
> > +++ b/lib/media_fill.c
> > @@ -0,0 +1,9 @@
> > +#include "i830_reg.h"
> > +#include "media_fill.h"
> > +
> > +media_fillfunc_t get_media_fillfunc(int devid)
> > +{
> > +	media_fillfunc_t fill = NULL;
> > +
> > +	return fill;
> > +}
> > diff --git a/lib/media_fill.h b/lib/media_fill.h
> > new file mode 100644
> > index 0000000..2e058cb
> > --- /dev/null
> > +++ b/lib/media_fill.h
> > @@ -0,0 +1,50 @@
> > +#ifndef RENDE_MEDIA_FILL_H
> > +#define RENDE_MEDIA_FILL_H
> > +
> > +#include <stdlib.h>
> > +#include <sys/ioctl.h>
> > +#include <stdio.h>
> > +#include <string.h>
> > +#include <assert.h>
> > +#include <fcntl.h>
> > +#include <inttypes.h>
> > +#include <errno.h>
> > +#include <sys/stat.h>
> > +#include <sys/time.h>
> > +#include <getopt.h>
> > +#include "drm.h"
> > +#include "i915_drm.h"
> > +#include "drmtest.h"
> > +#include "intel_bufmgr.h"
> > +#include "intel_batchbuffer.h"
> > +#include "intel_gpu_tools.h"
> > +
> > +struct scratch_buf {
> > +    drm_intel_bo *bo;
> > +    uint32_t stride;
> > +    uint32_t tiling;
> > +    uint32_t *data;
> > +    uint32_t *cpu_mapping;
> > +    uint32_t size;
> > +    unsigned num_tiles;
> > +};
> > +
> > +static inline unsigned buf_width(struct scratch_buf *buf)
> > +{
> > +	return buf->stride/sizeof(uint8_t);
> > +}
> > +
> > +static inline unsigned buf_height(struct scratch_buf *buf)
> > +{
> > +	return buf->size/buf->stride;
> > +}
> > +
> > +typedef void (*media_fillfunc_t)(struct intel_batchbuffer *batch,
> > +				struct scratch_buf *dst,
> > +				unsigned x, unsigned y,
> > +				unsigned width, unsigned height,
> > +				uint8_t color);
> > +
> > +media_fillfunc_t get_media_fillfunc(int devid);
> > +
> > +#endif /* RENDE_MEDIA_FILL_H */
> > diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> > index d201809..0ff0e37 100644
> > --- a/tests/Makefile.sources
> > +++ b/tests/Makefile.sources
> > @@ -87,6 +87,7 @@ TESTS_progs = \
> >  	gem_largeobject \
> >  	gem_lut_handle \
> >  	gem_mmap_offset_exhaustion \
> > +	gem_media_fill \
> >  	gem_pin \
> >  	gem_pipe_control_store_loop \
> >  	gem_reg_read \
> > diff --git a/tests/gem_media_fill.c b/tests/gem_media_fill.c
> > new file mode 100644
> > index 0000000..40b391d
> > --- /dev/null
> > +++ b/tests/gem_media_fill.c
> > @@ -0,0 +1,132 @@
> > +/*
> > + * Copyright © 2013 Intel Corporation
> > + *
> > + * Permission is hereby granted, free of charge, to any person obtaining a
> > + * copy of this software and associated documentation files (the "Software"),
> > + * to deal in the Software without restriction, including without limitation
> > + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> > + * and/or sell copies of the Software, and to permit persons to whom the
> > + * Software is furnished to do so, subject to the following conditions:
> > + *
> > + * The above copyright notice and this permission notice (including the next
> > + * paragraph) shall be included in all copies or substantial portions of the
> > + * Software.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> > + * IN THE SOFTWARE.
> > + *
> > + * Authors:
> > + *    Damien Lespiau <damien.lespiau at intel.com>
> > + *    Xiang, Haihao <haihao.xiang at intel.com>
> > + */
> > +
> > +/*
> > + * This file is a basic test for the media_fill() function, a very simple
> > + * workload for the Media pipeline.
> > + */
> > +
> > +#include <stdbool.h>
> > +#include <unistd.h>
> > +#include <cairo.h>
> > +
> > +#include "media_fill.h"
> > +
> > +#define WIDTH 64
> > +#define STRIDE (WIDTH)
> > +#define HEIGHT 64
> > +#define SIZE (HEIGHT*STRIDE)
> > +
> > +#define COLOR_C4	0xc4
> > +#define COLOR_4C	0x4c
> > +
> > +typedef struct {
> > +	int drm_fd;
> > +	uint32_t devid;
> > +	drm_intel_bufmgr *bufmgr;
> > +	uint8_t linear[WIDTH * HEIGHT];
> > +} data_t;
> > +
> > +static void scratch_buf_init(data_t *data, struct scratch_buf *buf,
> > +			int width, int height, int stride, uint8_t color)
> > +{
> > +	drm_intel_bo *bo;
> > +	int i;
> > +
> > +	bo = drm_intel_bo_alloc(data->bufmgr, "", SIZE, 4096);
> > +	for (i = 0; i < width * height; i++)
> > +		data->linear[i] = color;
> > +	gem_write(data->drm_fd, bo->handle, 0, data->linear,
> > +		sizeof(data->linear));
> > +
> > +	buf->bo = bo;
> > +	buf->stride = stride;
> > +	buf->tiling = I915_TILING_NONE;
> > +	buf->size = SIZE;
> > +}
> > +
> > +static void
> > +scratch_buf_check(data_t *data, struct scratch_buf *buf, int x, int y,
> > +		uint8_t color)
> > +{
> > +	uint8_t val;
> > +
> > +	gem_read(data->drm_fd, buf->bo->handle, 0,
> > +		data->linear, sizeof(data->linear));
> > +	val = data->linear[y * WIDTH + x];
> > +	if (val != color) {
> > +		fprintf(stderr, "Expected 0x%02x, found 0x%02x at (%d,%d)\n",
> > +			color, val, x, y);
> > +		abort();
> > +	}
> > +}
> > +
> > +int main(int argc, char **argv)
> > +{
> > +	data_t data = {0, };
> > +	struct intel_batchbuffer *batch = NULL;
> > +	struct scratch_buf dst;
> > +	media_fillfunc_t media_fill = NULL;
> > +	int i, j;
> > +
> > +	igt_fixture {
> > +		data.drm_fd = drm_open_any_render();
> > +		data.devid = intel_get_drm_devid(data.drm_fd);
> > +
> > +		data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
> > +		igt_assert(data.bufmgr);
> > +
> > +		media_fill = get_media_fillfunc(data.devid);
> > +
> > +		igt_require_f(media_fill,
> > +			"no media-fill function\n");
> > +
> > +		batch = intel_batchbuffer_alloc(data.bufmgr, data.devid);
> > +		igt_assert(batch);
> > +	}
> > +
> > +	scratch_buf_init(&data, &dst, WIDTH, HEIGHT, STRIDE, COLOR_C4);
> > +
> > +	for (i = 0; i < WIDTH; i++) {
> > +		for (j = 0; j < HEIGHT; j++) {
> > +			scratch_buf_check(&data, &dst, i, j, COLOR_C4);
> > +		}
> > +	}
> > +
> > +	media_fill(batch,
> > +		&dst, 0, 0, WIDTH / 2, HEIGHT / 2,
> > +		COLOR_4C);
> > +
> > +	for (i = 0; i < WIDTH; i++) {
> > +		for (j = 0; j < HEIGHT; j++) {
> > +			if (i < WIDTH / 2 && j < HEIGHT / 2)
> > +				scratch_buf_check(&data, &dst, i, j, COLOR_4C);
> > +			else
> > +				scratch_buf_check(&data, &dst, i, j, COLOR_C4);
> > +		}
> > +	}
> > +}
> > -- 
> > 1.7.9.5
> > 
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 





More information about the Intel-gfx mailing list