int dst_y,
unsigned int dst_w,
unsigned int dst_h,
- int z_pos)
+ int z_pos,
+ int hflip,
+ int vflip,
+ int rotation)
{
int ret;
struct vigsp_cmd_set_plane_request *request;
- DRM_DEBUG_DRIVER("plane = %u, src_x = %u, src_y = %u, src_w = %u, src_h = %u, dst_x = %d, dst_y = %d, dst_w = %u, dst_h = %u, z_pos = %d\n",
+ DRM_DEBUG_DRIVER("plane = %u, src_x = %u, src_y = %u, src_w = %u, src_h = %u, dst_x = %d, dst_y = %d, dst_w = %u, dst_h = %u, z_pos = %d, hflip = %d, vflip = %d, rotation = %d\n",
plane, src_x, src_y, src_w, src_h,
- dst_x, dst_y, dst_w, dst_h, z_pos);
+ dst_x, dst_y, dst_w, dst_h, z_pos, hflip, vflip,
+ rotation);
mutex_lock(&comm->mutex);
request->dst_size.w = dst_w;
request->dst_size.h = dst_h;
request->z_pos = z_pos;
+ request->hflip = hflip;
+ request->vflip = vflip;
+ request->rotation = rotation;
vigs_comm_exec_internal(comm, comm->execbuffer);
}
int dst_y,
unsigned int dst_w,
unsigned int dst_h,
- int z_pos);
+ int z_pos,
+ int hflip,
+ int vflip,
+ int rotation);
int vigs_comm_fence(struct vigs_comm *comm, struct vigs_fence *fence);
DRM_UNLOCKED | DRM_AUTH),
DRM_IOCTL_DEF_DRV(VIGS_PLANE_SET_ZPOS, vigs_plane_set_zpos_ioctl,
DRM_UNLOCKED | DRM_AUTH),
+ DRM_IOCTL_DEF_DRV(VIGS_PLANE_SET_TRANSFORM, vigs_plane_set_transform_ioctl,
+ DRM_UNLOCKED | DRM_AUTH),
DRM_IOCTL_DEF_DRV(VIGS_DP_CREATE_SURFACE, vigs_dp_surface_create_ioctl,
DRM_UNLOCKED | DRM_AUTH),
crtc_y,
crtc_w,
crtc_h,
- vigs_plane->z_pos);
+ vigs_plane->z_pos,
+ vigs_plane->hflip,
+ vigs_plane->vflip,
+ vigs_plane->rotation);
if (ret == 0) {
vigs_plane->src_x = src_x;
0,
0,
0,
+ 0,
+ 0,
+ 0,
0);
if (ret == 0) {
return ret;
}
+
+int vigs_plane_set_transform_ioctl(struct drm_device *drm_dev,
+ void *data,
+ struct drm_file *file_priv)
+{
+ struct drm_vigs_plane_set_transform *args = data;
+ struct drm_mode_object *obj;
+ struct drm_plane *plane;
+ struct vigs_plane *vigs_plane;
+ int ret;
+
+ drm_modeset_lock_all(drm_dev);
+
+ obj = drm_mode_object_find(drm_dev,
+ args->plane_id,
+ DRM_MODE_OBJECT_PLANE);
+ if (!obj) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ plane = obj_to_plane(obj);
+ vigs_plane = plane_to_vigs_plane(plane);
+
+ vigs_plane->hflip = args->hflip;
+ vigs_plane->vflip = args->vflip;
+ vigs_plane->rotation = args->rotation;
+
+ ret = 0;
+
+out:
+ drm_modeset_unlock_all(drm_dev);
+
+ return ret;
+}
unsigned int crtc_h;
int z_pos;
+ int hflip;
+ int vflip;
+ int rotation;
bool enabled;
};
void *data,
struct drm_file *file_priv);
+int vigs_plane_set_transform_ioctl(struct drm_device *drm_dev,
+ void *data,
+ struct drm_file *file_priv);
+
/*
* @}
*/
/*
* Bump this whenever protocol changes.
*/
-#define VIGS_PROTOCOL_VERSION 19
+#define VIGS_PROTOCOL_VERSION 20
#define VIGS_MAX_PLANES 2
vigsp_plane_yuv420 = 0x5
} vigsp_plane_format;
+typedef enum
+{
+ vigsp_rotation0 = 0x0,
+ vigsp_rotation90 = 0x1,
+ vigsp_rotation180 = 0x2,
+ vigsp_rotation270 = 0x3
+} vigsp_rotation;
+
#pragma pack(1)
struct vigsp_point
vigsp_s32 dst_y;
struct vigsp_size dst_size;
vigsp_s32 z_pos;
+ vigsp_bool hflip;
+ vigsp_bool vflip;
+ vigsp_rotation rotation;
};
/*
/*
* Bump this whenever driver interface changes.
*/
-#define DRM_VIGS_DRIVER_VERSION 13
+#define DRM_VIGS_DRIVER_VERSION 14
/*
* Surface access flags.
#define DRM_VIGS_DP_FB_Y 2
#define DRM_VIGS_DP_FB_C 3
+/*
+ * Rotations.
+ */
+#define DRM_VIGS_ROTATION_0 0
+#define DRM_VIGS_ROTATION_90 1
+#define DRM_VIGS_ROTATION_180 2
+#define DRM_VIGS_ROTATION_270 3
+
struct drm_vigs_get_protocol_version
{
uint32_t version;
int zpos;
};
+struct drm_vigs_plane_set_transform
+{
+ uint32_t plane_id;
+ int hflip;
+ int vflip;
+ int rotation;
+};
+
struct drm_vigs_dp_create_surface
{
uint32_t dp_plane;
#define DRM_VIGS_FENCE_SIGNALED 0x0C
#define DRM_VIGS_FENCE_UNREF 0x0D
#define DRM_VIGS_PLANE_SET_ZPOS 0x0E
+#define DRM_VIGS_PLANE_SET_TRANSFORM 0x0F
#define DRM_VIGS_DP_CREATE_SURFACE 0x20
#define DRM_VIGS_DP_OPEN_SURFACE 0x21
DRM_VIGS_FENCE_UNREF, struct drm_vigs_fence_unref)
#define DRM_IOCTL_VIGS_PLANE_SET_ZPOS DRM_IOW(DRM_COMMAND_BASE + \
DRM_VIGS_PLANE_SET_ZPOS, struct drm_vigs_plane_set_zpos)
+#define DRM_IOCTL_VIGS_PLANE_SET_TRANSFORM DRM_IOW(DRM_COMMAND_BASE + \
+ DRM_VIGS_PLANE_SET_TRANSFORM, struct drm_vigs_plane_set_transform)
#define DRM_IOCTL_VIGS_DP_CREATE_SURFACE DRM_IOWR(DRM_COMMAND_BASE + \
DRM_VIGS_DP_CREATE_SURFACE, struct drm_vigs_dp_create_surface)