summaryrefslogtreecommitdiff
path: root/src/dummy_dga.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dummy_dga.c')
-rw-r--r--src/dummy_dga.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/dummy_dga.c b/src/dummy_dga.c
new file mode 100644
index 0000000..5e35eda
--- /dev/null
+++ b/src/dummy_dga.c
@@ -0,0 +1,174 @@
+#include "xf86.h"
+#include "xf86_OSproc.h"
+#include "xf86_ansic.h"
+#include "xf86Pci.h"
+#include "xf86PciInfo.h"
+#include "dgaproc.h"
+#include "dummy.h"
+
+static Bool DUMMY_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **,
+ int *, int *, int *);
+static Bool DUMMY_SetMode(ScrnInfoPtr, DGAModePtr);
+static int DUMMY_GetViewport(ScrnInfoPtr);
+static void DUMMY_SetViewport(ScrnInfoPtr, int, int, int);
+
+static
+DGAFunctionRec DUMMYDGAFuncs = {
+ DUMMY_OpenFramebuffer,
+ NULL,
+ DUMMY_SetMode,
+ DUMMY_SetViewport,
+ DUMMY_GetViewport,
+ NULL,
+ NULL,
+ NULL,
+#if 0
+ DUMMY_BlitTransRect
+#else
+ NULL
+#endif
+};
+
+Bool
+DUMMYDGAInit(ScreenPtr pScreen)
+{
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
+ DGAModePtr modes = NULL, newmodes = NULL, currentMode;
+ DisplayModePtr pMode, firstMode;
+ int Bpp = pScrn->bitsPerPixel >> 3;
+ int num = 0, imlines, pixlines;
+
+ imlines = (pScrn->videoRam * 1024) /
+ (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3));
+
+ pixlines = imlines;
+
+ pMode = firstMode = pScrn->modes;
+
+ while(pMode) {
+
+ newmodes = xrealloc(modes, (num + 1) * sizeof(DGAModeRec));
+
+ if(!newmodes) {
+ xfree(modes);
+ return FALSE;
+ }
+ modes = newmodes;
+
+ currentMode = modes + num;
+ num++;
+
+ currentMode->mode = pMode;
+ currentMode->flags = DGA_CONCURRENT_ACCESS | DGA_PIXMAP_AVAILABLE;
+ if(pMode->Flags & V_DBLSCAN)
+ currentMode->flags |= DGA_DOUBLESCAN;
+ if(pMode->Flags & V_INTERLACE)
+ currentMode->flags |= DGA_INTERLACED;
+ currentMode->byteOrder = pScrn->imageByteOrder;
+ currentMode->depth = pScrn->depth;
+ currentMode->bitsPerPixel = pScrn->bitsPerPixel;
+ currentMode->red_mask = pScrn->mask.red;
+ currentMode->green_mask = pScrn->mask.green;
+ currentMode->blue_mask = pScrn->mask.blue;
+ currentMode->visualClass = (Bpp == 1) ? PseudoColor : TrueColor;
+ currentMode->viewportWidth = pMode->HDisplay;
+ currentMode->viewportHeight = pMode->VDisplay;
+ currentMode->xViewportStep = 1;
+ currentMode->yViewportStep = 1;
+ currentMode->viewportFlags = DGA_FLIP_RETRACE;
+ currentMode->offset = 0;
+ currentMode->address = (unsigned char *)pDUMMY->FBBase;
+
+ currentMode->bytesPerScanline =
+ ((pScrn->displayWidth * Bpp) + 3) & ~3L;
+ currentMode->imageWidth = pScrn->displayWidth;
+ currentMode->imageHeight = imlines;
+ currentMode->pixmapWidth = currentMode->imageWidth;
+ currentMode->pixmapHeight = pixlines;
+ currentMode->maxViewportX = currentMode->imageWidth -
+ currentMode->viewportWidth;
+ currentMode->maxViewportY = currentMode->imageHeight -
+ currentMode->viewportHeight;
+
+ pMode = pMode->next;
+ if(pMode == firstMode)
+ break;
+ }
+
+ pDUMMY->numDGAModes = num;
+ pDUMMY->DGAModes = modes;
+
+ return DGAInit(pScreen, &DUMMYDGAFuncs, modes, num);
+}
+
+static DisplayModePtr DUMMYSavedDGAModes[MAXSCREENS];
+
+static Bool
+DUMMY_SetMode(
+ ScrnInfoPtr pScrn,
+ DGAModePtr pMode
+){
+ int index = pScrn->pScreen->myNum;
+ DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
+
+ if(!pMode) { /* restore the original mode */
+ if(pDUMMY->DGAactive) {
+ pScrn->currentMode = DUMMYSavedDGAModes[index];
+ DUMMYSwitchMode(index, pScrn->currentMode, 0);
+ DUMMYAdjustFrame(index, 0, 0, 0);
+ pDUMMY->DGAactive = FALSE;
+ }
+ } else {
+ if(!pDUMMY->DGAactive) { /* save the old parameters */
+ DUMMYSavedDGAModes[index] = pScrn->currentMode;
+ pDUMMY->DGAactive = TRUE;
+ }
+
+ DUMMYSwitchMode(index, pMode->mode, 0);
+ }
+
+ return TRUE;
+}
+
+static int
+DUMMY_GetViewport(
+ ScrnInfoPtr pScrn
+){
+ DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
+
+ return pDUMMY->DGAViewportStatus;
+}
+
+static void
+DUMMY_SetViewport(
+ ScrnInfoPtr pScrn,
+ int x, int y,
+ int flags
+){
+ DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
+
+ DUMMYAdjustFrame(pScrn->pScreen->myNum, x, y, flags);
+ pDUMMY->DGAViewportStatus = 0;
+}
+
+
+static Bool
+DUMMY_OpenFramebuffer(
+ ScrnInfoPtr pScrn,
+ char **name,
+ unsigned char **mem,
+ int *size,
+ int *offset,
+ int *flags
+){
+ DUMMYPtr pDUMMY = DUMMYPTR(pScrn);
+
+ *name = NULL; /* no special device */
+ *mem = (unsigned char*)pDUMMY->FBBase;
+ *size = pScrn->videoRam * 1024;
+ *offset = 0;
+ *flags = DGA_NEED_ROOT;
+
+ return TRUE;
+}