Ian Romanick wrote:
Ian Romanick wrote:

1. Commit some minor changes to the r200 driver to use the new interfaces. This will go in Mesa trunk, but will be guarded by #ifdef. This is needed because the code calls some functions in dri_util.c that only exist in the branch.


Done.  Tomorrow I may do some clean-up on this code and make similar
 changes to the MGA driver.  It will all depend on whether or not I
have a chance to get to it. :(
I've tried to convert the radeon driver, seems to compile just fine. All
I did was incorporate the changes from r200_screen.c from version 1.7 to 1.8 to radeon_screen.c and change one line in the Imakefile.inc. Is that really all that is necessary? Seems to be too simple, it was a 100% copy&paste job, I didn't touch anything in the code at all (except replacing "r200" with "radeon" a couple of times...). That said, I changed one #endif USE_NEWINTERFACE to #endif /* USE_NEWINTERFACE */ to suppress a compiler warning. (there is still a new warning in both radeon and r200, radeon_screen.c:567: warning: passing arg 4 of `__driUtilCreateNewScreen' discards qualifiers from pointer target type).



In-progress.  Please test this branch! :)  Would it be possible to
make the R200 nightly snapshot come from the branch instead (or in
addition to) the trunk?  I'd like to merge to the trunk next Thursday
 (19-Feb-2004).  In order to feel comfortable doing that, I'd like to
 hear about people actually using the branch, even if they don't use
the new functionality.
As far as I can see the new interface is not enabled though, since r200_screen.c tests for USE_NEWINTERFACE while the define in the Imakefile is USE_NEW_INTERFACE. At least only after changing the define did I get the new compiler warning ;-). Or am I missing something?
The driver (for r200, can't test radeon right now) seems to run, though I didn't test it with the newly built X server yet. Someday, I'll need to restart my X session ;-).


Roland
Index: radeon_screen.c
===================================================================
RCS file: /cvs/mesa/Mesa/src/mesa/drivers/dri/radeon/radeon_screen.c,v
retrieving revision 1.7
diff -u -r1.7 radeon_screen.c
--- radeon_screen.c     5 Jan 2004 23:19:22 -0000       1.7
+++ radeon_screen.c     12 Feb 2004 21:19:18 -0000
@@ -28,11 +28,12 @@
 
 **************************************************************************/
 
-/*
- * Authors:
- *   Kevin E. Martin <[EMAIL PROTECTED]>
- *   Gareth Hughes <[EMAIL PROTECTED]>
+/**
+ * \file radeon_screen.c
+ * Screen initialization functions for the Radeon driver.
  *
+ * \author Kevin E. Martin <[EMAIL PROTECTED]>
+ * \author  Gareth Hughes <[EMAIL PROTECTED]>
  */
 
 #include "glheader.h"
@@ -101,8 +102,109 @@
 #define PCI_CHIP_RS250_4437     0x4437
 #endif
 
+#ifdef USE_NEWINTERFACE
+static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
+#endif /* USE_NEWINTERFACE */
+
 static int getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
 
+#ifdef USE_NEWINTERFACE
+static __GLcontextModes * fill_in_modes( __GLcontextModes * modes,
+                                        unsigned pixel_bits,
+                                        unsigned depth_bits,
+                                        unsigned stencil_bits,
+                                        const GLenum * db_modes,
+                                        unsigned num_db_modes )
+{
+    static const uint8_t bits[2][4] = {
+       {          5,          6,          5,          0 },
+       {          8,          8,          8,          8 }
+    };
+
+    static const uint32_t masks[2][4] = {
+       { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 },
+       { 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000 }
+    };
+
+    unsigned   i;
+    const unsigned index = (pixel_bits / 8) - 1;
+
+    for ( i = 0 ; i < num_db_modes ; i++ ) {
+
+       modes->redBits   = bits[index][0];
+       modes->greenBits = bits[index][1];
+       modes->blueBits  = bits[index][2];
+       modes->alphaBits = bits[index][3];
+       modes->redMask   = masks[index][0];
+       modes->greenMask = masks[index][1];
+       modes->blueMask  = masks[index][2];
+       modes->alphaMask = masks[index][3];
+       modes->rgbBits   = pixel_bits;
+
+       modes->stencilBits = stencil_bits;
+       modes->depthBits = depth_bits;
+       
+       if ( db_modes[i] == GLX_NONE ) {
+           modes->doubleBufferMode = GL_FALSE;
+       }
+       else {
+           modes->doubleBufferMode = GL_TRUE;
+           modes->swapMethod = db_modes[i];
+       }
+
+       modes = modes->next;
+    }
+
+    return modes;
+}
+#endif /* USE_NEWINTERFACE */
+
+#ifdef USE_NEWINTERFACE
+static __GLcontextModes *
+radeonFillInModes( unsigned pixel_bits, unsigned depth_bits,
+                unsigned stencil_bits, GLboolean have_back_buffer )
+{
+    __GLcontextModes * modes;
+    __GLcontextModes * m;
+    unsigned num_modes;
+    unsigned depth_buffer_factor;
+    unsigned back_buffer_factor;
+    unsigned i;
+
+    /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy
+     * enough to add support.  Basically, if a context is created with an
+     * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping
+     * will never be used.
+     */
+    static const GLenum back_buffer_modes[] = {
+       GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */
+    };
+
+    int depth_buffer_modes[2][2] = {
+       { 0, 0 },
+       { 0, 0 }
+    };
+
+    depth_buffer_modes[1][0] = depth_bits;
+    depth_buffer_modes[1][1] = stencil_bits;
+
+    depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;
+    back_buffer_factor  = (have_back_buffer) ? 2 : 1;
+
+    num_modes = depth_buffer_factor * back_buffer_factor;
+
+    modes = (*create_context_modes)( num_modes, sizeof( __GLcontextModes ) );
+    m = modes;
+    for ( i = 0 ; i < depth_buffer_factor ; i++ ) {
+       m = fill_in_modes( m, pixel_bits,
+                          depth_buffer_modes[i][0], depth_buffer_modes[i][1],
+                          back_buffer_modes, back_buffer_factor );
+    }
+
+    return modes;
+}
+#endif /* USE_NEWINTERFACE */
+
 /* Create the device specific screen private data struct.
  */
 radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv )
@@ -295,6 +397,12 @@
         }
 
         (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+
+         if ( driCompareGLXAPIVersion( 20030915 ) >= 0 ) {
+           (*glx_enable_extension)( psc, "GLX_SGIX_fbconfig" );
+           (*glx_enable_extension)( psc, "GLX_OML_swap_method" );
+        }
+
       }
    }
 #endif
@@ -343,8 +451,12 @@
 
 
 
-/* Create and initialize the Mesa and driver specific pixmap buffer
+/**
+ * Create and initialize the Mesa and driver specific pixmap buffer
  * data.
+ *
+ * \todo This function (and its interface) will need to be updated to support
+ * pbuffers.
  */
 static GLboolean
 radeonCreateBuffer( __DRIscreenPrivate *driScrnPriv,
@@ -381,19 +493,6 @@
 
 
 
-/* Fullscreen mode isn't used for much -- could be a way to shrink
- * front/back buffers & get more texture memory if the client has
- * changed the video resolution.
- * 
- * Pageflipping is now done automatically whenever there is a single
- * 3d client.
- */
-static GLboolean
-radeonOpenCloseFullScreen( __DRIcontextPrivate *driContextPriv )
-{
-   return GL_TRUE;
-}
-
 static struct __DriverAPIRec radeonAPI = {
    .InitDriver      = radeonInitDriver,
    .DestroyScreen   = radeonDestroyScreen,
@@ -404,8 +503,8 @@
    .SwapBuffers     = radeonSwapBuffers,
    .MakeCurrent     = radeonMakeCurrent,
    .UnbindContext   = radeonUnbindContext,
-   .OpenFullScreen  = radeonOpenCloseFullScreen,
-   .CloseFullScreen = radeonOpenCloseFullScreen,
+   .OpenFullScreen  = NULL,
+   .CloseFullScreen = NULL,
    .GetSwapInfo     = getSwapInfo,
    .GetMSC          = driGetMSC32,
    .WaitForMSC      = driWaitForMSC32,
@@ -438,33 +537,49 @@
 }
 #endif
 
-#ifndef _SOLO
 /**
- * This function is called by libGL.so as soon as libGL.so is loaded.
- * This is where we'd register new extension functions with the dispatcher.
+ * This is the bootstrap function for the driver.  libGL supplies all of the
+ * requisite information about the system, and the driver initializes itself.
+ * This routine also fills in the linked list pointed to by \c driver_modes
+ * with the \c __GLcontextModes that the driver can support for windows or
+ * pbuffers.
  *
- * \todo This interface has been deprecated, so we should probably remove
- *       this function before the next XFree86 release.
+ * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on 
+ *         failure.
  */
-void
-__driRegisterExtensions( void )
+#ifdef USE_NEWINTERFACE
+void * __driCreateNewScreen( Display *dpy, int scrn, __DRIscreen *psc,
+                            const __GLcontextModes * modes,
+                            const __DRIversion * ddx_version,
+                            const __DRIversion * dri_version,
+                            const __DRIversion * drm_version,
+                            const __DRIframebuffer * frame_buffer,
+                            drmAddress pSAREA, int fd,
+                            int internal_api_version,
+                            __GLcontextModes ** driver_modes )
+
 {
-   PFNGLXENABLEEXTENSIONPROC glx_enable_extension;
+   __DRIscreenPrivate *psp;
 
+   psp = __driUtilCreateNewScreen(dpy, scrn, psc, modes,
+                                 ddx_version, dri_version, drm_version,
+                                 frame_buffer, pSAREA, fd,
+                                 internal_api_version, &radeonAPI);
 
-   if ( driCompareGLXAPIVersion( 20030317 ) >= 0 ) {
-      glx_enable_extension = (PFNGLXENABLEEXTENSIONPROC)
-         glXGetProcAddress( (const GLubyte *) "__glXEnableExtension" );
 
-      if ( glx_enable_extension != NULL ) {
-        (*glx_enable_extension)( "GLX_SGI_swap_control", GL_FALSE );
-        (*glx_enable_extension)( "GLX_SGI_video_sync", GL_FALSE );
-        (*glx_enable_extension)( "GLX_MESA_swap_control", GL_FALSE );
-        (*glx_enable_extension)( "GLX_MESA_swap_frame_usage", GL_FALSE );
-      }
+   create_context_modes =
+       (PFNGLXCREATECONTEXTMODES) glXGetProcAddress( (const GLubyte *) 
"__glXCreateContextModes" );
+   if ( create_context_modes != NULL ) {
+      RADEONDRIPtr dri_priv = (RADEONDRIPtr) psp->pDevPriv;
+      *driver_modes = radeonFillInModes( dri_priv->bpp,
+                                      (dri_priv->bpp == 16) ? 16 : 24,
+                                      (dri_priv->bpp == 16) ? 0  : 8,
+                                      (dri_priv->backOffset != dri_priv->depthOffset) 
);
    }
+
+   return (void *) psp;
 }
-#endif
+#endif /* USE_NEWINTERFACE */
 
 /**
  * Get information about previous buffer swaps.
Index: Imakefile.inc
===================================================================
RCS file: /cvs/dri/xc/xc/lib/GL/mesa/drivers/dri/radeon/Imakefile.inc,v
retrieving revision 1.2
diff -u -r1.2 Imakefile.inc
--- Imakefile.inc       9 Dec 2003 15:33:35 -0000       1.2
+++ Imakefile.inc       12 Feb 2004 21:20:48 -0000
@@ -16,7 +16,7 @@
 #endif
 
 #if BuildXF86DRI
-  DRI_DEFINES = GlxDefines -DX_BYTE_ORDER=ByteOrder
+  DRI_DEFINES = GlxDefines -DX_BYTE_ORDER=ByteOrder -DUSE_NEWINTERFACE
  DRI_INCLUDES = -I$(GLXLIBSRC)/dri \
                -I$(XINCLUDESRC) \
                -I$(GLXLIBSRC)/glx \

Reply via email to