On Tue, Apr 04, 2017 at 06:13:20PM +1000, raof@xxxxxxxxxx wrote: > From: Christopher James Halse Rogers <raof@xxxxxxxxxx> > > Until recently, on (at least) nouveau, radeon, and amdgpu attempting to scanout of an > imported dma-buf would silently result in the dma-buf sharing being broken. > > While the hardware is capable of scanning out of imported dma-bufs (at least in some circumstances), > these drivers do not currently implement it, so attempts to scan out of such buffers will never succeed. > > Add a userspace-visible drm capability and associated driver_feature so that userspace can discover > when scanning out of an imported dma-buf can work. > > Signed-off-by: Christopher James Halse Rogers <christopher.halse.rogers@xxxxxxxxxxxxx> This seems like an awful specific special case. Why can't you do the entire dance upfront, i.e. import buffer, addfb2? None of that has any visible effect, and it will also allow you to check runtime constraints which can't be covered with this here. -Daniel > --- > drivers/gpu/drm/drm_ioctl.c | 3 +++ > include/drm/drm_drv.h | 1 + > include/uapi/drm/drm.h | 21 +++++++++++++++++++++ > 3 files changed, 25 insertions(+) > > diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c > index a7c61c23685a..79ccf638668e 100644 > --- a/drivers/gpu/drm/drm_ioctl.c > +++ b/drivers/gpu/drm/drm_ioctl.c > @@ -285,6 +285,9 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_ > case DRM_CAP_ADDFB2_MODIFIERS: > req->value = dev->mode_config.allow_fb_modifiers; > break; > + case DRM_CAP_PRIME_SCANOUT: > + req->value = drm_core_check_feature(dev, DRIVER_PRIME_SCANOUT); > + break; > default: > return -EINVAL; > } > diff --git a/include/drm/drm_drv.h b/include/drm/drm_drv.h > index 5699f42195fe..32cc0d956d7e 100644 > --- a/include/drm/drm_drv.h > +++ b/include/drm/drm_drv.h > @@ -53,6 +53,7 @@ struct drm_mode_create_dumb; > #define DRIVER_RENDER 0x8000 > #define DRIVER_ATOMIC 0x10000 > #define DRIVER_KMS_LEGACY_CONTEXT 0x20000 > +#define DRIVER_PRIME_SCANOUT 0x40000 > > /** > * struct drm_driver - DRM driver structure > diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h > index b2c52843bc70..c57213cdb702 100644 > --- a/include/uapi/drm/drm.h > +++ b/include/uapi/drm/drm.h > @@ -647,6 +647,27 @@ struct drm_gem_open { > #define DRM_CAP_CURSOR_HEIGHT 0x9 > #define DRM_CAP_ADDFB2_MODIFIERS 0x10 > #define DRM_CAP_PAGE_FLIP_TARGET 0x11 > +/** > + * DRM_CAP_PRIME_SCANOUT > + * > + * The PRIME_SCANOUT capability returns whether the driver might be capable > + * of scanning out of an imported PRIME buffer. > + * > + * This does not guarantee that any imported buffer can be scanned out, as > + * there may be specific requirements that a given buffer might not satisfy. > + * > + * If this capability is false then imported PRIME buffers will definitely > + * never be suitable for scanout. > + * > + * Note: Prior to the introduction of this capability, bugs in drivers would > + * allow userspace to attempt to scan out of imported PRIME buffers. This would > + * work once, but move the buffer into an inconsistent state where rendering from > + * the exporting GPU would no longer be seen by the importing GPU. > + * > + * It is unsafe for driver-agnostic code to attempt to scan out of an imported > + * PRIME buffer in the absense of this capability. > + */ > +#define DRM_CAP_PRIME_SCANOUT 0x12 > > /** DRM_IOCTL_GET_CAP ioctl argument type */ > struct drm_get_cap { > -- > 2.11.0 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel