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:
Kristian Høgsberg 2007-06-15 15:29:00 -04:00 committed by Eric Anholt
parent cec793ef7a
commit 50cb6c7e44
3 changed files with 47 additions and 32 deletions

View File

@ -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,12 +418,14 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA; pDRIPriv->hLSAREA = pDRIEntPriv->hLSAREA;
pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA; pDRIPriv->pLSAREA = pDRIEntPriv->pLSAREA;
if (!pDRIPriv->pDriverInfo->dontMapFrameBuffer)
{
if (drmAddMap( pDRIPriv->drmFD, if (drmAddMap( pDRIPriv->drmFD,
(drm_handle_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress, (drm_handle_t)pDRIPriv->pDriverInfo->frameBufferPhysicalAddress,
pDRIPriv->pDriverInfo->frameBufferSize, pDRIPriv->pDriverInfo->frameBufferSize,
DRM_FRAME_BUFFER, DRM_FRAME_BUFFER,
0, 0,
&pDRIPriv->hFrameBuffer) < 0) &pDRIPriv->pDriverInfo->hFrameBuffer) < 0)
{ {
pDRIPriv->directRenderingSupport = FALSE; pDRIPriv->directRenderingSupport = FALSE;
pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL; pScreen->devPrivates[DRIScreenPrivIndex].ptr = NULL;
@ -432,7 +436,11 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
return FALSE; return FALSE;
} }
DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n", DRIDrvMsg(pScreen->myNum, X_INFO, "[drm] framebuffer handle = %p\n",
pDRIPriv->hFrameBuffer); pDRIPriv->pDriverInfo->hFrameBuffer);
} else {
DRIDrvMsg(pScreen->myNum, X_INFO,
"[drm] framebuffer mapped by ddx driver\n");
}
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;
}
Bool
DRIFinishScreenInit(ScreenPtr pScreen)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
DRIInfoPtr pDRIInfo = pDRIPriv->pDriverInfo;
DRIContextFlags flags = 0;
DRIContextPrivPtr pDRIContextPriv;
/* Set up flags for DRICreateContextPriv */ /* 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;

View File

@ -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;

View File

@ -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 */