modesetting: add support for background none.
This adds support using glamor for background None. loosely based off the amdgpu code. relies on the glamor_finish code. Acked-by: Eric Anholt <eric@anholt.net> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
		
							parent
							
								
									c33250945b
								
							
						
					
					
						commit
						caabc4e855
					
				| 
						 | 
					@ -1098,6 +1098,25 @@ SetMaster(ScrnInfoPtr pScrn)
 | 
				
			||||||
    return ret == 0;
 | 
					    return ret == 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* When the root window is created, initialize the screen contents from
 | 
				
			||||||
 | 
					 * console if -background none was specified on the command line
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					CreateWindow_oneshot(WindowPtr pWin)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ScreenPtr pScreen = pWin->drawable.pScreen;
 | 
				
			||||||
 | 
					    ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
 | 
				
			||||||
 | 
					    modesettingPtr ms = modesettingPTR(pScrn);
 | 
				
			||||||
 | 
					    Bool ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pScreen->CreateWindow = ms->CreateWindow;
 | 
				
			||||||
 | 
					    ret = pScreen->CreateWindow(pWin);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ret)
 | 
				
			||||||
 | 
					        drmmode_copy_fb(pScrn, &ms->drmmode);
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
ScreenInit(ScreenPtr pScreen, int argc, char **argv)
 | 
					ScreenInit(ScreenPtr pScreen, int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1206,6 +1225,11 @@ ScreenInit(ScreenPtr pScreen, int argc, char **argv)
 | 
				
			||||||
     * later memory should be bound when allocating, e.g rotate_mem */
 | 
					     * later memory should be bound when allocating, e.g rotate_mem */
 | 
				
			||||||
    pScrn->vtSema = TRUE;
 | 
					    pScrn->vtSema = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (serverGeneration == 1 && bgNoneRoot && ms->drmmode.glamor) {
 | 
				
			||||||
 | 
					        ms->CreateWindow = pScreen->CreateWindow;
 | 
				
			||||||
 | 
					        pScreen->CreateWindow = CreateWindow_oneshot;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pScreen->SaveScreen = xf86SaveScreen;
 | 
					    pScreen->SaveScreen = xf86SaveScreen;
 | 
				
			||||||
    ms->CloseScreen = pScreen->CloseScreen;
 | 
					    ms->CloseScreen = pScreen->CloseScreen;
 | 
				
			||||||
    pScreen->CloseScreen = CloseScreen;
 | 
					    pScreen->CloseScreen = CloseScreen;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -97,7 +97,7 @@ typedef struct _modesettingRec {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Bool noAccel;
 | 
					    Bool noAccel;
 | 
				
			||||||
    CloseScreenProcPtr CloseScreen;
 | 
					    CloseScreenProcPtr CloseScreen;
 | 
				
			||||||
 | 
					    CreateWindowProcPtr CreateWindow;
 | 
				
			||||||
    unsigned int SaveGeneration;
 | 
					    unsigned int SaveGeneration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    CreateScreenResourcesProcPtr createScreenResources;
 | 
					    CreateScreenResourcesProcPtr createScreenResources;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,7 +51,9 @@
 | 
				
			||||||
#include "driver.h"
 | 
					#include "driver.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height);
 | 
					static Bool drmmode_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height);
 | 
				
			||||||
 | 
					static PixmapPtr drmmode_create_pixmap_header(ScreenPtr pScreen, int width, int height,
 | 
				
			||||||
 | 
					                                              int depth, int bitsPerPixel, int devKind,
 | 
				
			||||||
 | 
					                                              void *pPixData);
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
drmmode_zaphod_string_matches(ScrnInfoPtr scrn, const char *s, char *output_name)
 | 
					drmmode_zaphod_string_matches(ScrnInfoPtr scrn, const char *s, char *output_name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -285,49 +287,101 @@ drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
 | 
				
			||||||
    drmmode_crtc->dpms_mode = mode;
 | 
					    drmmode_crtc->dpms_mode = mode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
					 | 
				
			||||||
static PixmapPtr
 | 
					static PixmapPtr
 | 
				
			||||||
create_pixmap_for_fbcon(drmmode_ptr drmmode, ScrnInfoPtr pScrn, int crtc_id)
 | 
					create_pixmap_for_fbcon(drmmode_ptr drmmode, ScrnInfoPtr pScrn, int fbcon_id)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 | 
					    PixmapPtr pixmap = drmmode->fbcon_pixmap;
 | 
				
			||||||
    drmmode_crtc_private_ptr drmmode_crtc;
 | 
					 | 
				
			||||||
    ScreenPtr pScreen = pScrn->pScreen;
 | 
					 | 
				
			||||||
    PixmapPtr pixmap;
 | 
					 | 
				
			||||||
    struct radeon_bo *bo;
 | 
					 | 
				
			||||||
    drmModeFBPtr fbcon;
 | 
					    drmModeFBPtr fbcon;
 | 
				
			||||||
    struct drm_gem_flink flink;
 | 
					    struct drm_gem_flink flink;
 | 
				
			||||||
 | 
					    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
 | 
				
			||||||
 | 
					    Bool ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    drmmode_crtc = xf86_config->crtc[crtc_id]->driver_private;
 | 
					    if (pixmap)
 | 
				
			||||||
 | 
					        return pixmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fbcon = drmModeGetFB(drmmode->fd, drmmode_crtc->mode_crtc->buffer_id);
 | 
					    fbcon = drmModeGetFB(drmmode->fd, fbcon_id);
 | 
				
			||||||
    if (fbcon == NULL)
 | 
					    if (fbcon == NULL)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (fbcon->depth != pScrn->depth ||
 | 
				
			||||||
 | 
					        fbcon->width != pScrn->virtualX ||
 | 
				
			||||||
 | 
					        fbcon->height != pScrn->virtualY)
 | 
				
			||||||
 | 
					        goto out_free_fb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    flink.handle = fbcon->handle;
 | 
					    flink.handle = fbcon->handle;
 | 
				
			||||||
    if (ioctl(drmmode->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) {
 | 
					    if (ioctl(drmmode->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) {
 | 
				
			||||||
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Couldn't flink fbcon handle\n");
 | 
					        xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Couldn't flink fbcon handle\n");
 | 
				
			||||||
        return NULL;
 | 
					        goto out_free_fb;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bo = radeon_bo_open(drmmode->bufmgr, flink.name, 0, 0, 0, 0);
 | 
					    pixmap = drmmode_create_pixmap_header(pScreen, fbcon->width,
 | 
				
			||||||
    if (bo == NULL) {
 | 
					                                          fbcon->height, fbcon->depth,
 | 
				
			||||||
        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
 | 
					                                          fbcon->bpp, fbcon->pitch, NULL);
 | 
				
			||||||
                   "Couldn't allocate bo for fbcon handle\n");
 | 
					 | 
				
			||||||
        return NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pixmap = drmmode_create_bo_pixmap(pScreen, fbcon->width, fbcon->height,
 | 
					 | 
				
			||||||
                                      fbcon->depth, fbcon->bpp,
 | 
					 | 
				
			||||||
                                      fbcon->pitch, bo);
 | 
					 | 
				
			||||||
    if (!pixmap)
 | 
					    if (!pixmap)
 | 
				
			||||||
        return NULL;
 | 
					        goto out_free_fb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    radeon_bo_unref(bo);
 | 
					    ret = glamor_egl_create_textured_pixmap(pixmap, fbcon->handle, fbcon->pitch);
 | 
				
			||||||
 | 
					    if (!ret) {
 | 
				
			||||||
 | 
					      FreePixmap(pixmap);
 | 
				
			||||||
 | 
					      pixmap = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    drmmode->fbcon_pixmap = pixmap;
 | 
				
			||||||
 | 
					out_free_fb:
 | 
				
			||||||
    drmModeFreeFB(fbcon);
 | 
					    drmModeFreeFB(fbcon);
 | 
				
			||||||
    return pixmap;
 | 
					    return pixmap;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					void
 | 
				
			||||||
 | 
					drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
 | 
				
			||||||
 | 
					    ScreenPtr pScreen = xf86ScrnToScreen(pScrn);
 | 
				
			||||||
 | 
					    PixmapPtr src, dst;
 | 
				
			||||||
 | 
					    int fbcon_id = 0;
 | 
				
			||||||
 | 
					    GCPtr gc;
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < xf86_config->num_crtc; i++) {
 | 
				
			||||||
 | 
					        drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[i]->driver_private;
 | 
				
			||||||
 | 
					        if (drmmode_crtc->mode_crtc->buffer_id)
 | 
				
			||||||
 | 
					            fbcon_id = drmmode_crtc->mode_crtc->buffer_id;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!fbcon_id)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (fbcon_id == drmmode->fb_id) {
 | 
				
			||||||
 | 
					        /* in some rare case there might be no fbcon and we might already
 | 
				
			||||||
 | 
					         * be the one with the current fb to avoid a false deadlck in
 | 
				
			||||||
 | 
					         * kernel ttm code just do nothing as anyway there is nothing
 | 
				
			||||||
 | 
					         * to do
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    src = create_pixmap_for_fbcon(drmmode, pScrn, fbcon_id);
 | 
				
			||||||
 | 
					    if (!src)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dst = pScreen->GetScreenPixmap(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gc = GetScratchGC(pScrn->depth, pScreen);
 | 
				
			||||||
 | 
					    ValidateGC(&dst->drawable, gc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    (*gc->ops->CopyArea)(&src->drawable, &dst->drawable, gc, 0, 0,
 | 
				
			||||||
 | 
					                         pScrn->virtualX, pScrn->virtualY, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FreeScratchGC(gc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glamor_finish(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pScreen->canDoBGNoneRoot = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (drmmode->fbcon_pixmap)
 | 
				
			||||||
 | 
					        pScrn->pScreen->DestroyPixmap(drmmode->fbcon_pixmap);
 | 
				
			||||||
 | 
					    drmmode->fbcon_pixmap = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 | 
					drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -87,6 +87,8 @@ typedef struct {
 | 
				
			||||||
    Bool reverse_prime_offload_mode;
 | 
					    Bool reverse_prime_offload_mode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Bool is_secondary;
 | 
					    Bool is_secondary;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    PixmapPtr fbcon_pixmap;
 | 
				
			||||||
} drmmode_rec, *drmmode_ptr;
 | 
					} drmmode_rec, *drmmode_ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
| 
						 | 
					@ -174,7 +176,7 @@ void drmmode_free_bos(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
 | 
				
			||||||
void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode,
 | 
					void drmmode_get_default_bpp(ScrnInfoPtr pScrn, drmmode_ptr drmmmode,
 | 
				
			||||||
                             int *depth, int *bpp);
 | 
					                             int *depth, int *bpp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
 | 
				
			||||||
#ifndef DRM_CAP_DUMB_PREFERRED_DEPTH
 | 
					#ifndef DRM_CAP_DUMB_PREFERRED_DEPTH
 | 
				
			||||||
#define DRM_CAP_DUMB_PREFERRED_DEPTH 3
 | 
					#define DRM_CAP_DUMB_PREFERRED_DEPTH 3
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue