mesa/dri: User standard integer types.
[mesa.git] / src / mesa / drivers / dri / sis / sis_screen.c
index e6c398f4e2832e9082d23e1a384dad3cc6f10af5..f55027e0945482a895f357c4d78fa2e62a6ada21 100644 (file)
@@ -1,4 +1,3 @@
-/* $XFree86$ */
 /**************************************************************************
 
 Copyright 2003 Eric Anholt
@@ -46,24 +45,25 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "GL/internal/dri_interface.h"
 
+#define SIS_AGP_DISABLE(def) \
+DRI_CONF_OPT_BEGIN(agp_disable,bool,def)                               \
+       DRI_CONF_DESC(en,"Disable AGP vertex dispatch")                 \
+DRI_CONF_OPT_END
+
 PUBLIC const char __driConfigOptions[] =
 DRI_CONF_BEGIN
+       DRI_CONF_SECTION_QUALITY
+               DRI_CONF_TEXTURE_DEPTH(DRI_CONF_TEXTURE_DEPTH_FB)
+       DRI_CONF_SECTION_END
        DRI_CONF_SECTION_DEBUG
-               DRI_CONF_OPT_BEGIN(agp_disable,bool,false)
-               DRI_CONF_DESC(en,"Disable AGP vertex dispatch")
-               DRI_CONF_OPT_END
-               DRI_CONF_OPT_BEGIN(fallback_force,bool,false)
-               DRI_CONF_DESC(en,"Force software fallback")
-               DRI_CONF_OPT_END
+               SIS_AGP_DISABLE(true)
+               DRI_CONF_NO_RAST(false)
        DRI_CONF_SECTION_END
 DRI_CONF_END;
-static const GLuint __driNConfigOptions = 2;
+static const GLuint __driNConfigOptions = 3;
 
-#ifdef USE_NEW_INTERFACE
-static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
-#endif /* USE_NEW_INTERFACE */
+extern const struct dri_extension card_extensions[];
 
-#ifdef USE_NEW_INTERFACE
 static __GLcontextModes *
 sisFillInModes(int bpp)
 {
@@ -77,8 +77,8 @@ sisFillInModes(int bpp)
    static const GLenum back_buffer_modes[] = {
       GLX_NONE, GLX_SWAP_UNDEFINED_OML
    };
-   u_int8_t depth_bits_array[4];
-   u_int8_t stencil_bits_array[4];
+   uint8_t depth_bits_array[4];
+   uint8_t stencil_bits_array[4];
 
    depth_bits_array[0] = 0;
    stencil_bits_array[0] = 0;
@@ -103,7 +103,7 @@ sisFillInModes(int bpp)
       fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
    }
 
-   modes = (*create_context_modes)(num_modes, sizeof(__GLcontextModes));
+   modes = (*dri_interface->createContextModes)(num_modes, sizeof(__GLcontextModes));
    m = modes;
    if (!driFillInModes(&m, fb_format, fb_type, depth_bits_array,
                       stencil_bits_array, depth_buffer_factor,
@@ -123,7 +123,7 @@ sisFillInModes(int bpp)
 
    return modes;
 }
-#endif /* USE_NEW_INTERFACE */
+
 
 /* Create the device specific screen private data struct.
  */
@@ -133,11 +133,10 @@ sisCreateScreen( __DRIscreenPrivate *sPriv )
    sisScreenPtr sisScreen;
    SISDRIPtr sisDRIPriv = (SISDRIPtr)sPriv->pDevPriv;
 
-#ifndef USE_NEW_INTERFACE
-   /* XXX Should this still be around for the old interface? */
-   if ( !driCheckDriDdxDrmVersions( sPriv, "SiS", 4, 0, 0, 1, 1, 0 ) )
-      return NULL;
-#endif
+   if (sPriv->devPrivSize != sizeof(SISDRIRec)) {
+      fprintf(stderr,"\nERROR!  sizeof(SISDRIRec) does not match passed size from device driver\n");
+      return GL_FALSE;
+   }
 
    /* Allocate the private area */
    sisScreen = (sisScreenPtr)CALLOC( sizeof(*sisScreen) );
@@ -147,7 +146,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;
@@ -164,6 +162,7 @@ sisCreateScreen( __DRIscreenPrivate *sPriv )
 
    if (sisDRIPriv->agp.size) {
       sisScreen->agp.handle = sisDRIPriv->agp.handle;
+      sisScreen->agpBaseOffset = drmAgpBase(sPriv->fd);
       sisScreen->agp.size   = sisDRIPriv->agp.size;
       if ( drmMap( sPriv->fd, sisScreen->agp.handle, sisScreen->agp.size,
                    &sisScreen->agp.map ) )
@@ -209,78 +208,22 @@ sisCreateBuffer( __DRIscreenPrivate *driScrnPriv,
                  const __GLcontextModes *mesaVis,
                  GLboolean isPixmap )
 {
-   sisScreenPtr screen = (sisScreenPtr) driScrnPriv->private;
+   /*sisScreenPtr screen = (sisScreenPtr) driScrnPriv->private;*/
+   struct gl_framebuffer *fb;
 
    if (isPixmap)
       return GL_FALSE; /* not implemented */
 
-#if 0
-   driDrawPriv->driverPrivate = (void *)_mesa_create_framebuffer(
-                                mesaVis,
-                                GL_FALSE,  /* software depth buffer? */
-                                mesaVis->stencilBits > 0,
-                                mesaVis->accumRedBits > 0,
-                                mesaVis->alphaBits > 0 ); /* XXX */
-#else
-      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);
-
-      /* XXX double-check the Offset/Pitch parameters! */
-      {
-         driRenderbuffer *frontRb
-            = driNewRenderbuffer(GL_RGBA, screen->cpp,
-                                 0, driScrnPriv->fbStride);
-         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, screen->cpp,
-                                 0, driScrnPriv->fbStride);
-         sisSetSpanFunctions(backRb, mesaVis);
-         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);
-      }
-
-      if (mesaVis->depthBits == 16) {
-         driRenderbuffer *depthRb
-            = driNewRenderbuffer(GL_DEPTH_COMPONENT16, screen->cpp,
-                                 0, driScrnPriv->fbStride);
-         sisSetSpanFunctions(depthRb, mesaVis);
-         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
-      }
-      else if (mesaVis->depthBits == 24) {
-         driRenderbuffer *depthRb
-            = driNewRenderbuffer(GL_DEPTH_COMPONENT24, screen->cpp,
-                                 0, driScrnPriv->fbStride);
-         sisSetSpanFunctions(depthRb, mesaVis);
-         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
-      }
-      else if (mesaVis->depthBits == 32) {
-         driRenderbuffer *depthRb
-            = driNewRenderbuffer(GL_DEPTH_COMPONENT32, screen->cpp,
-                                 0, driScrnPriv->fbStride);
-         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;
-#endif
+   _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);
 }
@@ -289,66 +232,33 @@ sisCreateBuffer( __DRIscreenPrivate *driScrnPriv,
 static void
 sisDestroyBuffer(__DRIdrawablePrivate *driDrawPriv)
 {
-   _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));
-}
-
-__inline__ static void
-sis_bitblt_copy_cmd (sisContextPtr smesa, ENGPACKET * pkt)
-{
-   GLint *lpdwDest, *lpdwSrc;
-   int i;
-
-   lpdwSrc = (GLint *) pkt;
-   lpdwDest = (GLint *) (GET_IOBase (smesa) + REG_SRC_ADDR);
-
-   mWait3DCmdQueue (10);
-
-   for (i = 0; i < 7; i++)
-      *lpdwDest++ = *lpdwSrc++;
-
-   MMIO(REG_CMD0, *(GLint *)&pkt->stdwCmd);
-   MMIO(REG_CommandQueue, -1);
+   _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));
 }
 
 static void sisCopyBuffer( __DRIdrawablePrivate *dPriv )
 {
    sisContextPtr smesa = (sisContextPtr)dPriv->driContextPriv->driverPrivate;
    int i;
-   ENGPACKET stEngPacket;
-  
-   memset(&stEngPacket, 0, sizeof(ENGPACKET));
 
    while ((*smesa->FrameCountPtr) - MMIO_READ(0x8a2c) > SIS_MAX_FRAME_LENGTH)
       ;
 
    LOCK_HARDWARE();
 
-   stEngPacket.dwSrcBaseAddr = smesa->backOffset;
-   stEngPacket.dwSrcPitch = smesa->backPitch |
-      ((smesa->bytesPerPixel == 2) ? 0x80000000 : 0xc0000000);
-   stEngPacket.dwDestBaseAddr = 0;
-   stEngPacket.wDestPitch = smesa->frontPitch;
-   /* TODO: set maximum value? */
-   stEngPacket.wDestHeight = smesa->virtualY;
-
-   stEngPacket.stdwCmd.cRop = 0xcc;
-
-   if (smesa->blockWrite)
-      stEngPacket.stdwCmd.cCmd0 = CMD0_PAT_FG_COLOR;
-   else
-      stEngPacket.stdwCmd.cCmd0 = 0;
-   stEngPacket.stdwCmd.cCmd1 = CMD1_DIR_X_INC | CMD1_DIR_Y_INC;
-
    for (i = 0; i < dPriv->numClipRects; i++) {
       drm_clip_rect_t *box = &dPriv->pClipRects[i];
-      stEngPacket.stdwSrcPos.wY = box->y1 - dPriv->y;
-      stEngPacket.stdwSrcPos.wX = box->x1 - dPriv->x;
-      stEngPacket.stdwDestPos.wY = box->y1;
-      stEngPacket.stdwDestPos.wX = box->x1;
-
-      stEngPacket.stdwDim.wWidth = (GLshort) box->x2 - box->x1;
-      stEngPacket.stdwDim.wHeight = (GLshort) box->y2 - box->y1;
-      sis_bitblt_copy_cmd( smesa, &stEngPacket );
+
+      mWait3DCmdQueue(10);
+      MMIO(REG_SRC_ADDR, smesa->back.offset);
+      MMIO(REG_SRC_PITCH, smesa->back.pitch | ((smesa->bytesPerPixel == 4) ? 
+                          BLIT_DEPTH_32 : BLIT_DEPTH_16));
+      MMIO(REG_SRC_X_Y, ((box->x1 - dPriv->x) << 16) | (box->y1 - dPriv->y));
+      MMIO(REG_DST_X_Y, ((box->x1 - dPriv->x) << 16) | (box->y1 - dPriv->y));
+      MMIO(REG_DST_ADDR, smesa->front.offset);
+      MMIO(REG_DST_PITCH_HEIGHT, (smesa->virtualY << 16) | smesa->front.pitch);
+      MMIO(REG_WIDTH_HEIGHT, ((box->y2 - box->y1) << 16) | (box->x2 - box->x1));
+      MMIO(REG_BLIT_CMD, CMD_DIR_X_INC | CMD_DIR_Y_INC | CMD_ROP_SRC);
+      MMIO(REG_CommandQueue, -1);
    }
 
    *(GLint *)(smesa->IOBase+0x8a2c) = *smesa->FrameCountPtr;
@@ -410,20 +320,6 @@ static struct __DriverAPIRec sisAPI = {
 
 };
 
-/*
- * This is the bootstrap function for the driver.
- * The __driCreateScreen name is the symbol that libGL.so fetches.
- * Return:  pointer to a __DRIscreenPrivate.
- */
-#if !defined(DRI_NEW_INTERFACE_ONLY)
-void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
-                        int numConfigs, __GLXvisualConfig *config)
-{
-   __DRIscreenPrivate *psp;
-   psp = __driUtilCreateScreen(dpy, scrn, psc, numConfigs, config, &sisAPI);
-   return (void *)psp;
-}
-#endif /* !defined(DRI_NEW_INTERFACE_ONLY) */
 
 /**
  * This is the bootstrap function for the driver.  libGL supplies all of the
@@ -435,9 +331,8 @@ void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
  * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on 
  *         failure.
  */
-#ifdef USE_NEW_INTERFACE
 PUBLIC
-void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn,
+void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn,
                             __DRIscreen *psc,
                             const __GLcontextModes *modes,
                             const __DRIversion *ddx_version,
@@ -446,15 +341,18 @@ void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn,
                             const __DRIframebuffer *frame_buffer,
                             drmAddress pSAREA, int fd,
                             int internal_api_version,
+                            const __DRIinterfaceMethods * interface,
                             __GLcontextModes **driver_modes )
 
 {
    __DRIscreenPrivate *psp;
-   static const __DRIversion ddx_expected = {0, 1, 0};
+   static const __DRIversion ddx_expected = {0, 8, 0};
    static const __DRIversion dri_expected = {4, 0, 0};
    static const __DRIversion drm_expected = {1, 0, 0};
+   static const char *driver_name = "SiS";
+   dri_interface = interface;
 
-   if (!driCheckDriDdxDrmVersions2("SiS", dri_version, &dri_expected,
+   if (!driCheckDriDdxDrmVersions2(driver_name, dri_version, &dri_expected,
                                   ddx_version, &ddx_expected,
                                   drm_version, &drm_expected)) {
       return NULL;
@@ -465,14 +363,19 @@ void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn,
                                  frame_buffer, pSAREA, fd,
                                  internal_api_version, &sisAPI);
    if (psp != NULL) {
-      create_context_modes = (PFNGLXCREATECONTEXTMODES)
-        glXGetProcAddress((const GLubyte *)"__glXCreateContextModes");
-      if (create_context_modes != NULL) {
-        SISDRIPtr dri_priv = (SISDRIPtr)psp->pDevPriv;
-        *driver_modes = sisFillInModes(dri_priv->bytesPerPixel * 8);
-      }
+      SISDRIPtr dri_priv = (SISDRIPtr)psp->pDevPriv;
+      *driver_modes = sisFillInModes(dri_priv->bytesPerPixel * 8);
+
+      /* Calling driInitExtensions here, with a NULL context pointer, does not actually
+       * enable the extensions.  It just makes sure that all the dispatch offsets for all
+       * the extensions that *might* be enables are known.  This is needed because the
+       * dispatch offsets need to be known when _mesa_context_create is called, but we can't
+       * enable the extensions until we have a context pointer.
+       *
+       * Hello chicken.  Hello egg.  How are you two today?
+       */
+      driInitExtensions( NULL, card_extensions, GL_FALSE );
    }
 
    return (void *)psp;
 }
-#endif /* USE_NEW_INTERFACE */