Don't map the front buffer in libdri if the ddx driver doesn't set the size.
This lets drivers map the front buffer themselves by setting dontMapFramebuffer.
This commit is contained in:
		
							parent
							
								
									cec793ef7a
								
							
						
					
					
						commit
						50cb6c7e44
					
				| 
						 | 
					@ -311,6 +311,8 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
 | 
				
			||||||
    Bool                xineramaInCore = FALSE;
 | 
					    Bool                xineramaInCore = FALSE;
 | 
				
			||||||
    DRIEntPrivPtr       pDRIEntPriv;
 | 
					    DRIEntPrivPtr       pDRIEntPriv;
 | 
				
			||||||
    ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
 | 
					    ScrnInfoPtr         pScrn = xf86Screens[pScreen->myNum];
 | 
				
			||||||
 | 
					    DRIContextFlags	flags    = 0;
 | 
				
			||||||
 | 
					    DRIContextPrivPtr	pDRIContextPriv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* If the DRI extension is disabled, do not initialize the DRI */
 | 
					    /* If the DRI extension is disabled, do not initialize the DRI */
 | 
				
			||||||
    if (noXFree86DRIExtension) {
 | 
					    if (noXFree86DRIExtension) {
 | 
				
			||||||
| 
						 | 
					@ -416,23 +418,29 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
 | 
				
			||||||
    pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
 | 
					    pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
 | 
				
			||||||
    pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
 | 
					    pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (drmAddMap( pDRIPriv->drmFD,
 | 
					    if (!pDRIPriv->pDriverInfo->dontMapFrameBuffer)
 | 
				
			||||||
		   (drm_handle_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress,
 | 
					 | 
				
			||||||
		   pDRIPriv->pDriverInfo->frameBufferSize,
 | 
					 | 
				
			||||||
		   DRM_FRAME_BUFFER,
 | 
					 | 
				
			||||||
		   0,
 | 
					 | 
				
			||||||
		   &pDRIPriv->hFrameBuffer) < 0)
 | 
					 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
	pDRIPriv->directRenderingSupport = FALSE;
 | 
						if (drmAddMap( pDRIPriv->drmFD,
 | 
				
			||||||
	pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
 | 
							       (drm_handle_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress,
 | 
				
			||||||
	drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize);
 | 
							       pDRIPriv->pDriverInfo->frameBufferSize,
 | 
				
			||||||
	drmClose(pDRIPriv->drmFD);
 | 
							       DRM_FRAME_BUFFER,
 | 
				
			||||||
        DRIDrvMsg(pScreen->myNum, X_INFO,
 | 
							       0,
 | 
				
			||||||
                  "[drm] drmAddMap failed\n");
 | 
							       &pDRIPriv->pDriverInfo->hFrameBuffer) < 0)
 | 
				
			||||||
	return FALSE;
 | 
						    {
 | 
				
			||||||
 | 
							pDRIPriv->directRenderingSupport = FALSE;
 | 
				
			||||||
 | 
							pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
 | 
				
			||||||
 | 
							drmUnmap(pDRIPriv->pSAREA, pDRIPriv->pDriverInfo->SAREASize);
 | 
				
			||||||
 | 
							drmClose(pDRIPriv->drmFD);
 | 
				
			||||||
 | 
							DRIDrvMsg(pScreen->myNum, X_INFO,
 | 
				
			||||||
 | 
								  "[drm] drmAddMap failed\n");
 | 
				
			||||||
 | 
							return FALSE;
 | 
				
			||||||
 | 
						    }
 | 
				
			||||||
 | 
						DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
 | 
				
			||||||
 | 
							  pDRIPriv->pDriverInfo->hFrameBuffer);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
						DRIDrvMsg(pScreen->myNum, X_INFO,
 | 
				
			||||||
 | 
							  "[drm] framebuffer mapped by ddx driver\n");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
 | 
					 | 
				
			||||||
	      pDRIPriv->hFrameBuffer);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pDRIEntPriv->resOwner == NULL) {
 | 
					    if (pDRIEntPriv->resOwner == NULL) {
 | 
				
			||||||
	pDRIEntPriv->resOwner = pScreen;
 | 
						pDRIEntPriv->resOwner = pScreen;
 | 
				
			||||||
| 
						 | 
					@ -479,21 +487,14 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pDRIEntPriv->refCount++;
 | 
					    pDRIEntPriv->refCount++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return TRUE;
 | 
					    /* Set up flags for DRICreateContextPriv */
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bool
 | 
					 | 
				
			||||||
DRIFinishScreenInit(ScreenPtr pScreen)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    DRIScreenPrivPtr  pDRIPriv = DRI_SCREEN_PRIV(pScreen);
 | 
					 | 
				
			||||||
    DRIInfoPtr        pDRIInfo = pDRIPriv->pDriverInfo;
 | 
					 | 
				
			||||||
    DRIContextFlags   flags    = 0;
 | 
					 | 
				
			||||||
    DRIContextPrivPtr pDRIContextPriv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				/* Set up flags for DRICreateContextPriv */
 | 
					 | 
				
			||||||
    switch (pDRIInfo->driverSwapMethod) {
 | 
					    switch (pDRIInfo->driverSwapMethod) {
 | 
				
			||||||
    case DRI_KERNEL_SWAP:    flags = DRI_CONTEXT_2DONLY;    break;
 | 
					    case DRI_KERNEL_SWAP:
 | 
				
			||||||
    case DRI_HIDE_X_CONTEXT: flags = DRI_CONTEXT_PRESERVED; break;
 | 
						flags = DRI_CONTEXT_2DONLY;
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
 | 
					    case DRI_HIDE_X_CONTEXT:
 | 
				
			||||||
 | 
						flags = DRI_CONTEXT_PRESERVED;
 | 
				
			||||||
 | 
						break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!(pDRIContextPriv = DRICreateContextPriv(pScreen,
 | 
					    if (!(pDRIContextPriv = DRICreateContextPriv(pScreen,
 | 
				
			||||||
| 
						 | 
					@ -580,6 +581,15 @@ DRIFinishScreenInit(ScreenPtr pScreen)
 | 
				
			||||||
	break;
 | 
						break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Bool
 | 
				
			||||||
 | 
					DRIFinishScreenInit(ScreenPtr pScreen)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    DRIScreenPrivPtr  pDRIPriv = DRI_SCREEN_PRIV(pScreen);
 | 
				
			||||||
 | 
					    DRIInfoPtr        pDRIInfo = pDRIPriv->pDriverInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Wrap DRI support */
 | 
					    /* Wrap DRI support */
 | 
				
			||||||
    if (pDRIInfo->wrap.ValidateTree) {
 | 
					    if (pDRIInfo->wrap.ValidateTree) {
 | 
				
			||||||
	pDRIPriv->wrap.ValidateTree     = pScreen->ValidateTree;
 | 
						pDRIPriv->wrap.ValidateTree     = pScreen->ValidateTree;
 | 
				
			||||||
| 
						 | 
					@ -1592,7 +1602,7 @@ DRIGetDeviceInfo(ScreenPtr pScreen,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
 | 
					    DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    *hFrameBuffer = pDRIPriv->hFrameBuffer;
 | 
					    *hFrameBuffer = pDRIPriv->pDriverInfo->hFrameBuffer;
 | 
				
			||||||
    *fbOrigin = 0;
 | 
					    *fbOrigin = 0;
 | 
				
			||||||
    *fbSize = pDRIPriv->pDriverInfo->frameBufferSize;
 | 
					    *fbSize = pDRIPriv->pDriverInfo->frameBufferSize;
 | 
				
			||||||
    *fbStride = pDRIPriv->pDriverInfo->frameBufferStride;
 | 
					    *fbStride = pDRIPriv->pDriverInfo->frameBufferStride;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,7 @@ typedef struct {
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DRIINFO_MAJOR_VERSION   5
 | 
					#define DRIINFO_MAJOR_VERSION   5
 | 
				
			||||||
#define DRIINFO_MINOR_VERSION   3
 | 
					#define DRIINFO_MINOR_VERSION   4
 | 
				
			||||||
#define DRIINFO_PATCH_VERSION   0
 | 
					#define DRIINFO_PATCH_VERSION   0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef unsigned long long (*DRITexOffsetStartProcPtr)(PixmapPtr pPix);
 | 
					typedef unsigned long long (*DRITexOffsetStartProcPtr)(PixmapPtr pPix);
 | 
				
			||||||
| 
						 | 
					@ -187,6 +187,12 @@ typedef struct {
 | 
				
			||||||
    /* New with DRI version 5.3.0 */
 | 
					    /* New with DRI version 5.3.0 */
 | 
				
			||||||
    DRITexOffsetStartProcPtr  texOffsetStart;
 | 
					    DRITexOffsetStartProcPtr  texOffsetStart;
 | 
				
			||||||
    DRITexOffsetFinishProcPtr texOffsetFinish;
 | 
					    DRITexOffsetFinishProcPtr texOffsetFinish;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* New with DRI version 5.4.0 */
 | 
				
			||||||
 | 
					    int			dontMapFrameBuffer;
 | 
				
			||||||
 | 
					    drm_handle_t   	hFrameBuffer; /* Handle to framebuffer, either
 | 
				
			||||||
 | 
									       * mapped by DDX driver or DRI */
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
} DRIInfoRec, *DRIInfoPtr;
 | 
					} DRIInfoRec, *DRIInfoPtr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,6 @@ typedef struct _DRIScreenPrivRec
 | 
				
			||||||
    int			drmFD;	      /* File descriptor for /dev/video/?   */
 | 
					    int			drmFD;	      /* File descriptor for /dev/video/?   */
 | 
				
			||||||
    drm_handle_t   	hSAREA;	      /* Handle to SAREA, for mapping       */
 | 
					    drm_handle_t   	hSAREA;	      /* Handle to SAREA, for mapping       */
 | 
				
			||||||
    XF86DRISAREAPtr	pSAREA;	      /* Mapped pointer to SAREA            */
 | 
					    XF86DRISAREAPtr	pSAREA;	      /* Mapped pointer to SAREA            */
 | 
				
			||||||
    drm_handle_t   	hFrameBuffer; /* Handle to framebuffer, for mapping */
 | 
					 | 
				
			||||||
    drm_context_t          myContext;    /* DDX Driver's context               */
 | 
					    drm_context_t          myContext;    /* DDX Driver's context               */
 | 
				
			||||||
    DRIContextPrivPtr   myContextPriv;/* Pointer to server's private area   */
 | 
					    DRIContextPrivPtr   myContextPriv;/* Pointer to server's private area   */
 | 
				
			||||||
    DRIContextPrivPtr   lastPartial3DContext;  /* last one partially saved  */
 | 
					    DRIContextPrivPtr   lastPartial3DContext;  /* last one partially saved  */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue