Skip to content

Commit

Permalink
Add some acceleration using the P9100 quad and blit commands:
Browse files Browse the repository at this point in the history
- for solid fill (quad)
- for pixmap copy (blit) when source and destination pitch are the same
  • Loading branch information
jdc authored and jdc committed Jun 9, 2021
1 parent b5e5dfe commit ae7dafb
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 28 deletions.
70 changes: 43 additions & 27 deletions external/mit/xf86-video-pnozz/dist/src/pnozz_exa.c
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/*
* SBus Weitek P9100 EXA support
*/
/*-
*
* Copyright (c) 2021 The NetBSD Foundation, Inc.
* All rights reserved.
*
Expand Down Expand Up @@ -79,11 +78,9 @@ static CARD32 PnozzDrawROP[] = {
#define waitReady(pPnozz) while((pnozz_read_4(pPnozz, ENGINE_STATUS) & \
(ENGINE_BUSY | BLITTER_BUSY)) !=0 )

void PnozzInitEngine(PnozzPtr);
/* From pnozz_accel.c */
void pnozz_write_colour(PnozzPtr pPnozz, int reg, CARD32 colour);

extern CARD32 MaxClip, junk;

static void
PnozzWaitMarker(ScreenPtr pScreen, int Marker)
{
Expand All @@ -110,8 +107,10 @@ PnozzPrepareCopy
waitReady(pPnozz);
pnozz_write_4(pPnozz, RASTER_OP, (PnozzCopyROP[alu] & 0xff));
pnozz_write_4(pPnozz, PLANE_MASK, planemask);
pPnozz->srcoff = exaGetPixmapOffset(pSrcPixmap) / pPnozz->width;
pPnozz->srcoff = exaGetPixmapOffset(pSrcPixmap);

if (exaGetPixmapPitch(pSrcPixmap) != exaGetPixmapPitch(pDstPixmap))
return FALSE;
return TRUE;
}

Expand All @@ -130,24 +129,25 @@ PnozzCopy
ScrnInfoPtr pScrn = xf86Screens[pDstPixmap->drawable.pScreen->myNum];
PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn);
CARD32 src, dst, srcw, dstw;
int doff = exaGetPixmapOffset(pDstPixmap) / pPnozz->width;
int soff = pPnozz->srcoff / exaGetPixmapPitch(pDstPixmap);
int doff = exaGetPixmapOffset(pDstPixmap) / exaGetPixmapPitch(pDstPixmap);

src = (((xSrc << pPnozz->depthshift) & 0x1fff) << 16) |
((ySrc + pPnozz->srcoff) & 0x1fff);
((ySrc + soff) & 0x1fff);
dst = (((xDst << pPnozz->depthshift) & 0x1fff) << 16) |
((yDst + doff) & 0x1fff);
srcw = ((((xSrc + w) << pPnozz->depthshift) - 1) << 16) |
((ySrc + pPnozz->srcoff + h - 1) & 0x1fff);
srcw = ((((xSrc + w) << pPnozz->depthshift) - 1) << 16) |
((ySrc + soff + h) & 0x1fff);
dstw = ((((xDst + w) << pPnozz->depthshift) - 1) << 16) |
((yDst + doff + h - 1) & 0x1fff);
((yDst + doff + h) & 0x1fff);

waitReady(pPnozz);

pnozz_write_4(pPnozz, ABS_XY0, src);
pnozz_write_4(pPnozz, ABS_XY1, srcw);
pnozz_write_4(pPnozz, ABS_XY2, dst);
pnozz_write_4(pPnozz, ABS_XY3, dstw);
junk = pnozz_read_4(pPnozz, COMMAND_BLIT);
pnozz_read_4(pPnozz, COMMAND_BLIT);

exaMarkSync(pDstPixmap->drawable.pScreen);
}

Expand All @@ -172,7 +172,8 @@ PnozzPrepareSolid(

waitReady(pPnozz);
pnozz_write_colour(pPnozz, FOREGROUND_COLOR, fg);
pnozz_write_4(pPnozz, RASTER_OP, PnozzDrawROP[alu] & 0xff);
pnozz_write_colour(pPnozz, BACKGROUND_COLOR, fg);
pnozz_write_4(pPnozz, RASTER_OP, ROP_PAT);
pnozz_write_4(pPnozz, PLANE_MASK, planemask);
pnozz_write_4(pPnozz, COORD_INDEX, 0);

Expand All @@ -189,15 +190,18 @@ PnozzSolid(
{
ScrnInfoPtr pScrn = xf86Screens[pPixmap->drawable.pScreen->myNum];
PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn);
int w = x2 - x - 1;
int h = y2 - y - 1;
int doff = exaGetPixmapOffset(pPixmap);

waitReady(pPnozz);
pnozz_write_4(pPnozz, RECT_RTW_XY, ((x & 0x1fff) << 16) |
(y & 0x1fff));
pnozz_write_4(pPnozz, RECT_RTP_XY, (((w & 0x1fff) << 16) |
(h & 0x1fff)));
junk = pnozz_read_4(pPnozz, COMMAND_QUAD);
pnozz_write_4(pPnozz, ABS_XY0, (((x + doff) & 0x1fff) << 16) |
(y & 0x1fff));
pnozz_write_4(pPnozz, ABS_XY1, (((x + doff) & 0x1fff) << 16) |
(y2 & 0x1fff));
pnozz_write_4(pPnozz, ABS_XY2, (((x2 + doff) & 0x1fff) << 16) |
(y2 & 0x1fff));
pnozz_write_4(pPnozz, ABS_XY3, (((x2 + doff) & 0x1fff) << 16) |
(y & 0x1fff));
pnozz_read_4(pPnozz, COMMAND_QUAD);
exaMarkSync(pPixmap->drawable.pScreen);
}

Expand All @@ -208,8 +212,6 @@ PnozzEXAInit(ScreenPtr pScreen)
PnozzPtr pPnozz = GET_PNOZZ_FROM_SCRN(pScrn);
ExaDriverPtr pExa;

PnozzInitEngine(pPnozz);

pExa = exaDriverAlloc();
if (!pExa)
return FALSE;
Expand All @@ -223,18 +225,19 @@ PnozzEXAInit(ScreenPtr pScreen)

/* round to multiple of pixmap pitch */
pExa->memorySize = (pPnozz->vidmem / pPnozz->width) * pPnozz->width;
pExa->offScreenBase = pPnozz->width * pPnozz->height;
pExa->offScreenBase = pPnozz->width * pPnozz->height *
(pScrn->bitsPerPixel / 8);

/*
* our blitter can't deal with variable pitches
*/
pExa->pixmapOffsetAlign = pPnozz->width;
pExa->pixmapPitchAlign = pPnozz->width;

pExa->flags = EXA_MIXED_PIXMAPS;
pExa->flags = EXA_MIXED_PIXMAPS | EXA_OFFSCREEN_PIXMAPS | EXA_SUPPORTS_OFFSCREEN_OVERLAPS;

pExa->maxX = 4096;
pExa->maxY = 4096;
pExa->maxX = 1600;
pExa->maxY = 1200;

pExa->WaitMarker = PnozzWaitMarker;

Expand All @@ -246,5 +249,18 @@ PnozzEXAInit(ScreenPtr pScreen)
pExa->Copy = PnozzCopy;
pExa->DoneCopy = PnozzDoneCopy;

/* Drawing engine defaults */
pnozz_write_4(pPnozz, DRAW_MODE, 0);
pnozz_write_4(pPnozz, PLANE_MASK, 0xffffffff);
pnozz_write_4(pPnozz, PATTERN0, 0xffffffff);
pnozz_write_4(pPnozz, PATTERN1, 0xffffffff);
pnozz_write_4(pPnozz, PATTERN2, 0xffffffff);
pnozz_write_4(pPnozz, PATTERN3, 0xffffffff);
pnozz_write_4(pPnozz, WINDOW_OFFSET, 0);
pnozz_write_4(pPnozz, WINDOW_MIN, 0);
pnozz_write_4(pPnozz, WINDOW_MAX, CLIP_MAX);
pnozz_write_4(pPnozz, BYTE_CLIP_MIN, 0);
pnozz_write_4(pPnozz, BYTE_CLIP_MAX, CLIP_MAX);

return exaDriverInit(pScreen, pExa);;
}
6 changes: 5 additions & 1 deletion external/mit/xf86-video-pnozz/dist/src/pnozz_regs.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
* 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.
*/
/* $NetBSD: pnozz_regs.h,v 1.1 2009/08/26 22:28:26 macallan Exp $ */
/* $NetBSD: pnozz_regs.h,v 1.2 2021/06/09 07:25:57 jdc Exp $ */

#ifndef PNOZZ_REGS_H
#define PNOZZ_REGS_H
Expand Down Expand Up @@ -168,6 +168,10 @@
#define PIXEL_8_REG 0x221c /* PIXEL_8 overflow data */
#define WINDOW_MIN 0x2220
#define WINDOW_MAX 0x2224
#define CLIP_MAX 0x1fff1fff

#define COLOR_2 0x2230
#define COLOR_3 0x2234

#define PATTERN0 0x2280
#define PATTERN1 0x2284
Expand Down

0 comments on commit ae7dafb

Please sign in to comment.