mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-11 18:06:13 +00:00
igt_kms: Add support for setting plane rotation
Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
This commit is contained in:
parent
b2eb48576f
commit
068efd8d9f
@ -641,6 +641,16 @@ get_plane_property(igt_display_t *display, uint32_t plane_id, const char *name,
|
|||||||
name, prop_id, value);
|
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
|
* 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
|
* 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);
|
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);
|
fb_id = igt_plane_get_fb_id(plane);
|
||||||
crtc_id = output->config.crtc->crtc_id;
|
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->fb_changed = false;
|
||||||
plane->position_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;
|
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 */
|
/* Primary planes can't be windowed when using a legacy commit */
|
||||||
igt_assert((primary->crtc_x == 0 && primary->crtc_y == 0));
|
igt_assert((primary->crtc_x == 0 && primary->crtc_y == 0));
|
||||||
|
|
||||||
|
/* nor rotated */
|
||||||
|
igt_assert(!primary->rotation_changed);
|
||||||
|
|
||||||
if (!primary->fb_changed && !primary->position_changed &&
|
if (!primary->fb_changed && !primary->position_changed &&
|
||||||
!primary->panning_changed)
|
!primary->panning_changed)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1408,6 +1433,35 @@ void igt_plane_set_panning(igt_plane_t *plane, int x, int y)
|
|||||||
plane->panning_changed = true;
|
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)
|
void igt_wait_for_vblank(int drm_fd, enum pipe pipe)
|
||||||
{
|
{
|
||||||
drmVBlank wait_vbl;
|
drmVBlank wait_vbl;
|
||||||
|
@ -71,6 +71,14 @@ enum igt_commit_style {
|
|||||||
/* We'll add atomic here eventually. */
|
/* 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"
|
#include "igt_fb.h"
|
||||||
|
|
||||||
struct kmstest_connector_config {
|
struct kmstest_connector_config {
|
||||||
@ -155,6 +163,7 @@ typedef struct {
|
|||||||
unsigned int fb_changed : 1;
|
unsigned int fb_changed : 1;
|
||||||
unsigned int position_changed : 1;
|
unsigned int position_changed : 1;
|
||||||
unsigned int panning_changed : 1;
|
unsigned int panning_changed : 1;
|
||||||
|
unsigned int rotation_changed : 1;
|
||||||
/*
|
/*
|
||||||
* drm_plane can be NULL for primary and cursor planes (when not
|
* drm_plane can be NULL for primary and cursor planes (when not
|
||||||
* using the atomic modeset API)
|
* using the atomic modeset API)
|
||||||
@ -168,6 +177,7 @@ typedef struct {
|
|||||||
int crtc_x, crtc_y;
|
int crtc_x, crtc_y;
|
||||||
/* panning offset within the fb */
|
/* panning offset within the fb */
|
||||||
unsigned int pan_x, pan_y;
|
unsigned int pan_x, pan_y;
|
||||||
|
igt_rotation_t rotation;
|
||||||
} igt_plane_t;
|
} igt_plane_t;
|
||||||
|
|
||||||
struct igt_pipe {
|
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_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_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_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);
|
void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user