Remove screenConfigs from __DRIscreen.
authorKristian Høgsberg <krh@hinata.boston.redhat.com>
Fri, 11 May 2007 20:11:23 +0000 (16:11 -0400)
committerKristian Høgsberg <krh@redhat.com>
Wed, 10 Oct 2007 22:00:13 +0000 (18:00 -0400)
The screenConfigs field of __DRIscreen points back to the containing
__GLXscreenConfigs struct.  This is a serious abstraction violation; it
assumes that the loader is libGL and that there *is* a __GLXscreenConfigs
type in the loader.

Using the containerOf macro, we can get from the __DRIscreen pointer to
the containing __GLXscreenConfigs struct, at a place in the stack
where the above is a valid assumption.  Besides, the __DRI* structs shouldn't
hold state other than the private pointer.

13 files changed:
include/GL/internal/dri_interface.h
src/glx/x11/glxext.c
src/glx/x11/glxextensions.c
src/glx/x11/glxextensions.h
src/mesa/drivers/dri/i915/intel_screen.c
src/mesa/drivers/dri/i965/intel_screen.c
src/mesa/drivers/dri/mach64/mach64_screen.c
src/mesa/drivers/dri/mga/mga_xmesa.c
src/mesa/drivers/dri/r128/r128_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/savage/savage_xmesa.c
src/mesa/drivers/dri/tdfx/tdfx_screen.c
src/mesa/drivers/dri/unichrome/via_screen.c

index 9cb5920aa01315d106444f16682b413e8f6f47fe..752dd417dcc622c1cba1f340fdd410fdf305dc95 100644 (file)
@@ -87,7 +87,8 @@ typedef const char * (* PFNGLXGETDRIVERCONFIGPROC) (const char *driverName);
  * \c __DRIinterfaceMethods::getProcAddress.  This function is used to enable
  * a GLX extension on the specified screen.
  */
-typedef void (* PFNGLXSCRENABLEEXTENSIONPROC) ( void *psc, const char * name );
+typedef void (* PFNGLXSCRENABLEEXTENSIONPROC) (__DRIscreen *screen,
+                                              const char *name);
 /*@}*/
 
 
@@ -299,16 +300,6 @@ struct __DRIscreenRec {
      */
     int (*getMSC)( void *screenPrivate, int64_t *msc );
 
-    /**
-     * Opaque pointer that points back to the containing 
-     * \c __GLXscreenConfigs.  This data structure is shared with DRI drivers
-     * but \c __GLXscreenConfigs is not. However, they are needed by some GLX
-     * functions called by DRI drivers.
-     *
-     * \since Internal API version 20030813.
-     */
-    void *screenConfigs;
-
     /**
      * Functions associated with MESA_allocate_memory.
      *
index 85c990d4fc1a612ef417cc15cb35681c8d24d9c9..45b1dde91b6595bdc8b5e6078440b640a91a671c 100644 (file)
@@ -1203,7 +1203,6 @@ static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv)
            if (priv->driDisplay.createNewScreen &&
                priv->driDisplay.createNewScreen[i]) {
 
-               psc->driScreen.screenConfigs = (void *)psc;
                psc->driScreen.private =
                    CallCreateNewScreen(dpy, i, psc,
                                        & priv->driDisplay,
index 1d99b61db085f6f873eb3fbe9db5e6f3579f4063..96964d1db1020c6156bd7047f064b2df2fe0d45e 100644 (file)
@@ -356,6 +356,7 @@ __glXProcessServerString( const struct extension_info * ext,
    }
 }
 
+#ifdef GLX_DIRECT_RENDERING
 
 /**
  * Enable a named GLX extension on a given screen.
@@ -370,14 +371,18 @@ __glXProcessServerString( const struct extension_info * ext,
  * \since Internal API version 20030813.
  */
 void
-__glXScrEnableExtension( __GLXscreenConfigs *psc, const char * name )
+__glXScrEnableExtension( __DRIscreen *driScreen, const char * name )
 {
+    __GLXscreenConfigs *psc =
+       containerOf(driScreen, __GLXscreenConfigs, driScreen);
+
    __glXExtensionsCtr();
    __glXExtensionsCtrScreen(psc);
    set_glx_extension( known_glx_extensions, name, strlen( name ), GL_TRUE,
                      psc->direct_support );
 }
 
+#endif
 
 /**
  * Initialize global extension support tables.
index a4241b6b7f97d016370fecd43a2fa0c372b46aaf..62bbf116e93033bd7183d98af1c06a27d2882ae4 100644 (file)
@@ -234,7 +234,14 @@ extern GLboolean __glXExtensionBitIsEnabled( struct __GLXscreenConfigsRec *psc,
 extern const char * __glXGetClientExtensions( void );
 extern void __glXCalculateUsableExtensions( struct __GLXscreenConfigsRec *psc,
     GLboolean display_is_direct_capable, int server_minor_version );
-extern void __glXScrEnableExtension( struct __GLXscreenConfigsRec *psc, const char * name );
+
+#ifdef GLX_DIRECT_RENDERING
+
+struct __DRIscreenRec;
+extern void __glXScrEnableExtension( struct __DRIscreenRec *driScreen, const char * name );
+
+#endif
+
 extern void __glXCalculateUsableGLExtensions( struct __GLXcontextRec * gc,
     const char * server_string, int major_version, int minor_version );
 extern void __glXGetGLVersion( int * major_version, int * minor_version );
index 7a11672a8f1a6f95e7222c5184bf02b4d671d332..6ecde574b4f82a8f7dbc1062613bdcb410987ec3 100644 (file)
@@ -430,7 +430,6 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
       (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->
                                       getProcAddress("glxEnableExtension"));
-   void *const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
       fprintf(stderr,
@@ -524,11 +523,11 @@ intelInitDriver(__DRIscreenPrivate * sPriv)
    }
 
    if (glx_enable_extension != NULL) {
-      (*glx_enable_extension) (psc, "GLX_SGI_swap_control");
-      (*glx_enable_extension) (psc, "GLX_SGI_video_sync");
-      (*glx_enable_extension) (psc, "GLX_MESA_swap_control");
-      (*glx_enable_extension) (psc, "GLX_MESA_swap_frame_usage");
-      (*glx_enable_extension) (psc, "GLX_SGI_make_current_read");
+      (*glx_enable_extension) (sPriv->psc, "GLX_SGI_swap_control");
+      (*glx_enable_extension) (sPriv->psc, "GLX_SGI_video_sync");
+      (*glx_enable_extension) (sPriv->psc, "GLX_MESA_swap_control");
+      (*glx_enable_extension) (sPriv->psc, "GLX_MESA_swap_frame_usage");
+      (*glx_enable_extension) (sPriv->psc, "GLX_SGI_make_current_read");
    }
 
    /* If we've got a new enough DDX that's initializing TTM and giving us
index 29ea07d78ef7d0ef391d44f8e0bf9527e2d857e1..97ccba09d828619fba90624716c009e579a3619e 100644 (file)
@@ -271,7 +271,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
    I830DRIPtr         gDRIPriv = (I830DRIPtr)sPriv->pDevPriv;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void * const psc = sPriv->psc->screenConfigs;
    volatile drmI830Sarea *sarea;
 
    if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
@@ -352,12 +351,12 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
    }
 
    if (glx_enable_extension != NULL) {
-      (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-      (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
-      (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
-      (*glx_enable_extension)( psc, "GLX_MESA_copy_sub_buffer" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_copy_sub_buffer" );
    }
    
    return GL_TRUE;
index 52b96bf0bc030ce7d541b27db3dde09a750f955a..733a16b6aef0c29921576bc1065ec25cdde8c2eb 100644 (file)
@@ -210,7 +210,6 @@ mach64CreateScreen( __DRIscreenPrivate *sPriv )
    ATIDRIPtr serverInfo = (ATIDRIPtr)sPriv->pDevPriv;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void * const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(ATIDRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(ATIDRIRec) does not match passed size from device driver\n");
@@ -321,12 +320,12 @@ mach64CreateScreen( __DRIscreenPrivate *sPriv )
 
    if ( glx_enable_extension != NULL ) {
       if ( mach64Screen->irq != 0 ) {
-        (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-        (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
-        (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
       }
 
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
    }
 
    return mach64Screen;
index 372d2ce433925bf96e9ff3556b156907a5b7cc68..5b9d09d0bf3cfb094b97802708b61fa33ab79798 100644 (file)
@@ -200,7 +200,6 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
    MGADRIPtr         serverInfo = (MGADRIPtr)sPriv->pDevPriv;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
        (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void * const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(MGADRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(MGADRIRec) does not match passed size from device driver\n");
@@ -236,11 +235,11 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
    }
 
    if ( glx_enable_extension != NULL ) {
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
-      (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
-      (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-      (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
    }
 
    if (serverInfo->chipset != MGA_CARD_TYPE_G200 &&
index a84b54924acd927d46a55aa5f9a62659e6ba0247..9df9c65faef1a5952d472566343e50e6c5168301 100644 (file)
@@ -100,7 +100,6 @@ r128CreateScreen( __DRIscreenPrivate *sPriv )
    R128DRIPtr r128DRIPriv = (R128DRIPtr)sPriv->pDevPriv;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void * const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(R128DRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(R128DRIRec) does not match passed size from device driver\n");
@@ -228,12 +227,12 @@ r128CreateScreen( __DRIscreenPrivate *sPriv )
 
    if ( glx_enable_extension != NULL ) {
       if ( r128Screen->irq != 0 ) {
-        (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-        (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
-        (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
       }
 
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
    }
 
    return r128Screen;
index 2d44532a8433b35516d8e2b5a2f4a66ee8ceee4a..8f9509de5b2261437adeeb2c1160c2f9757260a1 100644 (file)
@@ -343,7 +343,6 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
    unsigned char *RADEONMMIO;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void * const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(RADEONDRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(RADEONDRIRec) does not match passed size from device driver\n");
@@ -734,17 +733,17 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
 
    if ( glx_enable_extension != NULL ) {
       if ( screen->irq != 0 ) {
-        (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-        (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
-        (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
       }
 
-      (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
       if (IS_R200_CLASS(screen))
-        (*glx_enable_extension)( psc, "GLX_MESA_allocate_memory" );
+        (*glx_enable_extension)( sPriv->psc, "GLX_MESA_allocate_memory" );
 
-      (*glx_enable_extension)( psc, "GLX_MESA_copy_sub_buffer" );
-      (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_MESA_copy_sub_buffer" );
+      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
    }
 
 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
index e8a63ae51b9781aeb0214259442cf3594ebd0312..9678c526aa01721503b8f8fd9dd03fefa0f258e4 100644 (file)
@@ -266,8 +266,7 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
                       __driConfigOptions, __driNConfigOptions);
 
    if (glx_enable_extension != NULL) {
-      (*glx_enable_extension)(sPriv->psc->screenConfigs,
-                             "GLX_SGI_make_current_read");
+      (*glx_enable_extension)(sPriv->psc, "GLX_SGI_make_current_read");
    }
 
 #if 0
index 899963d06d3db0e61ac03ba3acea2aa652129e7f..e9033c5ef3a17ab0f91e6a695acb07d655722418 100644 (file)
@@ -75,7 +75,6 @@ tdfxCreateScreen( __DRIscreenPrivate *sPriv )
    TDFXDRIPtr fxDRIPriv = (TDFXDRIPtr) sPriv->pDevPriv;
    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-   void *const psc = sPriv->psc->screenConfigs;
 
    if (sPriv->devPrivSize != sizeof(TDFXDRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(TDFXDRIRec) does not match passed size from device driver\n");
@@ -117,7 +116,7 @@ tdfxCreateScreen( __DRIscreenPrivate *sPriv )
    }
 
    if (glx_enable_extension != NULL) {
-      (*glx_enable_extension)(psc, "GLX_SGI_make_current_read");
+      (*glx_enable_extension)(sPriv->psc, "GLX_SGI_make_current_read");
    }
 
    return GL_TRUE;
index c10b7d1a9b1a1120c0ac83f869c948ebdb700087..22e4bcebc91d597ed4c681bd4f71f6c8ef927242 100644 (file)
@@ -100,7 +100,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
     VIADRIPtr gDRIPriv = (VIADRIPtr)sPriv->pDevPriv;
     PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
       (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-    void * const psc = sPriv->psc->screenConfigs;
 
     if (sPriv->devPrivSize != sizeof(VIADRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(VIADRIRec) does not match passed size from device driver\n");
@@ -177,13 +176,13 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
 
     if ( glx_enable_extension != NULL ) {
        if ( viaScreen->irqEnabled ) {
-         (*glx_enable_extension)( psc, "GLX_SGI_swap_control" );
-         (*glx_enable_extension)( psc, "GLX_SGI_video_sync" );
-         (*glx_enable_extension)( psc, "GLX_MESA_swap_control" );
+         (*glx_enable_extension)( sPriv->psc, "GLX_SGI_swap_control" );
+         (*glx_enable_extension)( sPriv->psc, "GLX_SGI_video_sync" );
+         (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_control" );
        }
 
-       (*glx_enable_extension)( psc, "GLX_SGI_make_current_read" );
-       (*glx_enable_extension)( psc, "GLX_MESA_swap_frame_usage" );
+       (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
+       (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
     }
 
     return GL_TRUE;