summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am3
-rw-r--r--src/glamo-cmdq.c41
-rw-r--r--src/glamo-cmdq.h18
-rw-r--r--src/glamo-draw.c79
-rw-r--r--src/glamo-funcs.c4
-rw-r--r--src/glamo.h40
6 files changed, 104 insertions, 81 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 5cb0ea2..8b7a83a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,6 +32,5 @@ glamo_drv_la_SOURCES = \
glamo.c \
glamo-cmdq.c \
glamo-funcs.c \
- glamo-draw.c \
- glamo-stub.c
+ glamo-draw.c
diff --git a/src/glamo-cmdq.c b/src/glamo-cmdq.c
index ffb5d09..782a856 100644
--- a/src/glamo-cmdq.c
+++ b/src/glamo-cmdq.c
@@ -31,10 +31,10 @@
#include "glamo-cmdq.h"
#include "glamo-draw.h"
-static void GLAMOCMDQResetCP(ScreenPtr pScreen);
+static void GLAMOCMDQResetCP(GlamoPtr pGlamo);
#ifndef NDEBUG
static void
-GLAMODebugFifo(GlamoPtr *pGlamo)
+GLAMODebugFifo(GlamoPtr pGlamo)
{
GLAMOCardInfo *glamoc = pGlamo->glamoc;
char *mmio = glamoc->reg_base;
@@ -58,7 +58,7 @@ GLAMOEngineReset(GlamoPtr pGlamo, enum GLAMOEngine engine)
{
CARD32 reg;
CARD16 mask;
- char *mmio = pGLamo->reg_base;
+ char *mmio = pGlamo->reg_base;
if (!mmio)
return;
@@ -205,7 +205,7 @@ GLAMOEngineBusy(GlamoPtr pGlamo, enum GLAMOEngine engine)
return FALSE;
if (pGlamo->cmd_queue_cache != NULL)
- GLAMOFlushCMDQCache(glamos, 0);
+ GLAMOFlushCMDQCache(pGlamo, 0);
switch (engine)
{
@@ -278,9 +278,10 @@ GLAMOEngineWaitReal(GlamoPtr pGlamo,
GLAMO_LOG_ERROR("Timeout idling accelerator "
"(0x%x), resetting...\n",
status);
- GLAMODumpRegs(glamos, 0x1600, 0x1612);
- GLAMOEngineReset(glamos->screen->pScreen, GLAMO_ENGINE_CMDQ);
- GLAMODrawSetup(glamos->screen->pScreen);
+ GLAMODumpRegs(pGlamo, 0x1600, 0x1612);
+ GLAMOEngineReset(pGlamo, GLAMO_ENGINE_CMDQ);
+ GLAMOEngineEnable(pGlamo, GLAMO_ENGINE_2D);
+ GLAMOEngineReset(pGlamo, GLAMO_ENGINE_2D);
}
}
@@ -292,7 +293,7 @@ GLAMOEngineWait(GlamoPtr pGlamo,
}
MemBuf *
-GLAMOCreateCMDQCache(GlamoPtr *pGlamo)
+GLAMOCreateCMDQCache(GlamoPtr pGlamo)
{
MemBuf *buf;
@@ -313,7 +314,7 @@ GLAMOCreateCMDQCache(GlamoPtr *pGlamo)
}
static void
-GLAMODispatchCMDQCache(GlamoPtr *pGlamo)
+GLAMODispatchCMDQCache(GlamoPtr pGlamo)
{
MemBuf *buf = pGlamo->cmd_queue_cache;
char *mmio = pGlamo->reg_base;
@@ -326,18 +327,18 @@ GLAMODispatchCMDQCache(GlamoPtr *pGlamo)
ring_count = pGlamo->ring_len / 2;
if (count + pGlamo->ring_write >= ring_count) {
GLAMOCMDQResetCP(pGlamo);
- glamos->ring_write = 0;
+ pGlamo->ring_write = 0;
}
WHILE_NOT_TIMEOUT(.5) {
if (count <= 0)
break;
- pGlamo->ring_addr[glamos->ring_write] = *addr;
+ pGlamo->ring_addr[pGlamo->ring_write] = *addr;
pGlamo->ring_write++; addr++;
if (pGlamo->ring_write >= ring_count) {
GLAMO_LOG_ERROR("wrapped over ring_write\n");
- GLAMODumpRegs(glamos, 0x1600, 0x1612);
+ GLAMODumpRegs(pGlamo, 0x1600, 0x1612);
pGlamo->ring_write = 0;
}
count--;
@@ -351,10 +352,10 @@ GLAMODispatchCMDQCache(GlamoPtr *pGlamo)
}
MMIO_OUT16(mmio, GLAMO_REG_CMDQ_WRITE_ADDRH,
- (pGLamo->ring_write >> 15) & 0x7);
+ (pGlamo->ring_write >> 15) & 0x7);
MMIO_OUT16(mmio, GLAMO_REG_CMDQ_WRITE_ADDRL,
(pGlamo->ring_write << 1) & 0xffff);
- GLAMOEngineWaitReal(pGlamo->screen->pScreen,
+ GLAMOEngineWaitReal(pGlamo,
GLAMO_ENGINE_CMDQ, FALSE);
}
@@ -380,7 +381,7 @@ GLAMOCMDQResetCP(GlamoPtr pGlamo)
CARD32 queue_offset = 0;
/* make the decoder happy? */
- memset((char*)pGlamo->ring_addr, 0, glamos->ring_len+2);
+ memset((char*)pGlamo->ring_addr, 0, pGlamo->ring_len+2);
GLAMOEngineReset(pGlamo, GLAMO_ENGINE_CMDQ);
@@ -410,23 +411,23 @@ GLAMOCMDQInit(GlamoPtr pGlamo,
char *mmio = pGlamo->reg_base;
int cq_len = CQ_LEN;
- if (!force && glamos->exa_cmd_queue)
+ if (!force && pGlamo->exa_cmd_queue)
return TRUE;
pGlamo->ring_len = (cq_len + 1) * 1024;
pGlamo->exa_cmd_queue =
- exaOffscreenAlloc(pGlamo, glamos->ring_len + 4,
- pGlamo->exa.pixmapOffsetAlign,
+ exaOffscreenAlloc(pGlamo->pScreen, pGlamo->ring_len + 4,
+ pGlamo->exa->pixmapOffsetAlign,
TRUE, NULL, NULL);
if (!pGlamo->exa_cmd_queue)
return FALSE;
pGlamo->ring_addr =
- (CARD16 *) (pScreenPriv->screen->memory_base +
+ (CARD16 *) (pGlamo->fbstart +
pGlamo->exa_cmd_queue->offset);
GLAMOEngineEnable(pGlamo, GLAMO_ENGINE_CMDQ);
- GLAMOCMDQResetCP(pGlamo->screen->pScreen);
+ GLAMOCMDQResetCP(pGlamo);
return TRUE;
}
diff --git a/src/glamo-cmdq.h b/src/glamo-cmdq.h
index a47e03e..b04df10 100644
--- a/src/glamo-cmdq.h
+++ b/src/glamo-cmdq.h
@@ -121,16 +121,16 @@ tv_le(struct timeval *tv1, struct timeval *tv2)
#define TIMEDOUT() (!tv_le(&_curtime, &_target))
MemBuf *
-GLAMOCreateCMDQCache(GlamoPtr *pGlamo);
+GLAMOCreateCMDQCache(GlamoPtr pGlamo);
void
-GLAMOFlushCMDQCache(GlamoPtr *pGlamo, Bool discard);
+GLAMOFlushCMDQCache(GlamoPtr pGlamo, Bool discard);
void
-GLAMOCMDQCacheSetup(ScreenPtr pScreen);
+GLAMOCMDQCacheSetup(GlamoPtr pGlamo);
void
-GLAMOCMQCacheTeardown(ScreenPtr pScreen);
+GLAMOCMQCacheTeardown(GlamoPtr pGlamo);
enum GLAMOEngine {
GLAMO_ENGINE_CMDQ,
@@ -142,19 +142,19 @@ enum GLAMOEngine {
};
void
-GLAMOEngineEnable(ScreenPtr pScreen, enum GLAMOEngine engine);
+GLAMOEngineEnable(GlamoPtr pGlamo, enum GLAMOEngine engine);
void
-GLAMOEngineDisable(ScreenPtr pScreen, enum GLAMOEngine engine);
+GLAMOEngineDisable(GlamoPtr pGlamo, enum GLAMOEngine engine);
void
-GLAMOEngineReset(ScreenPtr pScreen, enum GLAMOEngine engine);
+GLAMOEngineReset(GlamoPtr pGlamo, enum GLAMOEngine engine);
int
-GLAMOEngineBusy(ScreenPtr pScreen, enum GLAMOEngine engine);
+GLAMOEngineBusy(GlamoPtr pGlamo, enum GLAMOEngine engine);
void
-GLAMOEngineWait(ScreenPtr pScreen, enum GLAMOEngine engine);
+GLAMOEngineWait(GlamoPtr pGlamo, enum GLAMOEngine engine);
#endif /* _GLAMO_DMA_H_ */
diff --git a/src/glamo-draw.c b/src/glamo-draw.c
index e3f41df..c78663e 100644
--- a/src/glamo-draw.c
+++ b/src/glamo-draw.c
@@ -24,7 +24,7 @@
*/
#ifdef HAVE_CONFIG_H
-#include <kdrive-config.h>
+#include <config.h>
#endif
#include "glamo-log.h"
#include "glamo.h"
@@ -157,10 +157,23 @@ GLAMOExaDownloadFromScreen(PixmapPtr pSrc,
void
GLAMOExaWaitMarker (ScreenPtr pScreen, int marker);
+static void
+GLAMOBlockHandler(pointer blockData, OSTimePtr timeout, pointer readmask)
+{
+ ScreenPtr pScreen = (ScreenPtr) blockData;
+
+ exaWaitSync(pScreen);
+}
+
+static void
+GLAMOWakeupHandler(pointer blockData, int result, pointer readmask)
+{
+}
+
Bool
GLAMODrawExaInit(ScreenPtr pScreen, ScrnInfoPtr pScrn)
{
- GlamoPtr pGlamo = GlamoPTR(pScrn)
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
int offscreen_memory_size = 0;
Bool success = FALSE;
@@ -170,10 +183,11 @@ GLAMODrawExaInit(ScreenPtr pScreen, ScrnInfoPtr pScrn)
exa = pGlamo->exa = exaDriverAlloc();
if(!exa) return FALSE;
-
- exa->memoryBase = pGlamo->memory_base;
- exa->memorySize = pGlamo->memory_size;
- exa->offScreenBase = pGlamo->off_screen_base;
+
+ exa->memoryBase = pGlamo->fbstart;
+ exa->memorySize = 1024 * 1024 * 8;
+ /*exa->offScreenBase = pGlamo->fboff;*/
+ exa->offScreenBase = pScrn->virtualX * pScrn->virtualY * 2;
exa->exa_major = 2;
exa->exa_minor = 0;
@@ -210,8 +224,6 @@ GLAMODrawExaInit(ScreenPtr pScreen, ScrnInfoPtr pScrn)
GLAMOWakeupHandler,
pScreen);
- glamoExaScreenPrivateIndex = AllocateScreenPrivateIndex() ;
- pScreen->devPrivates[glamoExaScreenPrivateIndex].ptr = glamos;
success = exaDriverInit(pScreen, exa);
if (success) {
ErrorF("Initialized EXA acceleration\n");
@@ -229,9 +241,9 @@ GLAMOExaPrepareSolid(PixmapPtr pPix,
Pixel pm,
Pixel fg)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
-
+ ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
+
CARD32 offset, pitch;
FbBits mask;
RING_LOCALS;
@@ -266,8 +278,8 @@ GLAMOExaPrepareSolid(PixmapPtr pPix,
void
GLAMOExaSolid(PixmapPtr pPix, int x1, int y1, int x2, int y2)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
GLAMO_LOG("enter\n");
@@ -288,12 +300,12 @@ GLAMOExaSolid(PixmapPtr pPix, int x1, int y1, int x2, int y2)
void
GLAMOExaDoneSolid(PixmapPtr pPix)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
- exaWaitSync(glamos->screen->pScreen);
+ exaWaitSync(pGlamo->pScreen);
if (pGlamo->cmd_queue_cache)
- GLAMOFlushCMDQCache(glamos, 1);
+ GLAMOFlushCMDQCache(pGlamo, 1);
}
Bool
@@ -304,8 +316,8 @@ GLAMOExaPrepareCopy(PixmapPtr pSrc,
int alu,
Pixel pm)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
CARD32 src_offset, src_pitch;
CARD32 dst_offset, dst_pitch;
@@ -335,7 +347,7 @@ GLAMOExaPrepareCopy(PixmapPtr pSrc,
pGlamo->src_pitch,
pGlamo->dst_offset,
pGlamo->dst_pitch,
- pScreenPriv->screen->memory_base);
+ pGlamo->fbstart);
pGlamo->settings = GLAMOBltRop[alu] << 8;
exaMarkSync(pDst->drawable.pScreen);
@@ -352,8 +364,8 @@ GLAMOExaCopy(PixmapPtr pDst,
int width,
int height)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
RING_LOCALS;
@@ -390,11 +402,11 @@ GLAMOExaCopy(PixmapPtr pDst,
void
GLAMOExaDoneCopy(PixmapPtr pDst)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
GLAMO_LOG("enter\n");
- exaWaitSync(pGlamo->screen->pScreen);
+ exaWaitSync(pGlamo->pScreen);
if (pGlamo->cmd_queue_cache)
GLAMOFlushCMDQCache(pGlamo, 1);
GLAMO_LOG("leave\n");
@@ -448,9 +460,9 @@ GLAMOExaUploadToScreen(PixmapPtr pDst,
char *src,
int src_pitch)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
-
+ ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
+
int bpp, i;
CARD8 *dst_offset;
int dst_pitch;
@@ -458,7 +470,7 @@ GLAMOExaUploadToScreen(PixmapPtr pDst,
GLAMO_LOG("enter\n");
bpp = pDst->drawable.bitsPerPixel / 8;
dst_pitch = pDst->devKind;
- dst_offset = pGlamo->exa.memoryBase + exaGetPixmapOffset(pDst)
+ dst_offset = pGlamo->exa->memoryBase + exaGetPixmapOffset(pDst)
+ x*bpp + y*dst_pitch;
GLAMO_LOG("dst_pitch:%d, src_pitch\n", dst_pitch, src_pitch);
@@ -478,8 +490,8 @@ GLAMOExaDownloadFromScreen(PixmapPtr pSrc,
char *dst,
int dst_pitch)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
+ ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum];
+ GlamoPtr pGlamo = GlamoPTR(pScrn);
int bpp, i;
CARD8 *dst_offset, *src;
@@ -489,7 +501,7 @@ GLAMOExaDownloadFromScreen(PixmapPtr pSrc,
bpp = pSrc->drawable.bitsPerPixel;
bpp /= 8;
src_pitch = pSrc->devKind;
- src = pGlamo->exa.memoryBase + exaGetPixmapOffset(pSrc) +
+ src = pGlamo->exa->memoryBase + exaGetPixmapOffset(pSrc) +
x*bpp + y*src_pitch;
dst_offset = dst ;
@@ -506,9 +518,6 @@ GLAMOExaDownloadFromScreen(PixmapPtr pSrc,
void
GLAMOExaWaitMarker (ScreenPtr pScreen, int marker)
{
- ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
- GlamoPtr pGlamo = GLAMOPTR(pScrn);
-
GLAMO_LOG("enter\n");
GLAMOEngineWait(pScreen, GLAMO_ENGINE_ALL);
GLAMO_LOG("leave\n");
diff --git a/src/glamo-funcs.c b/src/glamo-funcs.c
index 933a92a..a31a605 100644
--- a/src/glamo-funcs.c
+++ b/src/glamo-funcs.c
@@ -353,7 +353,7 @@ GLAMOISPYuvRgbPipelineInit(GlamoPtr pGlamo)
unsigned short en3;
RING_LOCALS;
- GLAMO_LOG("enter.glamos:%#x\n", glamos);
+ GLAMO_LOG("enter.glamos:%#x\n", pGlamo);
BEGIN_CMDQ(18);
@@ -415,7 +415,7 @@ GLAMOISPColorKeyOverlayInit(GlamoPtr pGlamo)
}
void
-GLAMOISPSetColorKeyOverlay(ScreenPtr pGlamo,
+GLAMOISPSetColorKeyOverlay(GlamoPtr pGlamo,
CARD32 start_addr/*addr on 23bits*/,
CARD16 x /*12bits*/,
CARD16 y /*12bits*/,
diff --git a/src/glamo.h b/src/glamo.h
index 7748fd6..76a3f1d 100644
--- a/src/glamo.h
+++ b/src/glamo.h
@@ -85,20 +85,22 @@ typedef struct _MemBuf {
typedef struct {
unsigned char* fbstart;
unsigned char* fbmem;
- int fboff;
- int lineLength;
- int rotate;
- Bool shadowFB;
- void *shadow;
+ int fboff;
+ int lineLength;
+ int rotate;
+ Bool shadowFB;
+ void *shadow;
CloseScreenProcPtr CloseScreen;
CreateScreenResourcesProcPtr CreateScreenResources;
- void (*PointerMoved)(int index, int x, int y);
+ void (*PointerMoved)(int index, int x, int y);
EntityInfoPtr pEnt;
/* DGA info */
- DGAModePtr pDGAMode;
- int nDGAMode;
+ DGAModePtr pDGAMode;
+ int nDGAMode;
OptionInfoPtr Options;
+ ScreenPtr pScreen;
+
PixmapPtr srcPixmap;
PixmapPtr dstPixmap;
CARD32 src_offset;
@@ -108,8 +110,22 @@ typedef struct {
CARD32 settings;
CARD32 foreground;
+ ExaDriverPtr exa;
ExaOffscreenArea *exa_cmd_queue;
+ CARD16 *ring_addr; /* Beginning of ring buffer. */
+ int ring_write; /* Index of write ptr in ring. */
+ int ring_read; /* Index of read ptr in ring. */
+ int ring_len;
+
+ /*
+ * cmd queue cache in system memory
+ * It is to be flushed to cmd_queue_space
+ * "at once", when we are happy with it.
+ */
+ MemBuf *cmd_queue_cache;
+ int cmd_queue_cache_start;
+
/* What was GLAMOCardInfo */
char *reg_base;
Bool is_3362;
@@ -178,6 +194,7 @@ MMIOSetBitMask(char *mmio, CARD32 reg, CARD16 mask, CARD16 val)
MMIO_OUT16(mmio, reg, tmp);
}
+#if 0
/* glamo.c */
Bool
GLAMOMapReg(KdCardInfo *card, GLAMOCardInfo *glamoc);
@@ -190,10 +207,9 @@ GLAMODumpRegs(GLAMOScreenInfo *glamos,
CARD16 from,
CARD16 to);
-/* glamo_draw.c */
-void
-GLAMODrawSetup(ScreenPtr pScreen);
+#endif
+/* glamo_draw.c */
Bool
GLAMODrawInit(ScreenPtr pScreen);
@@ -212,6 +228,4 @@ GLAMORecolorCursor(ScreenPtr pScreen, int ndef, xColorItem *pdef);
int
GLAMOLog2(int val);
-extern KdCardFuncs GLAMOFuncs;
-
#endif /* _GLAMO_H_ */