diff options
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_alloc.c | 87 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_clear.c | 6 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_context.c | 24 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_context.h | 39 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_dd.c | 137 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_screen.c | 76 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_screen.h | 1 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_span.c | 58 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_span.h | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_state.c | 15 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/sis/sis_texstate.c | 4 | 
11 files changed, 252 insertions, 197 deletions
| diff --git a/src/mesa/drivers/dri/sis/sis_alloc.c b/src/mesa/drivers/dri/sis/sis_alloc.c index b808daae3d..9934215365 100644 --- a/src/mesa/drivers/dri/sis/sis_alloc.c +++ b/src/mesa/drivers/dri/sis/sis_alloc.c @@ -136,45 +136,42 @@ sisFreeAGP( sisContextPtr smesa, void *handle )  void  sisAllocZStencilBuffer( sisContextPtr smesa )  { -   GLuint z_depth; -   GLuint totalBytes; -   int width2; - -   GLubyte *addr; - -   z_depth = ( smesa->glCtx->Visual.depthBits + +   int cpp = ( smesa->glCtx->Visual.depthBits +                 smesa->glCtx->Visual.stencilBits ) / 8; +   unsigned char *addr; -   width2 = ALIGNMENT( smesa->width * z_depth, 4 ); +   smesa->depth.bpp = cpp * 8; +   smesa->depth.pitch = ALIGNMENT(smesa->driDrawable->w * cpp, 4); +   smesa->depth.size = smesa->depth.pitch * smesa->driDrawable->h; +   smesa->depth.size += Z_BUFFER_HW_PLUS; -   totalBytes = smesa->height * width2 + Z_BUFFER_HW_PLUS; - -   addr = sisAllocFB( smesa, totalBytes, &smesa->zbFree ); +   addr = sisAllocFB(smesa, smesa->depth.size, &smesa->depth.handle);     if (addr == NULL)        sis_fatal_error("Failure to allocate Z buffer.\n"); +   addr = (char *)ALIGNMENT((unsigned long)addr, Z_BUFFER_HW_ALIGNMENT); -   if (SIS_VERBOSE & VERBOSE_SIS_BUFFER) { -      fprintf(stderr, "sis_alloc_z_stencil_buffer: addr=%p\n", addr); -   } +   smesa->depth.map = addr; +   smesa->depth.offset = addr - smesa->FbBase; -   addr = (GLubyte *)ALIGNMENT( (unsigned long)addr, Z_BUFFER_HW_ALIGNMENT ); - -   smesa->depthbuffer = (void *) addr; -   smesa->depthPitch = width2; -   smesa->depthOffset = (unsigned long)addr - (unsigned long)smesa->FbBase; +   /* stencil buffer is same as depth buffer */ +   smesa->stencil.size = smesa->depth.size; +   smesa->stencil.offset = smesa->depth.offset; +   smesa->stencil.handle = smesa->depth.handle; +   smesa->stencil.pitch = smesa->depth.pitch; +   smesa->stencil.bpp = smesa->depth.bpp; +   smesa->stencil.map = smesa->depth.map;     /* set pZClearPacket */     memset( &smesa->zClearPacket, 0, sizeof(ENGPACKET) ); -   smesa->zClearPacket.dwSrcPitch = (z_depth == 2) ? 0x80000000 : 0xf0000000; -   smesa->zClearPacket.dwDestBaseAddr = (unsigned long)(addr - -      (unsigned long)smesa->FbBase); -   smesa->zClearPacket.wDestPitch = width2; +   smesa->zClearPacket.dwSrcPitch = (cpp == 2) ? 0x80000000 : 0xf0000000; +   smesa->zClearPacket.dwDestBaseAddr = smesa->depth.offset; +   smesa->zClearPacket.wDestPitch = smesa->depth.pitch;     smesa->zClearPacket.stdwDestPos.wY = 0;     smesa->zClearPacket.stdwDestPos.wX = 0;     smesa->zClearPacket.wDestHeight = smesa->virtualY; -   smesa->zClearPacket.stdwDim.wWidth = (GLshort)width2 / z_depth; +   smesa->zClearPacket.stdwDim.wWidth = smesa->depth.pitch / cpp;     smesa->zClearPacket.stdwDim.wHeight = (GLshort)smesa->height;     smesa->zClearPacket.stdwCmd.cRop = 0xf0; @@ -188,43 +185,40 @@ sisAllocZStencilBuffer( sisContextPtr smesa )  void  sisFreeZStencilBuffer( sisContextPtr smesa )  { -   sisFreeFB( smesa, smesa->zbFree ); -   smesa->zbFree = NULL; -   smesa->depthbuffer = NULL; +   sisFreeFB(smesa, smesa->depth.handle); +   smesa->depth.map = NULL;  +   smesa->depth.offset = 0;   }  void  sisAllocBackbuffer( sisContextPtr smesa )  { -   GLuint depth = smesa->bytesPerPixel; -   GLuint size, width2; - -   char *addr; +   int cpp = smesa->bytesPerPixel; +   unsigned char *addr; -   width2 = (depth == 2) ? ALIGNMENT (smesa->width, 2) : smesa->width; -   size = width2 * smesa->height * depth + DRAW_BUFFER_HW_PLUS; +   smesa->back.bpp = smesa->bytesPerPixel * 8; +   smesa->back.pitch = ALIGNMENT(smesa->driDrawable->w * cpp, 4); +   smesa->back.size = smesa->back.pitch * smesa->driDrawable->h; +   smesa->back.size += DRAW_BUFFER_HW_PLUS; -   /* Fixme: unique context alloc/free back-buffer? */ -   addr = sisAllocFB( smesa, size, &smesa->bbFree ); +   addr = sisAllocFB(smesa, smesa->back.size, &smesa->back.handle);     if (addr == NULL)        sis_fatal_error("Failure to allocate back buffer.\n"); +   addr = (char *)ALIGNMENT((unsigned long)addr, DRAW_BUFFER_HW_ALIGNMENT); -   addr = (char *)ALIGNMENT( (unsigned long)addr, DRAW_BUFFER_HW_ALIGNMENT ); - -   smesa->backbuffer = addr; -   smesa->backOffset = (unsigned long)(addr - (unsigned long)smesa->FbBase); -   smesa->backPitch = width2 * depth; +   smesa->back.map = addr; +   smesa->back.offset = addr - smesa->FbBase;     memset ( &smesa->cbClearPacket, 0, sizeof(ENGPACKET) ); -   smesa->cbClearPacket.dwSrcPitch = (depth == 2) ? 0x80000000 : 0xf0000000; -   smesa->cbClearPacket.dwDestBaseAddr = smesa->backOffset; -   smesa->cbClearPacket.wDestPitch = smesa->backPitch; +   smesa->cbClearPacket.dwSrcPitch = (cpp == 2) ? 0x80000000 : 0xf0000000; +   smesa->cbClearPacket.dwDestBaseAddr = smesa->back.offset; +   smesa->cbClearPacket.wDestPitch = smesa->back.pitch;     smesa->cbClearPacket.stdwDestPos.wY = 0;     smesa->cbClearPacket.stdwDestPos.wX = 0;     smesa->cbClearPacket.wDestHeight = smesa->virtualY; -   smesa->cbClearPacket.stdwDim.wWidth = (GLshort) width2; +   smesa->cbClearPacket.stdwDim.wWidth = (GLshort) smesa->back.pitch / cpp;     smesa->cbClearPacket.stdwDim.wHeight = (GLshort) smesa->height;     smesa->cbClearPacket.stdwCmd.cRop = 0xf0; @@ -238,6 +232,7 @@ sisAllocBackbuffer( sisContextPtr smesa )  void  sisFreeBackbuffer( sisContextPtr smesa )  { -   sisFreeFB( smesa, smesa->bbFree ); -   smesa->backbuffer = NULL;  +   sisFreeFB(smesa, smesa->back.handle); +   smesa->back.map = NULL;  +   smesa->back.offset = 0;   } diff --git a/src/mesa/drivers/dri/sis/sis_clear.c b/src/mesa/drivers/dri/sis/sis_clear.c index ef4b561ca5..e170faac39 100644 --- a/src/mesa/drivers/dri/sis/sis_clear.c +++ b/src/mesa/drivers/dri/sis/sis_clear.c @@ -144,7 +144,7 @@ sisDDClear( GLcontext * ctx, GLbitfield mask, GLboolean all,     }     if (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) { -      if (smesa->depthbuffer != NULL) +      if (smesa->depth.offset != NULL)           sis_clear_z_stencil_buffer( ctx, mask, x1, y1, width1, height1 );        mask &= ~(BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);     } @@ -393,8 +393,8 @@ sis_clear_color_buffer( GLcontext *ctx, GLenum mask, GLint x, GLint y,     memset( &stEngPacket, 0, sizeof (ENGPACKET) );     stEngPacket.dwSrcPitch = (depth == 2) ? 0x80000000 : 0xc0000000; -   stEngPacket.dwDestBaseAddr = smesa->frontOffset; -   stEngPacket.wDestPitch = smesa->frontPitch; +   stEngPacket.dwDestBaseAddr = smesa->front.offset; +   stEngPacket.wDestPitch = smesa->front.pitch;     /* TODO: set maximum value? */     stEngPacket.wDestHeight = smesa->virtualY;     stEngPacket.stdwCmd.cRop = 0xf0; diff --git a/src/mesa/drivers/dri/sis/sis_context.c b/src/mesa/drivers/dri/sis/sis_context.c index cfb7700afa..6f307a2599 100644 --- a/src/mesa/drivers/dri/sis/sis_context.c +++ b/src/mesa/drivers/dri/sis/sis_context.c @@ -47,6 +47,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "matrix.h"  #include "extensions.h"  #include "utils.h" +#include "framebuffer.h"  #include "drivers/common/driverfuncs.h" @@ -105,6 +106,16 @@ WaitingFor3dIdle(sisContextPtr smesa, int wLen)     }  } +void sisReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer, +                          GLuint width, GLuint height) +{ +   sisContextPtr smesa = SIS_CONTEXT(ctx); + +   sisUpdateBufferSize(smesa); + +   _mesa_resize_framebuffer(ctx, drawbuffer, width, height); +} +  GLboolean  sisCreateContext( const __GLcontextModes *glVisual,  		  __DRIcontextPrivate *driContextPriv, @@ -156,11 +167,10 @@ sisCreateContext( const __GLcontextModes *glVisual,     smesa->bytesPerPixel = sisScreen->cpp;     smesa->IOBase = sisScreen->mmio.map;     smesa->Chipset = sisScreen->deviceID; -   smesa->irqEnabled = sisScreen->irqEnabled;     smesa->FbBase = sPriv->pFB;     smesa->displayWidth = sPriv->fbWidth; -   smesa->frontPitch = sPriv->fbStride; +   smesa->front.pitch = sPriv->fbStride;     smesa->sarea = (SISSAREAPriv *)((char *)sPriv->pSAREA +  				   sisScreen->sarea_priv_offset); @@ -187,7 +197,7 @@ sisCreateContext( const __GLcontextModes *glVisual,        smesa->colorFormat = DST_FORMAT_RGB_565;        break;     default: -      sis_fatal_error("Bad bytesPerPixel.\n"); +      sis_fatal_error("Bad bytesPerPixel %d.\n", smesa->bytesPerPixel);     }     /* Parse configuration files */ @@ -303,6 +313,7 @@ sisMakeCurrent( __DRIcontextPrivate *driContextPriv,        GET_CURRENT_CONTEXT(ctx);        sisContextPtr oldSisCtx = ctx ? SIS_CONTEXT(ctx) : NULL;        sisContextPtr newSisCtx = (sisContextPtr) driContextPriv->driverPrivate; +      struct gl_framebuffer *drawBuffer, *readBuffer;        if ( newSisCtx != oldSisCtx) {           newSisCtx->GlobalFlag = GFLAG_ALL; @@ -310,9 +321,10 @@ sisMakeCurrent( __DRIcontextPrivate *driContextPriv,        newSisCtx->driDrawable = driDrawPriv; -      _mesa_make_current( newSisCtx->glCtx, -                          (GLframebuffer *) driDrawPriv->driverPrivate, -                          (GLframebuffer *) driReadPriv->driverPrivate ); +      drawBuffer = (GLframebuffer *)driDrawPriv->driverPrivate; +      readBuffer = (GLframebuffer *)driReadPriv->driverPrivate; + +      _mesa_make_current( newSisCtx->glCtx, drawBuffer, readBuffer );        sisUpdateBufferSize( newSisCtx );        sisUpdateClipping( newSisCtx->glCtx ); diff --git a/src/mesa/drivers/dri/sis/sis_context.h b/src/mesa/drivers/dri/sis/sis_context.h index fee8f6ead1..5ef1895362 100644 --- a/src/mesa/drivers/dri/sis/sis_context.h +++ b/src/mesa/drivers/dri/sis/sis_context.h @@ -231,6 +231,19 @@ typedef void (*sis_line_func)( sisContextPtr,  typedef void (*sis_point_func)( sisContextPtr,  				sisVertex * ); +/** + * Derived from gl_renderbuffer. + */ +struct sis_renderbuffer { +   struct gl_renderbuffer Base;  /* must be first! */ +   drmSize size; +   GLuint offset; +   void *handle; +   GLuint pitch; +   GLuint bpp; +   char *map; +}; +  /* Device dependent context state */  struct sis_context @@ -264,8 +277,6 @@ struct sis_context    unsigned char *IOBase;    unsigned char *FbBase;    unsigned int displayWidth; -  unsigned int frontOffset; -  unsigned int frontPitch;    /* HW RGBA layout */    unsigned int redMask, greenMask, blueMask, alphaMask; @@ -333,18 +344,12 @@ struct sis_context    /* Front/back/depth buffer info */    GLuint width, height;			/* size of buffers */    GLint bottom;				/* used for FLIP macro */ -  GLvoid *backbuffer; -  unsigned int backOffset; -  unsigned int backPitch; -  GLvoid *depthbuffer; -  unsigned int depthOffset; -  unsigned int depthPitch; -  void *zbFree, *bbFree;		/* Cookies for freeing buffers */    ENGPACKET zClearPacket, cbClearPacket; - -  /* Drawable, cliprect and scissor information -   */ -  GLint drawOffset, drawPitch; +  /* XXX These don't belong here.  They should be per-drawable state. */ +  struct sis_renderbuffer front; +  struct sis_renderbuffer back; +  struct sis_renderbuffer depth; +  struct sis_renderbuffer stencil; /* mirrors depth */    /* Mirrors of some DRI state     */ @@ -394,9 +399,10 @@ struct sis_context     *(volatile GLuint *)(smesa->IOBase + 0x8b60) = 0xffffffff;		\  } -#define sis_fatal_error(msg)						\ +#define sis_fatal_error(...)						\  do {									\ -	fprintf(stderr, "[%s:%d]: %s", __FILE__, __LINE__, msg);	\ +	fprintf(stderr, "[%s:%d]:", __FILE__, __LINE__);		\ +	fprintf(stderr, __VA_ARGS__);					\  	exit(-1);							\  } while (0) @@ -422,6 +428,9 @@ extern GLboolean sisCreateContext( const __GLcontextModes *glVisual,                                     void *sharedContextPrivate );  extern void sisDestroyContext( __DRIcontextPrivate * ); +void sisReAllocateBuffers(GLcontext *ctx, GLframebuffer *drawbuffer, +                          GLuint width, GLuint height); +  extern GLboolean sisMakeCurrent( __DRIcontextPrivate *driContextPriv,                                    __DRIdrawablePrivate *driDrawPriv,                                    __DRIdrawablePrivate *driReadPriv ); diff --git a/src/mesa/drivers/dri/sis/sis_dd.c b/src/mesa/drivers/dri/sis/sis_dd.c index 4e64c17b3d..e144a936f2 100644 --- a/src/mesa/drivers/dri/sis/sis_dd.c +++ b/src/mesa/drivers/dri/sis/sis_dd.c @@ -37,11 +37,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "sis_dd.h"  #include "sis_lock.h"  #include "sis_alloc.h" +#include "sis_span.h"  #include "sis_state.h"  #include "sis_tris.h"  #include "swrast/swrast.h"  #include "framebuffer.h" +#include "renderbuffer.h"  #include "utils.h" @@ -111,53 +113,139 @@ sisFinish( GLcontext *ctx )     UNLOCK_HARDWARE();  } +static void +sisDeleteRenderbuffer(struct gl_renderbuffer *rb) +{ +   /* Don't free() since we're contained in sis_context struct. */ +} + +static GLboolean +sisRenderbufferStorage(GLcontext *ctx, struct gl_renderbuffer *rb, +                       GLenum internalFormat, GLuint width, GLuint height) +{ +   rb->Width = width; +   rb->Height = height; +   rb->InternalFormat = internalFormat; +   return GL_TRUE; +} + +static void +sisInitRenderbuffer(struct gl_renderbuffer *rb, GLenum format) +{ +   const GLuint name = 0; + +   _mesa_init_renderbuffer(rb, name); + +   /* Make sure we're using a null-valued GetPointer routine */ +   assert(rb->GetPointer(NULL, rb, 0, 0) == NULL); + +   rb->InternalFormat = format; + +   if (format == GL_RGBA) { +      /* Color */ +      rb->_BaseFormat = GL_RGBA; +      rb->DataType = GL_UNSIGNED_BYTE; +   } +   else if (format == GL_DEPTH_COMPONENT16) { +      /* Depth */ +      rb->_BaseFormat = GL_DEPTH_COMPONENT; +      /* we always Get/Put 32-bit Z values */ +      rb->DataType = GL_UNSIGNED_INT; +   } +   else if (format == GL_DEPTH_COMPONENT24) { +      /* Depth */ +      rb->_BaseFormat = GL_DEPTH_COMPONENT; +      /* we always Get/Put 32-bit Z values */ +      rb->DataType = GL_UNSIGNED_INT; +   } +   else { +      /* Stencil */ +      ASSERT(format == GL_STENCIL_INDEX8); +      rb->_BaseFormat = GL_STENCIL_INDEX; +      rb->DataType = GL_UNSIGNED_BYTE; +   } + +   rb->Delete = sisDeleteRenderbuffer; +   rb->AllocStorage = sisRenderbufferStorage; +} +  void -sisUpdateBufferSize( sisContextPtr smesa ) +sisUpdateBufferSize(sisContextPtr smesa)  {     __GLSiSHardware *current = &smesa->current;     __GLSiSHardware *prev = &smesa->prev; -   GLuint z_depth; +   struct gl_framebuffer *fb = smesa->glCtx->DrawBuffer; -   /* XXX Should get the base offset of the frontbuffer from the X Server */ -   smesa->frontOffset = smesa->driDrawable->x * smesa->bytesPerPixel + -			smesa->driDrawable->y * smesa->frontPitch; +   if (!smesa->front.Base.InternalFormat) { +      /* do one-time init for the renderbuffers */ +      sisInitRenderbuffer(&smesa->front.Base, GL_RGBA); +      sisSetSpanFunctions(&smesa->front, &fb->Visual); +      _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &smesa->front.Base); + +      if (fb->Visual.doubleBufferMode) { +         sisInitRenderbuffer(&smesa->back.Base, GL_RGBA); +         sisSetSpanFunctions(&smesa->back, &fb->Visual); +         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &smesa->back.Base); +      } + +      if (smesa->glCtx->Visual.depthBits > 0) { +         sisInitRenderbuffer(&smesa->depth.Base,  +                             (smesa->glCtx->Visual.depthBits == 16 +                              ? GL_DEPTH_COMPONENT16 : GL_DEPTH_COMPONENT24)); +         sisSetSpanFunctions(&smesa->depth, &fb->Visual); +         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &smesa->depth.Base); +      } + +      if (smesa->glCtx->Visual.stencilBits > 0) { +         sisInitRenderbuffer(&smesa->stencil.Base, GL_STENCIL_INDEX8_EXT); +         sisSetSpanFunctions(&smesa->stencil, &fb->Visual); +         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &smesa->stencil.Base); +      } +   } + +   /* Make sure initialization did what we think it should */ +   assert(smesa->front.Base.InternalFormat); +   assert(smesa->front.Base.AllocStorage); +   if (fb->Visual.doubleBufferMode) { +      assert(fb->Attachment[BUFFER_BACK_LEFT].Renderbuffer); +      assert(smesa->front.Base.AllocStorage); +   } +   if (fb->Visual.depthBits) { +      assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer); +      assert(smesa->depth.Base.AllocStorage); +   }     if ( smesa->width == smesa->driDrawable->w && -      smesa->height == smesa->driDrawable->h ) +	smesa->height == smesa->driDrawable->h )     {        return;     } +   smesa->front.bpp = smesa->bytesPerPixel * 8; +   /* Front pitch set on context create */ +   smesa->front.size = smesa->front.pitch * smesa->driDrawable->h; +   /* XXX Should get the base offset of the frontbuffer from the X Server */ +   smesa->front.offset = smesa->driDrawable->x * smesa->bytesPerPixel + +			 smesa->driDrawable->y * smesa->front.pitch; +   smesa->front.map = (char *) smesa->driScreen->pFB; +     smesa->width = smesa->driDrawable->w;     smesa->height = smesa->driDrawable->h;     smesa->bottom = smesa->height - 1; -   if ( smesa->backbuffer ) +   if (smesa->back.offset)        sisFreeBackbuffer( smesa ); -   if ( smesa->depthbuffer ) +   if (smesa->depth.offset)        sisFreeZStencilBuffer( smesa ); -	 +     if ( smesa->glCtx->Visual.depthBits > 0 )        sisAllocZStencilBuffer( smesa );     if ( smesa->glCtx->Visual.doubleBufferMode )        sisAllocBackbuffer( smesa ); -   switch (smesa->zFormat) -   { -   case SiS_ZFORMAT_Z16: -      z_depth = 2; -      break; -   case SiS_ZFORMAT_Z32: -   case SiS_ZFORMAT_S8Z24: -      z_depth = 4; -      break; -   default: -      sis_fatal_error("Bad Z format\n"); -   } -     current->hwZ &= ~MASK_ZBufferPitch; -   current->hwZ |= smesa->width * z_depth >> 2; -   current->hwOffsetZ = smesa->depthOffset >> 2; +   current->hwZ |= smesa->depth.pitch >> 2; +   current->hwOffsetZ = smesa->depth.offset >> 2;     if ((current->hwOffsetZ != prev->hwOffsetZ) || (current->hwZ != prev->hwZ)) {        prev->hwOffsetZ = current->hwOffsetZ; @@ -174,7 +262,6 @@ void  sisInitDriverFuncs( struct dd_function_table *functions )  {     functions->GetBufferSize = sisGetBufferSize; -   functions->ResizeBuffers = _mesa_resize_framebuffer;     functions->GetString     = sisGetString;     functions->Finish        = sisFinish;     functions->Flush         = sisFlush; diff --git a/src/mesa/drivers/dri/sis/sis_screen.c b/src/mesa/drivers/dri/sis/sis_screen.c index 3e6fe5a4df..362c8696e3 100644 --- a/src/mesa/drivers/dri/sis/sis_screen.c +++ b/src/mesa/drivers/dri/sis/sis_screen.c @@ -143,7 +143,6 @@ sisCreateScreen( __DRIscreenPrivate *sPriv )     sisScreen->screenX = sisDRIPriv->width;     sisScreen->screenY = sisDRIPriv->height;     sisScreen->cpp = sisDRIPriv->bytesPerPixel; -   sisScreen->irqEnabled = sisDRIPriv->bytesPerPixel;     sisScreen->deviceID = sisDRIPriv->deviceID;     sisScreen->AGPCmdBufOffset = sisDRIPriv->AGPCmdBufOffset;     sisScreen->AGPCmdBufSize = sisDRIPriv->AGPCmdBufSize; @@ -206,70 +205,21 @@ sisCreateBuffer( __DRIscreenPrivate *driScrnPriv,                   GLboolean isPixmap )  {     sisScreenPtr screen = (sisScreenPtr) driScrnPriv->private; +   struct gl_framebuffer *fb;     if (isPixmap)        return GL_FALSE; /* not implemented */ -   { -      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis); - -      /* XXX double-check the Offset/Pitch parameters! */ -      { -         driRenderbuffer *frontRb -            = driNewRenderbuffer(GL_RGBA, NULL, screen->cpp, -                                 0, driScrnPriv->fbStride, driDrawPriv); -         sisSetSpanFunctions(frontRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base); -      } +   fb = _mesa_create_framebuffer(mesaVis); -      if (mesaVis->doubleBufferMode) { -         driRenderbuffer *backRb -            = driNewRenderbuffer(GL_RGBA, NULL, screen->cpp, -                                 0, driScrnPriv->fbStride, driDrawPriv); -         sisSetSpanFunctions(backRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base); -      } - -      if (mesaVis->depthBits == 16) { -         driRenderbuffer *depthRb -            = driNewRenderbuffer(GL_DEPTH_COMPONENT16, NULL, screen->cpp, -                                 0, driScrnPriv->fbStride, driDrawPriv); -         sisSetSpanFunctions(depthRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); -      } -      else if (mesaVis->depthBits == 24) { -         driRenderbuffer *depthRb -            = driNewRenderbuffer(GL_DEPTH_COMPONENT24, NULL, screen->cpp, -                                 0, driScrnPriv->fbStride, driDrawPriv); -         sisSetSpanFunctions(depthRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); -      } -      else if (mesaVis->depthBits == 32) { -         driRenderbuffer *depthRb -            = driNewRenderbuffer(GL_DEPTH_COMPONENT32, NULL, screen->cpp, -                                 0, driScrnPriv->fbStride, driDrawPriv); -         sisSetSpanFunctions(depthRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base); -      } - -      /* no h/w stencil? -      if (mesaVis->stencilBits > 0) { -         driRenderbuffer *stencilRb -            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT); -         sisSetSpanFunctions(stencilRb, mesaVis); -         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base); -      } -      */ - -      _mesa_add_soft_renderbuffers(fb, -                                   GL_FALSE, /* color */ -                                   GL_FALSE, /* depth */ -                                   mesaVis->stencilBits > 0, -                                   mesaVis->accumRedBits > 0, -                                   GL_FALSE, /* alpha */ -                                   GL_FALSE /* aux */); -      driDrawPriv->driverPrivate = (void *) fb; -   } +   _mesa_add_soft_renderbuffers(fb, +				GL_FALSE, /* color */ +				GL_FALSE, /* depth */ +				mesaVis->stencilBits > 0, +				mesaVis->accumRedBits > 0, +				GL_FALSE, /* alpha */ +				GL_FALSE /* aux */); +   driDrawPriv->driverPrivate = (void *) fb;     return (driDrawPriv->driverPrivate != NULL);  } @@ -312,11 +262,11 @@ static void sisCopyBuffer( __DRIdrawablePrivate *dPriv )     LOCK_HARDWARE(); -   stEngPacket.dwSrcBaseAddr = smesa->backOffset; -   stEngPacket.dwSrcPitch = smesa->backPitch | +   stEngPacket.dwSrcBaseAddr = smesa->back.offset; +   stEngPacket.dwSrcPitch = smesa->back.pitch |        ((smesa->bytesPerPixel == 2) ? 0x80000000 : 0xc0000000);     stEngPacket.dwDestBaseAddr = 0; -   stEngPacket.wDestPitch = smesa->frontPitch; +   stEngPacket.wDestPitch = smesa->front.pitch;     /* TODO: set maximum value? */     stEngPacket.wDestHeight = smesa->virtualY; diff --git a/src/mesa/drivers/dri/sis/sis_screen.h b/src/mesa/drivers/dri/sis/sis_screen.h index 068c0410da..c3e9ef4876 100644 --- a/src/mesa/drivers/dri/sis/sis_screen.h +++ b/src/mesa/drivers/dri/sis/sis_screen.h @@ -46,7 +46,6 @@ typedef struct {     unsigned int AGPCmdBufSize;     int deviceID; -   int irqEnabled;     int cpp;     unsigned int screenX, screenY; diff --git a/src/mesa/drivers/dri/sis/sis_span.c b/src/mesa/drivers/dri/sis/sis_span.c index bdefaf1018..ea6db6781d 100644 --- a/src/mesa/drivers/dri/sis/sis_span.c +++ b/src/mesa/drivers/dri/sis/sis_span.c @@ -44,16 +44,18 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #define LOCAL_VARS							\     sisContextPtr smesa = SIS_CONTEXT(ctx);				\     __DRIdrawablePrivate *dPriv = smesa->driDrawable;			\ -   driRenderbuffer *drb = (driRenderbuffer *) rb;			\ -   GLuint pitch = drb->pitch;						\ -   char *buf = (char *)(smesa->FbBase + drb->offset);			\ +   struct sis_renderbuffer *srb = (struct sis_renderbuffer *) rb;	\ +   GLuint pitch = srb->pitch;						\ +   char *buf = srb->map;						\     GLuint p;								\ -   (void) buf; (void) p +   (void) buf; (void) p; +     #define LOCAL_DEPTH_VARS						\     sisContextPtr smesa = SIS_CONTEXT(ctx);				\     __DRIdrawablePrivate *dPriv = smesa->driDrawable;			\ -   char *buf = smesa->depthbuffer;					\ +   struct sis_renderbuffer *srb = (struct sis_renderbuffer *) rb;	\ +   char *buf = srb->map;  #define LOCAL_STENCIL_VARS LOCAL_DEPTH_VARS  @@ -84,10 +86,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  /* 16 bit depthbuffer functions.   */  #define WRITE_DEPTH( _x, _y, d )	\ -   *(GLushort *)(buf + (_x)*2 + (_y)*smesa->depthPitch) = d; +   *(GLushort *)(buf + (_x)*2 + (_y)*srb->pitch) = d;  #define READ_DEPTH( d, _x, _y )		\ -   d = *(GLushort *)(buf + (_x)*2 + (_y)*smesa->depthPitch); +   d = *(GLushort *)(buf + (_x)*2 + (_y)*srb->pitch);  #define TAG(x) sis##x##_z16  #include "depthtmp.h" @@ -96,10 +98,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  /* 32 bit depthbuffer functions.   */  #define WRITE_DEPTH( _x, _y, d )	\ -   *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch) = d; +   *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch) = d;  #define READ_DEPTH( d, _x, _y )		\ -   d = *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch); +   d = *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch);  #define TAG(x) sis##x##_z32  #include "depthtmp.h" @@ -108,28 +110,28 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  /* 8/24 bit interleaved depth/stencil functions   */  #define WRITE_DEPTH( _x, _y, d ) {				\ -   GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch); \ +   GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch);	\     tmp &= 0xff000000;						\     tmp |= (d & 0x00ffffff);					\ -   *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch) = tmp;	\ +   *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch) = tmp;		\  } -#define READ_DEPTH( d, _x, _y )	{			\ -   d = *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch) & 0x00ffffff; \ +#define READ_DEPTH( d, _x, _y )	{				\ +   d = *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch) & 0x00ffffff; \  }  #define TAG(x) sis##x##_z24_s8  #include "depthtmp.h"  #define WRITE_STENCIL( _x, _y, d ) {				\ -   GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch); \ +   GLuint tmp = *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depth.pitch); \     tmp &= 0x00ffffff;						\     tmp |= (d << 24);						\ -   *(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch) = tmp;	\ +   *(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch) = tmp;	\  }  #define READ_STENCIL( d, _x, _y )			\ -   d = (*(GLuint *)(buf + (_x)*4 + (_y)*smesa->depthPitch) & 0xff000000) >> 24; +   d = (*(GLuint *)(buf + (_x)*4 + (_y)*srb->pitch) & 0xff000000) >> 24;  #define TAG(x) sis##x##_z24_s8  #include "stenciltmp.h" @@ -167,26 +169,26 @@ sisDDInitSpanFuncs( GLcontext *ctx )   * Plug in the Get/Put routines for the given driRenderbuffer.   */  void -sisSetSpanFunctions(driRenderbuffer *drb, const GLvisual *vis) +sisSetSpanFunctions(struct sis_renderbuffer *srb, const GLvisual *vis)  { -   if (drb->Base.InternalFormat == GL_RGBA) { +   if (srb->Base.InternalFormat == GL_RGBA) {        if (vis->redBits == 5 && vis->greenBits == 6 && vis->blueBits == 5) { -         sisInitPointers_RGB565( &drb->Base ); +         sisInitPointers_RGB565( &srb->Base );        }        else { -         sisInitPointers_ARGB8888( &drb->Base ); +         sisInitPointers_ARGB8888( &srb->Base );        }     } -   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT16) { -      sisInitDepthPointers_z16(&drb->Base); +   else if (srb->Base.InternalFormat == GL_DEPTH_COMPONENT16) { +      sisInitDepthPointers_z16(&srb->Base);     } -   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT24) { -      sisInitDepthPointers_z24_s8(&drb->Base); +   else if (srb->Base.InternalFormat == GL_DEPTH_COMPONENT24) { +      sisInitDepthPointers_z24_s8(&srb->Base);     } -   else if (drb->Base.InternalFormat == GL_DEPTH_COMPONENT32) { -      sisInitDepthPointers_z32(&drb->Base); +   else if (srb->Base.InternalFormat == GL_DEPTH_COMPONENT32) { +      sisInitDepthPointers_z32(&srb->Base);     } -   else if (drb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) { -      sisInitStencilPointers_z24_s8(&drb->Base); +   else if (srb->Base.InternalFormat == GL_STENCIL_INDEX8_EXT) { +      sisInitStencilPointers_z24_s8(&srb->Base);     }  } diff --git a/src/mesa/drivers/dri/sis/sis_span.h b/src/mesa/drivers/dri/sis/sis_span.h index 7c73bc6d3a..4b0add2ac2 100644 --- a/src/mesa/drivers/dri/sis/sis_span.h +++ b/src/mesa/drivers/dri/sis/sis_span.h @@ -41,6 +41,6 @@ extern void sisSpanRenderFinish( GLcontext *ctx );  extern void sisDDInitSpanFuncs( GLcontext *ctx );  extern void -sisSetSpanFunctions(driRenderbuffer *rb, const GLvisual *vis); +sisSetSpanFunctions(struct sis_renderbuffer *srb, const GLvisual *vis);  #endif diff --git a/src/mesa/drivers/dri/sis/sis_state.c b/src/mesa/drivers/dri/sis/sis_state.c index 8349c42d29..01688c2fda 100644 --- a/src/mesa/drivers/dri/sis/sis_state.c +++ b/src/mesa/drivers/dri/sis/sis_state.c @@ -521,19 +521,21 @@ void sisDDDrawBuffer( GLcontext *ctx, GLenum mode )     sisContextPtr smesa = SIS_CONTEXT(ctx);     __GLSiSHardware *prev = &smesa->prev;     __GLSiSHardware *current = &smesa->current; -   int pitch;     /*      * _DrawDestMask is easier to cope with than <mode>.      */ +   current->hwDstSet &= ~MASK_DstBufferPitch;     switch ( ctx->DrawBuffer->_ColorDrawBufferMask[0] ) {     case BUFFER_BIT_FRONT_LEFT:        FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_FALSE ); -      pitch = smesa->frontPitch; +      current->hwOffsetDest = smesa->front.offset >> 1; +      current->hwDstSet |= smesa->front.pitch >> 2;        break;     case BUFFER_BIT_BACK_LEFT:        FALLBACK( smesa, SIS_FALLBACK_DRAW_BUFFER, GL_FALSE ); -      pitch = smesa->backPitch; +      current->hwOffsetDest = smesa->back.offset >> 1; +      current->hwDstSet |= smesa->back.pitch >> 2;        break;     default:        /* GL_NONE or GL_FRONT_AND_BACK or stereo left&right, etc */ @@ -541,10 +543,6 @@ void sisDDDrawBuffer( GLcontext *ctx, GLenum mode )        return;     } -   current->hwOffsetDest = (smesa->drawOffset) >> 1; -   current->hwDstSet &= ~MASK_DstBufferPitch; -   current->hwDstSet |= pitch >> 2; -     if (current->hwDstSet != prev->hwDstSet) {        prev->hwDstSet = current->hwDstSet;        smesa->GlobalFlag |= GFLAG_DESTSETTING; @@ -598,7 +596,7 @@ sisDDEnable( GLcontext * ctx, GLenum cap, GLboolean state )           current->hwCapEnable &= ~MASK_CullEnable;        break;     case GL_DEPTH_TEST: -      if (state && smesa->depthbuffer) +      if (state && smesa->depth.offset != 0)           current->hwCapEnable |= MASK_ZTestEnable;        else           current->hwCapEnable &= ~MASK_ZTestEnable; @@ -840,6 +838,7 @@ void sisDDInitStateFuncs( GLcontext *ctx )     ctx->Driver.DrawPixels	 = _swrast_DrawPixels;     ctx->Driver.ReadPixels	 = _swrast_ReadPixels; +   ctx->Driver.ResizeBuffers	 = sisReAllocateBuffers;    /* Swrast hooks for imaging extensions:     */    ctx->Driver.CopyColorTable	 = _swrast_CopyColorTable; diff --git a/src/mesa/drivers/dri/sis/sis_texstate.c b/src/mesa/drivers/dri/sis/sis_texstate.c index a18ad06bd4..b5da62cd7c 100644 --- a/src/mesa/drivers/dri/sis/sis_texstate.c +++ b/src/mesa/drivers/dri/sis/sis_texstate.c @@ -122,8 +122,10 @@ sis_set_texture_env0( GLcontext *ctx, struct gl_texture_object *texObj,        break;     case GL_BLEND: +#if 1 /* XXX Blending broken */        FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 1); -#if 0 /* XXX Blending broken */ +#else +      FALLBACK(smesa, SIS_FALLBACK_TEXENV0, 0);        current->hwTexEnvColor =           ((GLint) (texture_unit->EnvColor[3])) << 24 |           ((GLint) (texture_unit->EnvColor[0])) << 16 | | 
