summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDamien Lespiau <damien.lespiau@intel.com>2014-07-08 16:02:05 +0100
committerDamien Lespiau <damien.lespiau@intel.com>2014-07-11 15:12:21 +0100
commit068efd8d9fc5ae02e928622a989d91b3e9c851d0 (patch)
tree4d1492c96731774736ce5a5fc8850c0e575d4545 /lib
parentb2eb48576f2422591fe338e21a46757b2e331985 (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.c54
-rw-r--r--lib/igt_kms.h11
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);