summaryrefslogtreecommitdiff
path: root/src/intel_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/intel_display.c')
-rw-r--r--src/intel_display.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/intel_display.c b/src/intel_display.c
index 84c7c08c..d75a6070 100644
--- a/src/intel_display.c
+++ b/src/intel_display.c
@@ -75,6 +75,7 @@ struct intel_crtc {
dri_bo *rotate_bo;
uint32_t rotate_pitch;
uint32_t rotate_fb_id;
+ uint32_t sprite_id;
xf86CrtcPtr crtc;
struct list link;
};
@@ -1576,9 +1577,50 @@ drm_wakeup_handler(pointer data, int err, pointer p)
drmHandleEvent(mode->fd, &mode->event_context);
}
+static void intel_crtc_find_plane(ScrnInfoPtr scrn, xf86CrtcPtr crtc)
+{
+ intel_screen_private *intel = intel_get_screen_private(scrn);
+ struct intel_crtc *intel_crtc = crtc->driver_private;
+ drmModePlaneRes *plane_resources;
+ drmModePlane *ovr;
+ uint32_t id = 0;
+ int i;
+
+ plane_resources = drmModeGetPlaneResources(intel->drmSubFD);
+ if (!plane_resources) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "failed to get plane resources: %s\n",
+ strerror(errno));
+ goto out;
+ }
+
+ for (i = 0; i < plane_resources->count_planes; i++) {
+ ovr = drmModeGetPlane(intel->drmSubFD,
+ plane_resources->planes[i]);
+ if (!ovr) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "failed to get plane info: %s\n",
+ strerror(errno));
+ continue;
+ }
+
+ if (ovr->possible_crtcs & (1 << intel_crtc_to_pipe(crtc))) {
+ id = ovr->plane_id;
+ drmModeFreePlane(ovr);
+ break;
+ }
+ drmModeFreePlane(ovr);
+ }
+
+ free(plane_resources);
+out:
+ intel_crtc->sprite_id = id;
+}
+
Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
{
intel_screen_private *intel = intel_get_screen_private(scrn);
+ struct intel_crtc *intel_crtc;
struct drm_i915_getparam gp;
struct intel_mode *mode;
unsigned int i;
@@ -1609,6 +1651,9 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
for (i = 0; i < mode->mode_res->count_crtcs; i++)
intel_crtc_init(scrn, mode, i);
+ list_for_each_entry(intel_crtc, &mode->crtcs, link)
+ intel_crtc_find_plane(scrn, intel_crtc->crtc);
+
for (i = 0; i < mode->mode_res->count_connectors; i++)
intel_output_init(scrn, mode, i);
@@ -1630,6 +1675,8 @@ Bool intel_mode_pre_init(ScrnInfoPtr scrn, int fd, int cpp)
}
intel->modes = mode;
+
+
return TRUE;
}
@@ -1699,3 +1746,9 @@ int intel_crtc_to_pipe(xf86CrtcPtr crtc)
struct intel_crtc *intel_crtc = crtc->driver_private;
return intel_crtc->pipe;
}
+
+int intel_crtc_to_sprite(xf86CrtcPtr crtc)
+{
+ struct intel_crtc *intel_crtc = crtc->driver_private;
+ return intel_crtc->sprite_id;
+}