diff options
Diffstat (limited to 'src/intel_display.c')
-rw-r--r-- | src/intel_display.c | 53 |
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; +} |