glamor: Reallocate pixmap storage without modifiers if necessary
If we need a pixmap's storage to be exported to a context in which we aren't aware of modifiers, reallocate the buffer again without modifiers. This makes it possible to run a compositing manager on an old GLX/EGL stack on top of an X server which allocates internal buffer storage using exotic modifiers from modifier-aware GBM/EGL/KMS. Signed-off-by: Daniel Stone <daniels@collabora.com> Reported-by: Adam Jackson <ajax@redhat.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
		
							parent
							
								
									aab5c46ccb
								
							
						
					
					
						commit
						86b2d8740a
					
				| 
						 | 
					@ -250,7 +250,7 @@ glamor_get_name_from_bo(int gbm_fd, struct gbm_bo *bo, int *name)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
glamor_make_pixmap_exportable(PixmapPtr pixmap)
 | 
					glamor_make_pixmap_exportable(PixmapPtr pixmap, Bool modifiers_ok)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ScreenPtr screen = pixmap->drawable.pScreen;
 | 
					    ScreenPtr screen = pixmap->drawable.pScreen;
 | 
				
			||||||
    ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 | 
					    ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
 | 
				
			||||||
| 
						 | 
					@ -266,7 +266,8 @@ glamor_make_pixmap_exportable(PixmapPtr pixmap)
 | 
				
			||||||
    PixmapPtr exported;
 | 
					    PixmapPtr exported;
 | 
				
			||||||
    GCPtr scratch_gc;
 | 
					    GCPtr scratch_gc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pixmap_priv->image)
 | 
					    if (pixmap_priv->image &&
 | 
				
			||||||
 | 
					        (modifiers_ok || !pixmap_priv->used_modifiers))
 | 
				
			||||||
        return TRUE;
 | 
					        return TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pixmap->drawable.bitsPerPixel != 32) {
 | 
					    if (pixmap->drawable.bitsPerPixel != 32) {
 | 
				
			||||||
| 
						 | 
					@ -282,7 +283,7 @@ glamor_make_pixmap_exportable(PixmapPtr pixmap)
 | 
				
			||||||
        format = GBM_FORMAT_ARGB8888;
 | 
					        format = GBM_FORMAT_ARGB8888;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef GBM_BO_WITH_MODIFIERS
 | 
					#ifdef GBM_BO_WITH_MODIFIERS
 | 
				
			||||||
    if (glamor_egl->dmabuf_capable) {
 | 
					    if (modifiers_ok && glamor_egl->dmabuf_capable) {
 | 
				
			||||||
        uint32_t num_modifiers;
 | 
					        uint32_t num_modifiers;
 | 
				
			||||||
        uint64_t *modifiers = NULL;
 | 
					        uint64_t *modifiers = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -370,7 +371,7 @@ glamor_egl_fds_from_pixmap(ScreenPtr screen, PixmapPtr pixmap, int *fds,
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!glamor_make_pixmap_exportable(pixmap))
 | 
					    if (!glamor_make_pixmap_exportable(pixmap, TRUE))
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bo = glamor_gbm_bo_from_pixmap(screen, pixmap);
 | 
					    bo = glamor_gbm_bo_from_pixmap(screen, pixmap);
 | 
				
			||||||
| 
						 | 
					@ -411,7 +412,7 @@ glamor_egl_fd_name_from_pixmap(ScreenPtr screen,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glamor_egl = glamor_egl_get_screen_private(xf86ScreenToScrn(screen));
 | 
					    glamor_egl = glamor_egl_get_screen_private(xf86ScreenToScrn(screen));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!glamor_make_pixmap_exportable(pixmap))
 | 
					    if (!glamor_make_pixmap_exportable(pixmap, FALSE))
 | 
				
			||||||
        goto failure;
 | 
					        goto failure;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bo = glamor_gbm_bo_from_pixmap(screen, pixmap);
 | 
					    bo = glamor_gbm_bo_from_pixmap(screen, pixmap);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue