One of the stepping stones on the way to atomic/nuclear operation is to expose all types of hardware planes to userspace via a consistent interface. Until now, the DRM plane interface has only operated on planes that drivers consider "overlay" or "sprite" planes; primary planes were simply represented by extra state hanging off the CRTC, and cursor planes had no direct representation in userspace, but were manipulated via separate ioctl's. This patch set begins the process of unifying the various plane types into a single, consistent interface. With this patchset, userspace clients that set a DRM_CLIENT_CAP_UNIVERSAL_PLANES client capability bit will receive a full list of all hardware planes, including primary planes and cursor planes, not just the overlay/sprite planes that have historically been returned. Userspace should be able to make drmModeSetPlane() calls against any type of plane and have them operate as expected (to the extent supported by the underlying hardware). This benefits of this unified interface will be most evident once driver state is fully property-ized as part of the upcoming atomic modeset / nuclear pageflip work. However there are a few benefits that may be achieved even before then: * Drivers for hardware with scaling-capable primary planes may honor userspace scaling requests for the primary plane made with the drmModeSetPlane() call. Previously there was no interface that allowed userspace to specify desired scaling on primary planes. * Drivers for hardware that may disable primary planes independently from the underlying CRTC may now do so when userspace passes a NULL framebuffer to the drmModeSetPlane() interface. This patchset is organized as follows: - Patch 1 updates the DRM core with the general concept of multiple plane types and prepares for there to be multiple types of planes on the DRM plane list. - Patch 2 adds a set of primary plane helper functions that drivers may use to quickly support plane operations against primary planes. These helpers implement plane update operations by calling into the driver's modeset interface. These helpers are optional; drivers are free to provide their own implementation. - Patches 3 and 4 update loops over the DRM plane list in the exynos and i915 drivers to ignore non-overlay planes. This ensures that the behavior of these loops will not change when new plane types show up on the DRM plane list in future patches. - Patch 5 adds a "plane type" property that allows userspace to identify the types of the planes it receives. Note that we replace the 'priv' parameter to drm_plane_init() with the type that should be used for this property; in doing so, we create the first opportunity for non-overlay planes to appear on the DRM plane list for some drivers ( msm, omap, and imx), although they will not be visible to userspace at this time. - Patch 6 updates all drivers to call drm_primary_helper_create_plane() before CRTC creation and then pass the resulting plane to drm_crtc_init(). This will create a primary plane via the primary plane helper and add it to the DRM plane list. Note that this is the first time that *all* drivers will have non-overlay planes on their plane list (msm, omap, and imx had their previously-private planes show up in the plane list in patch 5). These non-overlay planes still cannot be exposed to userspace. - Patch 7 drops the 'fb' field from drm_crtc and switches everything to using crtc->primary->fb instead. - Patch 8 adds the client capability bit which allows userspace to request the full plane list rather than just the overlay list. This is the first patch that may have a userspace-visible effect. - Patch 9 is a simple function name update in i915 to avoid confusion. - Patch 10 replaces the primary plane helper usage in i915 with a custom implementation of primary planes. On Intel hardware, we can disable the primary plane without disabling the entire CRTC; the custom implementation here allows us to avoid that limitation assumed by the helpers. This patch set is still a work in progress. Specific work that still needs to be done: * Update msm, omap, and imx to properly associate their primary planes with the appropriate CRTC (and stop creating a separate dummy primary plane). At the moment the formerly "private" planes that these drivers use are created as primary planes, but they're never specifically associated with the correct CRTC (i.e., passed at drm_crtc_init()). I think this should be pretty straightforward, but I just haven't had enough time to look through how those drivers are structured yet to make the change. [suggested by Rob Clark] * Add cursor plane implementation. The general infrastructure necessary to support cursors is present, but no default helpers exist yet and no driver actually registers any cursor planes. * Add extra read-only plane properties to inform userspace of what a plane's true limitations and capabilities are. Although the "plane type" property is probably enough to get by with something like a driver-specific DDX in userspace, hardware-independent userspace like Weston will need more information about what can and can't be done with each plane. This is especially important for cursor planes since they can largely be viewed as additional overlay planes that just have some extra limitations attached. * Disallow usage of legacy cursor interfaces by clients that request universal plane support. Make the new, unified interface the only interface for clients that can support it. [suggested by Ville Syrjälä] Matt Roper (10): drm: Add support for multiple plane types drm: Add primary plane helpers drm/exynos: Restrict plane loops to only operate on overlay planes drm/i915: Restrict plane loops to only operate on overlay planes drm: Add plane type property drm: Specify primary plane at CRTC initialization drm: Replace crtc fb with primary plane fb drm: Allow userspace to ask for full plane list (universal planes) drm/i915: Rename similar plane functions to avoid confusion drm/i915: Intel-specific primary plane handling drivers/gpu/drm/armada/armada_crtc.c | 4 +- drivers/gpu/drm/armada/armada_overlay.c | 3 +- drivers/gpu/drm/ast/ast_mode.c | 4 +- drivers/gpu/drm/bochs/bochs_kms.c | 4 +- drivers/gpu/drm/cirrus/cirrus_mode.c | 4 +- drivers/gpu/drm/drm_crtc.c | 447 ++++++++++++++++++++++------ drivers/gpu/drm/drm_crtc_helper.c | 21 +- drivers/gpu/drm/drm_fb_helper.c | 9 +- drivers/gpu/drm/drm_ioctl.c | 5 + drivers/gpu/drm/exynos/exynos_drm_crtc.c | 4 +- drivers/gpu/drm/exynos/exynos_drm_encoder.c | 6 + drivers/gpu/drm/exynos/exynos_drm_plane.c | 4 +- drivers/gpu/drm/gma500/psb_intel_display.c | 4 +- drivers/gpu/drm/i915/i915_debugfs.c | 4 +- drivers/gpu/drm/i915/i915_drv.h | 5 +- drivers/gpu/drm/i915/i915_irq.c | 4 +- drivers/gpu/drm/i915/intel_display.c | 238 +++++++++++---- drivers/gpu/drm/i915/intel_dp.c | 5 +- drivers/gpu/drm/i915/intel_drv.h | 1 + drivers/gpu/drm/i915/intel_overlay.c | 4 +- drivers/gpu/drm/i915/intel_pm.c | 39 +-- drivers/gpu/drm/i915/intel_sprite.c | 2 +- drivers/gpu/drm/mgag200/mgag200_mode.c | 4 +- drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 4 +- drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 4 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 4 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 3 +- drivers/gpu/drm/nouveau/dispnv04/crtc.c | 24 +- drivers/gpu/drm/nouveau/dispnv04/dfp.c | 2 +- drivers/gpu/drm/nouveau/dispnv04/overlay.c | 4 +- drivers/gpu/drm/nouveau/nouveau_display.c | 8 +- drivers/gpu/drm/nouveau/nv50_display.c | 21 +- drivers/gpu/drm/omapdrm/omap_crtc.c | 4 +- drivers/gpu/drm/omapdrm/omap_plane.c | 4 +- drivers/gpu/drm/qxl/qxl_display.c | 4 +- drivers/gpu/drm/radeon/atombios_crtc.c | 20 +- drivers/gpu/drm/radeon/r100.c | 4 +- drivers/gpu/drm/radeon/radeon_connectors.c | 2 +- drivers/gpu/drm/radeon/radeon_device.c | 3 +- drivers/gpu/drm/radeon/radeon_display.c | 8 +- drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 16 +- drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 4 +- drivers/gpu/drm/rcar-du/rcar_du_plane.c | 3 +- drivers/gpu/drm/shmobile/shmob_drm_crtc.c | 3 +- drivers/gpu/drm/shmobile/shmob_drm_plane.c | 2 +- drivers/gpu/drm/tegra/dc.c | 7 +- drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 4 +- drivers/gpu/drm/udl/udl_modeset.c | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 4 +- drivers/staging/imx-drm/imx-drm-core.c | 4 +- drivers/staging/imx-drm/ipuv3-plane.c | 4 +- include/drm/drmP.h | 5 + include/drm/drm_crtc.h | 108 ++++++- include/uapi/drm/drm.h | 8 + 55 files changed, 853 insertions(+), 275 deletions(-) -- 1.8.5.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel