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

ykzhao yakui.zhao at intel.com
Mon Dec 2 06:18:25 CET 2013


On Sun, 2013-12-01 at 22:02 -0700, 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

The media pipeline is critical to intel-vaapi driver, which is used in
encoding and video post-processing. This patch set can be used to check
whether the media pipeline can work as expected. 

> 
> Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>

Reviewed-by: Zhao Yakui <yakui.zhao at intel.com>

> ---
>  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);
> +		}
> +	}
> +}





More information about the Intel-gfx mailing list