mesa: Enable remap table in core.
[mesa.git] / src / mesa / drivers / dri / sis / sis_context.c
index 8a20f7ec0eebf00d6fc022e021e0cf3a75998df0..f501e7ad2e9dc128c4b7323f872ae32b19013132 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:
@@ -41,31 +40,61 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "sis_stencil.h"
 #include "sis_tex.h"
 #include "sis_tris.h"
-#include "sis_vb.h"
+#include "sis_alloc.h"
 
-#include "imports.h"
-#include "matrix.h"
-#include "extensions.h"
+#include "main/imports.h"
+#include "main/matrix.h"
+#include "main/extensions.h"
 #include "utils.h"
+#include "main/framebuffer.h"
 
 #include "drivers/common/driverfuncs.h"
 
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
-#include "array_cache/acache.h"
+#include "vbo/vbo.h"
 
 #include "tnl/tnl.h"
 #include "tnl/t_pipeline.h"
 
+#define need_GL_EXT_fog_coord
+#define need_GL_EXT_secondary_color
+#include "main/remap_helper.h"
+
+#ifndef SIS_DEBUG
+int SIS_DEBUG = 0;
+#endif
+
 int GlobalCurrentHwcx = -1;
 int GlobalHwcxCountBase = 1;
 int GlobalCmdQueueLen = 0;
 
-static const char * const card_extensions[] =
+static struct dri_extension card_extensions[] =
+{
+    { "GL_ARB_multitexture",               NULL },
+    { "GL_ARB_texture_border_clamp",       NULL },
+    { "GL_ARB_texture_mirrored_repeat",    NULL },
+    /*{ "GL_EXT_fog_coord",                  GL_EXT_fog_coord_functions },*/
+    { "GL_EXT_texture_lod_bias",           NULL },
+    { "GL_EXT_secondary_color",            GL_EXT_secondary_color_functions },
+    { "GL_EXT_stencil_wrap",               NULL },
+    { "GL_MESA_ycbcr_texture",             NULL },
+    { "GL_NV_blend_square",                NULL },
+    { NULL,                                NULL }
+};
+
+static struct dri_extension card_extensions_6326[] =
 {
-   "GL_ARB_multitexture",
-   "GL_EXT_texture_lod_bias",
-   NULL
+    /*{ "GL_ARB_texture_border_clamp",       NULL },*/
+    /*{ "GL_ARB_texture_mirrored_repeat",    NULL },*/
+    /*{ "GL_MESA_ycbcr_texture",             NULL },*/
+    { NULL,                                NULL }
+};
+
+static const struct dri_debug_control debug_control[] =
+{
+    { "fall",  DEBUG_FALLBACKS },
+    { NULL,    0 }
 };
 
 void
@@ -73,9 +102,15 @@ WaitEngIdle (sisContextPtr smesa)
 {
    GLuint engineState;
 
-   do {
-      engineState = MMIO_READ(REG_CommandQueue);
-   } while ((engineState & SiS_EngIdle) != SiS_EngIdle);
+   if (smesa->is6326) {
+      do {
+        engineState = MMIO_READ(REG_3D_EngineFire); /* XXX right reg? */
+      } while ((engineState & ENG_3DIDLEQE) != 0);
+   } else {
+      do {
+        engineState = MMIO_READ(REG_CommandQueue);
+      } while ((engineState & SiS_EngIdle) != SiS_EngIdle);
+   }
 }
 
 void
@@ -83,9 +118,15 @@ Wait2DEngIdle (sisContextPtr smesa)
 {
    GLuint engineState;
 
-   do {
-      engineState = MMIO_READ(REG_CommandQueue);
-   } while ((engineState & SiS_EngIdle2d) != SiS_EngIdle2d);
+   if (smesa->is6326) {
+      do {
+        engineState = MMIO_READ(REG_6326_BitBlt_Cmd);
+      } while ((engineState & BLT_BUSY) != 0);
+   } else {
+      do {
+        engineState = MMIO_READ(REG_CommandQueue);
+      } while ((engineState & SiS_EngIdle2d) != SiS_EngIdle2d);
+   }
 }
 
 /* To be called from mWait3DCmdQueue.  Separate function for profiling
@@ -94,12 +135,29 @@ Wait2DEngIdle (sisContextPtr smesa)
 void
 WaitingFor3dIdle(sisContextPtr smesa, int wLen)
 {
-   while (*(smesa->CurrentQueueLenPtr) < wLen) {
-      *(smesa->CurrentQueueLenPtr) =
-         (MMIO_READ(REG_CommandQueue) & MASK_QueueLen) - 20;
+   if (smesa->is6326) {
+      while (*(smesa->CurrentQueueLenPtr) < wLen) {
+        *(smesa->CurrentQueueLenPtr) =
+           ((GLuint)MMIO_READ(REG_3D_EngineFire) >> 16) * 2;
+      }
+   } else {
+      while (*(smesa->CurrentQueueLenPtr) < wLen) {
+        *(smesa->CurrentQueueLenPtr) =
+            (MMIO_READ(REG_CommandQueue) & MASK_QueueLen) - 20;
+      }
    }
 }
 
+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,
@@ -120,6 +178,7 @@ sisCreateContext( const __GLcontextModes *glVisual,
     * (the texture functions are especially important)
     */
    _mesa_init_driver_functions(&functions);
+   sisInitDriverFuncs(&functions);
    sisInitTextureFuncs(&functions);
 
    /* Allocate the Mesa context */
@@ -138,6 +197,7 @@ sisCreateContext( const __GLcontextModes *glVisual,
 
    sisScreen = smesa->sisScreen = (sisScreenPtr)(sPriv->private);
 
+   smesa->is6326 = GL_FALSE; /* XXX */
    smesa->driContext = driContextPriv;
    smesa->driScreen = sPriv;
    smesa->driDrawable = NULL;
@@ -150,19 +210,14 @@ 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);
 
-#if defined(SIS_DUMP)
-   IOBase4Debug = GET_IOBase (smesa);
-#endif
-
    /* support ARGB8888 and RGB565 */
    switch (smesa->bytesPerPixel)
    {
@@ -181,13 +236,27 @@ sisCreateContext( const __GLcontextModes *glVisual,
       smesa->colorFormat = DST_FORMAT_RGB_565;
       break;
    default:
-      assert (0);
+      sis_fatal_error("Bad bytesPerPixel %d.\n", smesa->bytesPerPixel);
+   }
+
+   if (smesa->is6326) {
+      ctx->Const.MaxTextureUnits = 1;
+      ctx->Const.MaxTextureLevels = 9;
+   } else {
+      ctx->Const.MaxTextureUnits = 2;
+      ctx->Const.MaxTextureLevels = 11;
    }
+   ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits;
+   ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits;
 
    /* Parse configuration files */
    driParseConfigFiles (&smesa->optionCache, &sisScreen->optionCache,
                        sisScreen->driScreen->myNum, "sis");
 
+#if DO_DEBUG
+   SIS_DEBUG = driParseDebugString(getenv("SIS_DEBUG"), debug_control);
+#endif
+
    /* TODO: index mode */
 
    smesa->CurrentQueueLenPtr = &(smesa->sarea->QueueLength);
@@ -196,20 +265,31 @@ sisCreateContext( const __GLcontextModes *glVisual,
    /* set AGP */
    smesa->AGPSize = sisScreen->agp.size;
    smesa->AGPBase = sisScreen->agp.map;
-   smesa->AGPAddr = sisScreen->agp.handle;
+   smesa->AGPAddr = sisScreen->agpBaseOffset;
 
-   /* set AGP command buffer */
-   if (smesa->AGPSize != 0 && sisScreen->AGPCmdBufSize != 0 &&
+   /* Create AGP command buffer */
+   if (smesa->AGPSize != 0 && 
       !driQueryOptionb(&smesa->optionCache, "agp_disable"))
-   {   
-      smesa->AGPCmdBufBase = smesa->AGPBase + sisScreen->AGPCmdBufOffset;
-      smesa->AGPCmdBufAddr = smesa->AGPAddr + sisScreen->AGPCmdBufOffset;
-      smesa->AGPCmdBufSize = sisScreen->AGPCmdBufSize;
-
-      smesa->pAGPCmdBufNext = (GLint *)&(smesa->sarea->AGPCmdBufNext);
-      smesa->AGPCmdModeEnabled = GL_TRUE;
-   } else {
-      smesa->AGPCmdModeEnabled = GL_FALSE;
+   {
+      smesa->vb = sisAllocAGP(smesa, 64 * 1024, &smesa->vb_agp_handle);
+      if (smesa->vb != NULL) {
+        smesa->using_agp = GL_TRUE;
+        smesa->vb_cur = smesa->vb;
+        smesa->vb_last = smesa->vb;
+        smesa->vb_end = smesa->vb + 64 * 1024;
+        smesa->vb_agp_offset = ((long)smesa->vb - (long)smesa->AGPBase +
+           (long)smesa->AGPAddr);
+      }
+   }
+   if (!smesa->using_agp) {
+      smesa->vb = malloc(64 * 1024);
+      if (smesa->vb == NULL) {
+        FREE(smesa);
+        return GL_FALSE;
+      }
+      smesa->vb_cur = smesa->vb;
+      smesa->vb_last = smesa->vb;
+      smesa->vb_end = smesa->vb + 64 * 1024;
    }
 
    smesa->GlobalFlag = 0L;
@@ -219,32 +299,40 @@ sisCreateContext( const __GLcontextModes *glVisual,
    /* Initialize the software rasterizer and helper modules.
     */
    _swrast_CreateContext( ctx );
-   _ac_CreateContext( ctx );
+   _vbo_CreateContext( ctx );
    _tnl_CreateContext( ctx );
    _swsetup_CreateContext( ctx );
 
    _swrast_allow_pixel_fog( ctx, GL_TRUE );
    _swrast_allow_vertex_fog( ctx, GL_FALSE );
+   _tnl_allow_pixel_fog( ctx, GL_TRUE );
+   _tnl_allow_vertex_fog( ctx, GL_FALSE );
 
    /* XXX these should really go right after _mesa_init_driver_functions() */
-   sisDDInitStateFuncs( ctx );
-   sisDDInitState( smesa );    /* Initializes smesa->zFormat, important */
-   sisInitVB( ctx );
+   if (smesa->is6326) {
+      sis6326DDInitStateFuncs( ctx );
+      sis6326DDInitState( smesa ); /* Initializes smesa->zFormat, important */
+   } else {
+      sisDDInitStateFuncs( ctx );
+      sisDDInitState( smesa ); /* Initializes smesa->zFormat, important */
+      sisDDInitStencilFuncs( ctx );
+   }
    sisInitTriFuncs( ctx );
    sisDDInitSpanFuncs( ctx );
-   sisDDInitStencilFuncs( ctx );
 
    driInitExtensions( ctx, card_extensions, GL_FALSE );
 
-   /* TODO */
-   /* smesa->blockWrite = SGRAMbw = IsBlockWrite (); */
-   smesa->blockWrite = GL_FALSE;
-
    for (i = 0; i < SIS_MAX_TEXTURES; i++) {
       smesa->TexStates[i] = 0;
       smesa->PrevTexFormat[i] = 0;
    }
 
+   if (driQueryOptionb(&smesa->optionCache, "no_rast")) {
+      fprintf(stderr, "disabling 3D acceleration\n");
+      FALLBACK(smesa, SIS_FALLBACK_DISABLE, 1);
+   }
+   smesa->texture_depth = driQueryOptioni(&smesa->optionCache, "texture_depth");
+
    return GL_TRUE;
 }
 
@@ -258,9 +346,12 @@ sisDestroyContext ( __DRIcontextPrivate *driContextPriv )
    if ( smesa != NULL ) {
       _swsetup_DestroyContext( smesa->glCtx );
       _tnl_DestroyContext( smesa->glCtx );
-      _ac_DestroyContext( smesa->glCtx );
+      _vbo_DestroyContext( smesa->glCtx );
       _swrast_DestroyContext( smesa->glCtx );
 
+      if (smesa->using_agp)
+        sisFreeAGP(smesa, smesa->vb_agp_handle);
+
       /* free the Mesa context */
       /* XXX: Is the next line needed?  The DriverCtx (smesa) reference is
        * needed for sisDDDeleteTexture, since it needs to call the FB/AGP free
@@ -282,6 +373,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;
@@ -289,19 +381,15 @@ sisMakeCurrent( __DRIcontextPrivate *driContextPriv,
 
       newSisCtx->driDrawable = driDrawPriv;
 
-      _mesa_make_current2( 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 );
-
-      if ( newSisCtx->glCtx->Viewport.Width == 0 ) {
-         _mesa_set_viewport(newSisCtx->glCtx, 0, 0,
-                            driDrawPriv->w, driDrawPriv->h);
-      }
    } else {
-      _mesa_make_current( 0, 0 );
+      _mesa_make_current( NULL, NULL, NULL );
    }
 
    return GL_TRUE;
@@ -506,10 +594,126 @@ sis_update_texture_state (sisContextPtr smesa)
 }
 
 void
-sis_fatal_error (void)
+sis6326_update_render_state( sisContextPtr smesa )
 {
-   /* free video memory, or the framebuffer device will do it automatically */
+   __GLSiSHardware *prev = &smesa->prev;
 
-   fprintf(stderr, "Fatal errors in sis_dri.so\n");
-   exit (-1);
+   mWait3DCmdQueue (45);
+
+   if (smesa->GlobalFlag & GFLAG_ENABLESETTING) {
+      if (!smesa->clearTexCache) {
+        MMIO(REG_6326_3D_TEnable, prev->hwCapEnable);
+      } else {
+        MMIO(REG_6326_3D_TEnable, prev->hwCapEnable & ~S_ENABLE_TextureCache);
+        MMIO(REG_6326_3D_TEnable, prev->hwCapEnable);
+        smesa->clearTexCache = GL_FALSE;
+      }
+   }
+
+   /* Z Setting */
+   if (smesa->GlobalFlag & GFLAG_ZSETTING) {
+      MMIO(REG_6326_3D_ZSet, prev->hwZ);
+      MMIO(REG_6326_3D_ZAddress, prev->hwOffsetZ);
+   }
+
+   /* Alpha Setting */
+   if (smesa->GlobalFlag & GFLAG_ALPHASETTING)
+      MMIO(REG_6326_3D_AlphaSet, prev->hwAlpha);
+
+   if (smesa->GlobalFlag & GFLAG_DESTSETTING) {
+      MMIO(REG_6326_3D_DstSet, prev->hwDstSet);
+      MMIO(REG_6326_3D_DstAddress, prev->hwOffsetDest);
+   }
+
+   /* Fog Setting */
+   if (smesa->GlobalFlag & GFLAG_FOGSETTING) {
+      MMIO(REG_6326_3D_FogSet, prev->hwFog);
+   }
+
+   /* Miscellaneous Setting */
+   if (smesa->GlobalFlag & GFLAG_DSTBLEND)
+      MMIO(REG_6326_3D_DstSrcBlendMode, prev->hwDstSrcBlend);
+
+   if (smesa->GlobalFlag & GFLAG_CLIPPING) {
+      MMIO(REG_6326_3D_ClipTopBottom, prev->clipTopBottom);
+      MMIO(REG_6326_3D_ClipLeftRight, prev->clipLeftRight);
+   }
+
+  smesa->GlobalFlag &= ~GFLAG_RENDER_STATES;
+}
+
+void
+sis6326_update_texture_state (sisContextPtr smesa)
+{
+   __GLSiSHardware *prev = &smesa->prev;
+
+   mWait3DCmdQueue (55);
+   if (smesa->clearTexCache || (smesa->GlobalFlag & GFLAG_TEXTUREADDRESS)) {
+      MMIO(REG_6326_3D_TEnable, prev->hwCapEnable & ~S_ENABLE_TextureCache);
+      MMIO(REG_6326_3D_TEnable, prev->hwCapEnable);
+      smesa->clearTexCache = GL_FALSE;
+   }
+
+   /* Texture Setting */
+   if (smesa->GlobalFlag & CFLAG_TEXTURERESET)
+      MMIO(REG_6326_3D_TextureSet, prev->texture[0].hwTextureSet);
+
+   if (smesa->GlobalFlag & GFLAG_TEXTUREMIPMAP)
+      MMIO(REG_6326_3D_TextureWidthHeight, prev->texture[0].hwTexWidthHeight);
+
+  /*
+  MMIO(REG_3D_TextureTransparencyColorHigh, prev->texture[0].hwTextureClrHigh);
+  MMIO(REG_3D_TextureTransparencyColorLow, prev->texture[0].hwTextureClrLow);
+  */
+
+   if (smesa->GlobalFlag & GFLAG_TEXBORDERCOLOR)
+      MMIO(REG_6326_3D_TextureBorderColor, prev->texture[0].hwTextureBorderColor);
+
+   if (smesa->GlobalFlag & GFLAG_TEXTUREADDRESS) {
+      switch ((prev->texture[0].hwTextureSet & MASK_6326_TextureLevel) >> 8)
+      {
+      case 9:
+         MMIO(REG_6326_3D_TextureAddress9, prev->texture[0].texOffset9);
+         /* FALLTHROUGH */
+      case 8:
+         MMIO(REG_6326_3D_TextureAddress8, prev->texture[0].texOffset8);
+         MMIO(REG_6326_3D_TexturePitch89, prev->texture[0].texPitch89);
+         /* FALLTHROUGH */
+      case 7:
+         MMIO(REG_6326_3D_TextureAddress7, prev->texture[0].texOffset7);
+         /* FALLTHROUGH */
+      case 6:
+         MMIO(REG_6326_3D_TextureAddress6, prev->texture[0].texOffset6);
+         MMIO(REG_6326_3D_TexturePitch67, prev->texture[0].texPitch67);
+         /* FALLTHROUGH */
+      case 5:
+         MMIO(REG_6326_3D_TextureAddress5, prev->texture[0].texOffset5);
+         /* FALLTHROUGH */
+      case 4:
+         MMIO(REG_6326_3D_TextureAddress4, prev->texture[0].texOffset4);
+         MMIO(REG_6326_3D_TexturePitch45, prev->texture[0].texPitch45);
+         /* FALLTHROUGH */
+      case 3:
+         MMIO(REG_6326_3D_TextureAddress3, prev->texture[0].texOffset3);
+         /* FALLTHROUGH */
+      case 2:
+         MMIO(REG_6326_3D_TextureAddress2, prev->texture[0].texOffset2);
+         MMIO(REG_6326_3D_TexturePitch23, prev->texture[0].texPitch23);
+         /* FALLTHROUGH */
+      case 1:
+         MMIO(REG_6326_3D_TextureAddress1, prev->texture[0].texOffset1);
+         /* FALLTHROUGH */
+      case 0:
+        MMIO(REG_6326_3D_TextureAddress0, prev->texture[0].texOffset0);
+        MMIO(REG_6326_3D_TexturePitch01, prev->texture[0].texPitch01);
+        break;
+      }
+   }
+
+   /* texture environment */
+   if (smesa->GlobalFlag & GFLAG_TEXTUREENV) {
+      MMIO(REG_6326_3D_TextureBlendSet, prev->hwTexBlendSet);
+   }
+
+   smesa->GlobalFlag &= ~GFLAG_TEXTURE_STATES;
 }