diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-07-05 14:52:20 +0200 |
---|---|---|
committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2016-07-26 14:50:26 +0200 |
commit | 826150fa43dc85a29915ccaba68a12531843609e (patch) | |
tree | 8ceed10debbd5ec44cc0953d98173d7f11e08827 /lib/igt_kms.c | |
parent | ad3b209b606d2c69e0ac39edc441854a9f457d3a (diff) |
igt_kms: Add more apis for panel fitting test.
igt_output_set_scaling_mode is a simple way to update scaling mode,
igt_display_(try_)commit_atomic will allow you to call drmAtomicCommit
with custom flags, like TEST_ONLY, EVENT, NONBLOCKING or without
ALLOW_MODESET.
This is useful when you only want to do any of those things, for events
it can be useful to set the user_data pointer too, so export that to
users.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'lib/igt_kms.c')
-rw-r--r-- | lib/igt_kms.c | 109 |
1 files changed, 82 insertions, 27 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 18337ee9..f264f996 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -867,7 +867,9 @@ static bool _kmstest_connector_config(int drm_fd, uint32_t connector_id, goto err3; if (!connector->count_modes) { - igt_warn("connector %d has no modes\n", connector_id); + igt_warn("connector %d/%s-%d has no modes\n", connector_id, + kmstest_connector_type_str(connector->connector_type), + connector->connector_type_id); goto err3; } @@ -2125,7 +2127,7 @@ static void igt_atomic_prepare_connector_commit(igt_output_t *output, drmModeAto * Commit all the changes of all the planes,crtcs, connectors * atomically using drmModeAtomicCommit() */ -static int igt_atomic_commit(igt_display_t *display) +static int igt_atomic_commit(igt_display_t *display, uint32_t flags, void *user_data) { int ret = 0, i; @@ -2166,11 +2168,49 @@ static int igt_atomic_commit(igt_display_t *display) igt_atomic_prepare_connector_commit(output, req); } - ret = drmModeAtomicCommit(display->drm_fd, req, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); + ret = drmModeAtomicCommit(display->drm_fd, req, flags, user_data); drmModeAtomicFree(req); return ret; } + +static void +display_commit_changed(igt_display_t *display, enum igt_commit_style s) +{ + int i; + enum pipe pipe; + + for_each_pipe(display, pipe) { + igt_pipe_t *pipe_obj = &display->pipes[pipe]; + igt_plane_t *plane; + + pipe_obj->color_mgmt_changed = false; + pipe_obj->background_changed = false; + + if (s != COMMIT_UNIVERSAL) + pipe_obj->mode_changed = false; + + for_each_plane_on_pipe(display, pipe, plane) { + plane->fb_changed = false; + plane->position_changed = false; + plane->size_changed = false; + + if (s != COMMIT_LEGACY || !(plane->is_primary || plane->is_cursor)) + plane->rotation_changed = false; + } + } + + for (i = 0; i < display->n_outputs; i++) { + igt_output_t *output = &display->outputs[i]; + + if (s != COMMIT_UNIVERSAL) + output->config.pipe_changed = false; + + if (s == COMMIT_ATOMIC) + output->config.connector_scaling_mode_changed = false; + } +} + /* * Commit all plane changes across all outputs of the display. * @@ -2184,14 +2224,14 @@ static int do_display_commit(igt_display_t *display, enum igt_commit_style s, bool fail_on_error) { - int i, ret; + int ret; enum pipe pipe; LOG_INDENT(display, "commit"); igt_display_refresh(display); if (s == COMMIT_ATOMIC) { - ret = igt_atomic_commit(display); + ret = igt_atomic_commit(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL); CHECK_RETURN(ret, fail_on_error); } else { @@ -2222,41 +2262,42 @@ static int do_display_commit(igt_display_t *display, if (ret) return ret; - for_each_pipe(display, pipe) { - igt_pipe_t *pipe_obj = &display->pipes[pipe]; - igt_plane_t *plane; + display_commit_changed(display, s); - pipe_obj->color_mgmt_changed = false; - pipe_obj->background_changed = false; + igt_debug_wait_for_keypress("modeset"); - if (s != COMMIT_UNIVERSAL) - pipe_obj->mode_changed = false; + return 0; +} - for_each_plane_on_pipe(display, pipe, plane) { - plane->fb_changed = false; - plane->position_changed = false; - plane->size_changed = false; +int igt_display_try_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data) +{ + int ret; - if (s != COMMIT_LEGACY || !(plane->is_primary || plane->is_cursor)) - plane->rotation_changed = false; - } - } + LOG_INDENT(display, "commit"); - for (i = 0; i < display->n_outputs; i++) { - igt_output_t *output = &display->outputs[i]; + igt_display_refresh(display); - if (s != COMMIT_UNIVERSAL) - output->config.pipe_changed = false; + ret = igt_atomic_commit(display, flags, user_data); - if (s == COMMIT_ATOMIC) - output->config.connector_scaling_mode_changed = false; - } + LOG_UNINDENT(display); + + if (ret || (flags & DRM_MODE_ATOMIC_TEST_ONLY)) + return ret; + + display_commit_changed(display, COMMIT_ATOMIC); igt_debug_wait_for_keypress("modeset"); return 0; } +void igt_display_commit_atomic(igt_display_t *display, uint32_t flags, void *user_data) +{ + int ret = igt_display_try_commit_atomic(display, flags, user_data); + + igt_assert_eq(ret, 0); +} + /** * igt_display_commit2: * @display: DRM device handle @@ -2378,6 +2419,15 @@ void igt_output_set_pipe(igt_output_t *output, enum pipe pipe) output->config.pipe_changed = true; } +void igt_output_set_scaling_mode(igt_output_t *output, uint64_t scaling_mode) +{ + output->config.connector_scaling_mode_changed = true; + + output->config.connector_scaling_mode = scaling_mode; + + igt_require(output->config.atomic_props_connector[IGT_CONNECTOR_SCALING_MODE]); +} + igt_plane_t *igt_output_get_plane(igt_output_t *output, enum igt_plane plane) { igt_pipe_t *pipe; @@ -2409,6 +2459,11 @@ void igt_plane_set_fb(igt_plane_t *plane, struct igt_fb *fb) plane->src_w = fb->width; plane->src_h = fb->height; } else { + plane->src_x = 0; + plane->src_y = 0; + plane->src_w = 0; + plane->src_h = 0; + plane->crtc_w = 0; plane->crtc_h = 0; } |