On Thu, May 15, 2014 at 06:17:29PM -0700, Matt Roper wrote: > The DRM core will translate calls to legacy cursor ioctls into universal > cursor calls automatically, so there's no need to maintain the legacy > cursor support. This greatly simplifies the transition since we don't > have to handle reference counting differently depending on which cursor > interface was called. > > The aim here is to transition to the universal plane interface with > minimal code change. There's a lot of cleanup that can be done (e.g., > using state stored in crtc->cursor->fb rather than intel_crtc) that is > left to future patches. > > Signed-off-by: Matt Roper <matthew.d.roper@xxxxxxxxx> > --- > +static int > +intel_cursor_plane_update(struct drm_plane *plane, struct drm_crtc *crtc, > + struct drm_framebuffer *fb, int crtc_x, int crtc_y, > + unsigned int crtc_w, unsigned int crtc_h, > + uint32_t src_x, uint32_t src_y, > + uint32_t src_w, uint32_t src_h) > +{ > + struct drm_device *dev = crtc->dev; > + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); > + struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); > + struct drm_i915_gem_object *obj = intel_fb->obj; > + struct drm_rect dest = { > + /* integer pixels */ > + .x1 = crtc_x, > + .y1 = crtc_y, > + .x2 = crtc_x + crtc_w, > + .y2 = crtc_y + crtc_h, > + }; > + struct drm_rect src = { > + /* 16.16 fixed point */ > + .x1 = src_x, > + .y1 = src_y, > + .x2 = src_x + src_w, > + .y2 = src_y + src_h, > + }; > + const struct drm_rect clip = { > + /* integer pixels */ > + .x2 = intel_crtc->config.pipe_src_w, > + .y2 = intel_crtc->config.pipe_src_h, > + }; > + int hscale, vscale; > + bool visible; > + > + /* Check scaling */ > + hscale = drm_rect_calc_hscale(&src, &dest, > + DRM_PLANE_HELPER_NO_SCALING, > + DRM_PLANE_HELPER_NO_SCALING); > + vscale = drm_rect_calc_vscale(&src, &dest, > + DRM_PLANE_HELPER_NO_SCALING, > + DRM_PLANE_HELPER_NO_SCALING); > + if (hscale < 0 || vscale < 0) { > + DRM_DEBUG_KMS("Invalid scaling of cursor plane\n"); > + return -ERANGE; > + } > + > + /* Check dimensions */ > + if (!((crtc_w == 64 && crtc_h == 64) || > + (crtc_w == 128 && crtc_h == 128 && !IS_GEN2(dev)) || > + (crtc_w == 256 && crtc_h == 256 && !IS_GEN2(dev)))) { > + DRM_DEBUG_KMS("Cursor dimension not supported: %dx%d\n", > + crtc_w, crtc_h); > + return -EINVAL; > + } > + > + /* Clip to display; if no longer visible after clipping, disable */ > + visible = drm_rect_clip_scaled(&src, &dest, &clip, hscale, vscale); > + > + crtc->cursor_x = crtc_x; > + crtc->cursor_y = crtc_y; > + if (fb != crtc->cursor->fb) { > + return intel_crtc_cursor_set_obj(crtc, visible ? obj : NULL, > + crtc_w, crtc_h); > + } else { > + intel_crtc_update_cursor(crtc, true); > + return 0; > + } Does this do the right thing for a cursor that is no longer visible, and vice versa? It is not immediately clear how clipping now works with intel_crtc_update_cursor(). -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel