diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2015-02-19 15:41:15 -0200 |
---|---|---|
committer | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2015-05-07 15:11:49 -0300 |
commit | cf9f48e704030b606260919f2da4c4287e51c4af (patch) | |
tree | d3af82ad7794a6af59e507c5ac63e96ae9bb697b /tests/kms_draw_crc.c | |
parent | 8d3023c15bcc9890ab7b89fa8ae4564a295078c2 (diff) |
lib: add igt_draw
For all those IGT tests that need an easy way to draw rectangles on
buffers using different methods. Current planned users: FBC and PSR
CRC tests.
There is also a tests/kms_draw_crc program to check if the library is
sane.
v2: - Move the test from lib/tests to tests/ (Daniel).
- Add igt_require() to filter out the swizzling/tiling methods we
don't support (Daniel).
- Simplify reloc handling on the BLT case (Daniel).
- Document enum igt_draw_method (Daniel).
- Document igt_draw_get_method_name() (Paulo).
v3: - Add IGT_DRAW_MMAP_WC (Chris).
- Implement the other trivial swizzling methods (Chris).
- Remove the gem_sync() calls (Chris).
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Diffstat (limited to 'tests/kms_draw_crc.c')
-rw-r--r-- | tests/kms_draw_crc.c | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/tests/kms_draw_crc.c b/tests/kms_draw_crc.c new file mode 100644 index 00000000..1630cc2c --- /dev/null +++ b/tests/kms_draw_crc.c @@ -0,0 +1,247 @@ +/* + * Copyright © 2015 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. + * + */ + +/* This program tests whether the igt_draw library actually works. */ + +#include "drmtest.h" +#include "igt_aux.h" +#include "igt_draw.h" +#include "igt_debugfs.h" +#include "igt_fb.h" +#include "igt_kms.h" + +#define MAX_CONNECTORS 32 + +struct modeset_params { + uint32_t crtc_id; + uint32_t connector_id; + drmModeModeInfoPtr mode; +}; + +int drm_fd; +drmModeResPtr drm_res; +drmModeConnectorPtr drm_connectors[MAX_CONNECTORS]; +drm_intel_bufmgr *bufmgr; +igt_pipe_crc_t *pipe_crc; + +bool has_method_base_crc = false; +igt_crc_t method_base_crc; + +struct modeset_params ms; + +static void find_modeset_params(void) +{ + int i; + uint32_t connector_id = 0, crtc_id; + drmModeModeInfoPtr mode = NULL; + + for (i = 0; i < drm_res->count_connectors; i++) { + drmModeConnectorPtr c = drm_connectors[i]; + + if (c->count_modes) { + connector_id = c->connector_id; + mode = &c->modes[0]; + break; + } + } + igt_require(connector_id); + + crtc_id = drm_res->crtcs[0]; + igt_assert(crtc_id); + igt_assert(mode); + + ms.connector_id = connector_id; + ms.crtc_id = crtc_id; + ms.mode = mode; + +} + +static void get_method_crc(enum igt_draw_method method, uint64_t tiling, + igt_crc_t *crc) +{ + struct igt_fb fb; + int rc; + + igt_create_fb(drm_fd, ms.mode->hdisplay, ms.mode->vdisplay, + DRM_FORMAT_XRGB8888, tiling, &fb); + igt_draw_rect_fb(drm_fd, bufmgr, NULL, &fb, method, + 0, 0, fb.width, fb.height, 0xFF); + + igt_draw_rect_fb(drm_fd, bufmgr, NULL, &fb, method, + fb.width / 4, fb.height / 4, + fb.width / 2, fb.height / 2, 0xFF00); + igt_draw_rect_fb(drm_fd, bufmgr, NULL, &fb, method, + fb.width / 8, fb.height / 8, + fb.width / 4, fb.height / 4, 0xFF0000); + igt_draw_rect_fb(drm_fd, bufmgr, NULL, &fb, method, + fb.width / 2, fb.height / 2, + fb.width / 3, fb.height / 3, 0xFF00FF); + + rc = drmModeSetCrtc(drm_fd, ms.crtc_id, fb.fb_id, 0, 0, + &ms.connector_id, 1, ms.mode); + igt_assert(rc == 0); + + igt_debug_wait_for_keypress("crc"); + igt_pipe_crc_collect_crc(pipe_crc, crc); + + kmstest_unset_all_crtcs(drm_fd, drm_res); + igt_remove_fb(drm_fd, &fb); +} + +static void draw_method_subtest(enum igt_draw_method method, uint64_t tiling) +{ + igt_crc_t crc; + + kmstest_unset_all_crtcs(drm_fd, drm_res); + + find_modeset_params(); + + /* Use IGT_DRAW_MMAP_GTT on an untiled buffer as the parameter for + * comparison. Cache the value so we don't recompute it for every single + * subtest. */ + if (!has_method_base_crc) { + get_method_crc(IGT_DRAW_MMAP_GTT, LOCAL_DRM_FORMAT_MOD_NONE, + &method_base_crc); + has_method_base_crc = true; + } + + get_method_crc(method, tiling, &crc); + igt_assert_crc_equal(&crc, &method_base_crc); +} + +static void get_fill_crc(uint64_t tiling, igt_crc_t *crc) +{ + struct igt_fb fb; + int rc; + + igt_create_fb(drm_fd, ms.mode->hdisplay, ms.mode->vdisplay, + DRM_FORMAT_XRGB8888, tiling, &fb); + + igt_draw_fill_fb(drm_fd, &fb, 0xFF); + + rc = drmModeSetCrtc(drm_fd, ms.crtc_id, fb.fb_id, 0, 0, + &ms.connector_id, 1, ms.mode); + igt_assert(rc == 0); + + igt_debug_wait_for_keypress("crc"); + igt_pipe_crc_collect_crc(pipe_crc, crc); + + kmstest_unset_all_crtcs(drm_fd, drm_res); + igt_remove_fb(drm_fd, &fb); +} + +static void fill_fb_subtest(void) +{ + int rc; + struct igt_fb fb; + igt_crc_t base_crc, crc; + + kmstest_unset_all_crtcs(drm_fd, drm_res); + + find_modeset_params(); + + igt_create_fb(drm_fd, ms.mode->hdisplay, ms.mode->vdisplay, + DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE, &fb); + + igt_draw_rect_fb(drm_fd, bufmgr, NULL, &fb, IGT_DRAW_MMAP_GTT, + 0, 0, fb.width, fb.height, 0xFF); + + rc = drmModeSetCrtc(drm_fd, ms.crtc_id, fb.fb_id, 0, 0, + &ms.connector_id, 1, ms.mode); + igt_assert(rc == 0); + + igt_debug_wait_for_keypress("crc"); + igt_pipe_crc_collect_crc(pipe_crc, &base_crc); + + get_fill_crc(LOCAL_DRM_FORMAT_MOD_NONE, &crc); + igt_assert_crc_equal(&crc, &base_crc); + + get_fill_crc(LOCAL_I915_FORMAT_MOD_X_TILED, &crc); + igt_assert_crc_equal(&crc, &base_crc); + + kmstest_unset_all_crtcs(drm_fd, drm_res); + igt_remove_fb(drm_fd, &fb); +} + +static void setup_environment(void) +{ + int i; + + drm_fd = drm_open_any_master(); + igt_require(drm_fd >= 0); + + drm_res = drmModeGetResources(drm_fd); + igt_assert(drm_res->count_connectors <= MAX_CONNECTORS); + + for (i = 0; i < drm_res->count_connectors; i++) + drm_connectors[i] = drmModeGetConnector(drm_fd, + drm_res->connectors[i]); + + kmstest_set_vt_graphics_mode(); + + bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096); + igt_assert(bufmgr); + drm_intel_bufmgr_gem_enable_reuse(bufmgr); + + pipe_crc = igt_pipe_crc_new(0, INTEL_PIPE_CRC_SOURCE_AUTO); +} + +static void teardown_environment(void) +{ + int i; + + igt_pipe_crc_free(pipe_crc); + + drm_intel_bufmgr_destroy(bufmgr); + + for (i = 0; i < drm_res->count_connectors; i++) + drmModeFreeConnector(drm_connectors[i]); + + drmModeFreeResources(drm_res); + close(drm_fd); +} + +igt_main +{ + enum igt_draw_method method; + + igt_fixture + setup_environment(); + + for (method = 0; method < IGT_DRAW_METHOD_COUNT; method++) { + igt_subtest_f("draw-method-%s-untiled", + igt_draw_get_method_name(method)) + draw_method_subtest(method, LOCAL_DRM_FORMAT_MOD_NONE); + igt_subtest_f("draw-method-%s-tiled", + igt_draw_get_method_name(method)) + draw_method_subtest(method, + LOCAL_I915_FORMAT_MOD_X_TILED); + } + + igt_subtest("fill-fb") + fill_fb_subtest(); + + igt_fixture + teardown_environment(); +} |