Mesa (master): glx: Split tfp functions out to context vtable

Kristian Høgsberg krh at kemper.freedesktop.org
Sat May 22 03:37:40 UTC 2010


Module: Mesa
Branch: master
Commit: 643b2af0203764cb9f0a5b9e082937ab3f243523
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=643b2af0203764cb9f0a5b9e082937ab3f243523

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Fri May 21 10:36:56 2010 -0400

glx: Split tfp functions out to context vtable

This introduces a new per-context vtable, which lets us clean up all the
#ifdef's a bit and move the DRI2 specific implementation into dri2_glx.c.

---

 src/glx/dri2_glx.c  |   36 ++++++++++++++++++++++
 src/glx/dri_glx.c   |    7 ++++
 src/glx/glxclient.h |   15 +++++++++
 src/glx/glxcmds.c   |   81 ++++++++++++++++++++++++++-------------------------
 4 files changed, 99 insertions(+), 40 deletions(-)

diff --git a/src/glx/dri2_glx.c b/src/glx/dri2_glx.c
index 4595991..ba546a6 100644
--- a/src/glx/dri2_glx.c
+++ b/src/glx/dri2_glx.c
@@ -563,6 +563,40 @@ dri2InvalidateBuffers(Display *dpy, XID drawable)
 #endif
 }
 
+static void
+dri2_bind_tex_image(Display * dpy,
+		    GLXDrawable drawable,
+		    int buffer, const int *attrib_list)
+{
+   GLXContext gc = __glXGetCurrentContext();
+   __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
+
+   if (pdraw != NULL) {
+      if (pdraw->psc->texBuffer->base.version >= 2 &&
+	  pdraw->psc->texBuffer->setTexBuffer2 != NULL) {
+	 (*pdraw->psc->texBuffer->setTexBuffer2) (gc->__driContext,
+						  pdraw->textureTarget,
+						  pdraw->textureFormat,
+						  pdraw->driDrawable);
+      }
+      else {
+	 (*pdraw->psc->texBuffer->setTexBuffer) (gc->__driContext,
+						 pdraw->textureTarget,
+						 pdraw->driDrawable);
+      }
+   }
+}
+
+static void
+dri2_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
+{
+}
+
+static const struct glx_context_vtable dri2_context_vtable = {
+   dri2_bind_tex_image,
+   dri2_release_tex_image,
+};
+
 static __GLXDRIscreen *
 dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
                  __GLXdisplayPrivate * priv)
@@ -683,6 +717,8 @@ dri2CreateScreen(__GLXscreenConfigs * psc, int screen,
    psp->copySubBuffer = dri2CopySubBuffer;
    __glXEnableDirectExtension(psc, "GLX_MESA_copy_sub_buffer");
 
+   psc->direct_context_vtable = &dri2_context_vtable;
+
    Xfree(driverName);
    Xfree(deviceName);
 
diff --git a/src/glx/dri_glx.c b/src/glx/dri_glx.c
index 74afa60..12a2cf3 100644
--- a/src/glx/dri_glx.c
+++ b/src/glx/dri_glx.c
@@ -634,6 +634,11 @@ driDestroyScreen(__GLXscreenConfigs * psc)
       dlclose(psc->driver);
 }
 
+static const struct glx_context_vtable dri_context_vtable = {
+   NULL,
+   NULL,
+};
+
 static __GLXDRIscreen *
 driCreateScreen(__GLXscreenConfigs * psc, int screen,
                 __GLXdisplayPrivate * priv)
@@ -700,6 +705,8 @@ driCreateScreen(__GLXscreenConfigs * psc, int screen,
    psp->waitX = NULL;
    psp->waitGL = NULL;
 
+   psc->direct_context_vtable = &dri_context_vtable;
+
    return psp;
 }
 
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 57d254e..78c5f33 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -249,6 +249,14 @@ typedef struct __GLXattributeMachineRec
    __GLXattribute **stackPointer;
 } __GLXattributeMachine;
 
+struct glx_context_vtable {
+   void (*bind_tex_image)(Display * dpy,
+			  GLXDrawable drawable,
+			  int buffer, const int *attrib_list);
+   void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer);
+   
+};
+
 /**
  * GLX state that needs to be kept on the client.  One of these records
  * exist for each context that has been made current by this client.
@@ -457,6 +465,8 @@ struct __GLXcontextRec
    unsigned long thread_id;
 
    char gl_extension_bits[__GL_EXT_BYTES];
+
+   const struct glx_context_vtable *vtable;
 };
 
 #define __glXSetError(gc,code)  \
@@ -511,6 +521,11 @@ struct __GLXscreenConfigsRec
      */
    char *effectiveGLXexts;
 
+   /**
+    * Context vtable to use for direct contexts on this screen
+    */
+   const struct glx_context_vtable *direct_context_vtable;
+
 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
     /**
      * Per screen direct rendering interface functions and data.
diff --git a/src/glx/glxcmds.c b/src/glx/glxcmds.c
index 34fbecf..16c4eef 100644
--- a/src/glx/glxcmds.c
+++ b/src/glx/glxcmds.c
@@ -62,9 +62,7 @@
 
 static const char __glXGLXClientVendorName[] = "Mesa Project and SGI";
 static const char __glXGLXClientVersion[] = "1.4";
-
-
-/****************************************************************************/
+static const struct glx_context_vtable glx_indirect_context_vtable;
 
 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
 
@@ -378,13 +376,10 @@ CreateContext(Display * dpy, int generic_id,
 	      unsigned code, int renderType, int screen)
 {
    GLXContext gc;
-#ifdef GLX_DIRECT_RENDERING
-#ifdef GLX_USE_APPLEGL
+   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
+#if defined(GLX_DIRECT_RENDERING) && defined(GLX_USE_APPLEGL)
    int errorcode;
    bool x11error;
-#else
-   __GLXscreenConfigs *const psc = GetGLXScreenConfigs(dpy, screen);
-#endif
 #endif
     
    if (dpy == NULL)
@@ -411,6 +406,11 @@ CreateContext(Display * dpy, int generic_id,
    }
 #endif
 
+   if (gc->driContext != NULL)
+      gc->vtable = psc->direct_context_vtable;
+   else
+      gc->vtable = &glx_indirect_context_vtable;
+
    LockDisplay(dpy);
    switch (code) {
    case X_GLXCreateContext: {
@@ -2997,10 +2997,10 @@ __glXCopySubBufferMESA(Display * dpy, GLXDrawable drawable,
 /**
  * GLX_EXT_texture_from_pixmap
  */
-/*@{*/
 static void
-__glXBindTexImageEXT(Display * dpy,
-                     GLXDrawable drawable, int buffer, const int *attrib_list)
+glx_indirect_bind_tex_image(Display * dpy,
+			    GLXDrawable drawable,
+			    int buffer, const int *attrib_list)
 {
    xGLXVendorPrivateReq *req;
    GLXContext gc = __glXGetCurrentContext();
@@ -3011,37 +3011,12 @@ __glXBindTexImageEXT(Display * dpy,
    CARD8 opcode;
    unsigned int i;
 
-   if (gc == NULL)
-      return;
-
    i = 0;
    if (attrib_list) {
       while (attrib_list[i * 2] != None)
          i++;
    }
 
-#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
-   if (gc->driContext) {
-      __GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, drawable, NULL);
-
-      if (pdraw != NULL) {
-         if (pdraw->psc->texBuffer->base.version >= 2 &&
-             pdraw->psc->texBuffer->setTexBuffer2 != NULL) {
-            (*pdraw->psc->texBuffer->setTexBuffer2) (gc->__driContext,
-                                                     pdraw->textureTarget,
-                                                     pdraw->textureFormat,
-                                                     pdraw->driDrawable);
-         }
-         else {
-            (*pdraw->psc->texBuffer->setTexBuffer) (gc->__driContext,
-                                                    pdraw->textureTarget,
-                                                    pdraw->driDrawable);
-         }
-      }
-      return;
-   }
-#endif
-
    opcode = __glXSetupForCommand(dpy);
    if (!opcode)
       return;
@@ -3076,7 +3051,7 @@ __glXBindTexImageEXT(Display * dpy,
 }
 
 static void
-__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
+glx_indirect_release_tex_image(Display * dpy, GLXDrawable drawable, int buffer)
 {
    xGLXVendorPrivateReq *req;
    GLXContext gc = __glXGetCurrentContext();
@@ -3084,9 +3059,6 @@ __glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
    INT32 *buffer_ptr;
    CARD8 opcode;
 
-   if ((gc == NULL) || GC_IS_DIRECT(gc))
-      return;
-
    opcode = __glXSetupForCommand(dpy);
    if (!opcode)
       return;
@@ -3108,6 +3080,35 @@ __glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
    SyncHandle();
 }
 
+static const struct glx_context_vtable glx_indirect_context_vtable = {
+   glx_indirect_bind_tex_image,
+   glx_indirect_release_tex_image,
+};
+
+/*@{*/
+static void
+__glXBindTexImageEXT(Display * dpy,
+                     GLXDrawable drawable, int buffer, const int *attrib_list)
+{
+   GLXContext gc = __glXGetCurrentContext();
+
+   if (gc == NULL || gc->vtable->bind_tex_image == NULL)
+      return;
+
+   gc->vtable->bind_tex_image(dpy, drawable, buffer, attrib_list);
+}
+
+static void
+__glXReleaseTexImageEXT(Display * dpy, GLXDrawable drawable, int buffer)
+{
+   GLXContext gc = __glXGetCurrentContext();
+
+   if (gc == NULL || gc->vtable->release_tex_image == NULL)
+      return;
+
+   gc->vtable->release_tex_image(dpy, drawable, buffer);
+}
+
 /*@}*/
 
 #endif /* GLX_USE_APPLEGL */




More information about the mesa-commit mailing list