[Intel-gfx] [PATCH 09/12] tests/kms_psr_sink_crc: Fix all testcases.
Rodrigo Vivi
rodrigo.vivi at intel.com
Thu Sep 4 03:30:03 CEST 2014
In order to get all test cases fixed and the matrix planes-operations working
it was needed to use the common new igt kms functions for all cases.
Previously only sprite testcase was using it.
Fixed the fb colors in a way to make tests more clear and be impossible to see
black screen during the tests.
Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
---
tests/kms_psr_sink_crc.c | 269 ++++++++++++++++++-----------------------------
1 file changed, 101 insertions(+), 168 deletions(-)
diff --git a/tests/kms_psr_sink_crc.c b/tests/kms_psr_sink_crc.c
index 4358889..27f3df9 100644
--- a/tests/kms_psr_sink_crc.c
+++ b/tests/kms_psr_sink_crc.c
@@ -27,8 +27,6 @@
#include <stdio.h>
#include <string.h>
-#include "drm_fourcc.h"
-
#include "ioctl_wrappers.h"
#include "drmtest.h"
#include "intel_bufmgr.h"
@@ -79,88 +77,37 @@ typedef struct {
int drm_fd;
enum planes test_plane;
enum operations op;
- drmModeRes *resources;
- drm_intel_bufmgr *bufmgr;
uint32_t devid;
- uint32_t handle[2];
uint32_t crtc_id;
- uint32_t crtc_idx;
- uint32_t fb_id[3];
- struct kmstest_connector_config config;
igt_display_t display;
- struct igt_fb fb[2];
- igt_plane_t *plane[2];
+ drm_intel_bufmgr *bufmgr;
+ struct igt_fb fb_green, fb_white;
+ igt_plane_t *primary, *sprite, *cursor;
} data_t;
-static uint32_t create_fb(data_t *data,
- int w, int h,
- double r, double g, double b,
- struct igt_fb *fb)
+static void create_cursor_fb(data_t *data)
{
- uint32_t fb_id;
cairo_t *cr;
+ uint32_t fb_id;
- fb_id = igt_create_fb(data->drm_fd, w, h,
- DRM_FORMAT_XRGB8888, I915_TILING_X, fb);
+ fb_id = igt_create_fb(data->drm_fd, 64, 64,
+ DRM_FORMAT_ARGB8888, I915_TILING_NONE,
+ &data->fb_white);
igt_assert(fb_id);
- cr = igt_get_cairo_ctx(data->drm_fd, fb);
- igt_paint_color(cr, 0, 0, w, h, r, g, b);
- igt_assert(cairo_status(cr) == 0);
- cairo_destroy(cr);
-
- return fb_id;
-}
-
-static void create_cursor_fb(data_t *data, struct igt_fb *fb)
-{
- cairo_t *cr;
-
- data->fb_id[2] = igt_create_fb(data->drm_fd, 64, 64,
- DRM_FORMAT_ARGB8888, I915_TILING_NONE,
- fb);
- igt_assert(data->fb_id[2]);
-
- cr = igt_get_cairo_ctx(data->drm_fd, fb);
+ cr = igt_get_cairo_ctx(data->drm_fd, &data->fb_white);
igt_paint_color_alpha(cr, 0, 0, 64, 64, 1.0, 1.0, 1.0, 1.0);
igt_assert(cairo_status(cr) == 0);
}
-static bool
-connector_set_mode(data_t *data, drmModeModeInfo *mode, uint32_t fb_id)
-{
- struct kmstest_connector_config *config = &data->config;
- int ret;
-
-#if 0
- fprintf(stdout, "Using pipe %s, %dx%d\n", kmstest_pipe_name(config->pipe),
- mode->hdisplay, mode->vdisplay);
-#endif
-
- ret = drmModeSetCrtc(data->drm_fd,
- config->crtc->crtc_id,
- fb_id,
- 0, 0, /* x, y */
- &config->connector->connector_id,
- 1,
- mode);
- igt_assert(ret == 0);
-
- return 0;
-}
-
static void display_init(data_t *data)
{
igt_display_init(&data->display, data->drm_fd);
- data->resources = drmModeGetResources(data->drm_fd);
- igt_assert(data->resources);
}
static void display_fini(data_t *data)
{
igt_display_fini(&data->display);
- drmModeSetCursor(data->drm_fd, data->crtc_id, 0, 0, 0);
- drmModeFreeResources(data->resources);
}
static void fill_blt(data_t *data, uint32_t handle, unsigned char color)
@@ -316,112 +263,105 @@ static void get_sink_crc(data_t *data, char *crc) {
static void test_crc(data_t *data)
{
- uint32_t handle = data->handle[0];
+ uint32_t handle = data->fb_white.gem_handle;
+ igt_plane_t *test_plane;
+ void *ptr;
char ref_crc[12];
char crc[12];
- if (data->op == PLANE_MOVE) {
- igt_assert(drmModeSetCursor(data->drm_fd, data->crtc_id,
- handle, 64, 64) == 0);
- igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id,
- 1, 1) == 0);
+ igt_plane_set_fb(data->primary, &data->fb_green);
+ igt_display_commit(&data->display);
+
+ /* Setting a secondary fb/plane */
+ switch (data->test_plane) {
+ case PRIMARY: default: test_plane = data->primary; break;
+ case SPRITE: test_plane = data->sprite; break;
+ case CURSOR: test_plane = data->cursor; break;
}
+ igt_plane_set_fb(test_plane, &data->fb_white);
+ igt_display_commit(&data->display);
igt_assert(wait_psr_entry(data, 10));
get_sink_crc(data, ref_crc);
switch (data->op) {
- void *ptr;
case PAGE_FLIP:
+ /* Only in use when testing primary plane */
igt_assert(drmModePageFlip(data->drm_fd, data->crtc_id,
- data->fb_id[1], 0, NULL) == 0);
+ data->fb_green.fb_id, 0, NULL) == 0);
break;
- case MMAP_CPU:
- ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
+ case MMAP_GTT:
+ ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
gem_set_domain(data->drm_fd, handle,
- I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
- sleep(1);
+ I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
memset(ptr, 0, 4);
munmap(ptr, 4096);
- sleep(1);
- gem_sw_finish(data->drm_fd, handle);
break;
- case MMAP_GTT:
case MMAP_GTT_WAITING:
ptr = gem_mmap__gtt(data->drm_fd, handle, 4096, PROT_WRITE);
gem_set_domain(data->drm_fd, handle,
I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
+
+ /* Printing white on white so the screen shouldn't change */
memset(ptr, 0xff, 4);
+ get_sink_crc(data, crc);
+ igt_assert(strcmp(ref_crc, crc) == 0);
+
+ fprintf(stdout, "Waiting 10s...\n");
+ sleep(10);
+
+ /* Now lets print black to change the screen */
+ memset(ptr, 0, 4);
munmap(ptr, 4096);
- gem_bo_busy(data->drm_fd, handle);
+ break;
+ case MMAP_CPU:
+ ptr = gem_mmap__cpu(data->drm_fd, handle, 4096, PROT_WRITE);
+ gem_set_domain(data->drm_fd, handle,
+ I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
+ memset(ptr, 0, 4);
+ munmap(ptr, 4096);
+ gem_sw_finish(data->drm_fd, handle);
break;
case BLT:
- fill_blt(data, handle, 0xff);
+ fill_blt(data, handle, 0);
break;
case RENDER:
- fill_render(data, handle, 0xff);
+ fill_render(data, handle, 0);
break;
case PLANE_MOVE:
- igt_assert(drmModeMoveCursor(data->drm_fd, data->crtc_id, 1, 2) == 0);
+ /* Only in use when testing Sprite and Cursor */
+ igt_plane_set_position(test_plane, 1, 1);
+ igt_display_commit(&data->display);
break;
case PLANE_ONOFF:
- igt_plane_set_fb(data->plane[0], &data->fb[0]);
- igt_display_commit(&data->display);
- igt_plane_set_fb(data->plane[1], &data->fb[1]);
+ /* Only in use when testing Sprite and Cursor */
+ igt_plane_set_fb(test_plane, NULL);
igt_display_commit(&data->display);
break;
}
-
- igt_wait_for_vblank(data->drm_fd, data->crtc_idx);
-
get_sink_crc(data, crc);
igt_assert(strcmp(ref_crc, crc) != 0);
}
-static bool prepare_crtc(data_t *data, uint32_t connector_id)
-{
- if (!kmstest_get_connector_config(data->drm_fd,
- connector_id,
- 1 << data->crtc_idx,
- &data->config))
- return false;
-
- data->fb_id[0] = create_fb(data,
- data->config.default_mode.hdisplay,
- data->config.default_mode.vdisplay,
- 0.0, 1.0, 0.0, &data->fb[0]);
- igt_assert(data->fb_id[0]);
-
- if (data->op == PLANE_MOVE)
- create_cursor_fb(data, &data->fb[0]);
-
- data->fb_id[1] = create_fb(data,
- data->config.default_mode.hdisplay,
- data->config.default_mode.vdisplay,
- 1.0, 0.0, 0.0, &data->fb[1]);
- igt_assert(data->fb_id[1]);
-
- data->handle[0] = data->fb[0].gem_handle;
- data->handle[1] = data->fb[1].gem_handle;
-
- /* scanout = fb[1] */
- connector_set_mode(data, &data->config.default_mode,
- data->fb_id[1]);
+static void test_cleanup(data_t *data) {
+ igt_plane_set_fb(data->primary, NULL);
+ if (data->test_plane == SPRITE)
+ igt_plane_set_fb(data->sprite, NULL);
+ if (data->test_plane == CURSOR)
+ igt_plane_set_fb(data->cursor, NULL);
- /* scanout = fb[0] */
- connector_set_mode(data, &data->config.default_mode,
- data->fb_id[0]);
+ igt_display_commit(&data->display);
- kmstest_free_connector_config(&data->config);
-
- return true;
+ igt_remove_fb(data->drm_fd, &data->fb_green);
+ igt_remove_fb(data->drm_fd, &data->fb_white);
}
-static void test_sprite(data_t *data)
+static void run_test(data_t *data)
{
igt_display_t *display = &data->display;
igt_output_t *output;
drmModeModeInfo *mode;
+ uint32_t white_h, white_v;
for_each_connected_output(display, output) {
drmModeConnectorPtr c = output->config.connector;
@@ -431,6 +371,7 @@ static void test_sprite(data_t *data)
continue;
igt_output_set_pipe(output, PIPE_ANY);
+ data->crtc_id = output->config.crtc->crtc_id;
mode = igt_output_get_mode(output);
@@ -438,51 +379,45 @@ static void test_sprite(data_t *data)
mode->hdisplay, mode->vdisplay,
DRM_FORMAT_XRGB8888, I915_TILING_X,
0.0, 1.0, 0.0,
- &data->fb[0]);
-
- igt_create_color_fb(data->drm_fd,
- mode->hdisplay/2, mode->vdisplay/2,
- DRM_FORMAT_XRGB8888, I915_TILING_X,
- 1.0, 0.0, 0.0,
- &data->fb[1]);
+ &data->fb_green);
+
+ data->primary = igt_output_get_plane(output, IGT_PLANE_PRIMARY);
+ igt_plane_set_fb(data->primary, NULL);
+
+ white_h = mode->hdisplay;
+ white_v = mode->vdisplay;
+
+ switch (data->test_plane) {
+ case SPRITE:
+ data->sprite = igt_output_get_plane(output,
+ IGT_PLANE_2);
+ igt_plane_set_fb(data->sprite, NULL);
+ /* To make it different for human eyes let's make
+ * sprite visible in only one quarter of the primary
+ */
+ white_h = white_h/2;
+ white_v = white_v/2;
+ case PRIMARY:
+ igt_create_color_fb(data->drm_fd,
+ white_h, white_v,
+ DRM_FORMAT_XRGB8888, I915_TILING_X,
+ 1.0, 1.0, 1.0,
+ &data->fb_white);
+ break;
+ case CURSOR:
+ data->cursor = igt_output_get_plane(output,
+ IGT_PLANE_CURSOR);
+ igt_plane_set_fb(data->cursor, NULL);
+ create_cursor_fb(data);
+ igt_plane_set_position(data->cursor, 0, 0);
+ break;
+ }
- data->plane[0] = igt_output_get_plane(output, 0);
- data->plane[1] = igt_output_get_plane(output, 1);
+ igt_display_commit(&data->display);
test_crc(data);
- }
-}
-
-static void run_test(data_t *data)
-{
- int i, n;
- drmModeConnectorPtr c;
- /* Baytrail supports per-pipe PSR configuration, however PSR on
- * PIPE_B isn't working properly. So let's keep it disabled for now.
- * crtcs = IS_VALLEYVIEW(data->devid)? 2 : 1; */
- int crtcs = 1;
-
- if (data->op == PLANE_ONOFF) {
- test_sprite(data);
- return;
- }
- for (i = 0; i < data->resources->count_connectors; i++) {
- uint32_t connector_id = data->resources->connectors[i];
- c = drmModeGetConnector(data->drm_fd, connector_id);
-
- if (c->connector_type != DRM_MODE_CONNECTOR_eDP ||
- c->connection != DRM_MODE_CONNECTED)
- continue;
- for (n = 0; n < crtcs; n++) {
- data->crtc_idx = n;
- data->crtc_id = data->resources->crtcs[n];
-
- if (!prepare_crtc(data, connector_id))
- continue;
-
- test_crc(data);
- }
+ test_cleanup(data);
}
}
@@ -496,7 +431,6 @@ igt_main
igt_fixture {
data.drm_fd = drm_open_any();
kmstest_set_vt_graphics_mode();
-
data.devid = intel_get_drm_devid(data.drm_fd);
igt_skip_on(!psr_enabled(&data));
@@ -508,7 +442,6 @@ igt_main
display_init(&data);
}
-
for (op = PAGE_FLIP; op <= RENDER; op++) {
igt_subtest_f("primary_%s", op_str(op)) {
data.test_plane = PRIMARY;
@@ -517,7 +450,7 @@ igt_main
}
}
- for (op = PLANE_ONOFF; op <= PLANE_ONOFF; op++) {
+ for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
igt_subtest_f("sprite_%s", op_str(op)) {
data.test_plane = SPRITE;
data.op = op;
@@ -525,7 +458,7 @@ igt_main
}
}
- for (op = PLANE_MOVE; op <= PLANE_MOVE; op++) {
+ for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
igt_subtest_f("cursor_%s", op_str(op)) {
data.test_plane = CURSOR;
data.op = op;
--
1.9.3
More information about the Intel-gfx
mailing list