Add a DRI_ReadDrawable marker extension to signal read drawable capability.
authorKristian Høgsberg <krh@hinata.boston.redhat.com>
Thu, 17 May 2007 18:39:06 +0000 (14:39 -0400)
committerKristian Høgsberg <krh@redhat.com>
Thu, 11 Oct 2007 15:22:55 +0000 (11:22 -0400)
13 files changed:
include/GL/internal/dri_interface.h
src/glx/x11/glxext.c
src/mesa/drivers/dri/common/dri_util.c
src/mesa/drivers/dri/common/dri_util.h
src/mesa/drivers/dri/i915/intel_screen.c
src/mesa/drivers/dri/i965/intel_screen.c
src/mesa/drivers/dri/mga/mga_xmesa.c
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.h
src/mesa/drivers/dri/savage/savage_xmesa.c
src/mesa/drivers/dri/tdfx/tdfx_screen.c
src/mesa/drivers/dri/unichrome/via_screen.c
src/mesa/drivers/dri/unichrome/via_screen.h

index 2c91876e0db877365dd59914ecc47950d6501ec0..cce3b6fcf02646b4cfc5021d2ae6d5c957366282 100644 (file)
@@ -78,6 +78,11 @@ struct __DRIextensionRec {
     const char *name;
 };
 
+/**
+ * Used by drivers to indicate support for setting the read drawable.
+ */
+#define __DRI_READ_DRAWABLE "DRI_ReadDrawable"
+
 /**
  * Used by drivers that implement the GLX_MESA_copy_sub_buffer extension.
  */
index 643db487c581b58ef8f9c88e369e63bca21f72a1..3db163af1ee959f14a4f3a80313abbb3f3970750 100644 (file)
@@ -1068,6 +1068,13 @@ static void queryExtensions(__GLXscreenConfigs *psc)
         * not defined in dri_interface.h.  Will enable
         * GLX_OML_sync_control if implemented. */
 #endif
+
+#ifdef __DRI_READ_DRAWABLE
+       if (strcmp(extensions[i]->name, __DRI_READ_DRAWABLE) == 0) {
+           __glXScrEnableExtension(&psc->driScreen,
+                                   "GLX_SGI_make_current_read");
+       }
+#endif
        /* Ignore unknown extensions */
     }
 }
index e20c4fe5face9f532b6e9fe3b7f0413bbc302da1..b88592313ed6e09a67c671ca1f0fe16942bab2e1 100644 (file)
@@ -46,6 +46,14 @@ const __DRIinterfaceMethods * dri_interface = NULL;
 static const int empty_attribute_list[1] = { None };
 
 
+/**
+ * This is just a token extension used to signal that the driver
+ * supports setting a read drawable.
+ */
+const __DRIextension driReadDrawableExtension = {
+    __DRI_READ_DRAWABLE
+};
+
 /**
  * Cached copy of the internal API version used by libGL and the client-side
  * DRI driver.
index e43a5b752e89b37272c68e2668ea843b52b0605b..91992a9a24225133def35d4438655b85f6ff466e 100644 (file)
@@ -76,6 +76,7 @@ extern __GLcontextModes *__driDriverInitScreen(__DRIscreenPrivate *psp);
 /**
  * Extensions.
  */
+extern const __DRIextension driReadDrawableExtension;
 extern const __DRIcopySubBufferExtension driCopySubBufferExtension;
 extern const __DRIswapControlExtension driSwapControlExtension;
 extern const __DRIframeTrackingExtension driFrameTrackingExtension;
index 60d375874dfcb0d8f6a9f7ca41882410437c4c9b..191d26e84bd55117f66eb248919d5ec0b8ff8705 100644 (file)
@@ -427,6 +427,7 @@ static const __DRIallocateExtension intelAllocateExtension = {
 };
 
 static const __DRIextension *intelExtensions[] = {
+    &driReadDrawableExtension,
     &driCopySubBufferExtension.base,
     &driSwapControlExtension.base,
     &intelAllocateExtension.base,
@@ -442,10 +443,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
    I830DRIPtr gDRIPriv = (I830DRIPtr) sPriv->pDevPriv;
    drmI830Sarea *sarea;
 
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->
-                                      getProcAddress("glxEnableExtension"));
-
    if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
       fprintf(stderr,
               "\nERROR!  sizeof(I830DRIRec) does not match passed size from device driver\n");
@@ -539,10 +536,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
 
    sPriv->extensions = intelExtensions;
 
-   if (glx_enable_extension != NULL) {
-      (*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
     * object handles for the shared buffers, use that.
     */
index a4d63599e555186108359bdcc29771f2ee041daa..e35f7da938731a178a0a4e4d72425089e843ab82 100644 (file)
@@ -265,6 +265,7 @@ intelUpdateScreenFromSAREA(intelScreenPrivate *intelScreen,
 }
 
 static const __DRIextension *intelExtensions[] = {
+    &driReadDrawableExtension,
     &driCopySubBufferExtension.base,
     &driSwapControlExtension.base,
     &driFrameTrackingExtension.base,
@@ -276,8 +277,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
 {
    intelScreenPrivate *intelScreen;
    I830DRIPtr         gDRIPriv = (I830DRIPtr)sPriv->pDevPriv;
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-     (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
    volatile drmI830Sarea *sarea;
 
    if (sPriv->devPrivSize != sizeof(I830DRIRec)) {
@@ -358,9 +357,6 @@ static GLboolean intelInitDriver(__DRIscreenPrivate *sPriv)
    }
 
    sPriv->extensions = intelExtensions;
-
-   if (glx_enable_extension != NULL)
-      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
    
    return GL_TRUE;
 }
index 6f138351ccdb5bffa82fcddfe009657cd0857851..99a2ea04911f962fd5bef166f88c85701a08526a 100644 (file)
@@ -194,6 +194,7 @@ mgaFillInModes( unsigned pixel_bits, unsigned depth_bits,
 
 
 static const __DRIextension *mgaExtensions[] = {
+    &driReadDrawableExtension,
     &driSwapControlExtension.base,
     &driFrameTrackingExtension.base,
     &driMediaStreamCounterExtension.base,
@@ -205,8 +206,6 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
 {
    mgaScreenPrivate *mgaScreen;
    MGADRIPtr         serverInfo = (MGADRIPtr)sPriv->pDevPriv;
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-       (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
 
    if (sPriv->devPrivSize != sizeof(MGADRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(MGADRIRec) does not match passed size from device driver\n");
@@ -243,9 +242,6 @@ mgaInitDriver(__DRIscreenPrivate *sPriv)
 
    sPriv->extensions = mgaExtensions;
 
-   if ( glx_enable_extension != NULL )
-      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
-
    if (serverInfo->chipset != MGA_CARD_TYPE_G200 &&
        serverInfo->chipset != MGA_CARD_TYPE_G400) {
       FREE(mgaScreen);
index 56493f5a3aa128d313e962e2a6a655bc20cc0867..269620cec47880f1271266cec8a35a03272aa9b7 100644 (file)
@@ -351,8 +351,6 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
    radeonScreenPtr screen;
    RADEONDRIPtr dri_priv = (RADEONDRIPtr)sPriv->pDevPriv;
    unsigned char *RADEONMMIO;
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-     (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
    int i;
 
    if (sPriv->devPrivSize != sizeof(RADEONDRIRec)) {
@@ -745,12 +743,12 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
    i = 0;
    screen->extensions[i++] = &driCopySubBufferExtension.base;
    screen->extensions[i++] = &driFrameTrackingExtension.base;
+   screen->extensions[i++] = &driReadDrawableExtension;
+
    if ( screen->irq != 0 ) {
        screen->extensions[i++] = &driSwapControlExtension.base;
        screen->extensions[i++] = &driMediaStreamCounterExtension.base;
    }
-   if ( glx_enable_extension != NULL )
-      (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
 
 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
    if (IS_R200_CLASS(screen))
index 0caac17dafb8407ebd2fe8d64fccfc799f7bac17..68755c985a68104d6ae5c97e94bb66273191deb2 100644 (file)
@@ -104,7 +104,7 @@ typedef struct {
    /* Configuration cache with default values for all contexts */
    driOptionCache optionCache;
 
-   const __DRIextension *extensions[6];
+   const __DRIextension *extensions[7];
 } radeonScreenRec, *radeonScreenPtr;
 
 #define IS_R100_CLASS(screen) \
index 3750c8948ac6e8542cb97c8a33a7087bdf099f33..013e88216fa70c190eeaead402e34eb2860b91f3 100644 (file)
@@ -168,6 +168,10 @@ static const struct tnl_pipeline_stage *savage_pipeline[] = {
 };
 
 
+static const __DRIextension *savageExtensions[] = {
+    &driReadDrawableExtension,
+};
+
 /* this is first function called in dirver*/
 
 static GLboolean
@@ -175,9 +179,6 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
 {
   savageScreenPrivate *savageScreen;
   SAVAGEDRIPtr         gDRIPriv = (SAVAGEDRIPtr)sPriv->pDevPriv;
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-     (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
-
 
    if (sPriv->devPrivSize != sizeof(SAVAGEDRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(SAVAGEDRIRec) does not match passed size from device driver\n");
@@ -265,9 +266,7 @@ savageInitDriver(__DRIscreenPrivate *sPriv)
    driParseOptionInfo (&savageScreen->optionCache,
                       __driConfigOptions, __driNConfigOptions);
 
-   if (glx_enable_extension != NULL) {
-      (*glx_enable_extension)(sPriv->psc, "GLX_SGI_make_current_read");
-   }
+   sPriv->extensions = savageExtensions;
 
 #if 0
    savageDDFastPathInit();
index 081a534035777a7542c2de64416b0a62873eea21..5bdb446d1551ed1d8ddf4e9bb297ccb6aa8096dc 100644 (file)
@@ -63,6 +63,10 @@ DRI_CONF_BEGIN
     DRI_CONF_SECTION_END
 DRI_CONF_END;
 
+static const __DRIextension *tdfxExtensions[] = {
+    &driReadDrawableExtension,
+};
+
 static const GLuint __driNConfigOptions = 1;
 
 extern const struct dri_extension card_extensions[];
@@ -73,8 +77,6 @@ tdfxCreateScreen( __DRIscreenPrivate *sPriv )
 {
    tdfxScreenPrivate *fxScreen;
    TDFXDRIPtr fxDRIPriv = (TDFXDRIPtr) sPriv->pDevPriv;
-   PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-     (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
 
    if (sPriv->devPrivSize != sizeof(TDFXDRIRec)) {
       fprintf(stderr,"\nERROR!  sizeof(TDFXDRIRec) does not match passed size from device driver\n");
@@ -115,9 +117,7 @@ tdfxCreateScreen( __DRIscreenPrivate *sPriv )
       return GL_FALSE;
    }
 
-   if (glx_enable_extension != NULL) {
-      (*glx_enable_extension)(sPriv->psc, "GLX_SGI_make_current_read");
-   }
+   sPriv->extensions = tdfxExtensions;
 
    return GL_TRUE;
 }
index fddf0799346bf359d360e8954f96988b64775b90..f3912ac352146ffde3fce314620d594de376f27f 100644 (file)
@@ -98,8 +98,6 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
 {
     viaScreenPrivate *viaScreen;
     VIADRIPtr gDRIPriv = (VIADRIPtr)sPriv->pDevPriv;
-    PFNGLXSCRENABLEEXTENSIONPROC glx_enable_extension =
-      (PFNGLXSCRENABLEEXTENSIONPROC) (*dri_interface->getProcAddress("glxEnableExtension"));
     int i;
 
     if (sPriv->devPrivSize != sizeof(VIADRIRec)) {
@@ -177,14 +175,12 @@ viaInitDriver(__DRIscreenPrivate *sPriv)
 
     i = 0;
     viaScreen->extensions[i++] = &driFrameTrackingExtension.base;
+    viaScreen->extensions[i++] = &driReadDrawableExtension;
     if ( viaScreen->irqEnabled ) {
        viaScreen->extensions[i++] = &driSwapControlExtension.base;
        viaScreen->extensions[i++] = &driMediaStreamCounterExtension.base;
     }
 
-    if ( glx_enable_extension != NULL )
-       (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
-
     viaScreen->extensions[i++] = NULL;
     sPriv->extensions = viaScreen->extensions;
 
index 5e5bc851b05dd7005c3f2073abe1569354f2339d..c3ef722ff0720fe780e1644630d8f26a8be6c932 100644 (file)
@@ -71,7 +71,7 @@ typedef struct {
     /* Configuration cache with default values for all contexts */
     driOptionCache optionCache;
 
-    const __DRIextension *extensions[4];
+    const __DRIextension *extensions[5];
 } viaScreenPrivate;