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

ykzhao
2013-12-02T05:12:58Z

On Sun, 2013-12-01 at 22:02 -0700, Xiang, Haihao wrote:
> From: "Xiang, Haihao" <haihao.xiang@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@intel.com>

Reviewed-by: Zhao Yakui <yakui.zhao@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@intel.com>
> + * Xiang, Haihao <haihao.xiang@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);
> + }
> + }
> +}

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org