igt_kms: Add a way to query of the plane supports rotation
authorDamien Lespiau <damien.lespiau@intel.com>
Tue, 8 Jul 2014 14:23:05 +0000 (15:23 +0100)
committerDamien Lespiau <damien.lespiau@intel.com>
Fri, 11 Jul 2014 14:12:21 +0000 (15:12 +0100)
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
lib/igt_kms.c
lib/igt_kms.h

index f50f27f..850f6e2 100644 (file)
@@ -696,6 +696,7 @@ void igt_display_init(igt_display_t *display, int drm_fd)
                /* add the planes that can be used with that pipe */
                for (j = 0; j < plane_resources->count_planes; j++) {
                        drmModePlane *drm_plane;
+                       uint64_t prop_value;
 
                        drm_plane = drmModeGetPlane(display->drm_fd,
                                                    plane_resources->planes[j]);
@@ -736,6 +737,12 @@ void igt_display_init(igt_display_t *display, int drm_fd)
 
                        plane->pipe = pipe;
                        plane->drm_plane = drm_plane;
+
+                       get_plane_property(display, drm_plane->plane_id,
+                                          "rotation",
+                                          &plane->rotation_property,
+                                          &prop_value);
+                       plane->rotation = (igt_rotation_t)prop_value;
                }
 
                if (display->has_universal_planes) {
index 07c2418..ef87ee1 100644 (file)
@@ -148,8 +148,10 @@ typedef struct {
        /*< private >*/
        igt_pipe_t *pipe;
        int index;
+       /* capabilities */
        unsigned int is_primary       : 1;
        unsigned int is_cursor        : 1;
+       /* state tracking */
        unsigned int fb_changed       : 1;
        unsigned int position_changed : 1;
        unsigned int panning_changed  : 1;
@@ -159,6 +161,9 @@ typedef struct {
         */
        drmModePlane *drm_plane;
        struct igt_fb *fb;
+
+       uint32_t rotation_property;
+
        /* position within pipe_src_w x pipe_src_h */
        int crtc_x, crtc_y;
        /* panning offset within the fb */
@@ -210,6 +215,11 @@ drmModeModeInfo *igt_output_get_mode(igt_output_t *output);
 void igt_output_set_pipe(igt_output_t *output, enum pipe pipe);
 igt_plane_t *igt_output_get_plane(igt_output_t *output, enum igt_plane plane);
 
+static inline bool igt_plane_supports_rotation(igt_plane_t *plane)
+{
+       return plane->rotation_property != 0;
+}
+
 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);