add shadowfb support, default to on.
we should probably expose a bit from kernel to say if shadow is preferred or wasteful.
This commit is contained in:
		
							parent
							
								
									0b5e574dff
								
							
						
					
					
						commit
						1f37991dec
					
				| 
						 | 
					@ -49,6 +49,7 @@
 | 
				
			||||||
#include "xf86Crtc.h"
 | 
					#include "xf86Crtc.h"
 | 
				
			||||||
#include "miscstruct.h"
 | 
					#include "miscstruct.h"
 | 
				
			||||||
#include "dixstruct.h"
 | 
					#include "dixstruct.h"
 | 
				
			||||||
 | 
					#include "shadow.h"
 | 
				
			||||||
#include "xf86xv.h"
 | 
					#include "xf86xv.h"
 | 
				
			||||||
#include <X11/extensions/Xv.h>
 | 
					#include <X11/extensions/Xv.h>
 | 
				
			||||||
#include <xorg-server.h>
 | 
					#include <xorg-server.h>
 | 
				
			||||||
| 
						 | 
					@ -110,11 +111,13 @@ typedef enum
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    OPTION_SW_CURSOR,
 | 
					    OPTION_SW_CURSOR,
 | 
				
			||||||
    OPTION_DEVICE_PATH,
 | 
					    OPTION_DEVICE_PATH,
 | 
				
			||||||
 | 
					    OPTION_SHADOW_FB,
 | 
				
			||||||
} modesettingOpts;
 | 
					} modesettingOpts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const OptionInfoRec Options[] = {
 | 
					static const OptionInfoRec Options[] = {
 | 
				
			||||||
    {OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE},
 | 
					    {OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE},
 | 
				
			||||||
    {OPTION_DEVICE_PATH, "kmsdev", OPTV_STRING, {0}, FALSE },
 | 
					    {OPTION_DEVICE_PATH, "kmsdev", OPTV_STRING, {0}, FALSE },
 | 
				
			||||||
 | 
					    {OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE },
 | 
				
			||||||
    {-1, NULL, OPTV_NONE, {0}, FALSE}
 | 
					    {-1, NULL, OPTV_NONE, {0}, FALSE}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -472,6 +475,8 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 | 
				
			||||||
	ms->SWCursor = TRUE;
 | 
						ms->SWCursor = TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ms->shadow_enable = xf86ReturnOptValBool(ms->Options, OPTION_SHADOW_FB, TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ms->drmmode.fd = ms->fd;
 | 
					    ms->drmmode.fd = ms->fd;
 | 
				
			||||||
    if (drmmode_pre_init(pScrn, &ms->drmmode, pScrn->bitsPerPixel / 8) == FALSE) {
 | 
					    if (drmmode_pre_init(pScrn, &ms->drmmode, pScrn->bitsPerPixel / 8) == FALSE) {
 | 
				
			||||||
	xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "KMS setup failed\n");
 | 
						xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "KMS setup failed\n");
 | 
				
			||||||
| 
						 | 
					@ -504,11 +509,31 @@ PreInit(ScrnInfoPtr pScrn, int flags)
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable) {
 | 
				
			||||||
 | 
						if (!xf86LoadSubModule(pScrn, "shadow")) {
 | 
				
			||||||
 | 
						    return FALSE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
    fail:
 | 
					    fail:
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void *
 | 
				
			||||||
 | 
					msShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode,
 | 
				
			||||||
 | 
						       CARD32 *size, void *closure)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ScrnInfoPtr pScrn = xf86Screens[screen->myNum];
 | 
				
			||||||
 | 
					    modesettingPtr ms = modesettingPTR(pScrn);
 | 
				
			||||||
 | 
					    int stride;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8;
 | 
				
			||||||
 | 
					    *size = stride;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ((uint8_t *)ms->drmmode.front_bo->ptr + row * stride + offset);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
CreateScreenResources(ScreenPtr pScreen)
 | 
					CreateScreenResources(ScreenPtr pScreen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -532,9 +557,19 @@ CreateScreenResources(ScreenPtr pScreen)
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    rootPixmap = pScreen->GetScreenPixmap(pScreen);
 | 
					    rootPixmap = pScreen->GetScreenPixmap(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable)
 | 
				
			||||||
 | 
						pixels = ms->shadow_fb;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, pixels))
 | 
					    if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, pixels))
 | 
				
			||||||
	FatalError("Couldn't adjust screen pixmap\n");
 | 
						FatalError("Couldn't adjust screen pixmap\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable) {
 | 
				
			||||||
 | 
						if (!shadowAdd(pScreen, rootPixmap, shadowUpdatePackedWeak(),
 | 
				
			||||||
 | 
							       msShadowWindow, 0, 0))
 | 
				
			||||||
 | 
						    return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
 | 
					    ms->damage = DamageCreate(NULL, NULL, DamageReportNone, TRUE,
 | 
				
			||||||
                              pScreen, rootPixmap);
 | 
					                              pScreen, rootPixmap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -550,6 +585,15 @@ CreateScreenResources(ScreenPtr pScreen)
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static Bool
 | 
				
			||||||
 | 
					msShadowInit(ScreenPtr pScreen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!shadowSetup(pScreen)) {
 | 
				
			||||||
 | 
						return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Bool
 | 
					static Bool
 | 
				
			||||||
ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 | 
					ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -571,6 +615,13 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 | 
				
			||||||
    if (!drmmode_create_initial_bos(pScrn, &ms->drmmode))
 | 
					    if (!drmmode_create_initial_bos(pScrn, &ms->drmmode))
 | 
				
			||||||
	return FALSE;
 | 
						return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable) {
 | 
				
			||||||
 | 
						ms->shadow_fb = calloc(1, pScrn->displayWidth * pScrn->virtualY *
 | 
				
			||||||
 | 
								       ((pScrn->bitsPerPixel + 7) >> 3));
 | 
				
			||||||
 | 
						if (!ms->shadow_fb)
 | 
				
			||||||
 | 
						    ms->shadow_enable = FALSE;
 | 
				
			||||||
 | 
					    }	
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    miClearVisualTypes();
 | 
					    miClearVisualTypes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!miSetVisualTypes(pScrn->depth,
 | 
					    if (!miSetVisualTypes(pScrn->depth,
 | 
				
			||||||
| 
						 | 
					@ -607,6 +658,12 @@ ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fbPictureInit(pScreen, NULL, 0);
 | 
					    fbPictureInit(pScreen, NULL, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable && !msShadowInit(pScreen)) {
 | 
				
			||||||
 | 
						xf86DrvMsg(scrnIndex, X_ERROR,
 | 
				
			||||||
 | 
							   "shadow fb init failed\n");
 | 
				
			||||||
 | 
						return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
    ms->createScreenResources = pScreen->CreateScreenResources;
 | 
					    ms->createScreenResources = pScreen->CreateScreenResources;
 | 
				
			||||||
    pScreen->CreateScreenResources = CreateScreenResources;
 | 
					    pScreen->CreateScreenResources = CreateScreenResources;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -715,6 +772,11 @@ CloseScreen(int scrnIndex, ScreenPtr pScreen)
 | 
				
			||||||
	ms->damage = NULL;
 | 
						ms->damage = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ms->shadow_enable) {
 | 
				
			||||||
 | 
						shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen));
 | 
				
			||||||
 | 
						free(ms->shadow_fb);
 | 
				
			||||||
 | 
						ms->shadow_fb = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    drmmode_uevent_fini(pScrn, &ms->drmmode);
 | 
					    drmmode_uevent_fini(pScrn, &ms->drmmode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    drmmode_free_bos(pScrn, &ms->drmmode);
 | 
					    drmmode_free_bos(pScrn, &ms->drmmode);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,6 +76,8 @@ typedef struct _modesettingRec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    DamagePtr damage;
 | 
					    DamagePtr damage;
 | 
				
			||||||
    Bool dirty_enabled;
 | 
					    Bool dirty_enabled;
 | 
				
			||||||
 | 
					    Bool shadow_enable;
 | 
				
			||||||
 | 
					    void *shadow_fb;
 | 
				
			||||||
} modesettingRec, *modesettingPtr;
 | 
					} modesettingRec, *modesettingPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
 | 
					#define modesettingPTR(p) ((modesettingPtr)((p)->driverPrivate))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue