OSDN Git Service

Move GLX_MESA_allocate_memory related functions to new extension mechanism.
authorKristian Høgsberg <krh@hinata.boston.redhat.com>
Wed, 16 May 2007 18:10:29 +0000 (14:10 -0400)
committerKristian Høgsberg <krh@redhat.com>
Thu, 11 Oct 2007 15:09:57 +0000 (11:09 -0400)
include/GL/internal/dri_interface.h
src/glx/x11/glxclient.h
src/glx/x11/glxcmds.c
src/glx/x11/glxext.c
src/mesa/drivers/dri/i915/intel_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.c
src/mesa/drivers/dri/radeon/radeon_screen.h

index 7eb168a..fcf8252 100644 (file)
@@ -57,9 +57,10 @@ typedef struct __DRIframebufferRec   __DRIframebuffer;
 typedef struct __DRIversionRec         __DRIversion;
 typedef struct __DRIinterfaceMethodsRec        __DRIinterfaceMethods;
 
-typedef struct __DRIextensionRec       __DRIextension;
+typedef struct __DRIextensionRec               __DRIextension;
 typedef struct __DRIcopySubBufferExtensionRec  __DRIcopySubBufferExtension;
 typedef struct __DRIswapControlExtensionRec    __DRIswapControlExtension;
+typedef struct __DRIallocateExtensionRec       __DRIallocateExtension;
 /*@}*/
 
 
@@ -96,6 +97,22 @@ struct __DRIswapControlExtensionRec {
 };
 
 /**
+ * Used by drivers that implement the GLX_MESA_allocate_memory.
+ */
+#define __DRI_ALLOCATE "DRI_Allocate"
+struct __DRIallocateExtensionRec {
+    __DRIextension base;
+
+    void *(*allocateMemory)(__DRIscreen *screen, GLsizei size,
+                           GLfloat readfreq, GLfloat writefreq,
+                           GLfloat priority);
+   
+    void (*freeMemory)(__DRIscreen *screen, GLvoid *pointer);
+   
+    GLuint (*memoryOffset)(__DRIscreen *screen, const GLvoid *pointer);
+};
+
+/**
  * \name Functions provided by the driver loader.
  */
 /*@{*/
@@ -341,21 +358,6 @@ struct __DRIscreenRec {
     int (*getMSC)(__DRIscreen *screen, int64_t *msc);
 
     /**
-     * Functions associated with MESA_allocate_memory.
-     *
-     * \since Internal API version 20030815.
-     */
-    /*@{*/
-    void *(*allocateMemory)(__DRIscreen *screen, GLsizei size,
-                           GLfloat readfreq, GLfloat writefreq,
-                           GLfloat priority);
-   
-    void (*freeMemory)(__DRIscreen *screen, GLvoid *pointer);
-   
-    GLuint (*memoryOffset)(__DRIscreen *screen, const GLvoid *pointer);
-    /*@}*/
-
-    /**
      * Method to create the private DRI context data and initialize the
      * context dependent methods.
      *
index 09ae702..b60d8a0 100644 (file)
@@ -485,6 +485,10 @@ struct __GLXscreenConfigsRec {
     __DRIswapControlExtension *swapControl;
 #endif
 
+#ifdef __DRI_ALLOCATE
+    __DRIallocateExtension *allocate;
+#endif
+
 #endif
 
     /**
index 6fda512..e2deca5 100644 (file)
@@ -2371,16 +2371,14 @@ PUBLIC void *glXAllocateMemoryMESA(Display *dpy, int scrn,
                                   size_t size, float readFreq,
                                   float writeFreq, float priority)
 {
-#ifdef GLX_DIRECT_RENDERING
+#ifdef __DRI_ALLOCATE
    __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
 
-   if ( __glXExtensionBitIsEnabled( psc, MESA_allocate_memory_bit ) ) {
-      if (psc && psc->driScreen.private && psc->driScreen.allocateMemory) {
-        return (*psc->driScreen.allocateMemory)( &psc->driScreen, size,
-                                                 readFreq, writeFreq,
-                                                 priority );
-      }
-   }
+   if (psc && psc->allocate)
+       return (*psc->allocate->allocateMemory)( &psc->driScreen, size,
+                                               readFreq, writeFreq,
+                                               priority );
+
 #else
    (void) dpy;
    (void) scrn;
@@ -2396,14 +2394,12 @@ PUBLIC void *glXAllocateMemoryMESA(Display *dpy, int scrn,
 
 PUBLIC void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer)
 {
-#ifdef GLX_DIRECT_RENDERING
+#ifdef __DRI_ALLOCATE
    __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
 
-   if ( __glXExtensionBitIsEnabled( psc, MESA_allocate_memory_bit ) ) {
-      if (psc && psc->driScreen.private && psc->driScreen.freeMemory) {
-        (*psc->driScreen.freeMemory)( &psc->driScreen, pointer );
-      }
-   }
+   if (psc && psc->allocate)
+        (*psc->allocate->freeMemory)( &psc->driScreen, pointer );
+
 #else
    (void) dpy;
    (void) scrn;
@@ -2415,14 +2411,12 @@ PUBLIC void glXFreeMemoryMESA(Display *dpy, int scrn, void *pointer)
 PUBLIC GLuint glXGetMemoryOffsetMESA( Display *dpy, int scrn,
                                      const void *pointer )
 {
-#ifdef GLX_DIRECT_RENDERING
+#ifdef __DRI_ALLOCATE
    __GLXscreenConfigs * const psc = GetGLXScreenConfigs( dpy, scrn );
 
-   if ( __glXExtensionBitIsEnabled( psc, MESA_allocate_memory_bit ) ) {
-      if (psc && psc->driScreen.private && psc->driScreen.memoryOffset) {
-        return (*psc->driScreen.memoryOffset)( &psc->driScreen, pointer );
-      }
-   }
+   if (psc && psc->allocate)
+       return (*psc->allocate->memoryOffset)( &psc->driScreen, pointer );
+
 #else
    (void) dpy;
    (void) scrn;
index 1563ca6..8275b4b 100644 (file)
@@ -1039,6 +1039,17 @@ static void queryExtensions(__GLXscreenConfigs *psc)
        }
 #endif
 
+#ifdef __DRI_ALLOCATE
+       if (strcmp(extensions[i]->name, __DRI_ALLOCATE) == 0) {
+           psc->allocate = (__DRIallocateExtension *) extensions[i];
+           __glXScrEnableExtension(&psc->driScreen,
+                                   "GLX_SGI_swap_control");
+           __glXScrEnableExtension(&psc->driScreen,
+                                   "GLX_MESA_swap_control");
+           
+       }
+#endif
+
        /* Ignore unknown extensions */
     }
 }
index f507a3b..27bf5e1 100644 (file)
@@ -419,9 +419,17 @@ intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
       intelPrintSAREA(sarea);
 }
 
+static const __DRIallocateExtension intelAllocateExtension = {
+    { __DRI_ALLOCATE },
+    intelAllocateMemoryMESA,
+    intelFreeMemoryMESA,
+    intelGetMemoryOffsetMESA
+};
+
 static const __DRIextension *intelExtensions[] = {
     &driCopySubBufferExtension.base,
     &driSwapControlExtension.base,
+    &intelAllocateExtension.base,
     NULL
 };
 
index 46160ba..362d70f 100644 (file)
@@ -332,6 +332,17 @@ radeonFillInModes( unsigned pixel_bits, unsigned depth_bits,
     return modes;
 }
 
+#if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
+
+static const __DRIallocateExtension r200AllocateExtension = {
+    { __DRI_ALLOCATE },
+    r200AllocateMemoryMESA,
+    r200FreeMemoryMESA,
+    r200GetMemoryOffsetMESA
+};
+
+#endif
+
 /* Create the device specific screen private data struct.
  */
 static radeonScreenPtr
@@ -741,22 +752,17 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
       }
 
       (*glx_enable_extension)( sPriv->psc, "GLX_MESA_swap_frame_usage" );
-      if (IS_R200_CLASS(screen))
-        (*glx_enable_extension)( sPriv->psc, "GLX_MESA_allocate_memory" );
-
       (*glx_enable_extension)( sPriv->psc, "GLX_SGI_make_current_read" );
    }
-   screen->extensions[i++] = NULL;
-   sPriv->extensions = screen->extensions;
 
 #if RADEON_COMMON && defined(RADEON_COMMON_FOR_R200)
-   if (IS_R200_CLASS(screen)) {
-      sPriv->psc->allocateMemory = (void *) r200AllocateMemoryMESA;
-      sPriv->psc->freeMemory     = (void *) r200FreeMemoryMESA;
-      sPriv->psc->memoryOffset   = (void *) r200GetMemoryOffsetMESA;
-   }
+   if (IS_R200_CLASS(screen))
+       screen->extensions[i++] = &r200AllocateExtension.base;
 #endif
 
+   screen->extensions[i++] = NULL;
+   sPriv->extensions = screen->extensions;
+
    screen->driScreen = sPriv;
    screen->sarea_priv_offset = dri_priv->sarea_priv_offset;
    return screen;
index eceab53..954096f 100644 (file)
@@ -104,7 +104,7 @@ typedef struct {
    /* Configuration cache with default values for all contexts */
    driOptionCache optionCache;
 
-   const __DRIextension *extensions[3];
+   const __DRIextension *extensions[4];
 } radeonScreenRec, *radeonScreenPtr;
 
 #define IS_R100_CLASS(screen) \