summaryrefslogtreecommitdiff
path: root/driver/xf86-video-sunffb/src/ffb_dri.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/xf86-video-sunffb/src/ffb_dri.c')
-rw-r--r--driver/xf86-video-sunffb/src/ffb_dri.c521
1 files changed, 0 insertions, 521 deletions
diff --git a/driver/xf86-video-sunffb/src/ffb_dri.c b/driver/xf86-video-sunffb/src/ffb_dri.c
deleted file mode 100644
index dd471d4fd..000000000
--- a/driver/xf86-video-sunffb/src/ffb_dri.c
+++ /dev/null
@@ -1,521 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/sunffb/ffb_dri.c,v 1.8 2001/04/18 14:52:42 dawes Exp $
- * Acceleration for the Creator and Creator3D framebuffer - DRI/DRM support.
- *
- * Copyright (C) 2000 David S. Miller (davem@redhat.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * DAVID MILLER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-
-#include "xf86.h"
-#include "xf86_OSproc.h"
-#include "xf86Priv.h"
-
-#include "xf86PciInfo.h"
-#include "xf86Pci.h"
-
-#include "miline.h"
-
-#include "GL/glxtokens.h"
-
-#include "xf86drm.h"
-#include "sarea.h"
-#define _XF86DRI_SERVER_
-#include "dri.h"
-
-#include "GL/glxint.h"
-
-#include "ffb.h"
-#include "ffb_regs.h"
-#include "ffb_fifo.h"
-#include "ffb_rcache.h"
-
-static char FFBKernelDriverName[] = "ffb";
-static char FFBClientDriverName[] = "ffb";
-
-/* Forward declarations. */
-static Bool FFBDRICreateContext(ScreenPtr, VisualPtr, drm_context_t,
- void *, DRIContextType);
-static void FFBDRIDestroyContext(ScreenPtr, drm_context_t, DRIContextType);
-
-static void FFBDRIInitBuffers(WindowPtr, RegionPtr, CARD32);
-static void FFBDRIMoveBuffers(WindowPtr, DDXPointRec, RegionPtr, CARD32);
-
-static void FFBDRISetDrawableIndex(WindowPtr, CARD32);
-
-/* XXX Why isn't this in a header somewhere? XXX */
-extern void GlxSetVisualConfigs(int nconfigs, __GLXvisualConfig *configs,
- void **configprivs);
-
-static Bool
-FFBDRIInitVisualConfigs(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
- __GLXvisualConfig *pConfigs;
- FFBConfigPrivPtr pFfbConfigs;
- FFBConfigPrivPtr *pFfbConfigPtrs;
-
- pConfigs = (__GLXvisualConfig *)
- xcalloc(sizeof(__GLXvisualConfig), 1);
- if (!pConfigs)
- return FALSE;
-
- pFfbConfigs = (FFBConfigPrivPtr)
- xcalloc(sizeof(FFBConfigPrivRec), 1);
- if (!pFfbConfigs) {
- xfree(pConfigs);
- return FALSE;
- }
-
- pFfbConfigPtrs = (FFBConfigPrivPtr *)
- xcalloc(sizeof(FFBConfigPrivPtr), 1);
- if (!pFfbConfigPtrs) {
- xfree(pConfigs);
- xfree(pFfbConfigs);
- return FALSE;
- }
-
- pFfbConfigPtrs[0] = &pFfbConfigs[0];
-
- pConfigs->vid = -1;
- pConfigs->class = -1;
- pConfigs->rgba = TRUE;
- pConfigs->redSize = 8;
- pConfigs->greenSize = 8;
- pConfigs->blueSize = 8;
- pConfigs->alphaSize = 0;
- pConfigs->redMask = 0x000000ff;
- pConfigs->greenMask = 0x0000ff00;
- pConfigs->blueMask = 0x00ff0000;
- pConfigs->alphaMask = 0;
- pConfigs->accumRedSize = 0;
- pConfigs->accumGreenSize = 0;
- pConfigs->accumBlueSize = 0;
- pConfigs->accumAlphaSize = 0;
- pConfigs->doubleBuffer = TRUE;
- pConfigs->stereo = FALSE;
- pConfigs->bufferSize = 32;
- pConfigs->depthSize = 16;
- pConfigs->stencilSize = 0;
- pConfigs->auxBuffers = 0;
- pConfigs->level = 0;
- pConfigs->visualRating = GLX_NONE;
- pConfigs->transparentPixel = GLX_NONE;
- pConfigs->transparentRed = 0;
- pConfigs->transparentGreen = 0;
- pConfigs->transparentBlue = 0;
- pConfigs->transparentAlpha = 0;
- pConfigs->transparentIndex = 0;
-
- pFfb->numVisualConfigs = 1;
- pFfb->pVisualConfigs = pConfigs;
- pFfb->pVisualConfigsPriv = pFfbConfigs;
-
- GlxSetVisualConfigs(1, pConfigs, (void **)pFfbConfigPtrs);
-
- return TRUE;
-}
-
-static void
-init_ffb_sarea(FFBPtr pFfb, ffb_dri_state_t *pFfbSarea)
-{
- int i;
-
- pFfbSarea->flags = 0;
-
- switch (pFfb->ffb_type) {
- case ffb2_prototype:
- case ffb2_vertical:
- case ffb2_vertical_plus:
- case ffb2_horizontal:
- case ffb2_horizontal_plus:
- pFfbSarea->flags |= FFB_DRI_FFB2;
- break;
-
- default:
- break;
- };
-
- if (pFfb->ffb_type == ffb2_vertical_plus ||
- pFfb->ffb_type == ffb2_horizontal_plus)
- pFfbSarea->flags |= FFB_DRI_FFB2PLUS;
-
- if (pFfb->dac_info.flags & FFB_DAC_PAC1)
- pFfbSarea->flags |= FFB_DRI_PAC1;
-
- if (pFfb->dac_info.flags & FFB_DAC_PAC2)
- pFfbSarea->flags |= FFB_DRI_PAC2;
-
- for (i = 0; i < FFB_DRI_NWIDS; i++)
- pFfbSarea->wid_table[i] = 0;
-}
-
-#define FFB_DFB24_POFF 0x02000000UL
-#define FFB_DFB24_SIZE 0x01000000UL
-
-#define FFB_FBC_REGS_POFF 0x00600000UL
-#define FFB_FBC_REGS_SIZE 0x00002000UL
-
-#define FFB_DAC_POFF 0x00400000UL
-#define FFB_DAC_SIZE 0x00002000UL
-
-#define FFB_SFB8R_POFF 0x04000000UL
-#define FFB_SFB8R_SIZE 0x00400000UL
-
-#define FFB_SFB32_POFF 0x05000000UL
-#define FFB_SFB32_SIZE 0x01000000UL
-
-#define FFB_SFB64_POFF 0x06000000UL
-#define FFB_SFB64_SIZE 0x02000000UL
-
-Bool
-FFBDRIScreenInit(ScreenPtr pScreen)
-{
- ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
- FFBPtr pFfb = GET_FFB_FROM_SCRN(pScrn);
- DRIInfoPtr pDRIInfo;
- FFBDRIPtr pFfbDRI;
-
- /* Check that the GLX, DRI, and DRM modules have been loaded by testing
- * for canonical symbols in each module.
- */
- if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs"))
- return FALSE;
- if (!xf86LoaderCheckSymbol("drmAvailable"))
- return FALSE;
- if (!xf86LoaderCheckSymbol("DRIQueryVersion")) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "FFBDRIScreenInit failed (libdri.a too old)\n");
- return FALSE;
- }
-
- /* Check the DRI version */
- {
- int major, minor, patch;
- DRIQueryVersion(&major, &minor, &patch);
- if (major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[dri] FFBDRIScreenInit failed because of a version mismatch.\n"
- "[dri] libdri version is %d.%d.%d but version %d.%d.x is needed.\n"
- "[dri] Disabling DRI.\n",
- major, minor, patch,
- DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION);
- return FALSE;
- }
- }
-
- pDRIInfo = DRICreateInfoRec();
- if (pDRIInfo == NULL)
- return FALSE;
-
- pFfb->pDRIInfo = pDRIInfo;
-
- pDRIInfo->drmDriverName = FFBKernelDriverName;
- pDRIInfo->clientDriverName = FFBClientDriverName;
-
- pDRIInfo->ddxDriverMajorVersion = 0;
- pDRIInfo->ddxDriverMinorVersion = 1;
- pDRIInfo->ddxDriverPatchVersion = 1;
-
- pDRIInfo->busIdString = xalloc(64); /* Freed in DRIDestroyInfoRec */
- sprintf(pDRIInfo->busIdString, "SBUS:%s", pFfb->psdp->device);
-
- /* Dumb rendering port for now... */
- pDRIInfo->frameBufferPhysicalAddress = FFB_DFB24_POFF;
- pDRIInfo->frameBufferSize = FFB_DFB24_SIZE;
- pDRIInfo->frameBufferStride = (2048 * 4);
-
- /* XXX */
- pDRIInfo->ddxDrawableTableEntry = 15;
- pDRIInfo->maxDrawableTableEntry = 15;
- pDRIInfo->SAREASize = (SAREA_MAX + (0x2000 - 1)) & ~(0x2000 - 1);
-
- pFfbDRI = (FFBDRIPtr) xcalloc(sizeof(FFBDRIRec), 1);
- if (pFfbDRI == NULL) {
- DRIDestroyInfoRec(pFfb->pDRIInfo);
- return FALSE;
- }
-
- pDRIInfo->devPrivate = pFfbDRI;
- pDRIInfo->devPrivateSize = sizeof(*pFfbDRI);
- pDRIInfo->contextSize = 0; /* kernel does ctx swaps */
-
- pDRIInfo->CreateContext = FFBDRICreateContext;
- pDRIInfo->DestroyContext = FFBDRIDestroyContext;
- pDRIInfo->InitBuffers = FFBDRIInitBuffers;
- pDRIInfo->MoveBuffers = FFBDRIMoveBuffers;
- pDRIInfo->SetDrawableIndex = FFBDRISetDrawableIndex;
-
- /* Our InitBuffers depends heavily on this setting. */
- pDRIInfo->bufferRequests = DRI_3D_WINDOWS_ONLY;
-
- pDRIInfo->createDummyCtx = TRUE;
- pDRIInfo->createDummyCtxPriv = FALSE;
-
- if (!DRIScreenInit(pScreen, pDRIInfo, &(pFfb->drmSubFD))) {
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[dri] DRIScreenInit failed. Disabling DRI.\n");
- DRIDestroyInfoRec(pFfb->pDRIInfo);
- xfree(pFfbDRI);
- return FALSE;
- }
-
-#if 000 /* XXX this should be cleaned up and used */
- /* Check the ffb DRM version */
- version = drmGetVersion(info->drmFD);
- if (version) {
- if (version->version_major != 1 ||
- version->version_minor < 0) {
- /* incompatible drm version */
- xf86DrvMsg(pScreen->myNum, X_ERROR,
- "[dri] FFBDRIScreenInit failed because of a version mismatch.\n"
- "[dri] ffb.o kernel module version is %d.%d.%d but version 1.0.x is needed.\n"
- "[dri] Disabling the DRI.\n",
- version->version_major,
- version->version_minor,
- version->version_patchlevel);
- drmFreeVersion(version);
- R128DRICloseScreen(pScreen);
- return FALSE;
- }
- drmFreeVersion(version);
- }
-#endif
-
- pFfb->pFfbSarea = DRIGetSAREAPrivate(pScreen);
- init_ffb_sarea(pFfb, pFfb->pFfbSarea);
-
- /* Setup device specific direct rendering memory maps. */
- if (drmAddMap(pFfb->drmSubFD,
- FFB_FBC_REGS_POFF, FFB_FBC_REGS_SIZE,
- DRM_REGISTERS, 0, &pFfbDRI->hFbcRegs) < 0) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
- pFfbDRI->sFbcRegs = FFB_FBC_REGS_SIZE;
-
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] FBC Register handle = 0x%08x\n",
- pFfbDRI->hFbcRegs);
-
- if (drmAddMap(pFfb->drmSubFD,
- FFB_DAC_POFF, FFB_DAC_SIZE,
- DRM_REGISTERS, 0, &pFfbDRI->hDacRegs) < 0) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
- pFfbDRI->sDacRegs = FFB_DAC_SIZE;
-
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] DAC Register handle = 0x%08x\n",
- pFfbDRI->hDacRegs);
-
- /* Now add maps for the "Smart" views of the framebuffer. */
- if (drmAddMap(pFfb->drmSubFD,
- FFB_SFB8R_POFF, FFB_SFB8R_SIZE,
- DRM_REGISTERS, 0, &pFfbDRI->hSfb8r) < 0) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
- pFfbDRI->sSfb8r = FFB_SFB8R_SIZE;
-
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] SFB8R handle = 0x%08x\n",
- pFfbDRI->hSfb8r);
-
- if (drmAddMap(pFfb->drmSubFD,
- FFB_SFB32_POFF, FFB_SFB32_SIZE,
- DRM_REGISTERS, 0, &pFfbDRI->hSfb32) < 0) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
- pFfbDRI->sSfb32 = FFB_SFB32_SIZE;
-
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] SFB32 handle = 0x%08x\n",
- pFfbDRI->hSfb32);
-
- if (drmAddMap(pFfb->drmSubFD,
- FFB_SFB64_POFF, FFB_SFB64_SIZE,
- DRM_REGISTERS, 0, &pFfbDRI->hSfb64) < 0) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
- pFfbDRI->sSfb64 = FFB_SFB64_SIZE;
-
- xf86DrvMsg(pScreen->myNum, X_INFO,
- "[drm] SFB64 handle = 0x%08x\n",
- pFfbDRI->hSfb64);
-
- /* Setup visual configurations. */
- if (!FFBDRIInitVisualConfigs(pScreen)) {
- DRICloseScreen(pScreen);
- return FALSE;
- }
-
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "[drm] Visual configs initialized\n");
-
- return TRUE;
-}
-
-void
-FFBDRICloseScreen(ScreenPtr pScreen)
-{
- FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
-
- DRICloseScreen(pScreen);
-
- if (pFfb->pDRIInfo) {
- DRIInfoPtr pDRIInfo = pFfb->pDRIInfo;
-
- if (pDRIInfo->devPrivate)
- xfree(pDRIInfo->devPrivate);
- DRIDestroyInfoRec(pDRIInfo);
- pFfb->pDRIInfo = NULL;
- }
-
- if (pFfb->pVisualConfigs) {
- xfree(pFfb->pVisualConfigs);
- pFfb->pVisualConfigs = NULL;
- }
- if (pFfb->pVisualConfigsPriv) {
- xfree(pFfb->pVisualConfigsPriv);
- pFfb->pVisualConfigsPriv = NULL;
- }
-}
-
-static Bool
-FFBDRICreateContext(ScreenPtr pScreen, VisualPtr visual, drm_context_t hwContext,
- void *pVisualConfigPriv, DRIContextType context)
-{
- /* Nothing to do... */
- return TRUE;
-}
-
-static void
-FFBDRIDestroyContext(ScreenPtr pScreen, drm_context_t hwContext, DRIContextType context)
-{
- /* Nothing to do... */
-}
-
-Bool
-FFBDRIFinishScreenInit(ScreenPtr pScreen)
-{
- FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
- DRIInfoPtr pDRIInfo = pFfb->pDRIInfo;
- FFBDRIPtr pFfbDRI = (FFBDRIPtr) pDRIInfo->devPrivate;
- int i;
-
- /* This belongs in the kernel. I'm sorry, the rest
- * of the current DRI switching mechanisms just suck.
- */
- pDRIInfo->driverSwapMethod = DRI_KERNEL_SWAP;
-
- /* Copy over the fast/page filling parameters now that
- * acceleration has been fully setup.
- */
- pFfbDRI->disable_pagefill = pFfb->disable_pagefill;
- pFfbDRI->fastfill_small_area = FFB_FFPARMS(pFfb).fastfill_small_area;
- pFfbDRI->pagefill_small_area = FFB_FFPARMS(pFfb).pagefill_small_area;
- pFfbDRI->fastfill_height = FFB_FFPARMS(pFfb).fastfill_height;
- pFfbDRI->fastfill_width = FFB_FFPARMS(pFfb).fastfill_width;
- pFfbDRI->pagefill_height = FFB_FFPARMS(pFfb).pagefill_height;
- pFfbDRI->pagefill_width = FFB_FFPARMS(pFfb).pagefill_width;
- for (i = 0; i < 0x800; i++)
- pFfbDRI->Pf_AlignTab[i] = pFfb->Pf_AlignTab[i];
-
- return DRIFinishScreenInit(pScreen);
-}
-
-static void
-FFBDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
- CreatorPrivWinPtr pFfbPrivWin = CreatorGetWindowPrivate(pWin);
- ffb_fbcPtr ffb = pFfb->regs;
- unsigned int fbc;
- BoxPtr pBox;
- int nBox;
-
- fbc = pFfbPrivWin->fbc_base;
- fbc = (fbc & ~FFB_FBC_WB_MASK) | FFB_FBC_WB_AB;
- fbc = (fbc & ~FFB_FBC_XE_MASK) | FFB_FBC_XE_ON;
- fbc = (fbc & ~FFB_FBC_RGBE_MASK) | FFB_FBC_RGBE_OFF;
-
- pBox = REGION_RECTS(prgn);
- nBox = (int) REGION_NUM_RECTS(prgn);
- FFB_WRITE_ROP(pFfb, ffb, (FFB_ROP_NEW | (FFB_ROP_NEW << 8)));
- FFB_WRITE_PPC(pFfb, ffb,
- (FFB_PPC_APE_DISABLE | FFB_PPC_CS_CONST | FFB_PPC_XS_WID),
- (FFB_PPC_APE_MASK | FFB_PPC_CS_MASK | FFB_PPC_XS_MASK));
- FFB_WRITE_PMASK(pFfb, ffb, ~0);
- FFB_WRITE_DRAWOP(pFfb, ffb, FFB_DRAWOP_RECTANGLE);
- FFB_WRITE_FBC(pFfb, ffb, fbc);
- FFB_WRITE_WID(pFfb, ffb, FFB_WID_WIN(pWin));
-
- while(nBox--) {
- register int x, y, w, h;
-
- x = pBox->x1;
- y = pBox->y1;
- w = (pBox->x2 - x);
- h = (pBox->y2 - y);
- FFBFifo(pFfb, 4);
- FFB_WRITE64(&ffb->by, y, x);
- FFB_WRITE64_2(&ffb->bh, h, w);
- pBox++;
- }
- pFfb->rp_active = 1;
- FFBSync(pFfb, ffb);
-}
-
-static void
-FFBDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg,
- RegionPtr prgnSrc, CARD32 index)
-{
-}
-
-static void
-FFBDRISetDrawableIndex(WindowPtr pWin, CARD32 index)
-{
- ScreenPtr pScreen = pWin->drawable.pScreen;
- FFBPtr pFfb = GET_FFB_FROM_SCREEN(pScreen);
- CreatorPrivWinPtr pFfbPrivWin = CreatorGetWindowPrivate(pWin);
- unsigned int wid;
-
- if (FFBWidIsShared(pFfb, pFfbPrivWin->wid)) {
- wid = FFBWidUnshare(pFfb, pFfbPrivWin->wid);
- if (wid == (unsigned int) -1)
- return;
-
- ErrorF("FFB: Allocated WID %x for DRI window.\n", wid);
- pFfbPrivWin->wid = wid;
-
- /* Now update the SAREA. */
- pFfb->pFfbSarea->wid_table[index] = wid;
- }
-}