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