Ian Romanick wrote:
Roland Scheidegger wrote:

Ian Romanick wrote:

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 ;-).


It turns out the whole thing was borked. I discovered a bunch of issues when I brought it over to the MGA driver. I made the r200 "look like" the MGA driver, but I only have access to a G400 at the moment, so the r200 may not work. Try pulling the most recent code and work from that.
That said, it should be a cut & paste job followed by s/r200/radeon/g. :)

ok, next attempt.
I've tested the branch briefly (on r200 only), seemed to work, including the fbconfig xdemos. However, each OpenGL application will output lots of warnings.
pbinfo:
libGL warning: 3D driver claims to not support visual 0x23
libGL warning: 3D driver claims to not support visual 0x24
libGL warning: 3D driver claims to not support visual 0x25
libGL warning: 3D driver claims to not support visual 0x26
libGL warning: 3D driver claims to not support visual 0x27
libGL warning: 3D driver claims to not support visual 0x28
libGL warning: 3D driver claims to not support visual 0x29
libGL warning: 3D driver claims to not support visual 0x2a
libGL warning: 3D driver claims to not support visual 0x2b
libGL warning: 3D driver claims to not support visual 0x2c
libGL warning: 3D driver claims to not support visual 0x2d
libGL warning: 3D driver claims to not support visual 0x2e
libGL warning: 3D driver claims to not support visual 0x2f
libGL warning: 3D driver claims to not support visual 0x30
libGL warning: 3D driver claims to not support visual 0x31
libGL warning: 3D driver claims to not support visual 0x32
Number of fbconfigs: 16
ID VisualType Depth Lvl RGB CI DB Stereo R G B A Z S AR AG AB AA MSbufs MSnum Pbuffer
0x023 TrueColor 32 0 y n n n 8 8 8 8 24 0 0 0 0 0 0 0 n
0x024 TrueColor 32 0 y n n n 8 8 8 8 24 8 0 0 0 0 0 0 n
0x025 TrueColor 32 0 y n n n 8 8 8 8 24 0 16 16 16 16 0 0 n
0x026 TrueColor 32 0 y n n n 8 8 8 8 24 8 16 16 16 16 0 0 n
0x027 TrueColor 32 0 y n y n 8 8 8 8 24 0 0 0 0 0 0 0 n
0x028 TrueColor 32 0 y n y n 8 8 8 8 24 8 0 0 0 0 0 0 n
0x029 TrueColor 32 0 y n y n 8 8 8 8 24 0 16 16 16 16 0 0 n
0x02a TrueColor 32 0 y n y n 8 8 8 8 24 8 16 16 16 16 0 0 n
0x02b DirectColor 32 0 y n n n 8 8 8 8 24 0 0 0 0 0 0 0 n
0x02c DirectColor 32 0 y n n n 8 8 8 8 24 8 0 0 0 0 0 0 n
0x02d DirectColor 32 0 y n n n 8 8 8 8 24 0 16 16 16 16 0 0 n
0x02e DirectColor 32 0 y n n n 8 8 8 8 24 8 16 16 16 16 0 0 n
0x02f DirectColor 32 0 y n y n 8 8 8 8 24 0 0 0 0 0 0 0 n
0x030 DirectColor 32 0 y n y n 8 8 8 8 24 8 0 0 0 0 0 0 n
0x031 DirectColor 32 0 y n y n 8 8 8 8 24 0 16 16 16 16 0 0 n
0x032 DirectColor 32 0 y n y n 8 8 8 8 24 8 16 16 16 16 0 0 n


Roland
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       13 Feb 2004 01:41:46 -0000
@@ -16,7 +16,7 @@
 #endif
 
 #if BuildXF86DRI
-  DRI_DEFINES = GlxDefines -DX_BYTE_ORDER=ByteOrder
+  DRI_DEFINES = GlxDefines -DX_BYTE_ORDER=ByteOrder -DUSE_NEW_INTERFACE
  DRI_INCLUDES = -I$(GLXLIBSRC)/dri \
                -I$(XINCLUDESRC) \
                -I$(GLXLIBSRC)/glx \
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     13 Feb 2004 01:42:40 -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,133 @@
 #define PCI_CHIP_RS250_4437     0x4437
 #endif
 
+#ifdef USE_NEW_INTERFACE
+static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
+#endif /* USE_NEW_INTERFACE */
+
 static int getSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo );
 
+#ifdef USE_NEW_INTERFACE
+static __GLcontextModes * fill_in_modes( __GLcontextModes * modes,
+                                        unsigned pixel_bits,
+                                        unsigned depth_bits,
+                                        unsigned stencil_bits,
+                                        const GLenum * db_modes,
+                                        unsigned num_db_modes,
+                                        int visType )
+{
+    static const uint8_t bits[2][4] = {
+       {          5,          6,          5,          0 },
+       {          8,          8,          8,          0 }
+    };
+
+    static const uint32_t masks[2][4] = {
+       { 0x0000F800, 0x000007E0, 0x0000001F, 0x00000000 },
+       { 0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000 }
+    };
+
+    unsigned   i;
+    unsigned   j;
+    const unsigned index = ((pixel_bits + 15) / 16) - 1;
+
+    for ( i = 0 ; i < num_db_modes ; i++ ) {
+       for ( j = 0 ; j < 2 ; j++ ) {
+
+           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   = modes->redBits + modes->greenBits
+               + modes->blueBits;
+
+           modes->accumRedBits   = 16 * j;
+           modes->accumGreenBits = 16 * j;
+           modes->accumBlueBits  = 16 * j;
+           modes->accumAlphaBits = 0;
+           modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG;
+
+           modes->stencilBits = stencil_bits;
+           modes->depthBits = depth_bits;
+
+           modes->visualType = visType;
+           modes->renderType = GLX_RGBA_BIT;
+           modes->drawableType = GLX_WINDOW_BIT;
+           modes->rgbMode = GL_TRUE;
+
+           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_NEW_INTERFACE */
+
+#ifdef USE_NEW_INTERFACE
+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 * 4;
+
+    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,
+                          GLX_TRUE_COLOR );
+    }
+
+    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,
+                          GLX_DIRECT_COLOR );
+    }
+
+    return modes;
+}
+#endif /* USE_NEW_INTERFACE */
+
 /* Create the device specific screen private data struct.
  */
 radeonScreenPtr radeonCreateScreen( __DRIscreenPrivate *sPriv )
@@ -295,6 +421,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 +475,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 +517,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 +527,8 @@
    .SwapBuffers     = radeonSwapBuffers,
    .MakeCurrent     = radeonMakeCurrent,
    .UnbindContext   = radeonUnbindContext,
-   .OpenFullScreen  = radeonOpenCloseFullScreen,
-   .CloseFullScreen = radeonOpenCloseFullScreen,
+   .OpenFullScreen  = NULL,
+   .CloseFullScreen = NULL,
    .GetSwapInfo     = getSwapInfo,
    .GetMSC          = driGetMSC32,
    .WaitForMSC      = driWaitForMSC32,
@@ -438,33 +561,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_NEW_INTERFACE
+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, NULL,
+                                 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_NEW_INTERFACE */
 
 /**
  * Get information about previous buffer swaps.

Reply via email to