diff options
author | Damien Lespiau <damien.lespiau@intel.com> | 2014-07-08 16:02:05 +0100 |
---|---|---|
committer | Damien Lespiau <damien.lespiau@intel.com> | 2014-07-11 15:12:21 +0100 |
commit | 068efd8d9fc5ae02e928622a989d91b3e9c851d0 (patch) | |
tree | 4d1492c96731774736ce5a5fc8850c0e575d4545 /lib | |
parent | b2eb48576f2422591fe338e21a46757b2e331985 (diff) |
igt_kms: Add support for setting plane rotation
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/igt_kms.c | 54 | ||||
-rw-r--r-- | lib/igt_kms.h | 11 |
2 files changed, 65 insertions, 0 deletions
diff --git a/lib/igt_kms.c b/lib/igt_kms.c index 850f6e28..20370a90 100644 --- a/lib/igt_kms.c +++ b/lib/igt_kms.c @@ -641,6 +641,16 @@ get_plane_property(igt_display_t *display, uint32_t plane_id, const char *name, name, prop_id, value); } +static void +igt_plane_set_property(igt_plane_t *plane, uint32_t prop_id, uint64_t value) +{ + igt_pipe_t *pipe = plane->pipe; + igt_display_t *display = pipe->display; + + drmModeObjectSetProperty(display->drm_fd, plane->drm_plane->plane_id, + DRM_MODE_OBJECT_PLANE, prop_id, value); +} + /* * Walk a plane's property list to determine its type. If we don't * find a type property, then the kernel doesn't support universal @@ -986,6 +996,10 @@ static int igt_drm_plane_commit(igt_plane_t *plane, igt_assert(plane->drm_plane); + /* it's an error to try an unsupported feature */ + igt_assert(igt_plane_supports_rotation(plane) || + !plane->rotation_changed); + fb_id = igt_plane_get_fb_id(plane); crtc_id = output->config.crtc->crtc_id; @@ -1035,6 +1049,14 @@ static int igt_drm_plane_commit(igt_plane_t *plane, plane->fb_changed = false; plane->position_changed = false; + + if (plane->rotation_changed) { + igt_plane_set_property(plane, plane->rotation_property, + plane->rotation); + + plane->rotation_changed = false; + } + return 0; } @@ -1117,6 +1139,9 @@ static int igt_primary_plane_commit_legacy(igt_plane_t *primary, /* Primary planes can't be windowed when using a legacy commit */ igt_assert((primary->crtc_x == 0 && primary->crtc_y == 0)); + /* nor rotated */ + igt_assert(!primary->rotation_changed); + if (!primary->fb_changed && !primary->position_changed && !primary->panning_changed) return 0; @@ -1408,6 +1433,35 @@ void igt_plane_set_panning(igt_plane_t *plane, int x, int y) plane->panning_changed = true; } +static const char *rotation_name(igt_rotation_t rotation) +{ + switch (rotation) { + case IGT_ROTATION_0: + return "0°"; + case IGT_ROTATION_90: + return "90°"; + case IGT_ROTATION_180: + return "180°"; + case IGT_ROTATION_270: + return "270°"; + default: + igt_assert(0); + } +} + +void igt_plane_set_rotation(igt_plane_t *plane, igt_rotation_t rotation) +{ + igt_pipe_t *pipe = plane->pipe; + igt_display_t *display = pipe->display; + + LOG(display, "%c.%d: plane_set_rotation(%s)\n", pipe_name(pipe->pipe), + plane->index, rotation_name(rotation)); + + plane->rotation = rotation; + + plane->rotation_changed = true; +} + void igt_wait_for_vblank(int drm_fd, enum pipe pipe) { drmVBlank wait_vbl; diff --git a/lib/igt_kms.h b/lib/igt_kms.h index ef87ee1e..53856879 100644 --- a/lib/igt_kms.h +++ b/lib/igt_kms.h @@ -71,6 +71,14 @@ enum igt_commit_style { /* We'll add atomic here eventually. */ }; +typedef enum { + /* this maps to the kernel API */ + IGT_ROTATION_0 = 1 << 0, + IGT_ROTATION_90 = 1 << 1, + IGT_ROTATION_180 = 1 << 2, + IGT_ROTATION_270 = 1 << 3, +} igt_rotation_t; + #include "igt_fb.h" struct kmstest_connector_config { @@ -155,6 +163,7 @@ typedef struct { unsigned int fb_changed : 1; unsigned int position_changed : 1; unsigned int panning_changed : 1; + unsigned int rotation_changed : 1; /* * drm_plane can be NULL for primary and cursor planes (when not * using the atomic modeset API) @@ -168,6 +177,7 @@ typedef struct { int crtc_x, crtc_y; /* panning offset within the fb */ unsigned int pan_x, pan_y; + igt_rotation_t rotation; } igt_plane_t; struct igt_pipe { @@ -223,6 +233,7 @@ static inline bool igt_plane_supports_rotation(igt_plane_t *plane) void igt_plane_set_fb(igt_plane_t *plane, struct igt_fb *fb); void igt_plane_set_position(igt_plane_t *plane, int x, int y); void igt_plane_set_panning(igt_plane_t *plane, int x, int y); +void igt_plane_set_rotation(igt_plane_t *plane, igt_rotation_t rotation); void igt_wait_for_vblank(int drm_fd, enum pipe pipe); |