summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/drivers/dri/unichrome/via_context.c393
-rw-r--r--src/mesa/drivers/dri/unichrome/via_context.h65
-rw-r--r--src/mesa/drivers/dri/unichrome/via_dri.h3
-rw-r--r--src/mesa/drivers/dri/unichrome/via_ioctl.c1001
-rw-r--r--src/mesa/drivers/dri/unichrome/via_ioctl.h7
-rw-r--r--src/mesa/drivers/dri/unichrome/via_screen.c33
-rw-r--r--src/mesa/drivers/dri/unichrome/via_screen.h3
-rw-r--r--src/mesa/drivers/dri/unichrome/via_span.c210
-rw-r--r--src/mesa/drivers/dri/unichrome/via_state.c148
-rw-r--r--src/mesa/drivers/dri/unichrome/via_tris.c123
10 files changed, 600 insertions, 1386 deletions
diff --git a/src/mesa/drivers/dri/unichrome/via_context.c b/src/mesa/drivers/dri/unichrome/via_context.c
index 326f34a0f9..bb1dfdd6ca 100644
--- a/src/mesa/drivers/dri/unichrome/via_context.c
+++ b/src/mesa/drivers/dri/unichrome/via_context.c
@@ -68,7 +68,6 @@
#ifdef DEBUG
GLuint VIA_DEBUG = 0;
#endif
-GLuint DRAW_FRONT = 0;
#define DMA_SIZE 2
GLuint VIA_PERFORMANCE = 0;
#ifdef PERFORMANCE_MEASURE
@@ -211,12 +210,11 @@ calculate_buffer_parameters( viaContextPtr vmesa )
/* Allocate depth-buffer */
if ( vmesa->hasStencil || vmesa->hasDepth ) {
- const unsigned dShift = (vmesa->hasStencil)
- ? 2 : (vmesa->depthBits / 16);
+ vmesa->depth.bpp = vmesa->depthBits;
+ if (vmesa->depth.bpp == 24)
+ vmesa->depth.bpp = 32;
- vmesa->depth.pitch = (buffer_align( vmesa->driDrawable->w ) << dShift)
- + extra;
- vmesa->depth.bpp = 8 << dShift;
+ vmesa->depth.pitch = (buffer_align( vmesa->driDrawable->w ) * (vmesa->depth.bpp/8)) + extra;
vmesa->depth.size = vmesa->depth.pitch * vmesa->driDrawable->h;
}
else {
@@ -233,7 +231,7 @@ calculate_buffer_parameters( viaContextPtr vmesa )
/*=* John Sheng [2003.5.31] flip *=*/
if( vmesa->viaScreen->width == vmesa->driDrawable->w &&
vmesa->viaScreen->height == vmesa->driDrawable->h ) {
-#define ALLOW_EXPERIMENTAL_PAGEFLIP 1
+#define ALLOW_EXPERIMENTAL_PAGEFLIP 0
#if ALLOW_EXPERIMENTAL_PAGEFLIP
vmesa->doPageFlip = GL_TRUE;
#else
@@ -406,31 +404,51 @@ viaCreateContext(const __GLcontextModes *mesaVis,
sPriv->myNum, "via");
/* pick back buffer */
- if (mesaVis->doubleBufferMode) {
- vmesa->hasBack = GL_TRUE;
- }
- else {
- vmesa->hasBack = GL_FALSE;
- }
- /* pick z buffer */
- if (mesaVis->haveDepthBuffer) {
- vmesa->hasDepth = GL_TRUE;
- vmesa->depthBits = mesaVis->depthBits;
- }
- else {
- vmesa->hasDepth = GL_FALSE;
- vmesa->depthBits = 0;
- }
- /* pick stencil buffer */
- if (mesaVis->haveStencilBuffer) {
- vmesa->hasStencil = GL_TRUE;
- vmesa->stencilBits = mesaVis->stencilBits;
- }
- else {
- vmesa->hasStencil = GL_FALSE;
- vmesa->stencilBits = 0;
+ vmesa->hasBack = mesaVis->doubleBufferMode;
+
+ switch(mesaVis->depthBits) {
+ case 0:
+ vmesa->hasDepth = GL_FALSE;
+ vmesa->depthBits = 0;
+ break;
+ case 16:
+ vmesa->hasDepth = GL_TRUE;
+ vmesa->depthBits = mesaVis->depthBits;
+ vmesa->have_hw_stencil = GL_FALSE;
+ vmesa->depth_scale = 1.0/0xffff;
+ vmesa->depth_clear_mask = 0xf << 28;
+ vmesa->ClearDepth = 0xffff;
+ break;
+ case 24:
+ vmesa->hasDepth = GL_TRUE;
+ vmesa->depthBits = mesaVis->depthBits;
+ vmesa->depth_scale = 1.0/0xffffff;
+ vmesa->depth_clear_mask = 0xe << 28;
+ vmesa->ClearDepth = 0xffffff00;
+
+ assert(mesaVis->haveStencilBuffer);
+ assert(mesaVis->stencilBits == 8);
+
+ vmesa->have_hw_stencil = GL_TRUE;
+ vmesa->stencilBits = mesaVis->stencilBits;
+ vmesa->stencil_clear_mask = 0x1 << 28;
+ break;
+ case 32:
+ vmesa->hasDepth = GL_TRUE;
+ vmesa->depthBits = mesaVis->depthBits;
+ assert(!mesaVis->haveStencilBuffer);
+ vmesa->have_hw_stencil = GL_FALSE;
+ vmesa->depth_scale = 1.0/0xffffffff;
+ vmesa->depth_clear_mask = 0;
+ vmesa->ClearDepth = 0xffffffff;
+ vmesa->depth_clear_mask = 0xf << 28;
+ break;
+ default:
+ assert(0);
+ break;
}
+
_mesa_init_driver_functions(&functions);
viaInitTextureFuncs(&functions);
@@ -452,19 +470,7 @@ viaCreateContext(const __GLcontextModes *mesaVis,
ctx = vmesa->glCtx;
- /* check */
- /*=* John Sheng [2003.7.2] for visual config number can't excess 8 *=*/
- /*if (viaScreen->textureSize < 2 * 1024 * 1024) {
- ctx->Const.MaxTextureLevels = 9;
- }
- else if (viaScreen->textureSize < 8 * 1024 * 1024) {
- ctx->Const.MaxTextureLevels = 10;
- }
- else {
- ctx->Const.MaxTextureLevels = 11;
- }*/
- ctx->Const.MaxTextureLevels = 11;
-
+ ctx->Const.MaxTextureLevels = 11;
ctx->Const.MaxTextureUnits = 2;
ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits;
ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits;
@@ -550,10 +556,9 @@ viaCreateContext(const __GLcontextModes *mesaVis,
VIA_DEBUG = 0;
#endif
- if (getenv("DRAW_FRONT"))
- DRAW_FRONT = 1;
- else
- DRAW_FRONT = 0;
+ if (getenv("VIA_NO_RAST"))
+ FALLBACK(vmesa, VIA_FALLBACK_USER_DISABLE, 1);
+
#ifdef PERFORMANCE_MEASURE
if (getenv("VIA_PERFORMANCE"))
@@ -609,43 +614,6 @@ viaCreateContext(const __GLcontextModes *mesaVis,
}
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
- {
-#ifndef USE_XINERAMA
- vmesa->saam = 0;
-#else
- GLboolean saam = XineramaIsActive(vmesa->display);
- int count = 0, fbSize;
-
- if (saam && vmesa->viaScreen->drixinerama) {
- vmesa->xsi = XineramaQueryScreens(vmesa->display, &count);
- /* Test RightOf or Down */
- if (vmesa->xsi[0].x_org == 0 && vmesa->xsi[0].y_org == 0) {
- if (vmesa->xsi[1].x_org == vmesa->xsi[1].width) {
- vmesa->saam = RightOf;
- }
- else {
- vmesa->saam = Down;
- }
- }
- /* Test LeftOf or Up */
- else if (vmesa->xsi[0].x_org == vmesa->xsi[0].width) {
- vmesa->saam = LeftOf;
- }
- else if (vmesa->xsi[0].y_org == vmesa->xsi[0].height) {
- vmesa->saam = Up;
- }
- else
- vmesa->saam = 0;
-
-
- fbSize = vmesa->viaScreen->fbSize;
- }
- else
- vmesa->saam = 0;
-#endif
- }
-
- vmesa->pSaamRects = (drm_clip_rect_t *) malloc(sizeof(drm_clip_rect_t));
return GL_TRUE;
}
@@ -656,10 +624,10 @@ viaDestroyContext(__DRIcontextPrivate *driContextPriv)
if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
assert(vmesa); /* should never be null */
/* viaFlushPrimsLocked(vmesa); */
- WAIT_IDLE
if (vmesa) {
/*=* John Sheng [2003.5.31] agp tex *=*/
+ WAIT_IDLE(vmesa);
if(VIA_DEBUG) fprintf(stderr, "agpFullCount = %d\n", vmesa->agpFullCount);
_swsetup_DestroyContext(vmesa->glCtx);
@@ -687,6 +655,9 @@ void viaXMesaSetFrontClipRects(viaContextPtr vmesa)
{
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
+ if (!dPriv)
+ return;
+
vmesa->numClipRects = dPriv->numClipRects;
vmesa->pClipRects = dPriv->pClipRects;
vmesa->drawX = dPriv->x;
@@ -700,202 +671,52 @@ void viaXMesaSetFrontClipRects(viaContextPtr vmesa)
void viaXMesaSetBackClipRects(viaContextPtr vmesa)
{
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
- /*=* John Sheng [2003.6.9] fix glxgears dirty screen */
- /*if (vmesa->saam) {*/
- vmesa->numClipRects = dPriv->numClipRects;
- vmesa->pClipRects = dPriv->pClipRects;
- vmesa->drawX = dPriv->x;
- vmesa->drawY = dPriv->y;
- vmesa->drawW = dPriv->w;
- vmesa->drawH = dPriv->h;
- /*}
- else {
- if (dPriv->numBackClipRects == 0) {
- vmesa->numClipRects = dPriv->numClipRects;
- vmesa->pClipRects = dPriv->pClipRects;
- vmesa->drawX = dPriv->x;
- vmesa->drawY = dPriv->y;
- vmesa->drawW = dPriv->w;
- vmesa->drawH = dPriv->h;
- }
- else {
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->drawW = dPriv->w;
- vmesa->drawH = dPriv->h;
- }
- }*/
- viaEmitDrawingRectangle(vmesa);
- vmesa->uploadCliprects = GL_TRUE;
+ __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
+
+ if (!dPriv)
+ return;
+
+ /*=* John Sheng [2003.6.9] fix glxgears dirty screen */
+ vmesa->numClipRects = dPriv->numClipRects;
+ vmesa->pClipRects = dPriv->pClipRects;
+ vmesa->drawX = dPriv->x;
+ vmesa->drawY = dPriv->y;
+ vmesa->drawW = dPriv->w;
+ vmesa->drawH = dPriv->h;
+ viaEmitDrawingRectangle(vmesa);
+ vmesa->uploadCliprects = GL_TRUE;
}
void viaXMesaWindowMoved(viaContextPtr vmesa)
{
GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3;
-#ifdef USE_XINERAMA
- GLuint side = 0;
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
-#endif
switch (vmesa->glCtx->Color._DrawDestMask[0]) {
- case __GL_FRONT_BUFFER_MASK:
+ case DD_FRONT_LEFT_BIT:
viaXMesaSetFrontClipRects(vmesa);
break;
- case __GL_BACK_BUFFER_MASK:
+ case DD_BACK_LEFT_BIT:
viaXMesaSetBackClipRects(vmesa);
break;
default:
+ viaXMesaSetFrontClipRects(vmesa);
break;
}
-#ifndef USE_XINERAMA
vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
-#else
- side = vmesa->saam & P_MASK;
-
- switch (side) {
- case RightOf:
- /* full in screen 1 */
- if (vmesa->drawX >= vmesa->xsi[0].width) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawX = vmesa->drawX - vmesa->xsi[1].width;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if ((vmesa->drawX + vmesa->drawW) <= vmesa->xsi[0].width) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case LeftOf:
- /* full in screen 1 */
- if (vmesa->drawX + vmesa->drawW <= 0) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawX = vmesa->drawX + vmesa->xsi[1].width;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if (vmesa->drawX >= 0) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case Down :
- /* full in screen 1 */
- if (vmesa->drawY >= vmesa->xsi[0].height) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawY = vmesa->drawY - vmesa->xsi[1].height;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if ((vmesa->drawY + vmesa->drawH) <= vmesa->xsi[0].height) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- case Up :
- /* full in screen 1 */
- if ((vmesa->drawY + vmesa->drawH) <= 0) {
- vmesa->viaScreen->fbOffset = vmesa->viaScreen->fbSize;
- vmesa->drawY = vmesa->drawY + vmesa->xsi[1].height;
- vmesa->numClipRects = dPriv->numBackClipRects;
- vmesa->pClipRects = dPriv->pBackClipRects;
- vmesa->drawX = dPriv->backX;
- vmesa->drawY = dPriv->backY;
- vmesa->saam &= ~S0;
- vmesa->saam |= S1;
- }
- /* full in screen 0 */
- else if (vmesa->drawY >= 0) {
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam &= ~S1;
- vmesa->saam |= S0;
- }
- /* between screen 0 && screen 1 */
- else {
- vmesa->numSaamRects = dPriv->numBackClipRects;
- vmesa->pSaamRects = dPriv->pBackClipRects;
- vmesa->drawXSaam = dPriv->backX;
- vmesa->drawYSaam = dPriv->backY;
- vmesa->viaScreen->fbOffset = 0;
- vmesa->saam |= S0;
- vmesa->saam |= S1;
- }
- break;
- default:
- vmesa->viaScreen->fbOffset = 0;
- }
-#endif
-
+
{
GLuint pitch, offset;
pitch = vmesa->front.pitch;
offset = vmesa->viaScreen->fbOffset + (vmesa->drawY * pitch + vmesa->drawX * bytePerPixel);
- vmesa->drawXoff = (GLuint)((offset & 0x1f) / bytePerPixel);
- if (vmesa->saam) {
- if (vmesa->pSaamRects) {
- offset = vmesa->viaScreen->fbOffset + (vmesa->pSaamRects[0].y1 * pitch +
- vmesa->pSaamRects[0].x1 * bytePerPixel);
- vmesa->drawXoffSaam = (GLuint)((offset & 0x1f) / bytePerPixel);
- }
- else
- vmesa->drawXoffSaam = 0;
- }
- else
- vmesa->drawXoffSaam = 0;
+ assert(vmesa->viaScreen->fbOffset % bytePerPixel == 0);
+ assert(pitch % bytePerPixel == 0);
+
+ /* KW: I don't know what this was, but it was giving incorrect
+ * results for backbuffer rendering:
+ */
+/* vmesa->drawXoff = (GLuint)(((vmesa->drawX * bytePerPixel) & 0x1f) / bytePerPixel); */
+ vmesa->drawXoff = 0;
}
viaCalcViewport(vmesa->glCtx);
@@ -924,6 +745,7 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
if (driContextPriv) {
viaContextPtr vmesa = (viaContextPtr)driContextPriv->driverPrivate;
+ GLcontext *ctx = vmesa->glCtx;
if (VIA_DEBUG) fprintf(stderr, "viaMakeCurrent: w = %d\n", vmesa->driDrawable->w);
@@ -933,6 +755,7 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
if ( ! calculate_buffer_parameters( vmesa ) ) {
return GL_FALSE;
}
+ ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] );
}
_mesa_make_current2(vmesa->glCtx,
@@ -940,6 +763,8 @@ viaMakeCurrent(__DRIcontextPrivate *driContextPriv,
(GLframebuffer *)driReadPriv->driverPrivate);
if (VIA_DEBUG) fprintf(stderr, "Context %d MakeCurrent\n", vmesa->hHWContext);
viaXMesaWindowMoved(vmesa);
+
+
}
else {
_mesa_make_current(0,0);
@@ -980,52 +805,6 @@ void viaGetLock(viaContextPtr vmesa, GLuint flags)
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
}
-#if 0
-void viaLock(viaContextPtr vmesa, GLuint flags)
-{
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
- __DRIscreenPrivate *sPriv = vmesa->driScreen;
-
- if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-
- /*=* John Sheng [2003.6.16] for xf43 */
- if(dPriv->pStamp == NULL)
- dPriv->pStamp = &dPriv->lastStamp;
-
- if (*(dPriv->pStamp) != dPriv->lastStamp || vmesa->saam) {
- GLuint scrn;
- scrn = vmesa->saam & S_MASK;
-
- DRM_SPINLOCK(&sPriv->pSAREA->drawable_lock, sPriv->drawLockID);
-
- if (scrn == S1)
- __driUtilUpdateDrawableInfo(dPriv);
- else
- DRI_VALIDATE_DRAWABLE_INFO_ONCE(dPriv);
-
- viaXMesaWindowMoved(vmesa);
- DRM_SPINUNLOCK(&sPriv->pSAREA->drawable_lock, sPriv->drawLockID);
- }
-
- if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-
- return;
-}
-#endif
-
-void viaUnLock(viaContextPtr vmesa, GLuint flags)
-{
- drm_via_sarea_t *sarea = vmesa->sarea;
- int me = vmesa->hHWContext;
-
- if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
- if (VIA_DEBUG) fprintf(stderr, "sarea->ctxOwner = %d\n", sarea->ctxOwner);
- if (VIA_DEBUG) fprintf(stderr, "me = %d\n", me);
- if (sarea->ctxOwner == me) {
- sarea->ctxOwner = 0;
- }
- if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-}
void
viaSwapBuffers(__DRIdrawablePrivate *drawablePrivate)
diff --git a/src/mesa/drivers/dri/unichrome/via_context.h b/src/mesa/drivers/dri/unichrome/via_context.h
index 41ce1ce095..187b81154f 100644
--- a/src/mesa/drivers/dri/unichrome/via_context.h
+++ b/src/mesa/drivers/dri/unichrome/via_context.h
@@ -40,9 +40,6 @@ typedef struct via_texture_object_t *viaTextureObjectPtr;
#include "via_tex.h"
#include "via_common.h"
#include "xf86drmVIA.h"
-#ifdef USE_XINERAMA
-#include "../../../../../include/extensions/Xinerama.h"
-#endif
#define VIA_FALLBACK_TEXTURE 0x1
#define VIA_FALLBACK_DRAW_BUFFER 0x2
#define VIA_FALLBACK_READ_BUFFER 0x4
@@ -53,6 +50,7 @@ typedef struct via_texture_object_t *viaTextureObjectPtr;
#define VIA_FALLBACK_STENCIL 0x100
#define VIA_FALLBACK_BLEND_EQ 0x200
#define VIA_FALLBACK_BLEND_FUNC 0x400
+#define VIA_FALLBACK_USER_DISABLE 0x800
#define VIA_UPLOAD_NONE 0x0000
#define VIA_UPLOAD_ALPHATEST 0x0001
@@ -116,6 +114,13 @@ struct via_context_t {
GLboolean hasAccum;
GLuint depthBits;
GLuint stencilBits;
+
+ GLboolean have_hw_stencil;
+ GLuint ClearDepth;
+ GLuint depth_clear_mask;
+ GLuint stencil_clear_mask;
+ GLfloat depth_scale;
+
GLuint *dma;
viaRegion tex;
@@ -250,15 +255,6 @@ struct via_context_t {
int drawW;
int drawH;
- GLuint saam;
-#ifdef USE_XINERAMA
- XineramaScreenInfo *xsi;
-#endif
- int drawXoffSaam;
- drm_clip_rect_t *pSaamRects;
- int drawXSaam;
- int drawYSaam;
- GLuint numSaamRects;
int drawPitch;
int readPitch;
@@ -386,58 +382,26 @@ extern hash_element hash_table[HASH_TABLE_SIZE][HASH_TABLE_DEPTH];
/* Lock the hardware and validate our state.
*/
-/*
-#define LOCK_HARDWARE(vmesa) \
- do { \
- char __ret = 0; \
- DRM_CAS(vmesa->driHwLock, vmesa->hHWContext, \
- (DRM_LOCK_HELD|vmesa->hHWContext), __ret); \
- if (__ret) \
- viaGetLock(vmesa, 0); \
- } while (0)
-*/
-/*=* John Sheng [2003.6.20] fix pci *=*/
-/*=* John Sheng [2003.7.25] fix viewperf black shadow *=*/
#define LOCK_HARDWARE(vmesa) \
- if(1) \
do { \
char __ret = 0; \
DRM_CAS(vmesa->driHwLock, vmesa->hHWContext, \
(DRM_LOCK_HELD|vmesa->hHWContext), __ret); \
if (__ret) \
viaGetLock(vmesa, 0); \
- } while (0); \
- else \
- viaLock(vmesa, 0)
-
+ } while (0)
-/*
-#define LOCK_HARDWARE(vmesa) \
- viaLock(vmesa, 0);
-*/
/* Release the kernel lock.
*/
-/*
-#define UNLOCK_HARDWARE(vmesa) \
- DRM_UNLOCK(vmesa->driFd, vmesa->driHwLock, vmesa->hHWContext);
-*/
-/*=* John Sheng [2003.6.20] fix pci *=*/
-/*=* John Sheng [2003.7.25] fix viewperf black shadow *=*/
#define UNLOCK_HARDWARE(vmesa) \
- if(1) \
- DRM_UNLOCK(vmesa->driFd, vmesa->driHwLock, vmesa->hHWContext); \
- else \
- viaUnLock(vmesa, 0);
-/*
-#define UNLOCK_HARDWARE(vmesa) \
- viaUnLock(vmesa, 0);
-*/
-#define WAIT_IDLE \
- while (1) { \
+ DRM_UNLOCK(vmesa->driFd, vmesa->driHwLock, vmesa->hHWContext);
+
+#define WAIT_IDLE(vmesa) \
+ do { \
if ((((GLuint)*vmesa->regEngineStatus) & 0xFFFEFFFF) == 0x00020000) \
break; \
- }
+ } while (1)
#define LOCK_HARDWARE_QUIESCENT(vmesa) \
do { \
@@ -453,7 +417,6 @@ extern GLuint VIA_DEBUG;
#endif
-extern GLuint DRAW_FRONT;
extern void viaGetLock(viaContextPtr vmesa, GLuint flags);
extern void viaLock(viaContextPtr vmesa, GLuint flags);
extern void viaUnLock(viaContextPtr vmesa, GLuint flags);
diff --git a/src/mesa/drivers/dri/unichrome/via_dri.h b/src/mesa/drivers/dri/unichrome/via_dri.h
index 6a0331424d..01ca0ea55b 100644
--- a/src/mesa/drivers/dri/unichrome/via_dri.h
+++ b/src/mesa/drivers/dri/unichrome/via_dri.h
@@ -29,9 +29,6 @@ typedef struct {
int priv2;
int fbOffset;
int fbSize;
-#ifdef USE_XINERAMA
- Bool drixinerama;
-#endif
int backOffset;
int depthOffset;
int textureOffset;
diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.c b/src/mesa/drivers/dri/unichrome/via_ioctl.c
index 58a3012729..8f6768542c 100644
--- a/src/mesa/drivers/dri/unichrome/via_ioctl.c
+++ b/src/mesa/drivers/dri/unichrome/via_ioctl.c
@@ -90,218 +90,117 @@ typedef enum {VIABLIT_TRANSCOPY, VIABLIT_COPY, VIABLIT_FILL} ViaBlitOps;
static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
GLint cx, GLint cy, GLint cw, GLint ch)
{
- viaContextPtr vmesa = VIA_CONTEXT(ctx);
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
- const GLuint colorMask = *((GLuint *)&ctx->Color.ColorMask);
- int flag = 0;
- GLuint scrn = 0, i = 0, side = 0;
- scrn = vmesa->saam & S_MASK;
- side = vmesa->saam & P_MASK;
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
- VIA_FIREVERTICES(vmesa);
-
- if ((mask & DD_FRONT_LEFT_BIT) && colorMask == ~0) {
- flag |= VIA_FRONT;
- mask &= ~DD_FRONT_LEFT_BIT;
- }
-
- if ((mask & DD_BACK_LEFT_BIT) && colorMask == ~0) {
- flag |= VIA_BACK;
- mask &= ~DD_BACK_LEFT_BIT;
- }
-
- if (mask & DD_DEPTH_BIT) {
- if (ctx->Depth.Mask)
- flag |= VIA_DEPTH;
- mask &= ~DD_DEPTH_BIT;
- }
-
- if (mask & DD_STENCIL_BIT) {
- if (ctx->Stencil.Enabled)
- flag |= VIA_STENCIL;
- mask &= ~DD_STENCIL_BIT;
- }
+ viaContextPtr vmesa = VIA_CONTEXT(ctx);
+ __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
+ const GLuint colorMask = *((GLuint *)&ctx->Color.ColorMask);
+ int flag = 0;
+ GLuint i = 0;
+ GLuint clear_depth_mask = 0xf << 28;
+ GLuint clear_depth = 0;
+
+ VIA_FIREVERTICES(vmesa);
+
+ if ((mask & DD_FRONT_LEFT_BIT) && colorMask == ~0) {
+ flag |= VIA_FRONT;
+ mask &= ~DD_FRONT_LEFT_BIT;
+ }
+
+ if ((mask & DD_BACK_LEFT_BIT) && colorMask == ~0) {
+ flag |= VIA_BACK;
+ mask &= ~DD_BACK_LEFT_BIT;
+ }
+
+ if (mask & DD_DEPTH_BIT) {
+ flag |= VIA_DEPTH;
+ clear_depth = (GLuint)(ctx->Depth.Clear * vmesa->ClearDepth);
+ clear_depth_mask &= ~vmesa->depth_clear_mask;
+ mask &= ~DD_DEPTH_BIT;
+ }
- /*=* [DBG] make draw to front buffer *=*/
- if(DRAW_FRONT) {
- flag |= VIA_FRONT;
- flag &= ~VIA_BACK;
- }
+ if (mask & DD_STENCIL_BIT) {
+ if (vmesa->have_hw_stencil) {
+ if (ctx->Stencil.WriteMask[0] == 0xff) {
+ flag |= VIA_DEPTH;
+ clear_depth &= ~0xff;
+ clear_depth |= (ctx->Stencil.Clear & 0xff);
+ clear_depth_mask &= ~vmesa->stencil_clear_mask;
+ mask &= ~DD_STENCIL_BIT;
+ }
+ else {
+ fprintf(stderr, "XXX: Clear stencil writemask %x -- need triangles (or a ROP?)\n",
+ ctx->Stencil.WriteMask[0]);
+ /* Fixme - clear with triangles */
+ }
+ }
+ }
- if (flag) {
- LOCK_HARDWARE(vmesa);
- /* flip top to bottom */
- cy = dPriv->h - cy - ch;
- cx += vmesa->drawX;
- cy += vmesa->drawY;
+ if (flag) {
+ LOCK_HARDWARE(vmesa);
+ /* flip top to bottom */
+ cy = dPriv->h - cy - ch;
+ cx += vmesa->drawX;
+ cy += vmesa->drawY;
- if (vmesa->numClipRects) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, vmesa->numClipRects);
- drm_clip_rect_t *box = vmesa->pClipRects;
- drm_clip_rect_t *b = vmesa->sarea->boxes;
- int n = 0;
+ if (vmesa->numClipRects) {
+ int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, vmesa->numClipRects);
+ drm_clip_rect_t *box = vmesa->pClipRects;
+ drm_clip_rect_t *b = vmesa->sarea->boxes;
+ int n = 0;
- if (!vmesa->saam) {
- if (!all) {
- if (VIA_DEBUG) fprintf(stderr,"!all");
- for (; i < nr; i++) {
- GLint x = box[i].x1;
- GLint y = box[i].y1;
- GLint w = box[i].x2 - x;
- GLint h = box[i].y2 - y;
-
- if (x < cx) w -= cx - x, x = cx;
- if (y < cy) h -= cy - y, y = cy;
- if (x + w > cx + cw) w = cx + cw - x;
- if (y + h > cy + ch) h = cy + ch - y;
- if (w <= 0) continue;
- if (h <= 0) continue;
-
- b->x1 = x;
- b->y1 = y;
- b->x2 = x + w;
- b->y2 = y + h;
- b++;
- n++;
- }
- }
- else {
- for (; i < nr; i++) {
- *b++ = *(drm_clip_rect_t *)&box[i];
- n++;
- }
- }
- vmesa->sarea->nbox = n;
+ if (!all) {
+ for (; i < nr; i++) {
+ GLint x = box[i].x1;
+ GLint y = box[i].y1;
+ GLint w = box[i].x2 - x;
+ GLint h = box[i].y2 - y;
+
+ if (x < cx) w -= cx - x, x = cx;
+ if (y < cy) h -= cy - y, y = cy;
+ if (x + w > cx + cw) w = cx + cw - x;
+ if (y + h > cy + ch) h = cy + ch - y;
+ if (w <= 0) continue;
+ if (h <= 0) continue;
+
+ b->x1 = x;
+ b->y1 = y;
+ b->x2 = x + w;
+ b->y2 = y + h;
+ b++;
+ n++;
}
- else {
- GLuint scrn = 0;
- scrn = vmesa->saam & S_MASK;
-
- if (scrn == S0 || scrn == S1) {
- if (!all) {
- for (; i < nr; i++) {
- GLint x = box[i].x1;
- GLint y = box[i].y1;
- GLint w = box[i].x2 - x;
- GLint h = box[i].y2 - y;
-
- if (x < cx) w -= cx - x, x = cx;
- if (y < cy) h -= cy - y, y = cy;
- if (x + w > cx + cw) w = cx + cw - x;
- if (y + h > cy + ch) h = cy + ch - y;
- if (w <= 0) continue;
- if (h <= 0) continue;
-
- b->x1 = x;
- b->y1 = y;
- b->x2 = x + w;
- b->y2 = y + h;
- b++;
- n++;
- }
- }
- else {
- for (; i < nr; i++) {
- *b++ = *(drm_clip_rect_t *)&box[i];
- n++;
- }
- }
- vmesa->sarea->nbox = n;
- }
- /* between */
- else {
- if (!all) {
- for (; i < nr; i++) {
- GLint x = box[i].x1;
- GLint y = box[i].y1;
- GLint w = box[i].x2 - x;
- GLint h = box[i].y2 - y;
-
- if (x < cx) w -= cx - x, x = cx;
- if (y < cy) h -= cy - y, y = cy;
- if (x + w > cx + cw) w = cx + cw - x;
- if (y + h > cy + ch) h = cy + ch - y;
- if (w <= 0) continue;
- if (h <= 0) continue;
-
- b->x1 = x;
- b->y1 = y;
- b->x2 = x + w;
- b->y2 = y + h;
- b++;
- n++;
- }
-
- }
- else {
- for (; i < nr; i++) {
- *b++ = *(drm_clip_rect_t *)&box[n];
- n++;
- }
- }
- *b++ = *(drm_clip_rect_t *)vmesa->pSaamRects;
- vmesa->sarea->nbox = n;
- }
+ }
+ else {
+ for (; i < nr; i++) {
+ *b++ = *(drm_clip_rect_t *)&box[i];
+ n++;
}
+ }
+ vmesa->sarea->nbox = n;
+
+ }
- {
- if (flag & VIA_FRONT) {
-
- if (vmesa->drawType == GLX_PBUFFER_BIT)
- viaFillFrontPBuffer(vmesa);
- else
- viaFillFrontBuffer(vmesa);
-
- if (vmesa->saam && (scrn == (S0 | S1))) {
- nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, vmesa->numSaamRects);
- box = vmesa->pSaamRects;
- b = vmesa->sarea->boxes;
- n = 0;
-
- for (i = 0; i < nr; i++) {
- *b++ = *(drm_clip_rect_t *)&box[n];
- n++;
- }
-
- vmesa->sarea->nbox = n;
- viaFillFrontBufferSaam(vmesa);
- }
- }
+ if (flag & VIA_FRONT) {
+ if (vmesa->drawType == GLX_PBUFFER_BIT)
+ viaFillFrontPBuffer(vmesa);
+ else
+ viaFillFrontBuffer(vmesa);
+ }
- if (flag & VIA_BACK) {
- viaFillBackBuffer(vmesa);
- }
+ if (flag & VIA_BACK) {
+ viaFillBackBuffer(vmesa);
+ }
- if (flag & VIA_DEPTH) {
- double depth_clamp, range = 0xffffffff;
- if (vmesa->hasStencil == 0) {
- if (vmesa->depthBits == 32) {
- depth_clamp = ((double)ctx->Depth.Clear)*range;
- viaFillDepthBuffer(vmesa, (GLuint)depth_clamp);
- }
- else {
- depth_clamp = ((double)ctx->Depth.Clear)*range;
- viaFillDepthBuffer(vmesa, (GLuint)depth_clamp);
- }
- }
- else {
- depth_clamp = ((double)ctx->Depth.Clear)*range;
- viaFillStencilDepthBuffer(vmesa, (GLuint)depth_clamp);
- }
- }
- /*=* [DBG] Fix tuxracer depth error *=*/
- else if (flag & VIA_STENCIL) {
- viaFillStencilBuffer(vmesa, (GLuint)ctx->Stencil.Clear);
- }
- }
- }
- UNLOCK_HARDWARE(vmesa);
- vmesa->uploadCliprects = GL_TRUE;
- }
+ if (flag & VIA_DEPTH) {
+ viaFillDepthBuffer(vmesa, clear_depth, clear_depth_mask);
+ }
- if (mask)
- _swrast_Clear(ctx, mask, all, cx, cy, cw, ch);
- if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
+ UNLOCK_HARDWARE(vmesa);
+ vmesa->uploadCliprects = GL_TRUE;
+ }
+
+ if (mask)
+ _swrast_Clear(ctx, mask, all, cx, cy, cw, ch);
+ if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
/*
@@ -309,110 +208,61 @@ static void viaClear(GLcontext *ctx, GLbitfield mask, GLboolean all,
*/
void viaCopyBuffer(const __DRIdrawablePrivate *dPriv)
{
- viaContextPtr vmesa;
- drm_clip_rect_t *pbox;
- int nbox, i;
- GLuint scrn = 0, side = 0;
- GLboolean missed_target;
- int64_t ust;
-
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
- assert(dPriv);
- assert(dPriv->driContextPriv);
- assert(dPriv->driContextPriv->driverPrivate);
-
- vmesa = (viaContextPtr)dPriv->driContextPriv->driverPrivate;
+ viaContextPtr vmesa;
+ drm_clip_rect_t *pbox;
+ int nbox, i;
+ GLboolean missed_target;
+ int64_t ust;
+
+ if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
+ assert(dPriv);
+ assert(dPriv->driContextPriv);
+ assert(dPriv->driContextPriv->driverPrivate);
+
+ vmesa = (viaContextPtr)dPriv->driContextPriv->driverPrivate;
- VIA_FIREVERTICES(vmesa);
+ VIA_FIREVERTICES(vmesa);
- driWaitForVBlank( dPriv, & vmesa->vbl_seq, vmesa->vblank_flags, & missed_target );
- LOCK_HARDWARE(vmesa);
-
- scrn = vmesa->saam & S_MASK;
- side = vmesa->saam & P_MASK;
+ driWaitForVBlank( dPriv, & vmesa->vbl_seq, vmesa->vblank_flags, & missed_target );
+ LOCK_HARDWARE(vmesa);
- pbox = vmesa->pClipRects;
- nbox = vmesa->numClipRects;
+ pbox = vmesa->pClipRects;
+ nbox = vmesa->numClipRects;
- if (VIA_DEBUG) fprintf(stderr, "%s %d cliprects (%d), SAAM (%d)\n",
- __FUNCTION__, nbox, vmesa->drawType, vmesa->saam);
+ if (VIA_DEBUG) fprintf(stderr, "%s %d cliprects (%d)\n",
+ __FUNCTION__, nbox, vmesa->drawType);
- if (vmesa->drawType == GLX_PBUFFER_BIT) {
- viaDoSwapPBuffers(vmesa);
- if (VIA_DEBUG) fprintf(stderr, "%s SwapPBuffers\n", __FUNCTION__);
- }
- else {
- GLuint scrn = 0;
- scrn = vmesa->saam & S_MASK;
- if (!vmesa->saam) {
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, dPriv->numClipRects);
- drm_clip_rect_t *b = (drm_clip_rect_t *)vmesa->sarea->boxes;
-
- vmesa->sarea->nbox = nr - i;
-
- for (; i < nr; i++)
- *b++ = pbox[i];
- viaDoSwapBuffers(vmesa);
- if (VIA_DEBUG) fprintf(stderr, "%s SwapBuffers\n", __FUNCTION__);
- }
- }
- else if (scrn == S0 || scrn == S1) {
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, vmesa->numClipRects);
- drm_clip_rect_t *b = (drm_clip_rect_t *)vmesa->sarea->boxes;
-
- vmesa->sarea->nbox = nr - i;
-
- for (; i < nr; i++) {
- *b++ = pbox[i];
- }
- viaDoSwapBuffers(vmesa);
- }
- }
- /* between */
- else {
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, dPriv->numClipRects);
- drm_clip_rect_t *b = (drm_clip_rect_t *)vmesa->sarea->boxes;
-
- vmesa->sarea->nbox = nr - i;
-
- for (; i < nr; i++)
- *b++ = pbox[i];
- viaDoSwapBuffers(vmesa);
- }
-
- pbox = vmesa->pSaamRects;
- nbox = vmesa->numSaamRects;
-
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, vmesa->numSaamRects);
- drm_clip_rect_t *b = (drm_clip_rect_t *)vmesa->sarea->boxes;
-
- vmesa->sarea->nbox = nr - i;
-
- for (; i < nr; i++)
- *b++ = pbox[i];
-
- viaDoSwapBuffersSaam(vmesa);
- }
- }
- }
- UNLOCK_HARDWARE(vmesa);
- vmesa->uploadCliprects = GL_TRUE;
-
- vmesa->swap_count++;
- (*vmesa->get_ust)( & ust );
- if ( missed_target ) {
- vmesa->swap_missed_count++;
- vmesa->swap_missed_ust = ust - vmesa->swap_ust;
- }
+ if (vmesa->drawType == GLX_PBUFFER_BIT) {
+ viaDoSwapPBuffers(vmesa);
+ if (VIA_DEBUG) fprintf(stderr, "%s SwapPBuffers\n", __FUNCTION__);
+ }
+ else {
+ for (i = 0; i < nbox; ) {
+ int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, dPriv->numClipRects);
+ drm_clip_rect_t *b = (drm_clip_rect_t *)vmesa->sarea->boxes;
+
+ vmesa->sarea->nbox = nr - i;
+
+ for (; i < nr; i++)
+ *b++ = pbox[i];
+ viaDoSwapBuffers(vmesa);
+ if (VIA_DEBUG) fprintf(stderr, "%s SwapBuffers\n", __FUNCTION__);
+ }
+ }
+ UNLOCK_HARDWARE(vmesa);
+ vmesa->uploadCliprects = GL_TRUE;
+
+ vmesa->swap_count++;
+ (*vmesa->get_ust)( & ust );
+ if ( missed_target ) {
+ vmesa->swap_missed_count++;
+ vmesa->swap_missed_ust = ust - vmesa->swap_ust;
+ }
- vmesa->swap_ust = ust;
+ vmesa->swap_ust = ust;
- if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
+ if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
/*
@@ -436,10 +286,6 @@ void viaPageFlip(const __DRIdrawablePrivate *dPriv)
ctx = vmesa->glCtx;
- /*=* [DBG] make draw to front buffer *=*/
- if(DRAW_FRONT)
- return;
-
VIA_FIREVERTICES(vmesa);
/* Now wait for the vblank:
@@ -514,7 +360,7 @@ void viaPageFlip(const __DRIdrawablePrivate *dPriv)
if(vmesa->currentPage) {
vmesa->currentPage = 0;
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) {
ctx->Driver.DrawBuffer(ctx, GL_BACK);
}
else {
@@ -523,7 +369,7 @@ void viaPageFlip(const __DRIdrawablePrivate *dPriv)
}
else {
vmesa->currentPage = 1;
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) {
ctx->Driver.DrawBuffer(ctx, GL_BACK);
}
else {
@@ -569,268 +415,163 @@ static int intersect_rect(drm_clip_rect_t *out,
void viaFlushPrimsLocked(viaContextPtr vmesa)
{
- drm_clip_rect_t *pbox = (drm_clip_rect_t *)vmesa->pClipRects;
- int nbox = vmesa->numClipRects;
- drm_via_sarea_t *sarea = vmesa->sarea;
- drm_via_flush_sys_t sysCmd;
- GLuint *vb = viaCheckDma(vmesa, 0);
- int i;
-
- if (*(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|vmesa->hHWContext) &&
- *(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|DRM_LOCK_CONT|vmesa->hHWContext))
- fprintf(stderr, "%s called without lock held\n", __FUNCTION__);
-
- if (vmesa->dmaLow == DMA_OFFSET) {
- return;
- }
- if (vmesa->dmaLow > (VIA_DMA_BUFSIZ - 256))
- fprintf(stderr, "buffer overflow in Flush Prims = %d\n",vmesa->dmaLow);
+ drm_clip_rect_t *pbox = (drm_clip_rect_t *)vmesa->pClipRects;
+ int nbox = vmesa->numClipRects;
+ drm_via_sarea_t *sarea = vmesa->sarea;
+ drm_via_flush_sys_t sysCmd;
+ GLuint *vb = viaCheckDma(vmesa, 0);
+ int i;
+
+ if (*(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|vmesa->hHWContext) &&
+ *(GLuint *)vmesa->driHwLock != (DRM_LOCK_HELD|DRM_LOCK_CONT|vmesa->hHWContext))
+ fprintf(stderr, "%s called without lock held\n", __FUNCTION__);
+
+ if (vmesa->dmaLow == DMA_OFFSET) {
+ return;
+ }
+ if (vmesa->dmaLow > (VIA_DMA_BUFSIZ - 256))
+ fprintf(stderr, "buffer overflow in Flush Prims = %d\n",vmesa->dmaLow);
- switch (vmesa->dmaLow & 0x1F) {
- case 8:
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- vmesa->dmaLow += 24;
- break;
- case 16:
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- vmesa->dmaLow += 16;
- break;
- case 24:
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- *vb++ = HC_DUMMY;
- vmesa->dmaLow += 40;
- break;
- case 0:
- break;
- default:
- break;
- }
+ switch (vmesa->dmaLow & 0x1F) {
+ case 8:
+ *vb++ = HC_HEADER2;
+ *vb++ = (HC_ParaType_NotTex << 16);
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ vmesa->dmaLow += 24;
+ break;
+ case 16:
+ *vb++ = HC_HEADER2;
+ *vb++ = (HC_ParaType_NotTex << 16);
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ vmesa->dmaLow += 16;
+ break;
+ case 24:
+ *vb++ = HC_HEADER2;
+ *vb++ = (HC_ParaType_NotTex << 16);
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ *vb++ = HC_DUMMY;
+ vmesa->dmaLow += 40;
+ break;
+ case 0:
+ break;
+ default:
+ break;
+ }
- sysCmd.offset = 0x0;
- sysCmd.size = vmesa->dmaLow;
- sysCmd.index = (GLuint)vmesa->dma;
- sysCmd.discard = 0;
+ sysCmd.offset = 0x0;
+ sysCmd.size = vmesa->dmaLow;
+ sysCmd.index = (GLuint)vmesa->dma;
+ sysCmd.discard = 0;
- sarea->vertexPrim = vmesa->hwPrimitive;
+ sarea->vertexPrim = vmesa->hwPrimitive;
- if (!nbox) {
+ if (!nbox) {
sysCmd.size = 0;
- }
- else if (nbox > VIA_NR_SAREA_CLIPRECTS) {
- vmesa->uploadCliprects = GL_TRUE;
- }
-
- if (!nbox || !vmesa->uploadCliprects) {
- if (nbox == 1)
- sarea->nbox = 0;
- else
- sarea->nbox = nbox;
-
- sysCmd.discard = 1;
- flush_sys(vmesa, &sysCmd);
- }
- else {
- GLuint scrn;
- GLuint side;
- scrn = vmesa->saam & S_MASK;
- side = vmesa->saam & P_MASK;
-
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, nbox);
- drm_clip_rect_t *b = sarea->boxes;
-
- if (!vmesa->saam) {
- if (vmesa->glCtx->Scissor.Enabled) {
- sarea->nbox = 0;
-
- for (; i < nr; i++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
- if (intersect_rect(b, b, &vmesa->scissorRect)) {
- sarea->nbox++;
- b++;
- }
- }
- if (!sarea->nbox) {
- if (nr < nbox) continue;
- sysCmd.size = 0;
- }
- }
- else {
- sarea->nbox = nr - i;
- for (; i < nr; i++, b++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
- }
- }
- }
- else if (scrn == S0 || scrn == S1){
- if (vmesa->scissor) {
- sarea->nbox = 0;
- for (; i < nr; i++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
- if (intersect_rect(b, b, &vmesa->scissorRect)) {
- sarea->nbox++;
- b++;
- }
- }
- if (!sarea->nbox) {
- if (nr < nbox) continue;
- sysCmd.size = 0;
- }
- }
- else {
- sarea->nbox = nr - i;
- for (; i < nr; i++, b++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
- }
- }
-
+ }
+ else if (nbox > VIA_NR_SAREA_CLIPRECTS) {
+ vmesa->uploadCliprects = GL_TRUE;
+ }
+
+ if (!nbox || !vmesa->uploadCliprects) {
+ if (nbox == 1)
+ sarea->nbox = 0;
+ else
+ sarea->nbox = nbox;
+
+ sysCmd.discard = 1;
+ flush_sys(vmesa, &sysCmd);
+ }
+ else {
+ for (i = 0; i < nbox; ) {
+ int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, nbox);
+ drm_clip_rect_t *b = sarea->boxes;
+
+ if (vmesa->glCtx->Scissor.Enabled) {
+ sarea->nbox = 0;
+
+ for (; i < nr; i++) {
+ b->x1 = pbox[i].x1 - vmesa->drawX;
+ b->y1 = pbox[i].y1 - vmesa->drawY;
+ b->x2 = pbox[i].x2 - vmesa->drawX;
+ b->y2 = pbox[i].y2 - vmesa->drawY;
+ if (intersect_rect(b, b, &vmesa->scissorRect)) {
+ sarea->nbox++;
+ b++;
+ }
}
- /* between */
- else {
- if (vmesa->scissor) {
- sarea->nbox = 0;
- for (; i < nr; i++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
-
- if (intersect_rect(b, b, &vmesa->scissorRect)) {
- sarea->nbox++;
- b++;
- }
- }
- if (!sarea->nbox) {
- if (nr < nbox) continue;
- sysCmd.size = 0;
- }
- }
- else {
- sarea->nbox = nr - i;
- for (; i < nr; i++, b++) {
- b->x1 = pbox[i].x1 - vmesa->drawX;
- b->y1 = pbox[i].y1 - vmesa->drawY;
- b->x2 = pbox[i].x2 - vmesa->drawX;
- b->y2 = pbox[i].y2 - vmesa->drawY;
- }
- }
+ if (!sarea->nbox) {
+ if (nr < nbox) continue;
+ sysCmd.size = 0;
}
-
- if (nr == nbox) {
- sysCmd.discard = 1;
- flush_sys(vmesa, &sysCmd);
+ }
+ else {
+ sarea->nbox = nr - i;
+ for (; i < nr; i++, b++) {
+ b->x1 = pbox[i].x1 - vmesa->drawX;
+ b->y1 = pbox[i].y1 - vmesa->drawY;
+ b->x2 = pbox[i].x2 - vmesa->drawX;
+ b->y2 = pbox[i].y2 - vmesa->drawY;
}
-
- if (scrn == (S0 | S1)) {
- pbox = (drm_clip_rect_t *)vmesa->pSaamRects;
- nbox = vmesa->numSaamRects;
- for (i = 0; i < nbox; ) {
- int nr = MIN2(i + VIA_NR_SAREA_CLIPRECTS, nbox);
- drm_clip_rect_t *b = sarea->boxes;
- if (vmesa->scissor) {
- sarea->nbox = 0;
- for (; i < nr; i++) {
- b->x1 = pbox[i].x1 - vmesa->drawXSaam;
- b->y1 = pbox[i].y1 - vmesa->drawYSaam;
- b->x2 = pbox[i].x2 - vmesa->drawXSaam;
- b->y2 = pbox[i].y2 - vmesa->drawYSaam;
-
- if (intersect_rect(b, b, &vmesa->scissorRect)) {
- sarea->nbox++;
- b++;
- }
- }
- if (!sarea->nbox) {
- if (nr < nbox) continue;
- sysCmd.size = 0;
- }
- }
- else {
- sarea->nbox = nr - i;
- for (; i < nr; i++, b++) {
- b->x1 = pbox[i].x1 - vmesa->drawXSaam;
- b->y1 = pbox[i].y1 - vmesa->drawYSaam;
- b->x2 = pbox[i].x2 - vmesa->drawXSaam;
- b->y2 = pbox[i].y2 - vmesa->drawYSaam;
- }
- }
- }
- flush_sys(vmesa, &sysCmd);
- }
- }
- }
- if (VIA_DEBUG) {
- GLuint i;
- GLuint *data = (GLuint *)vmesa->dmaAddr;
- for (i = 0; i < vmesa->dmaLow; i += 16) {
- fprintf(stderr, "%08x ", *data++);
- fprintf(stderr, "%08x ", *data++);
- fprintf(stderr, "%08x ", *data++);
- fprintf(stderr, "%08x\n", *data++);
- }
- fprintf(stderr, "******************************************\n");
- }
- /* Reset vmesa vars:
- */
- vmesa->dmaLow = DMA_OFFSET;
- vmesa->dmaAddr = (unsigned char *)vmesa->dma;
- vmesa->dmaHigh = VIA_DMA_BUFSIZ;
- vmesa->dmaLastPrim = DMA_OFFSET;
+ }
+
+ if (nr == nbox) {
+ sysCmd.discard = 1;
+ flush_sys(vmesa, &sysCmd);
+ }
+ }
+ }
+ if (VIA_DEBUG) {
+ GLuint i;
+ GLuint *data = (GLuint *)vmesa->dmaAddr;
+ for (i = 0; i < vmesa->dmaLow; i += 16) {
+ fprintf(stderr, "%08x ", *data++);
+ fprintf(stderr, "%08x ", *data++);
+ fprintf(stderr, "%08x ", *data++);
+ fprintf(stderr, "%08x\n", *data++);
+ }
+ fprintf(stderr, "******************************************\n");
+ }
+ /* Reset vmesa vars:
+ */
+ vmesa->dmaLow = DMA_OFFSET;
+ vmesa->dmaAddr = (unsigned char *)vmesa->dma;
+ vmesa->dmaHigh = VIA_DMA_BUFSIZ;
+ vmesa->dmaLastPrim = DMA_OFFSET;
}
void viaFlushPrims(viaContextPtr vmesa)
{
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
+ if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
- if (vmesa->dmaLow) {
+ if (vmesa->dmaLow) {
LOCK_HARDWARE(vmesa);
- viaFlushPrimsLocked(vmesa);
+ viaFlushPrimsLocked(vmesa);
UNLOCK_HARDWARE(vmesa);
- }
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
+ }
+ if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
}
static void viaFlush(GLcontext *ctx)
{
viaContextPtr vmesa = VIA_CONTEXT(ctx);
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
VIA_FIREVERTICES(vmesa);
- if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
static void viaFinish(GLcontext *ctx)
{
- if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
- if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
- return;
+ viaContextPtr vmesa = VIA_CONTEXT(ctx);
+ VIA_FIREVERTICES(vmesa);
+ WAIT_IDLE(vmesa);
}
static void viaClearStencil(GLcontext *ctx, int s)
@@ -857,6 +598,11 @@ GLuint *viaBlit(viaContextPtr vmesa, GLuint bpp,GLuint srcBase,
GLuint dwGEMode = 0, srcY=0, srcX, dstY=0, dstX;
GLuint cmd;
+ if (VIA_DEBUG)
+ fprintf(stderr, "%s bpp %d src %x/%x dst %x/%x w %d h %d dir %d,%d mode: %x color: 0x%08x mask 0x%08x\n",
+ __FUNCTION__, bpp, srcBase, srcPitch, dstBase, dstPitch, w,h, xdir, ydir, blitMode, color, nMask);
+
+
if (!w || !h)
return vb;
@@ -943,30 +689,6 @@ void viaFillFrontBuffer(viaContextPtr vmesa)
viaFlushPrimsLocked(vmesa);
}
-void viaFillFrontBufferSaam(viaContextPtr vmesa)
-{
- GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight,i;
- drm_clip_rect_t *b = vmesa->sarea->boxes;
- GLuint *vb = viaCheckDma(vmesa, vmesa->sarea->nbox*VIA_BLITSIZE);
- GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3;
- GLuint pixel = (GLuint)vmesa->ClearColor;
-
- nDestPitch = vmesa->front.pitch;
-
- for (i = 0; i < vmesa->sarea->nbox ; i++) {
- nDestWidth = b->x2 - b->x1;
- nDestHeight = b->y2 - b->y1;
- nDestBase = vmesa->viaScreen->fbOffset +
- (vmesa->drawYSaam* nDestPitch + vmesa->drawXSaam * bytePerPixel);
- vb = viaBlit(vmesa,vmesa->viaScreen->bitsPerPixel, nDestBase, nDestPitch,
- nDestBase , nDestPitch, nDestWidth, nDestHeight,
- 0,0,VIABLIT_FILL, pixel, 0x0, vb);
- b++;
- }
-
- viaFlushPrimsLocked(vmesa);
-}
-
void viaFillFrontPBuffer(viaContextPtr vmesa)
{
GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offset;
@@ -990,7 +712,7 @@ void viaFillFrontPBuffer(viaContextPtr vmesa)
void viaFillBackBuffer(viaContextPtr vmesa)
{
- GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offsetX, offset;
+ GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offset;
GLcontext *ctx = vmesa->glCtx;
GLuint *vb = viaCheckDma(vmesa, vmesa->sarea->nbox*VIA_BLITSIZE);
GLuint pixel = (GLuint)vmesa->ClearColor;
@@ -1000,7 +722,6 @@ void viaFillBackBuffer(viaContextPtr vmesa)
if (VIA_DEBUG) fprintf(stderr, "Fill Back offset = %08x\n", offset);
nDestBase = offset;
nDestPitch = vmesa->back.pitch;
- offsetX = vmesa->drawXoff;
if (!ctx->Scissor.Enabled) {
nDestWidth = (vmesa->back.pitch / bytePerPixel);
@@ -1031,71 +752,27 @@ void viaFillBackBuffer(viaContextPtr vmesa)
}
}
-void viaFillStencilDepthBuffer(viaContextPtr vmesa, GLuint pixel)
-{
- GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offsetX, offset;
- GLuint *vb = viaCheckDma(vmesa, VIA_BLITSIZE);
-
- offset = vmesa->depth.offset;
- if (VIA_DEBUG) fprintf(stderr, "Fill Stencil Depth offset = %08x\n", offset);
- nDestBase = offset;
- nDestPitch = vmesa->depth.pitch;
- offsetX = vmesa->drawXoff;
- pixel = pixel & 0xffffff00;
- nDestWidth = (vmesa->depth.pitch / vmesa->depthBits * 8) - offsetX;
- nDestHeight = vmesa->driDrawable->h;
-
- viaBlit(vmesa, vmesa->depth.bpp , nDestBase, nDestPitch,
- nDestBase , nDestPitch, nDestWidth, nDestHeight,
- 0,0,VIABLIT_FILL, pixel, 0x10000000, vb);
-
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
- viaFlushPrimsLocked(vmesa);
- }
-}
-
-void viaFillStencilBuffer(viaContextPtr vmesa, GLuint pixel)
-{
- GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offsetX, offset;
- GLuint *vb = viaCheckDma(vmesa, VIA_BLITSIZE);
-
- offset = vmesa->depth.offset;
- if (VIA_DEBUG) fprintf(stderr, "Fill Stencil offset = %08x\n", offset);
- nDestBase = offset;
- nDestPitch = vmesa->depth.pitch;
- offsetX = vmesa->drawXoff;
- pixel = pixel & 0x000000ff;
- nDestWidth = (vmesa->depth.pitch / vmesa->depthBits * 8) - offsetX;
- nDestHeight = vmesa->driDrawable->h;
-
- viaBlit(vmesa, vmesa->depth.bpp , nDestBase, nDestPitch,
- nDestBase , nDestPitch, nDestWidth, nDestHeight,
- 0,0,VIABLIT_FILL, pixel, 0xe0000000, vb);
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
- viaFlushPrimsLocked(vmesa);
- }
-}
-
-void viaFillDepthBuffer(viaContextPtr vmesa, GLuint pixel)
+void viaFillDepthBuffer(viaContextPtr vmesa, GLuint pixel, GLuint mask)
{
GLuint nDestBase, nDestPitch, nDestWidth, nDestHeight, offsetX, offset;
GLuint *vb = viaCheckDma(vmesa, VIA_BLITSIZE);
offset = vmesa->depth.offset;
- if (VIA_DEBUG) fprintf(stderr, "Fill Depth offset = %08x\n", offset);
+ if (VIA_DEBUG)
+ fprintf(stderr, "Fill Depth offset = %08x, pixel %x, mask %x\n", offset, pixel, mask);
nDestBase = offset;
nDestPitch = vmesa->depth.pitch;
offsetX = vmesa->drawXoff;
- nDestWidth = (vmesa->depth.pitch / vmesa->depthBits * 8) - offsetX;
+ nDestWidth = (vmesa->depth.pitch / vmesa->depth.bpp * 8) - offsetX;
nDestHeight = vmesa->driDrawable->h;
viaBlit(vmesa, vmesa->depth.bpp , nDestBase, nDestPitch,
nDestBase , nDestPitch, nDestWidth, nDestHeight,
- 0,0,VIABLIT_FILL, pixel, 0, vb);
+ 0,0,VIABLIT_FILL, pixel, mask, vb);
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) {
viaFlushPrimsLocked(vmesa);
}
}
@@ -1114,10 +791,6 @@ void viaDoSwapBuffers(viaContextPtr vmesa)
nFrontPitch = vmesa->front.pitch;
nBackPitch = vmesa->back.pitch;
- /*=* [DBG] make draw to front buffer *=*/
- if(DRAW_FRONT)
- return;
-
for (i = 0; i < vmesa->sarea->nbox; i++) {
/* Width, Height */
@@ -1139,79 +812,6 @@ void viaDoSwapBuffers(viaContextPtr vmesa)
if (VIA_DEBUG) fprintf(stderr, "Do Swap Buffer\n");
}
-void viaDoSwapBuffersSaam(viaContextPtr vmesa)
-{
- GLuint *vb = viaCheckDma(vmesa, vmesa->sarea->nbox*56 + 8);
- GLuint nFrontPitch;
- GLuint nBackPitch;
- GLuint nFrontWidth, nFrontHeight, nBackWidth, nBackHeight;
- GLuint nFrontBase, nBackBase;
- GLuint nFrontOffsetX, nFrontOffsetY, nBackOffsetX, nBackOffsetY;
- drm_clip_rect_t *b = vmesa->sarea->boxes;
- GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3;
- GLuint i, blitMode;
- GLuint EngStatus = *(vmesa->pnGEMode);
-
- switch(bytePerPixel) {
- case 4:
- blitMode = 0x300;
- break;
- case 2:
- blitMode = 0x100;
- break;
- default:
- blitMode = 0x000;
- break;
- }
-
- /* Restore mode */
- SetReg2DAGP(0x04, (EngStatus & 0xFFFFFCFF) | blitMode);
-
-
- nFrontPitch = vmesa->front.pitch;
- nBackPitch = vmesa->back.pitch;
-
- /* Caculate Base */
- nFrontBase = vmesa->viaScreen->fbSize + (vmesa->drawYSaam * nFrontPitch + vmesa->drawXSaam * bytePerPixel);
- nBackBase = vmesa->back.offset;
- /* 128 bit alignment*/
- nFrontBase = nFrontBase & 0xffffffe0;
-
- /*=* [DBG] make draw to front buffer *=*/
- if(DRAW_FRONT)
- return;
-
- for (i = 0; i < vmesa->sarea->nbox; i++) {
- /* Width, Height */
- nFrontWidth = nBackWidth = b->x2 - b->x1 - 1;
- nFrontHeight = nBackHeight = b->y2 - b->y1 - 1;
- /* Offset */
- nFrontOffsetX = (b->x1 - vmesa->drawXSaam) + vmesa->drawXoff;
- nFrontOffsetY = b->y1 - vmesa->drawYSaam;
-
- nBackOffsetX = nFrontOffsetX;
- nBackOffsetY = nFrontOffsetY;
- /* GEWD */
- SetReg2DAGP(0x10, nFrontWidth | (nFrontHeight << 16));
- /* GEDST */
- SetReg2DAGP(0x0C, nFrontOffsetX | (nFrontOffsetY << 16));
- /* GESRC */
- SetReg2DAGP(0x08, nBackOffsetX | (nBackOffsetY << 16));
- /* GEDSTBASE */
- SetReg2DAGP(0x34, (nFrontBase >> 3));
- /* GESCRBASE */
- SetReg2DAGP(0x30, (nBackBase >> 3));
- /* GEPITCH */
- SetReg2DAGP(0x38, (((nFrontPitch >> 3) << 16) & 0x7FF0000) | 0x80000000 |
- ((nBackPitch >> 3) & 0x7FF));
- /* BITBLT */
- SetReg2DAGP(0x0, 0x1 | 0xCC000000);
- b++;
- }
-
- viaFlushPrimsLocked(vmesa);
- if (VIA_DEBUG) fprintf(stderr, "Do Swap Buffer\n");
-}
void viaDoSwapPBuffers(viaContextPtr vmesa)
{
@@ -1296,11 +896,7 @@ int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf)
pnBuf = (GLuint *)(buf->index + buf->offset);
pnEnd = (GLuint *)((GLuint)pnBuf + buf->size);
- /*=* [DBG] make draw to front buffer *=*/
- if(DRAW_FRONT)
- vmesa->glCtx->Color._DrawDestMask[0] = __GL_FRONT_BUFFER_MASK;
-
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) {
*vb++ = HC_HEADER2;
*vb++ = (HC_ParaType_NotTex << 16);
@@ -1369,7 +965,7 @@ int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf)
}
}
if (ret) {
- if (vmesa->useAgp) WAIT_IDLE;
+ if (vmesa->useAgp) WAIT_IDLE(vmesa);
/* for (i = 0; */
@@ -1457,7 +1053,9 @@ int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf)
}
if (ret) {
- if (vmesa->useAgp) WAIT_IDLE;
+ if (vmesa->useAgp)
+ WAIT_IDLE(vmesa);
+
if (drmCommandWrite(vmesa->driFd, DRM_VIA_PCICMD, &bufI, sizeof(bufI))) {
_mesa_error(vmesa->glCtx, GL_INVALID_OPERATION, __FUNCTION__);
abort();
@@ -1472,6 +1070,7 @@ int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf)
#if 0
/*=* John Sheng [2003.6.20] debug pci *=*/
+#if 0
if (VIA_DEBUG) {
GLuint *pnEngBase = (GLuint *)((GLuint)pnMMIOBase + 0x400);
int nStatus;
diff --git a/src/mesa/drivers/dri/unichrome/via_ioctl.h b/src/mesa/drivers/dri/unichrome/via_ioctl.h
index d178dda807..fec13c9362 100644
--- a/src/mesa/drivers/dri/unichrome/via_ioctl.h
+++ b/src/mesa/drivers/dri/unichrome/via_ioctl.h
@@ -39,18 +39,13 @@ void viaCopyBuffer(const __DRIdrawablePrivate *dpriv);
void viaPageFlip(const __DRIdrawablePrivate *dpriv);
int via_check_copy(int fd);
void viaFillFrontBuffer(viaContextPtr vmesa);
-void viaFillFrontBufferSaam(viaContextPtr vmesa);
void viaFillFrontPBuffer(viaContextPtr vmesa);
void viaFillBackBuffer(viaContextPtr vmesa);
-void viaFillDepthBuffer(viaContextPtr vmesa, GLuint pixel);
-void viaFillStencilBuffer(viaContextPtr vmesa, GLuint pixel);
-void viaFillStencilDepthBuffer(viaContextPtr vmesa, GLuint pixel);
+void viaFillDepthBuffer(viaContextPtr vmesa, GLuint pixel, GLuint mask);
void viaDoSwapBuffers(viaContextPtr vmesa);
-void viaDoSwapBuffersSaam(viaContextPtr vmesa);
void viaDoSwapPBuffers(viaContextPtr vmesa);
int flush_agp(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd);
-int flush_agp_saam(viaContextPtr vmesa, drm_via_flush_agp_t* agpCmd);
int flush_sys(viaContextPtr vmesa, drm_via_flush_sys_t* buf);
#define VIA_STATECHANGE(vmesa, flag) \
diff --git a/src/mesa/drivers/dri/unichrome/via_screen.c b/src/mesa/drivers/dri/unichrome/via_screen.c
index 1a47fe57c6..b7f049022b 100644
--- a/src/mesa/drivers/dri/unichrome/via_screen.c
+++ b/src/mesa/drivers/dri/unichrome/via_screen.c
@@ -117,9 +117,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
viaScreen->irqEnabled = gDRIPriv->irqEnabled;
viaScreen->irqEnabled = 1;
-#ifdef USE_XINERAMA
- viaScreen->drixinerama = gDRIPriv->drixinerama;
-#endif
if (VIA_DEBUG) {
fprintf(stderr, "deviceID = %08x\n", viaScreen->deviceID);
fprintf(stderr, "width = %08x\n", viaScreen->width);
@@ -219,36 +216,24 @@ viaCreateBuffer(__DRIscreenPrivate *driScrnPriv,
const __GLcontextModes *mesaVis,
GLboolean isPixmap)
{
- /* KW: Bogus: Do this sort of thing in MakeCurrent or similar.
- */
- viaContextPtr vmesa;
+ viaContextPtr vmesa = 0;
GET_CURRENT_CONTEXT(ctx);
+ GLboolean swStencil = (mesaVis->stencilBits > 0 &&
+ mesaVis->depthBits != 24);
if (ctx)
vmesa = VIA_CONTEXT(ctx);
if (VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
- /*=* John Sheng [2003.7.2] for visual config & patch viewperf *=*/
- if (vmesa && mesaVis->depthBits == 32 && vmesa->depthBits == 16) {
- vmesa->depthBits = mesaVis->depthBits;
- vmesa->depth.size *= 2;
- vmesa->depth.pitch *= 2;
- vmesa->depth.bpp *= 2;
- if (vmesa->depth.map)
- via_free_depth_buffer(vmesa);
- if (!via_alloc_depth_buffer(vmesa)) {
- via_free_depth_buffer(vmesa);
- return GL_FALSE;
- }
-
- ((__GLcontextModes*)mesaVis)->depthBits = 16; /* XXX : sure you want to change read-only data? */
- }
-
+
+ /* KW: removed bogus depth recalculations.
+ */
+
if (isPixmap) {
driDrawPriv->driverPrivate = (void *)
_mesa_create_framebuffer(mesaVis,
GL_FALSE, /* software depth buffer? */
- mesaVis->stencilBits > 0,
+ swStencil,
mesaVis->accumRedBits > 0,
GL_FALSE /* s/w alpha planes */);
@@ -260,7 +245,7 @@ viaCreateBuffer(__DRIscreenPrivate *driScrnPriv,
driDrawPriv->driverPrivate = (void *)
_mesa_create_framebuffer(mesaVis,
GL_FALSE, /* software depth buffer? */
- mesaVis->stencilBits > 0,
+ swStencil,
mesaVis->accumRedBits > 0,
GL_FALSE /* s/w alpha planes */);
diff --git a/src/mesa/drivers/dri/unichrome/via_screen.h b/src/mesa/drivers/dri/unichrome/via_screen.h
index c70ff447fd..01613eac21 100644
--- a/src/mesa/drivers/dri/unichrome/via_screen.h
+++ b/src/mesa/drivers/dri/unichrome/via_screen.h
@@ -44,9 +44,6 @@ typedef struct {
int fbFormat;
int fbOffset;
int fbSize;
-#ifdef USE_XINERAMA
- Bool drixinerama;
-#endif
int fbStride;
diff --git a/src/mesa/drivers/dri/unichrome/via_span.c b/src/mesa/drivers/dri/unichrome/via_span.c
index 343d1993fa..89cafa37ae 100644
--- a/src/mesa/drivers/dri/unichrome/via_span.c
+++ b/src/mesa/drivers/dri/unichrome/via_span.c
@@ -32,28 +32,13 @@
#include "swrast/swrast.h"
#define DBG 0
-#define LOCAL_VARS \
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- viaScreenPrivate *viaScreen = vmesa->viaScreen; \
- GLuint pitch = vmesa->drawPitch; \
- GLuint height = dPriv->h; \
- GLushort p; \
- char *buf = (char *)(vmesa->drawMap + \
- dPriv->x * viaScreen->bytesPerPixel + \
- dPriv->y * pitch); \
- char *read_buf = (char *)(vmesa->readMap + \
- dPriv->x * viaScreen->bytesPerPixel + \
- dPriv->y * pitch); \
- (void)read_buf; (void)buf; (void)p
#define LOCAL_DEPTH_VARS \
__DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
viaScreenPrivate *viaScreen = vmesa->viaScreen; \
GLuint pitch = viaScreen->backPitch; \
GLuint height = dPriv->h; \
- char *buf = (char *)(vmesa->depth.map + \
- dPriv->x * 2 + \
- dPriv->y * pitch)
+ char *buf = (char *)(vmesa->depth.map)
#define CLIPPIXEL(_x,_y) (_x >= minx && _x < maxx && \
_y >= miny && _y < maxy)
@@ -72,98 +57,36 @@
#define Y_FLIP(_y) (height - _y - 1)
-#define HW_LOCK() \
- viaContextPtr vmesa = VIA_CONTEXT(ctx); \
- LOCK_HARDWARE_QUIESCENT(vmesa);
-
-/*=* [DBG] csmash saam : bitmap option menu can't be drawn in saam *=*/
-/*#define HW_CLIPLOOP() \
- do { \
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- int _nc = dPriv->numClipRects; \
- while (_nc--) { \
- int minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \
- int miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \
- int maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \
- int maxy = dPriv->pClipRects[_nc].y2 - dPriv->y;*/
-#define HW_CLIPLOOP() \
- do { \
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- int _nc = dPriv->numClipRects; \
- GLuint scrn = vmesa->saam & S_MASK; \
- if(scrn == S1) _nc = 1; \
- while (_nc--) { \
- int minx; \
- int miny; \
- int maxx; \
- int maxy; \
- if (!vmesa->saam) { \
- minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \
- miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \
- maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \
- maxy = dPriv->pClipRects[_nc].y2 - dPriv->y; \
- } \
- else { \
- minx = -10000; \
- miny = -10000; \
- maxx = 10000; \
- maxy = 10000; \
- }
-
- /*else if (scrn == S0) { \
- minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \
- miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \
- maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \
- maxy = dPriv->pClipRects[_nc].y2 - dPriv->y; \
- } \
- else if (scrn == S1) { \
- drm_clip_rect_t *b = vmesa->sarea->boxes; \
- minx = b->x1; \
- miny = b->y1; \
- maxx = b->x2; \
- maxy = b->y2; \
- } \
- else { \
- drm_clip_rect_t *b = vmesa->sarea->boxes + vmesa->numClipRects;\
- minx = b->x1; \
- miny = b->y1; \
- maxx = b->x2; \
- maxy = b->y2; \
- }*/
+#define HW_LOCK()
+#define HW_CLIPLOOP() \
+ do { \
+ __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
+ int _nc = dPriv->numClipRects; \
+ while (_nc--) { \
+ int minx = dPriv->pClipRects[_nc].x1 - dPriv->x; \
+ int miny = dPriv->pClipRects[_nc].y1 - dPriv->y; \
+ int maxx = dPriv->pClipRects[_nc].x2 - dPriv->x; \
+ int maxy = dPriv->pClipRects[_nc].y2 - dPriv->y;
+
#define HW_ENDCLIPLOOP() \
} \
} while (0)
-#define HW_UNLOCK() \
- UNLOCK_HARDWARE(vmesa);
-
+#define HW_UNLOCK()
/* 16 bit, 565 rgb color spanline and pixel functions
*/
-/*=* [DBG] csmash : fix options worng position *=*/
-/*#define LOCAL_VARS \
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- GLuint pitch = vmesa->drawPitch; \
- GLuint height = dPriv->h; \
- GLushort p; \
- char *buf = (char *)(vmesa->drawMap + \
- dPriv->x * 2 + \
- dPriv->y * pitch); \
- char *read_buf = (char *)(vmesa->readMap + \
- dPriv->x * 2 + \
- dPriv->y * pitch); \
- (void)read_buf; (void)buf; (void)p*/
-
#undef LOCAL_VARS
#define LOCAL_VARS \
+ viaContextPtr vmesa = VIA_CONTEXT(ctx); \
__DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
GLuint pitch = vmesa->drawPitch; \
GLuint height = dPriv->h; \
GLushort p; \
char *buf, *read_buf; \
p = 0; \
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) { \
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) { \
buf = (char *)(vmesa->drawMap); \
read_buf = (char *)(vmesa->readMap); \
} \
@@ -203,15 +126,19 @@
*/
#undef LOCAL_VARS
#undef LOCAL_DEPTH_VARS
+#undef INIT_MONO_PIXEL
+#undef DBG
+#define DBG 0
#define LOCAL_VARS \
+ viaContextPtr vmesa = VIA_CONTEXT(ctx); \
__DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
GLuint pitch = vmesa->drawPitch; \
GLuint height = dPriv->h; \
GLuint p; \
char *buf, *read_buf; \
p = 0; \
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) { \
+ if (vmesa->glCtx->Color._DrawDestMask[0] == DD_BACK_LEFT_BIT) { \
buf = (char *)(vmesa->drawMap); \
read_buf = (char *)(vmesa->readMap); \
} \
@@ -236,21 +163,15 @@
/* 16 bit depthbuffer functions.
*/
-/*=* John Sheng [2003.6.16] fix exy press 'i' dirty screen *=*/
-/*#define LOCAL_DEPTH_VARS \
- __DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- GLuint pitch = vmesa->depth.pitch; \
- GLuint height = dPriv->h; \
- char *buf = (char *)(vmesa->depth.map + \
- dPriv->x * 2 + \
- dPriv->y * pitch) */
#define LOCAL_DEPTH_VARS \
+ viaContextPtr vmesa = VIA_CONTEXT(ctx); \
__DRIdrawablePrivate *dPriv = vmesa->driDrawable; \
- /*viaScreenPrivate *viaScreen = vmesa->viaScreen;*/ \
GLuint pitch = vmesa->depth.pitch; \
GLuint height = dPriv->h; \
char *buf = (char *)(vmesa->depth.map)
+#define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS
+
#define WRITE_DEPTH(_x, _y, d) \
*(GLushort *)(buf + _x * 2 + _y * pitch) = d;
@@ -272,21 +193,37 @@
#define TAG(x) via##x##_32
#include "depthtmp.h"
-/* 24/8 bit depthbuffer functions.
+
+
+/* 24/8 bit interleaved depth/stencil functions
*/
-/*
-#define WRITE_DEPTH(_x, _y, d) { \
- GLuint tmp = *(GLuint *)(buf + _x * 4 + y * pitch); \
- tmp &= 0xff; \
- tmp |= (d) & 0xffffff00; \
- *(GLuint *)(buf + _x * 4 + _y * pitch) = tmp; \
+#define WRITE_DEPTH( _x, _y, d ) { \
+ GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); \
+ tmp &= 0x000000ff; \
+ tmp |= ((d)<<8); \
+ *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = tmp; \
+}
+
+#define READ_DEPTH( d, _x, _y ) \
+ d = (*(GLuint *)(buf + (_x)*4 + (_y)*pitch)) >> 8;
-#define READ_DEPTH(d, _x, _y) \
- d = (*(GLuint *)(buf + _x * 4 + _y * pitch) & ~0xff) >> 8;
#define TAG(x) via##x##_24_8
#include "depthtmp.h"
-*/
+
+#define WRITE_STENCIL( _x, _y, d ) { \
+ GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*pitch); \
+ tmp &= 0xffffff00; \
+ tmp |= (d); \
+ *(GLuint *)(buf + (_x)*4 + (_y)*pitch) = tmp; \
+}
+
+#define READ_STENCIL( d, _x, _y ) \
+ d = *(GLuint *)(buf + (_x)*4 + (_y)*pitch) & 0xff;
+
+#define TAG(x) via##x##_24_8
+#include "stenciltmp.h"
+
static void viaSetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer,
@@ -312,6 +249,23 @@ static void viaSetBuffer(GLcontext *ctx, GLframebuffer *colorBuffer,
if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
+/* Move locking out to get reasonable span performance.
+ */
+static void viaSpanRenderStart( GLcontext *ctx )
+{
+ viaContextPtr vmesa = VIA_CONTEXT(ctx);
+ LOCK_HARDWARE(vmesa);
+ viaFlushPrimsLocked(vmesa);
+ WAIT_IDLE(vmesa);
+
+}
+
+static void viaSpanRenderFinish( GLcontext *ctx )
+{
+ viaContextPtr vmesa = VIA_CONTEXT(ctx);
+ _swrast_flush( ctx );
+ UNLOCK_HARDWARE( vmesa );
+}
void viaInitSpanFuncs(GLcontext *ctx)
{
@@ -320,7 +274,7 @@ void viaInitSpanFuncs(GLcontext *ctx)
swdd->SetBuffer = viaSetBuffer;
if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
- if (vmesa->viaScreen->bitsPerPixel == 0x10) {
+ if (vmesa->viaScreen->bitsPerPixel == 16) {
swdd->WriteRGBASpan = viaWriteRGBASpan_565;
swdd->WriteRGBSpan = viaWriteRGBSpan_565;
swdd->WriteMonoRGBASpan = viaWriteMonoRGBASpan_565;
@@ -329,24 +283,44 @@ void viaInitSpanFuncs(GLcontext *ctx)
swdd->ReadRGBASpan = viaReadRGBASpan_565;
swdd->ReadRGBAPixels = viaReadRGBAPixels_565;
}
- else if (vmesa->viaScreen->bitsPerPixel == 0x20) {
+ else if (vmesa->viaScreen->bitsPerPixel == 32) {
viaInitPointers_8888( swdd );
}
- else
- ASSERT(0);
+ else {
+ fprintf(stderr, "%s: failed\n", __FUNCTION__);
+ assert(0);
+ }
- if (vmesa->glCtx->Visual.depthBits == 0x10) {
+ if (vmesa->glCtx->Visual.depthBits == 16) {
swdd->ReadDepthSpan = viaReadDepthSpan_16;
swdd->WriteDepthSpan = viaWriteDepthSpan_16;
+ swdd->WriteMonoDepthSpan = viaWriteMonoDepthSpan_16;
swdd->ReadDepthPixels = viaReadDepthPixels_16;
swdd->WriteDepthPixels = viaWriteDepthPixels_16;
}
- else if (vmesa->glCtx->Visual.depthBits == 0x20) {
+ else if (vmesa->glCtx->Visual.depthBits == 24) {
+ fprintf(stderr, "%s: 24/8 span functions\n", __FUNCTION__);
+ swdd->ReadDepthSpan = viaReadDepthSpan_24_8;
+ swdd->WriteDepthSpan = viaWriteDepthSpan_24_8;
+ swdd->ReadDepthPixels = viaReadDepthPixels_24_8;
+ swdd->WriteDepthPixels = viaWriteDepthPixels_24_8;
+
+ swdd->WriteStencilSpan = viaWriteStencilSpan_24_8;
+ swdd->ReadStencilSpan = viaReadStencilSpan_24_8;
+ swdd->WriteStencilPixels = viaWriteStencilPixels_24_8;
+ swdd->ReadStencilPixels = viaReadStencilPixels_24_8;
+ }
+ else if (vmesa->glCtx->Visual.depthBits == 32) {
swdd->ReadDepthSpan = viaReadDepthSpan_32;
swdd->WriteDepthSpan = viaWriteDepthSpan_32;
+ swdd->WriteMonoDepthSpan = viaWriteMonoDepthSpan_32;
swdd->ReadDepthPixels = viaReadDepthPixels_32;
swdd->WriteDepthPixels = viaWriteDepthPixels_32;
}
+
+ swdd->SpanRenderStart = viaSpanRenderStart;
+ swdd->SpanRenderFinish = viaSpanRenderFinish;
+
swdd->WriteCI8Span = NULL;
swdd->WriteCI32Span = NULL;
diff --git a/src/mesa/drivers/dri/unichrome/via_state.c b/src/mesa/drivers/dri/unichrome/via_state.c
index 8c5a45c983..bb06b327bb 100644
--- a/src/mesa/drivers/dri/unichrome/via_state.c
+++ b/src/mesa/drivers/dri/unichrome/via_state.c
@@ -195,7 +195,12 @@ static void viaScissor(GLcontext *ctx, GLint x, GLint y,
GLsizei w, GLsizei h)
{
viaContextPtr vmesa = VIA_CONTEXT(ctx);
+
+ if (!vmesa->driDrawable)
+ return;
+
if (VIA_DEBUG) fprintf(stderr, "%s in\n", __FUNCTION__);
+
if (ctx->Scissor.Enabled) {
VIA_FIREVERTICES(vmesa); /* don't pipeline cliprect changes */
vmesa->uploadCliprects = GL_TRUE;
@@ -257,6 +262,13 @@ static void viaDrawBuffer(GLcontext *ctx, GLenum mode)
FALLBACK(vmesa, VIA_FALLBACK_DRAW_BUFFER, GL_TRUE);
return;
}
+
+ /* We want to update the s/w rast state too so that r200SetBuffer()
+ * gets called.
+ */
+ _swrast_DrawBuffer(ctx, mode);
+
+
if (VIA_DEBUG) fprintf(stderr, "%s out\n", __FUNCTION__);
}
@@ -296,40 +308,6 @@ static void viaPointSize(GLcontext *ctx, GLfloat sz)
vmesa = vmesa;
}
-static void viaBitmap( GLcontext *ctx, GLint px, GLint py,
- GLsizei width, GLsizei height,
- const struct gl_pixelstore_attrib *unpack,
- const GLubyte *bitmap )
-{
- viaContextPtr vmesa = VIA_CONTEXT(ctx);
-
- /*=* [DBG] csmash : fix background overlap option menu *=*/
- LOCK_HARDWARE(vmesa);
- viaFlushPrimsLocked(vmesa);
- UNLOCK_HARDWARE(vmesa);
-
- WAIT_IDLE
- /*=* [DBG] csmash : fix segmentation fault *=*/
- /*=* John Sheng [2003.7.18] texenv *=*/
- /*if (!vmesa->drawMap && !vmesa->readMap) {*/
- if (1) {
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
- viaDrawBuffer(ctx, GL_BACK);
- }
- else {
- viaDrawBuffer(ctx, GL_FRONT);
- }
- }
- /*=* [DBG] csmash : white option words become brown *=*/
- /*_swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap );*/
- {
- GLboolean fog;
- fog = ctx->Fog.Enabled;
- ctx->Fog.Enabled = GL_FALSE;
- _swrast_Bitmap(ctx, px, py, width, height, unpack, bitmap );
- ctx->Fog.Enabled = fog;
- }
-}
/* =============================================================
* Color masks
@@ -426,15 +404,8 @@ void viaCalcViewport(GLcontext *ctx)
m[MAT_TX] = v[MAT_TX] + vmesa->drawXoff;
m[MAT_SY] = - v[MAT_SY];
m[MAT_TY] = - v[MAT_TY] + vmesa->driDrawable->h;
- /*=* John Sheng [2003.7.2] for visual config & viewperf drv-08 *=*/
- if (vmesa->depth.bpp == 16) {
- m[MAT_SZ] = v[MAT_SZ] * (1.0 / 0xffff);
- m[MAT_TZ] = v[MAT_TZ] * (1.0 / 0xffff);
- }
- else {
- m[MAT_SZ] = v[MAT_SZ] * (1.0 / 0xffffffff);
- m[MAT_TZ] = v[MAT_TZ] * (1.0 / 0xffffffff);
- }
+ m[MAT_SZ] = v[MAT_SZ] * vmesa->depth_scale;
+ m[MAT_TZ] = v[MAT_TZ] * vmesa->depth_scale;
}
static void viaViewport(GLcontext *ctx,
@@ -474,14 +445,86 @@ void viaInitState(GLcontext *ctx)
vmesa->regCmdB = HC_ACMD_HCmdB | HC_HVPMSK_X | HC_HVPMSK_Y | HC_HVPMSK_Z;
vmesa->regEnable = HC_HenCW_MASK;
- if (vmesa->glCtx->Color._DrawDestMask[0] == __GL_BACK_BUFFER_MASK) {
- vmesa->drawMap = vmesa->back.map;
- vmesa->readMap = vmesa->back.map;
- }
- else {
- vmesa->drawMap = (char *)vmesa->driScreen->pFB;
- vmesa->readMap = (char *)vmesa->driScreen->pFB;
- }
+ /* Mesa should do this for us:
+ */
+ ctx->Driver.AlphaFunc( ctx,
+ ctx->Color.AlphaFunc,
+ ctx->Color.AlphaRef);
+
+/* ctx->Driver.BlendColor( ctx, */
+/* ctx->Color.BlendColor ); */
+
+ ctx->Driver.BlendEquationSeparate( ctx,
+ ctx->Color.BlendEquationRGB,
+ ctx->Color.BlendEquationA);
+
+ ctx->Driver.BlendFuncSeparate( ctx,
+ ctx->Color.BlendSrcRGB,
+ ctx->Color.BlendDstRGB,
+ ctx->Color.BlendSrcA,
+ ctx->Color.BlendDstA);
+
+ ctx->Driver.ColorMask( ctx,
+ ctx->Color.ColorMask[RCOMP],
+ ctx->Color.ColorMask[GCOMP],
+ ctx->Color.ColorMask[BCOMP],
+ ctx->Color.ColorMask[ACOMP]);
+
+ ctx->Driver.CullFace( ctx, ctx->Polygon.CullFaceMode );
+ ctx->Driver.DepthFunc( ctx, ctx->Depth.Func );
+ ctx->Driver.DepthMask( ctx, ctx->Depth.Mask );
+
+ ctx->Driver.Enable( ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled );
+ ctx->Driver.Enable( ctx, GL_BLEND, ctx->Color.BlendEnabled );
+ ctx->Driver.Enable( ctx, GL_COLOR_LOGIC_OP, ctx->Color.ColorLogicOpEnabled );
+ ctx->Driver.Enable( ctx, GL_COLOR_SUM, ctx->Fog.ColorSumEnabled );
+ ctx->Driver.Enable( ctx, GL_CULL_FACE, ctx->Polygon.CullFlag );
+ ctx->Driver.Enable( ctx, GL_DEPTH_TEST, ctx->Depth.Test );
+ ctx->Driver.Enable( ctx, GL_DITHER, ctx->Color.DitherFlag );
+ ctx->Driver.Enable( ctx, GL_FOG, ctx->Fog.Enabled );
+ ctx->Driver.Enable( ctx, GL_LIGHTING, ctx->Light.Enabled );
+ ctx->Driver.Enable( ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag );
+ ctx->Driver.Enable( ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag );
+ ctx->Driver.Enable( ctx, GL_SCISSOR_TEST, ctx->Scissor.Enabled );
+ ctx->Driver.Enable( ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled );
+ ctx->Driver.Enable( ctx, GL_TEXTURE_1D, GL_FALSE );
+ ctx->Driver.Enable( ctx, GL_TEXTURE_2D, GL_FALSE );
+ ctx->Driver.Enable( ctx, GL_TEXTURE_RECTANGLE_NV, GL_FALSE );
+ ctx->Driver.Enable( ctx, GL_TEXTURE_3D, GL_FALSE );
+ ctx->Driver.Enable( ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE );
+
+ ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color );
+ ctx->Driver.Fogfv( ctx, GL_FOG_MODE, 0 );
+ ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density );
+ ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start );
+ ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End );
+
+ ctx->Driver.FrontFace( ctx, ctx->Polygon.FrontFace );
+
+ {
+ GLfloat f = (GLfloat)ctx->Light.Model.ColorControl;
+ ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_COLOR_CONTROL, &f );
+ }
+
+ ctx->Driver.LineWidth( ctx, ctx->Line.Width );
+ ctx->Driver.LogicOpcode( ctx, ctx->Color.LogicOp );
+ ctx->Driver.PointSize( ctx, ctx->Point.Size );
+ ctx->Driver.PolygonStipple( ctx, (const GLubyte *)ctx->PolygonStipple );
+ ctx->Driver.Scissor( ctx, ctx->Scissor.X, ctx->Scissor.Y,
+ ctx->Scissor.Width, ctx->Scissor.Height );
+ ctx->Driver.ShadeModel( ctx, ctx->Light.ShadeModel );
+/* ctx->Driver.StencilFunc( ctx, */
+/* ctx->Stencil.Function[0], */
+/* ctx->Stencil.Ref[0], */
+/* ctx->Stencil.ValueMask[0] ); */
+/* ctx->Driver.StencilMask( ctx, ctx->Stencil.WriteMask[0] ); */
+/* ctx->Driver.StencilOp( ctx, */
+/* ctx->Stencil.FailFunc[0], */
+/* ctx->Stencil.ZFailFunc[0], */
+/* ctx->Stencil.ZPassFunc[0]); */
+
+
+ ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] );
}
/**
@@ -1366,8 +1409,7 @@ void viaInitStateFuncs(GLcontext *ctx)
/* Pixel path fallbacks.
*/
ctx->Driver.Accum = _swrast_Accum;
- ctx->Driver.Bitmap = viaBitmap;
-
+ ctx->Driver.Bitmap = _swrast_Bitmap;
ctx->Driver.CopyPixels = _swrast_CopyPixels;
ctx->Driver.DrawPixels = _swrast_DrawPixels;
ctx->Driver.ReadPixels = _swrast_ReadPixels;
diff --git a/src/mesa/drivers/dri/unichrome/via_tris.c b/src/mesa/drivers/dri/unichrome/via_tris.c
index cf9c99bbd4..60b835d040 100644
--- a/src/mesa/drivers/dri/unichrome/via_tris.c
+++ b/src/mesa/drivers/dri/unichrome/via_tris.c
@@ -754,16 +754,14 @@ static void emit_all_state(viaContextPtr vmesa)
*vb++ = ((HC_SubA_HROP << 24) | vmesa->regHROP);
i += 5;
- if (vmesa->hasDepth && vmesa->hasStencil) {
+ if (vmesa->have_hw_stencil) {
GLuint pitch, format, offset;
- format = HC_HZWBFM_24;
-
+ format = HC_HZWBFM_24;
offset = vmesa->depth.offset;
pitch = vmesa->depth.pitch;
*vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
*vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
*vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
format | pitch);
@@ -793,33 +791,12 @@ static void emit_all_state(viaContextPtr vmesa)
pitch = vmesa->depth.pitch;
*vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
*vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
*vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
format | pitch);
*vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
i += 4;
}
- else if (vmesa->hasStencil) {
- GLuint pitch, format, offset;
-
- format = HC_HZWBFM_24;
-
- offset = vmesa->depth.offset;
- pitch = vmesa->depth.pitch;
-
- *vb++ = ((HC_SubA_HZWBBasL << 24) | (offset & 0xFFFFFF));
-
- *vb++ = ((HC_SubA_HZWBBasH << 24) | ((offset & 0xFF000000) >> 24));
- *vb++ = ((HC_SubA_HZWBType << 24) | HC_HDBLoc_Local | HC_HZONEasFF_MASK |
- format | pitch);
- *vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
- /* set stencil */
- *vb++ = ((HC_SubA_HSTREF << 24) | vmesa->regHSTREF);
- *vb++ = ((HC_SubA_HSTMD << 24) | vmesa->regHSTMD);
-
- i += 6;
- }
if (ctx->Color.AlphaEnabled) {
*vb++ = ((HC_SubA_HATMD << 24) | vmesa->regHATMD);
@@ -1222,97 +1199,6 @@ static void emit_all_state(viaContextPtr vmesa)
}
-static void emit_partial_state(viaContextPtr vmesa)
-{
- GLcontext *ctx = vmesa->glCtx;
- GLuint dirty = vmesa->dirty;
- GLuint *vb = viaCheckDma(vmesa, 0x110);
- GLuint i = 0;
-
- if( VIA_DEBUG) fprintf(stderr, "%s - in\n", __FUNCTION__);
-
-#ifdef PERFORMANCE_MEASURE
- if (VIA_PERFORMANCE) P_M;
-#endif
- vb = vb;
-
- *vb++ = HC_HEADER2;
- *vb++ = (HC_ParaType_NotTex << 16);
- *vb++ = ((HC_SubA_HEnable << 24) | vmesa->regEnable);
- *vb++ = ((HC_SubA_HFBBMSKL << 24) | vmesa->regHFBBMSKL);
- *vb++ = ((HC_SubA_HROP << 24) | vmesa->regHROP);
- i += 5;
-
- if (dirty & VIA_UPLOAD_DESTBUFFER) {
- }
-
- if (dirty & VIA_UPLOAD_DEPTHBUFFER) {
- }
-
- if (dirty * VIA_UPLOAD_DEPTH) {
- *vb++ = ((HC_SubA_HZWTMD << 24) | vmesa->regHZWTMD);
- i++;
- }
-
- if (dirty * VIA_UPLOAD_ALPHATEST) {
- *vb++ = ((HC_SubA_HATMD << 24) | vmesa->regHATMD);
- i++;
- }
-
-
- if (dirty & VIA_UPLOAD_BLEND) {
- *vb++ = ((HC_SubA_HABLCsat << 24) | vmesa->regHABLCsat);
- *vb++ = ((HC_SubA_HABLCop << 24) | vmesa->regHABLCop);
- *vb++ = ((HC_SubA_HABLAsat << 24) | vmesa->regHABLAsat);
- *vb++ = ((HC_SubA_HABLAop << 24) | vmesa->regHABLAop);
- *vb++ = ((HC_SubA_HABLRCa << 24) | vmesa->regHABLRCa);
- *vb++ = ((HC_SubA_HABLRFCa << 24) | vmesa->regHABLRFCa);
- *vb++ = ((HC_SubA_HABLRCbias << 24) | vmesa->regHABLRCbias);
- *vb++ = ((HC_SubA_HABLRCb << 24) | vmesa->regHABLRCb);
- *vb++ = ((HC_SubA_HABLRFCb << 24) | vmesa->regHABLRFCb);
- *vb++ = ((HC_SubA_HABLRAa << 24) | vmesa->regHABLRAa);
- *vb++ = ((HC_SubA_HABLRAb << 24) | vmesa->regHABLRAb);
- i += 11;
- }
-
- if (dirty & VIA_UPLOAD_FOG) {
- *vb++ = ((HC_SubA_HFogLF << 24) | vmesa->regHFogLF);
- *vb++ = ((HC_SubA_HFogCL << 24) | vmesa->regHFogCL);
- *vb++ = ((HC_SubA_HFogCH << 24) | vmesa->regHFogCH);
- i += 3;
- }
-
- if (dirty & VIA_UPLOAD_LINESTIPPLE) {
- *vb++ = ((HC_SubA_HLP << 24) | ctx->Line.StipplePattern);
- *vb++ = ((HC_SubA_HLPRF << 24) | ctx->Line.StippleFactor);
- }
- else {
- *vb++ = ((HC_SubA_HLP << 24) | 0xFFFF);
- *vb++ = ((HC_SubA_HLPRF << 24) | 0x1);
- }
- i += 2;
-
- *vb++ = ((HC_SubA_HPixGC << 24) | 0x0);
- i++;
-
- if (i & 0x1) {
- *vb++ = HC_DUMMY;
- i++;
- }
-
- if (dirty & VIA_UPLOAD_TEXTURE) {
-
- }
-
- if (dirty & VIA_UPLOAD_POLYGONSTIPPLE) {
-
- }
-
- vmesa->dmaLow += (i << 2);
-
- vmesa->dirty = 0;
- if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);
-}
/**********************************************************************/
/* High level hooks for t_vb_render.c */
@@ -1352,10 +1238,7 @@ static void viaRunPipeline(GLcontext *ctx)
vmesa->newState = 0;
}
- if (vmesa->needUploadAllState)
- emit_all_state(vmesa);
- else
- emit_partial_state(vmesa);
+ emit_all_state(vmesa);
_tnl_run_pipeline(ctx);
if (VIA_DEBUG) fprintf(stderr, "%s - out\n", __FUNCTION__);