evergreen: set gl_texture_image::TexFormat field in evergreenSetTexBuffer()
[mesa.git] / src / mesa / drivers / dri / sis / sis_dd.c
index 2c97d270fdab805638eb197c3a7a661170d729d5..90e894b842c98364e29203d1c59e761a12a6c7e2 100644 (file)
@@ -24,7 +24,6 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
-/* $XFree86: xc/lib/GL/mesa/src/drv/sis/sis_ctx.c,v 1.3 2000/09/26 15:56:48 tsi Exp $ */
 
 /*
  * Authors:
@@ -37,18 +36,21 @@ 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 "main/formats.h"
+#include "main/renderbuffer.h"
 
 #include "utils.h"
 
-#define DRIVER_DATE    "20030810"
+#define DRIVER_DATE    "20060710"
 
 /* Return the width and height of the given buffer.
  */
 static void
-sisGetBufferSize( GLframebuffer *buffer,
+sisGetBufferSize( struct gl_framebuffer *buffer,
                              GLuint *width, GLuint *height )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -63,7 +65,7 @@ sisGetBufferSize( GLframebuffer *buffer,
 /* Return various strings for glGetString().
  */
 static const GLubyte *
-sisGetString( GLcontext *ctx, GLenum name )
+sisGetString( struct gl_context *ctx, GLenum name )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
    static char buffer[128];
@@ -85,73 +87,164 @@ sisGetString( GLcontext *ctx, GLenum name )
    }
 }
 
-/* Send all commands to the hardware.  No-op, due to mmio.
+/* Send all commands to the hardware.
  */
 static void
-sisFlush( GLcontext *ctx )
+sisFlush( struct gl_context *ctx )
 {
-   /* Do nothing */
+   sisContextPtr smesa = SIS_CONTEXT(ctx);
+
+   SIS_FIREVERTICES(smesa);
 }
 
 /* Make sure all commands have been sent to the hardware and have
  * completed processing.
  */
 static void
-sisFinish( GLcontext *ctx )
+sisFinish( struct gl_context *ctx )
 {
    sisContextPtr smesa = SIS_CONTEXT(ctx);
 
-   sisFlush( ctx );
+   SIS_FIREVERTICES(smesa);
+   LOCK_HARDWARE();
    WaitEngIdle( smesa );
+   UNLOCK_HARDWARE();
+}
+
+static void
+sisDeleteRenderbuffer(struct gl_renderbuffer *rb)
+{
+   /* Don't free() since we're contained in sis_context struct. */
+}
+
+static GLboolean
+sisRenderbufferStorage(struct gl_context *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->Format = MESA_FORMAT_ARGB8888;
+      rb->DataType = GL_UNSIGNED_BYTE;
+   }
+   else if (format == GL_DEPTH_COMPONENT16) {
+      /* Depth */
+      /* we always Get/Put 32-bit Z values */
+      rb->Format = MESA_FORMAT_Z16;
+      rb->DataType = GL_UNSIGNED_INT;
+   }
+   else if (format == GL_DEPTH_COMPONENT24) {
+      /* Depth */
+      /* we always Get/Put 32-bit Z values */
+      rb->Format = MESA_FORMAT_Z32;
+      rb->DataType = GL_UNSIGNED_INT;
+   }
+   else {
+      /* Stencil */
+      ASSERT(format == GL_STENCIL_INDEX8_EXT);
+      rb->Format = MESA_FORMAT_S8;
+      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;
+
+   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);
+   }
 
    /* 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;
+   smesa->front.offset = smesa->driDrawable->x * smesa->bytesPerPixel +
+                        smesa->driDrawable->y * smesa->front.pitch;
+   smesa->front.map = (char *) smesa->driScreen->pFB + smesa->front.offset;
 
    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;
+
    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:
-      assert( 0 );
-   }
-
    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;
@@ -167,9 +260,8 @@ sisUpdateBufferSize( sisContextPtr smesa )
 void
 sisInitDriverFuncs( struct dd_function_table *functions )
 {
-   functions->GetBufferSize    = sisGetBufferSize;
-   functions->ResizeBuffers    = _swrast_alloc_buffers;
-   functions->GetString        = sisGetString;
-   functions->Finish           = sisFinish;
-   functions->Flush            = sisFlush;
+   functions->GetBufferSize = sisGetBufferSize;
+   functions->GetString     = sisGetString;
+   functions->Finish        = sisFinish;
+   functions->Flush         = sisFlush;
 }