.gitignore | 54 Makefile.am | 15 README | 35 autogen.sh | 14 benchmarks/Makefile.am | 15 benchmarks/intel_upload_blit_large.c | 3 benchmarks/intel_upload_blit_large_gtt.c | 3 benchmarks/intel_upload_blit_large_map.c | 3 benchmarks/intel_upload_blit_small.c | 3 configure.ac | 77 debugger/Makefile.am | 19 debugger/debug_rdata.c | 141 + debugger/eudb.c | 606 ++++++ debugger/system_routine/GNUmakefile.in | 3 debugger/system_routine/Makefile | 84 debugger/system_routine/eviction_macro.c | 48 debugger/system_routine/pre_cpp.py | 123 + debugger/system_routine/sr.g4a | 277 ++ debugger/system_routine/test.g4a | 64 lib/Makefile.am | 22 lib/debug.h | 92 lib/drmtest.c | 30 lib/i830_reg.h | 805 ++++++++ lib/i915_3d.h | 619 ++++++ lib/i915_reg.h | 844 ++++++++ lib/instdone.c | 211 +- lib/instdone.h | 4 lib/intel_batchbuffer.c | 124 + lib/intel_batchbuffer.h | 60 lib/intel_chipset.h | 88 lib/intel_drm.c | 92 lib/intel_gpu_tools.c | 154 - lib/intel_gpu_tools.h | 65 lib/intel_mmio.c | 251 ++ lib/intel_pci.c | 89 lib/intel_reg.h | 1068 ++++++++--- lib/intel_reg_map.c | 178 + m4/.gitignore | 5 m4/dolt.m4 | 178 - m4/shave.m4 | 73 man/Makefile.am | 9 man/intel_audio_dump.1 | 11 man/intel_bios_dumper.1 | 14 man/intel_bios_reader.1 | 15 man/intel_error_decode.1 | 20 man/intel_gpu_dump.1 | 22 man/intel_gpu_top.1 | 23 man/intel_gtt.1 | 14 man/intel_lid.1 | 12 man/intel_reg_dumper.1 | 24 man/intel_reg_read.1 | 15 man/intel_reg_snapshot.1 | 15 man/intel_reg_write.1 | 2 scripts/Makefile.am | 6 scripts/throttle.py | 67 scripts/who.sh | 13 shave-libtool.in | 69 shave.in | 76 tests/Makefile.am | 89 tests/check_drm_clients | 30 tests/debugfs_emon_crash | 34 tests/debugfs_reader | 27 tests/gem_bad_address.c | 3 tests/gem_bad_batch.c | 3 tests/gem_bad_blit.c | 7 tests/gem_bad_length.c | 158 + tests/gem_double_irq_loop.c | 147 + tests/gem_dummy_reloc_loop.c | 194 ++ tests/gem_exec_bad_domains.c | 145 + tests/gem_exec_blt.c | 306 +++ tests/gem_exec_faulting_reloc.c | 289 +++ tests/gem_exec_nop.c | 162 + tests/gem_fence_thrash.c | 10 tests/gem_fenced_exec_thrash.c | 184 + tests/gem_flink.c | 2 tests/gem_gtt_speed.c | 311 +++ tests/gem_hang.c | 5 tests/gem_hangcheck_forcewake.c | 127 + tests/gem_largeobject.c | 25 tests/gem_linear_blits.c | 310 +++ tests/gem_mmap.c | 2 tests/gem_mmap_gtt.c | 233 ++ tests/gem_partial_pwrite_pread.c | 284 +++ tests/gem_pipe_control_store_loop.c | 184 + tests/gem_pread_after_blit.c | 3 tests/gem_pwrite.c | 154 + tests/gem_readwrite.c | 4 tests/gem_reloc_vs_gpu.c | 207 ++ tests/gem_ring_sync_loop.c | 139 + tests/gem_ringfill.c | 3 tests/gem_storedw_batches_loop.c | 168 + tests/gem_storedw_loop_blt.c | 146 + tests/gem_storedw_loop_bsd.c | 146 + tests/gem_storedw_loop_render.c | 143 + tests/gem_stress.c | 991 ++++++++++ tests/gem_stress.h | 100 + tests/gem_stress_gen6.c | 595 ++++++ tests/gem_stress_i830.c | 354 +++ tests/gem_stress_i915.c | 190 ++ tests/gem_tiled_blits.c | 137 - tests/gem_tiled_fence_blits.c | 213 ++ tests/gem_tiled_pread.c | 215 +- tests/gem_tiled_pread_pwrite.c | 227 ++ tests/gem_unref_active_buffers.c | 107 + tests/gem_vmap_blits.c | 409 ++++ tests/gen3_mixed_blits.c | 619 ++++++ tests/gen3_render_linear_blits.c | 459 ++++ tests/gen3_render_mixed_blits.c | 508 +++++ tests/gen3_render_tiledx_blits.c | 487 +++++ tests/gen3_render_tiledy_blits.c | 494 +++++ tests/gen6_render.h | 1553 ++++++++++++++++ tests/getstats.c | 2 tests/sysfs_edid_timing | 20 tests/testdisplay.c | 1287 +++++++++++++ tools/Makefile.am | 41 tools/forcewaked.c | 106 + tools/intel_audio_dump.c | 1206 ++++++++++++ tools/intel_backlight.c | 69 tools/intel_bios.h | 731 +++++++ tools/intel_bios_dumper.c | 112 + tools/intel_bios_reader.c | 938 +++++++++ tools/intel_decode.c | 2931 +++++++++++++++++++++++++++++++ tools/intel_decode.h | 8 tools/intel_disable_clock_gating.c | 71 tools/intel_dump_decode.c | 203 ++ tools/intel_error_decode.c | 499 +++++ tools/intel_gpu_abrt | 45 tools/intel_gpu_dump.c | 2263 ----------------------- tools/intel_gpu_time.c | 110 + tools/intel_gpu_top.c | 545 +++++ tools/intel_gtt.c | 121 + tools/intel_lid.c | 144 + tools/intel_reg_checker.c | 399 ++++ tools/intel_reg_dumper.c | 1995 +++++++++++++++++++++ tools/intel_reg_read.c | 80 tools/intel_reg_snapshot.c | 48 tools/intel_reg_write.c | 2 tools/intel_stepping.c | 134 + 138 files changed, 29694 insertions(+), 3524 deletions(-)
New commits: commit 5a3fccbb577dd8d6a0699cd58e9f39532792b866 Author: Daniel Vetter <[email protected]> Date: Sat Dec 24 01:23:59 2011 +0100 Release 1.1 diff --git a/configure.ac b/configure.ac index 3e1218e..5d89b30 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ([2.63]) AC_INIT([intel-gpu-tools], - [1.0.2], + [1.1], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [intel-gpu-tools]) commit 74d6545ffadf0a7f321138ae4ccd0def8f28e0d2 Author: Daniel Vetter <[email protected]> Date: Sun Dec 18 00:24:45 2011 +0100 testdisplay: shut up compiler Signed-Off-by: Daniel Vetter <[email protected]> diff --git a/tests/testdisplay.c b/tests/testdisplay.c index cc6153d..a5a9556 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -1095,7 +1095,7 @@ out: static gboolean input_event(GIOChannel *source, GIOCondition condition, gpointer data) { - gchar buf[1]; + gchar buf[2]; gsize count; count = read(g_io_channel_unix_get_fd(source), buf, sizeof(buf)); @@ -1125,7 +1125,6 @@ static gboolean input_event(GIOChannel *source, GIOCondition condition, int main(int argc, char **argv) { int c; - int encoders = 0, connectors = 0, crtcs = 0, framebuffers = 0; char *modules[] = { "i915" }; unsigned int i; struct udev *u; @@ -1138,7 +1137,6 @@ int main(int argc, char **argv) switch (c) { case 'i': dump_info = 1; - encoders = connectors = crtcs = modes = framebuffers = 1; break; case 'a': test_all_modes = 1; commit 2de19c477af4f10370f1272e6578cec0d1b486bc Author: Daniel Vetter <[email protected]> Date: Sun Dec 18 00:21:39 2011 +0100 testdisplay: move drm_fourcc.h include under the #ifdef protection Signed-Off-by: Daniel Vetter <[email protected]> diff --git a/tests/testdisplay.c b/tests/testdisplay.c index 308160f..cc6153d 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -65,11 +65,11 @@ #include "xf86drm.h" #include "xf86drmMode.h" -#include "drm_fourcc.h" #include "i915_drm.h" #if defined(DRM_IOCTL_MODE_ADDFB2) && defined(DRM_I915_SET_SPRITE_COLORKEY) #define TEST_PLANES 1 +#include "drm_fourcc.h" #endif struct udev_monitor *uevent_monitor; commit 1f41a30070d62e007bfda9f8ddadc24877a3324c Author: Yi Sun <[email protected]> Date: Thu Dec 1 18:57:16 2011 +0800 tests/testdisplay.c: make the 3th pipe finish all the mode setting. If test all modes rather than preferred mode, remove framebuffer and set CRTC to zero after each connector mode setting. Signed-off-by: Sun Yi <[email protected]> Reviewed-by: Eugeni Dodonov <[email protected]> diff --git a/tests/testdisplay.c b/tests/testdisplay.c index ab5bf2c..308160f 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -376,7 +376,10 @@ static void connector_find_preferred_mode(struct connector *c) } c->crtc = resources->crtcs[i]; c->pipe = i; - resources->crtcs[i] = 0; + + if(test_preferred_mode) + resources->crtcs[i] = 0; + c->connector = connector; } @@ -970,6 +973,7 @@ set_mode(struct connector *c) continue; } + fprintf(stdout, "CRTS(%u):",c->crtc); dump_mode(&c->mode); if (drmModeSetCrtc(fd, c->crtc, fb_id, 0, 0, &c->id, 1, &c->mode)) { @@ -984,6 +988,12 @@ set_mode(struct connector *c) if (sleep_between_modes && test_all_modes) sleep(sleep_between_modes); + + } + + if(!test_preferred_mode){ + drmModeRmFB(fd,fb_id); + drmModeSetCrtc(fd, c->crtc, fb_id, 0, 0, &c->id, 1, 0); } drmModeFreeEncoder(c->encoder); commit 06460049f69b2769c31c51520ae07af394a0a33b Author: Ben Widawsky <[email protected]> Date: Thu Dec 15 13:54:30 2011 -0800 intel-decode: fix flush dword post sync parse Signed-off-by: Ben Widawsky <[email protected]> diff --git a/tools/intel_decode.c b/tools/intel_decode.c index 53951d4..344578b 100644 --- a/tools/intel_decode.c +++ b/tools/intel_decode.c @@ -170,10 +170,10 @@ decode_mi(uint32_t *data, int count, uint32_t hw_offset, int *failures) return len; case 0x26: switch (data[0] & (0x3<<14)) { - case 0: post_sync_op = "no write"; break; - case 1: post_sync_op = "write data"; break; - case 2: post_sync_op = "reserved"; break; - case 3: post_sync_op = "write TIMESTAMP"; break; + case (0<<14): post_sync_op = "no write"; break; + case (1<<14): post_sync_op = "write data"; break; + case (2<<14): post_sync_op = "reserved"; break; + case (3<<14): post_sync_op = "write TIMESTAMP"; break; } instr_out(data, hw_offset, 0, "MI_FLUSH_DW%s%s%s%s post_sync_op='%s' %s%s\n", data[0] & (1<<22) ? " enable protected mem (BCS-only)," : "", commit 7ecdb152ca30db67f23a8f31bc7e4b84ec72a4d1 Author: Chris Wilson <[email protected]> Date: Wed Dec 14 17:43:37 2011 +0000 tests/gem_double_irq_loop: silence the compiler gem_double_irq_loop.c: In function ‘dummy_reloc_loop’: gem_double_irq_loop.c:62:9: warning: unused variable ‘j’ [-Wunused-variable] diff --git a/tests/gem_double_irq_loop.c b/tests/gem_double_irq_loop.c index f6811c9..f2f8b1a 100644 --- a/tests/gem_double_irq_loop.c +++ b/tests/gem_double_irq_loop.c @@ -59,7 +59,7 @@ static drm_intel_bo *target_buffer, *blt_bo; static void dummy_reloc_loop(void) { - int i, j; + int i; for (i = 0; i < 0x800; i++) { BEGIN_BATCH(8); commit f381a8b9f08a6d0c843e7b9f7997020d6b0d1e1a Author: Chris Wilson <[email protected]> Date: Wed Dec 14 17:41:34 2011 +0000 tests/gem_exec_blt: silence the compiler by failing on error gem_exec_blt.c: In function ‘gem_exec’: gem_exec_blt.c:174:6: warning: variable ‘ret’ set but not used [-Wunused-but-set-variable] Propagate the failure and exit(1). diff --git a/tests/gem_exec_blt.c b/tests/gem_exec_blt.c index 19eb716..b2ca2d6 100644 --- a/tests/gem_exec_blt.c +++ b/tests/gem_exec_blt.c @@ -169,15 +169,17 @@ static void gem_sync(int fd, uint32_t handle) drmIoctl(fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain); } -static void gem_exec(int fd, struct drm_i915_gem_execbuffer2 *execbuf, int loops) +static int gem_exec(int fd, struct drm_i915_gem_execbuffer2 *execbuf, int loops) { - int ret; + int ret = 0; - while (loops--) { + while (loops-- && ret == 0) { ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf); } + + return ret; } static double elapsed(const struct timeval *start, @@ -272,7 +274,8 @@ static void run(int object_size) struct timeval start, end; gettimeofday(&start, NULL); - gem_exec(fd, &execbuf, count); + if (gem_exec(fd, &execbuf, count)) + exit(1); gem_sync(fd, handle); gettimeofday(&end, NULL); printf("Time to blt %d bytes x %6d: %7.3fµs, %s\n", commit 2a292188e764c18b76698e1698ecaf62699b2f04 Author: Chris Wilson <[email protected]> Date: Wed Dec 14 17:41:34 2011 +0000 tests/gem_exec_nop: silence the compiler by failing on error gem_exec_nop.c: In function ‘exec’: gem_exec_nop.c:101:6: warning: variable ‘ret’ set but not used [-Wunused-but-set-variable] Propagate the failure and exit(1). diff --git a/tests/gem_exec_nop.c b/tests/gem_exec_nop.c index d022c2b..82076f0 100644 --- a/tests/gem_exec_nop.c +++ b/tests/gem_exec_nop.c @@ -94,11 +94,11 @@ static double elapsed(const struct timeval *start, return (1e6*(end->tv_sec - start->tv_sec) + (end->tv_usec - start->tv_usec))/loop; } -static void exec(int fd, uint32_t handle, int loops) +static int exec(int fd, uint32_t handle, int loops) { struct drm_i915_gem_execbuffer2 execbuf; struct drm_i915_gem_exec_object2 exec[1]; - int ret; + int ret = 0; exec[0].handle = handle; exec[0].relocation_count = 0; @@ -121,12 +121,14 @@ static void exec(int fd, uint32_t handle, int loops) execbuf.rsvd1 = 0; execbuf.rsvd2 = 0; - while (loops--) { + while (loops-- && ret == 0) { ret = drmIoctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); } gem_sync(fd, handle); + + return ret; } int main(int argc, char **argv) @@ -145,7 +147,8 @@ int main(int argc, char **argv) struct timeval start, end; gettimeofday(&start, NULL); - exec(fd, handle, count); + if (exec(fd, handle, count)) + exit(1); gettimeofday(&end, NULL); printf("Time to exec x %d: %7.3fµs\n", count, elapsed(&start, &end, count)); commit ceb9f7d934e7efaaf0b061c3a0c5cb4b21efa156 Author: Chris Wilson <[email protected]> Date: Wed Dec 14 17:39:42 2011 +0000 tests/gem_stress: silence the compiler by using '%zu' for size_t gem_stress.c: In function ‘main’: gem_stress.c:980:3: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 4 has type ‘unsigned int’ [-Wformat] diff --git a/tests/gem_stress.c b/tests/gem_stress.c index df819b6..ecf3a0d 100644 --- a/tests/gem_stress.c +++ b/tests/gem_stress.c @@ -976,7 +976,7 @@ int main(int argc, char **argv) fan_in_and_check(); - fprintf(stderr, "num failed tiles %u, max incoherent bytes %lu\n", + fprintf(stderr, "num failed tiles %u, max incoherent bytes %zd\n", stats.num_failed, stats.max_failed_reads*sizeof(uint32_t)); intel_batchbuffer_free(batch); commit d4bb328b78b767b98c8a60ee2c1bd0d2cc894d67 Author: Chris Wilson <[email protected]> Date: Wed Dec 14 17:37:53 2011 +0000 tests/gem_largeobject: silence the compiler gem_largeobject.c: In function ‘test_large_object’: gem_largeobject.c:95:20: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] diff --git a/tests/gem_largeobject.c b/tests/gem_largeobject.c index f7973bd..bf59c84 100644 --- a/tests/gem_largeobject.c +++ b/tests/gem_largeobject.c @@ -92,7 +92,7 @@ test_large_object(int fd) pwrite.handle = create.handle; pwrite.size = obj_size; - pwrite.data_ptr = (uint64_t)data; + pwrite.data_ptr = (uintptr_t)data; ret = ioctl(fd, DRM_IOCTL_I915_GEM_PWRITE, &pwrite); if (ret) { commit b4fb480c802c41dbb8061344a540752156113489 Author: Jesse Barnes <[email protected]> Date: Wed Dec 14 08:14:45 2011 -0800 testdisplay: don't test planes if i915 color key ioctl is not available diff --git a/tests/testdisplay.c b/tests/testdisplay.c index d9e7e62..ab5bf2c 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -68,7 +68,7 @@ #include "drm_fourcc.h" #include "i915_drm.h" -#ifdef DRM_IOCTL_MODE_ADDFB2 +#if defined(DRM_IOCTL_MODE_ADDFB2) && defined(DRM_I915_SET_SPRITE_COLORKEY) #define TEST_PLANES 1 #endif commit 7ac492aec2c749895c863675ad5f48177daf9648 Author: Chris Wilson <[email protected]> Date: Mon Dec 12 20:19:03 2011 +0000 scripts/who: Add the process id to the output Signed-off-by: Chris Wilson <[email protected]> diff --git a/scripts/who.sh b/scripts/who.sh index 9aab704..b221639 100755 --- a/scripts/who.sh +++ b/scripts/who.sh @@ -9,5 +9,5 @@ for i in `lsof -t /dev/dri/card0`; do who=`readlink /proc/$i/exe` count=`grep /dev/dri/card0 /proc/$i/maps | wc -l | cut -f1 -d\ ` - echo "$who: $count" + echo "$who [$i]: $count" done commit 61ff1309cabaa1fc879ed0c3179696ad64a79da3 Author: Chris Wilson <[email protected]> Date: Mon Dec 12 17:44:58 2011 +0000 scripts: Add a trivial script to show which programs are using the GPU Signed-off-by: Chris Wilson <[email protected]> diff --git a/scripts/Makefile.am b/scripts/Makefile.am index e4c26c4..dad9cf7 100644 --- a/scripts/Makefile.am +++ b/scripts/Makefile.am @@ -1,5 +1,6 @@ noinst_SCRIPTS = \ throttle.py\ + who.sh \ $(NULL) EXTRA_DIST = $(noinst_SCRIPTS) diff --git a/scripts/who.sh b/scripts/who.sh new file mode 100755 index 0000000..9aab704 --- /dev/null +++ b/scripts/who.sh @@ -0,0 +1,13 @@ +#!/bin/bash +# +# usage: sudo who.sh +# +# Requires root permissions to both query who has the device open, +# and to read the mappings of likely root-owned processes +# + +for i in `lsof -t /dev/dri/card0`; do + who=`readlink /proc/$i/exe` + count=`grep /dev/dri/card0 /proc/$i/maps | wc -l | cut -f1 -d\ ` + echo "$who: $count" +done commit 10e36edabe42e52f7862f66147d4433e8947ebc2 Author: Chris Wilson <[email protected]> Date: Sat Dec 10 12:49:10 2011 +0000 decode: Fix interpretation of i915 8bit formats 2/3 are reserved with the correct values for A8/I8 being 4/5 respectively. Signed-off-by: Chris Wilson <[email protected]> diff --git a/tools/intel_decode.c b/tools/intel_decode.c index 7162581..53951d4 100644 --- a/tools/intel_decode.c +++ b/tools/intel_decode.c @@ -1357,8 +1357,8 @@ decode_3d_1d(uint32_t *data, int count, switch ((dword>>3) & 0xf) { case 0: format = "I"; break; case 1: format = "L"; break; - case 2: format = "A"; break; - case 3: format = " mono"; break; } + case 4: format = "A"; break; + case 5: format = " mono"; break; } break; case 2: type = "16b"; commit 5a9d82c6d5ad6d4e9b48a74dd4a5226babee81aa Author: Jesse Barnes <[email protected]> Date: Wed Dec 7 08:22:41 2011 -0800 testdisplay: update for final plane & fb ABI Signed-off-by: Jesse Barnes <[email protected]> diff --git a/tests/testdisplay.c b/tests/testdisplay.c index 3c9741c..d9e7e62 100644 --- a/tests/testdisplay.c +++ b/tests/testdisplay.c @@ -65,6 +65,7 @@ #include "xf86drm.h" #include "xf86drmMode.h" +#include "drm_fourcc.h" #include "i915_drm.h" #ifdef DRM_IOCTL_MODE_ADDFB2 @@ -77,7 +78,7 @@ int fd, modes; int dump_info = 0, test_all_modes =0, test_preferred_mode = 0, force_mode = 0, test_plane, enable_tiling; int sleep_between_modes = 5; -uint32_t depth = 24; +uint32_t depth = 24, stride, bpp; float force_clock; int force_hdisplay; @@ -89,11 +90,13 @@ int force_vsync_start; int force_vsync_end; int force_vtotal; -int crtc_x, crtc_y, crtc_w, crtc_h; +int crtc_x, crtc_y, crtc_w, crtc_h, width, height; unsigned int plane_fb_id; unsigned int plane_crtc_id; unsigned int plane_id; int plane_width, plane_height; +static const uint32_t SPRITE_COLOR_KEY = 0x00aaaaaa; +uint32_t *fb_ptr; #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) @@ -413,12 +416,12 @@ static void gem_close(int fd, uint32_t handle) } static cairo_surface_t * -allocate_surface(int fd, int width, int height, uint32_t depth, uint32_t bpp, +allocate_surface(int fd, int width, int height, uint32_t depth, uint32_t *handle, int tiled) { cairo_format_t format; struct drm_i915_gem_set_tiling set_tiling; - int size, stride; + int size; if (tiled) { int v; @@ -477,9 +480,11 @@ allocate_surface(int fd, int width, int height, uint32_t depth, uint32_t bpp, } } - return cairo_image_surface_create_for_data - (gem_mmap(fd, *handle, size, PROT_READ | PROT_WRITE), - format, width, height, stride); + fb_ptr = gem_mmap(fd, *handle, size, PROT_READ | PROT_WRITE); + + return cairo_image_surface_create_for_data((unsigned char *)fb_ptr, + format, width, height, + stride); } enum corner { @@ -506,6 +511,20 @@ paint_color_gradient(cairo_t *cr, int x, int y, int width, int height, } static void +paint_color_key(void) +{ + int i, j; + + for (i = crtc_y; i < crtc_y + crtc_h; i++) + for (j = crtc_x; j < crtc_x + crtc_w; j++) { + uint32_t offset; + + offset = (i * width) + j; + fb_ptr[offset] = SPRITE_COLOR_KEY; + } +} + +static void paint_test_patterns(cairo_t *cr, int width, int height, int stride) { double gr_height, gr_width; @@ -732,15 +751,11 @@ enable_plane(struct connector *c) cairo_surface_t *surface; cairo_status_t status; cairo_t *cr; - uint32_t handle, x, y; + uint32_t handle; int ret; - uint32_t pitches[4], offsets[4]; /* we only use [0] */ - - plane_width = c->mode.hdisplay * 0.50; - plane_height = c->mode.vdisplay * 0.50; - - x = (c->mode.hdisplay - plane_width) / 2; - y = (c->mode.vdisplay - plane_height) / 2; + uint32_t handles[4], pitches[4], offsets[4]; /* we only use [0] */ + struct drm_intel_set_sprite_destkey set; + uint32_t plane_flags = 0; plane_id = connector_find_plane(c); if (!plane_id) { @@ -749,7 +764,7 @@ enable_plane(struct connector *c) } plane_crtc_id = c->crtc; - surface = allocate_surface(fd, plane_width, plane_height, 24, 32, &handle, 1); + surface = allocate_surface(fd, plane_width, plane_height, 24, &handle, 1); if (!surface) { fprintf(stderr, "allocation failed %dx%d\n", plane_width, plane_height); return; @@ -767,8 +782,10 @@ enable_plane(struct connector *c) pitches[0] = cairo_image_surface_get_stride(surface); memset(offsets, 0, sizeof(offsets)); - ret = drmModeAddFB2(fd, plane_width, plane_height, V4L2_PIX_FMT_RGB24, - handle, pitches, offsets, &plane_fb_id); + handles[0] = handles[1] = handles[2] = handles[3] = handle; + ret = drmModeAddFB2(fd, plane_width, plane_height, DRM_FORMAT_XRGB8888, + handles, pitches, offsets, &plane_fb_id, + plane_flags); cairo_surface_destroy(surface); gem_close(fd, handle); @@ -778,8 +795,14 @@ enable_plane(struct connector *c) return; } - if (drmModeSetPlane(fd, plane_id, plane_crtc_id, plane_fb_id, crtc_x, crtc_y, - crtc_w, crtc_h, 0, 0, plane_width, plane_height)) { + set.plane_id = plane_id; + set.value = SPRITE_COLOR_KEY; + ret = drmCommandWrite(fd, DRM_I915_SET_SPRITE_DESTKEY, &set, + sizeof(set)); + + if (drmModeSetPlane(fd, plane_id, plane_crtc_id, plane_fb_id, + plane_flags, crtc_x, crtc_y, crtc_w, crtc_h, + 0, 0, plane_width, plane_height)) { fprintf(stderr, "failed to enable plane: %s\n", strerror(errno)); return; @@ -789,11 +812,16 @@ enable_plane(struct connector *c) static void adjust_plane(int fd, int xdistance, int ydistance, int wdiff, int hdiff) { + uint32_t plane_flags = 0; + crtc_x += xdistance; crtc_y += ydistance; crtc_w += wdiff; crtc_h += hdiff; - if (drmModeSetPlane(fd, plane_id, plane_crtc_id, plane_fb_id, crtc_x, crtc_y, + fprintf(stderr, "setting plane %dx%d @ %d,%d (source %dx%d)\n", + crtc_w, crtc_h, crtc_x, crtc_y, plane_width, plane_height); + if (drmModeSetPlane(fd, plane_id, plane_crtc_id, plane_fb_id, + plane_flags, crtc_x, crtc_y, crtc_w, crtc_h, 0, 0, plane_width, plane_height)) fprintf(stderr, "failed to adjust plane: %s\n", strerror(errno)); } @@ -827,7 +855,7 @@ disable_planes(int fd) return; } if (drmModeSetPlane(fd, plane_id, connectors[c].crtc, 0, 0, 0, - 0, 0, 0, 0, 0, 0)) { + 0, 0, 0, 0, 0, 0, 0)) { fprintf(stderr, "failed to disable plane: %s\n", strerror(errno)); return; @@ -848,10 +876,9 @@ static void set_mode(struct connector *c) { unsigned int fb_id; - int ret, width, height; + int ret; char buf[128]; int j, test_mode_num; - uint32_t bpp = 32; if (depth <= 8) bpp = 8; @@ -896,7 +923,7 @@ set_mode(struct connector *c) width = c->mode.hdisplay; height = c->mode.vdisplay; - surface = allocate_surface(fd, width, height, depth, bpp, + surface = allocate_surface(fd, width, height, depth, &handle, enable_tiling); if (!surface) { fprintf(stderr, "allocation failed %dx%d\n", width, height); @@ -923,6 +950,8 @@ set_mode(struct connector *c) /* Paint output info */ paint_output_info(cr, c, width, height); + paint_color_key(); + status = cairo_status(cr); cairo_destroy(cr); if (status) @@ -1015,7 +1044,7 @@ static void usage(char *name) fprintf(stderr, "\t-a\ttest all modes\n"); fprintf(stderr, "\t-s\t<duration>\tsleep between each mode test\n"); fprintf(stderr, "\t-d\t<depth>\tbit depth of scanout buffer\n"); - fprintf(stderr, "\t-p\t<crtcx,y>,<crtcw,h> test overlay plane\n"); + fprintf(stderr, "\t-p\t<planew,h>,<crtcx,y>,<crtcw,h> test overlay plane\n"); fprintf(stderr, "\t-m\ttest the preferred mode\n"); fprintf(stderr, "\t-t\tuse a tiled framebuffer\n"); fprintf(stderr, "\t-f\t<clock MHz>,<hdisp>,<hsync-start>,<hsync-end>,<htotal>,\n"); @@ -1119,8 +1148,9 @@ int main(int argc, char **argv) fprintf(stderr, "using depth %d\n", depth); break; case 'p': - if (sscanf(optarg, "%d,%d,%d,%d", &crtc_x, &crtc_y, - &crtc_w, &crtc_h) != 4) + if (sscanf(optarg, "%d,%d,%d,%d,%d,%d", &plane_width, + &plane_height, &crtc_x, &crtc_y, + &crtc_w, &crtc_h) != 6) usage(argv[0]); test_plane = 1; break; commit ff409c537f541cbaa20f0b0f8faa03ece0d8014f Author: Daniel Vetter <[email protected]> Date: Tue Dec 6 16:57:53 2011 +0100 tests/gem_partial_pwrite_pread: don't trash gtt unnecessarily On chips that don't have a unmappable gtt part it's utterly pointless. Signed-Off-by: Daniel Vetter <[email protected]> diff --git a/lib/intel_chipset.h b/lib/intel_chipset.h index 35edaf7..668bf59 100755 --- a/lib/intel_chipset.h +++ b/lib/intel_chipset.h @@ -114,7 +114,9 @@ #define IS_945(devid) (devid == PCI_CHIP_I945_G || \ devid == PCI_CHIP_I945_GM || \ devid == PCI_CHIP_I945_GME || \ - devid == PCI_CHIP_G33_G || \ + IS_G33(devid)) + +#define IS_G33(devid) (devid == PCI_CHIP_G33_G || \ devid == PCI_CHIP_Q33_G || \ devid == PCI_CHIP_Q35_G || IS_IGD(devid)) diff --git a/tests/gem_partial_pwrite_pread.c b/tests/gem_partial_pwrite_pread.c index 57076cf..e00167f 100644 --- a/tests/gem_partial_pwrite_pread.c +++ b/tests/gem_partial_pwrite_pread.c @@ -124,7 +124,8 @@ blt_bo_fill(drm_intel_bo *tmp_bo, drm_intel_bo *bo, int val) drm_intel_gem_bo_unmap_gtt(tmp_bo); - if (bo->offset < num_trash_bos*1024*1024) + if (bo->offset < num_trash_bos*1024*1024 && + (IS_G33(devid) || intel_gen(devid) >= 4)) trash_aperture(); copy_bo(tmp_bo, bo); commit 5a851b139266063fc4e172e6ce781ebc1c75c9d9 Author: Daniel Vetter <[email protected]> Date: Sun Dec 4 21:42:31 2011 +0100 tests: add gem_partial_pwrite_pread Signed-off-by: Daniel Vetter <[email protected]> diff --git a/.gitignore b/.gitignore index 22de4e9..26058fd 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ tests/gem_tiled_blits tests/gem_tiled_fence_blits tests/gem_tiled_pread tests/gem_tiled_pread_pwrite +tests/gem_partial_pwrite_pread tests/gem_unref_active_buffers tests/gem_bad_address tests/gem_bad_batch diff --git a/tests/Makefile.am b/tests/Makefile.am index a0935bd..43d7db6 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -31,6 +31,7 @@ TESTS_progs = \ gem_pread_after_blit \ gem_tiled_pread \ gem_tiled_pread_pwrite \ + gem_partial_pwrite_pread \ gem_linear_blits \ gem_vmap_blits \ gem_tiled_blits \ diff --git a/tests/gem_partial_pwrite_pread.c b/tests/gem_partial_pwrite_pread.c new file mode 100644 index 0000000..57076cf --- /dev/null +++ b/tests/gem_partial_pwrite_pread.c @@ -0,0 +1,283 @@ +/* + * Copyright © 2011 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: + * Daniel Vetter <[email protected]> + * + */ + +#include <stdlib.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 "drm.h" +#include "i915_drm.h" +#include "drmtest.h" +#include "intel_bufmgr.h" +#include "intel_batchbuffer.h" +#include "intel_gpu_tools.h" + +/* + * Testcase: pwrite/pread consistency when touching partial cachelines + * + * Some fancy new pwrite/pread optimizations clflush in-line while + * reading/writing. Check whether all required clflushes happen. + * + */ + +static drm_intel_bufmgr *bufmgr; +struct intel_batchbuffer *batch; + +drm_intel_bo *scratch_bo; +drm_intel_bo *staging_bo; +#define BO_SIZE (4*4096) +uint32_t devid; +int fd; + +drm_intel_bo *trash_bos[10000]; +int num_trash_bos; + +static void +init_aperture_trashers(void) +{ + int i; + + if (intel_gen(devid) >= 6) + num_trash_bos = 512; + else + num_trash_bos = 256; + + for (i = 0; i < num_trash_bos; i++) + trash_bos[i] = drm_intel_bo_alloc(bufmgr, "trash bo", 1024*1024, 4096); +} + +static void +trash_aperture(void) +{ + int i; + uint8_t *gtt_ptr; + + for (i = 0; i < num_trash_bos; i++) { + drm_intel_gem_bo_map_gtt(trash_bos[i]); + gtt_ptr = trash_bos[i]->virtual; + *gtt_ptr = 0; + drm_intel_gem_bo_unmap_gtt(trash_bos[i]); + } +} + +static void +copy_bo(drm_intel_bo *src, drm_intel_bo *dst) +{ + BEGIN_BATCH(8); + OUT_BATCH(XY_SRC_COPY_BLT_CMD | + XY_SRC_COPY_BLT_WRITE_ALPHA | + XY_SRC_COPY_BLT_WRITE_RGB); + OUT_BATCH((3 << 24) | /* 32 bits */ + (0xcc << 16) | /* copy ROP */ + 4096); + OUT_BATCH(0 << 16 | 0); + OUT_BATCH((BO_SIZE/4096) << 16 | 1024); + OUT_RELOC_FENCED(dst, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0); + OUT_BATCH(0 << 16 | 0); + OUT_BATCH(4096); + OUT_RELOC_FENCED(src, I915_GEM_DOMAIN_RENDER, 0, 0); + ADVANCE_BATCH(); -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

