needs libdrm --- tests/Makefile.am | 4 +- tests/Makefile.sources | 1 + tests/gem_exec_noreloc.c | 172 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 175 insertions(+), 2 deletions(-) create mode 100644 tests/gem_exec_noreloc.c diff --git a/tests/Makefile.am b/tests/Makefile.am index a2fba51..5c06ab3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -27,8 +27,8 @@ multi-tests.txt: Makefile.sources @echo ${multi_kernel_tests} >> $@ @echo END TESTLIST >> $@ -EXTRA_PROGRAMS = $(TESTS_progs) $(TESTS_progs_M) $(HANG) $(TESTS_testsuite) -EXTRA_DIST = $(TESTS_scripts) $(TESTS_scripts_M) $(scripts) $(IMAGES) $(common_files) +bin_PROGRAMS = $(TESTS_progs) $(TESTS_progs_M) $(HANG) $(TESTS_testsuite) +dist_bin_SCRIPTS = $(TESTS_scripts) $(TESTS_scripts_M) $(scripts) $(IMAGES) $(common_files) CLEANFILES = $(EXTRA_PROGRAMS) single-tests.txt multi-tests.txt diff --git a/tests/Makefile.sources b/tests/Makefile.sources index 698e290..cbc3bb9 100644 --- a/tests/Makefile.sources +++ b/tests/Makefile.sources @@ -31,6 +31,7 @@ TESTS_progs_M = \ gem_evict_everything \ gem_exec_bad_domains \ gem_exec_faulting_reloc \ + gem_exec_noreloc \ gem_exec_nop \ gem_exec_params \ gem_exec_parse \ diff --git a/tests/gem_exec_noreloc.c b/tests/gem_exec_noreloc.c new file mode 100644 index 0000000..3552246 --- /dev/null +++ b/tests/gem_exec_noreloc.c @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2014 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. + * + */ + +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <fcntl.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <limits.h> +#include <signal.h> +#include <errno.h> +#include <drm.h> + +#include "ioctl_wrappers.h" +#include "drmtest.h" +#include "igt_core.h" +#include "igt_aux.h" +#include "intel_bufmgr.h" +#include "intel_batchbuffer.h" +#include "intel_io.h" +#include "intel_chipset.h" + +#define PATTERN 0xdefaca7e + +int fd; +static struct intel_batchbuffer *batch_3d; + +static void +set_bo(drm_intel_bo *bo, uint32_t val, int width, int height) +{ + int size = width * height; + uint32_t *vaddr; + + drm_intel_bo_map(bo, true); + vaddr = bo->virtual; + while (size--) + *vaddr++ = val; + drm_intel_bo_unmap(bo); +} + +static void +cmp_bo(drm_intel_bo *bo, uint32_t val, int width, int height) +{ + int size = width * height; + uint32_t *vaddr; + + drm_intel_bo_map(bo, false); + vaddr = bo->virtual; + while (size--) + igt_assert(*vaddr++ == val); + drm_intel_bo_unmap(bo); +} + + +static void init_buffer(drm_intel_bufmgr *bufmgr, + struct igt_buf *buf, + drm_intel_bo *bo, + int width, int height) +{ + buf->bo = bo; + buf->size = width * height * 4; + igt_assert(buf->bo); + buf->tiling = I915_TILING_NONE; + buf->num_tiles = width * height * 4; + buf->stride = width * 4; +} + +static drm_intel_bo * +create_bo(drm_intel_bufmgr *bufmgr, int width, int height) +{ + drm_intel_bo *bo; + + bo = drm_intel_bo_alloc_prelocated(bufmgr, "soft bo", width * height * 4); + igt_assert(bo); + + set_bo(bo, PATTERN, width, height); + + return bo; +} + +static void release_bo(drm_intel_bo *bo) +{ + drm_intel_gem_bo_unmap_gtt(bo); + drm_intel_bo_unreference(bo); +} + +static void render_copyfunc(struct igt_buf *src, + struct igt_buf *dst, + int width, + int height) +{ + const int src_x = 0, src_y = 0, dst_x = 0, dst_y = 0; + igt_render_copyfunc_t rendercopy = igt_get_render_copyfunc(intel_get_drm_devid(fd)); + + igt_assert(rendercopy); + + if (rendercopy) { + rendercopy(batch_3d, NULL, + src, src_x, src_y, + width, height, + dst, dst_x, dst_y); + intel_batchbuffer_flush(batch_3d); + } +} + +static struct intel_batchbuffer * +noreloc_batchbuffer_alloc(drm_intel_bufmgr *bufmgr, uint32_t devid) +{ + struct intel_batchbuffer *batch = calloc(sizeof(*batch), 1); + igt_assert(batch); + + batch->bufmgr = bufmgr; + batch->devid = devid; + batch->bo = drm_intel_bo_alloc_prelocated(bufmgr, "batchbuffer", 4096); + igt_assert(batch->bo); + memset(batch->buffer, 0, sizeof(batch->buffer)); + batch->ptr = batch->buffer; + + return batch; +} + +int main(int argc, char **argv) +{ + struct igt_buf src, dest; + drm_intel_bo *from, *to; + drm_intel_bufmgr *bufmgr; + + fd = drm_open_any(); + igt_assert(fd >= 0); + + bufmgr = drm_intel_bufmgr_gem_init(fd, 4096); + batch_3d = noreloc_batchbuffer_alloc(bufmgr, intel_get_drm_devid(fd)); + igt_assert(batch_3d); + + from = create_bo(bufmgr, 4096, 4096); + to = create_bo(bufmgr, 4096, 4096); + igt_assert(from); + igt_assert(to); + init_buffer(bufmgr, &src, from, 4096, 4096); + init_buffer(bufmgr, &dest, to, 4096, 4096); + + render_copyfunc(&src, &dest, 4096, 4096); + cmp_bo(to, PATTERN, 4096, 4096); + + release_bo(to); + release_bo(from); + + return 0; +} -- 2.0.4 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx