Is this method better than reworking dri_util.c? I still had to
replace some XF86DRIxxx calls in dri_util.c. There needs to be some
way to replace the __glxXX calls in the dispatch table. Right now I'm
using an #ifdef but it can't stay that way.

Both schemes have merit. I probably like the first scheme of doing the
glx_find_dri_screen() call before you get into dri_util. Then change
things like driCreateNewContext to take __DRIscreen* instead of
Display/scrn.

My EGL porgram run on DRI now but I'm not getting any drawing output.
I must still have something messed up in the buffer
pointers/stride/whatever.

-- 
Jon Smirl
[EMAIL PROTECTED]


diff --git a/src/glx/x11/glxcmds.c b/src/glx/x11/glxcmds.c
--- a/src/glx/x11/glxcmds.c
+++ b/src/glx/x11/glxcmds.c
@@ -72,6 +72,26 @@ static void * DriverCreateContextWrapper
     Display *dpy, XVisualInfo *vis, void *shared, __DRIcontext *ctx,
     const __GLcontextModes *fbconfig, int render_type );
 
+GLboolean __glXCreateContextWithConfig(__DRInativeDisplay* dpy, int screen,
+    int configID, void* context, drm_context_t * hHWContext);
+
+GLboolean __glXCreateDrawable( __DRInativeDisplay * ndpy, int screen,
+    __DRIid drawable, drm_drawable_t * hHWDrawable );
+
+GLboolean __glXDestroyDrawable( __DRInativeDisplay * ndpy, int screen,
+    __DRIid drawable );
+
+GLboolean __glXDestroyContext( __DRInativeDisplay * ndpy, int screen,
+    __DRIid drawable );
+
+GLboolean __glXGetDrawableInfo(__DRInativeDisplay * ndpy, int screen,
__DRIid drawable,
+    unsigned int* index, unsigned int* stamp,
+    int* X, int* Y, int* W, int* H,
+    int* numClipRects, drm_clip_rect_t ** pClipRects,
+    int* backX, int* backY,
+    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects );
+
+
 #ifndef DRI_NEW_INTERFACE_ONLY
 static Bool dummyBindContext2( Display *dpy, int scrn,
     GLXDrawable draw, GLXDrawable read, GLXContext gc );
@@ -2926,8 +2946,11 @@ static const struct name_address_pair GL
    GLX_FUNCTION( __glXFindDRIScreen ),
    GLX_FUNCTION( __glXGetInternalVersion ),
    GLX_FUNCTION( __glXWindowExists ),
-   GLX_FUNCTION2( __glXCreateContextWithConfig,
XF86DRICreateContextWithConfig ),
-   GLX_FUNCTION2( __glXGetDrawableInfo, XF86DRIGetDrawableInfo ),
+   GLX_FUNCTION( __glXCreateContextWithConfig ),
+   GLX_FUNCTION( __glXCreateDrawable ),
+   GLX_FUNCTION( __glXDestroyDrawable ),
+   GLX_FUNCTION( __glXDestroyContext ),
+   GLX_FUNCTION( __glXGetDrawableInfo ),
 
    /*** DRI configuration ***/
    GLX_FUNCTION( glXGetScreenDriver ),
@@ -3057,7 +3080,7 @@ int __glXGetInternalVersion(void)
 }
 
 
-
+#ifndef EGL_DRI
 static Bool windowExistsFlag;
 
 static int windowExistsErrorHandler(Display *dpy, XErrorEvent *xerr)
@@ -3067,7 +3090,7 @@ static int windowExistsErrorHandler(Disp
     }
     return 0;
 }
-
+#endif
 /**
  * Determine if a window associated with a \c GLXDrawable exists on the
  * X-server.  This function is not used internally by libGL.  It is provided
@@ -3087,6 +3110,12 @@ static int windowExistsErrorHandler(Disp
  *
  * \since Internal API version 20021128.
  */
+#ifdef EGL_DRI
+static Bool __glXWindowExists(Display *dpy, GLXDrawable draw)
+{
+   return GL_TRUE;
+}
+#else
 static Bool __glXWindowExists(Display *dpy, GLXDrawable draw)
 {
     XWindowAttributes xwa;
@@ -3099,7 +3128,7 @@ static Bool __glXWindowExists(Display *d
     XSetErrorHandler(oldXErrorHandler);
     return windowExistsFlag;
 }
-
+#endif
 
 /**
  * Get the unadjusted system time (UST).  Currently, the UST is measured in
diff --git a/src/glx/x11/glxext.c b/src/glx/x11/glxext.c
--- a/src/glx/x11/glxext.c
+++ b/src/glx/x11/glxext.c
@@ -65,6 +65,9 @@
 #include <sys/mman.h>
 #include "xf86dri.h"
 #include "sarea.h"
+#ifdef EGL_DRI
+#include "egldri.h"
+#endif
 #include "dri_glx.h"
 #endif
 
@@ -1508,17 +1511,61 @@ GLXDrawable glXGetCurrentDrawable(void)
 /************************************************************************/
 
 #ifdef GLX_DIRECT_RENDERING
+#ifdef EGL_DRI
 /* Return the DRI per screen structure */
-__DRIscreen *__glXFindDRIScreen(__DRInativeDisplay *dpy, int scrn)
+__DRIscreen *__glXFindDRIScreen(__DRInativeDisplay *ndpy, int scrn)
+{
+   driDisplay *disp = (driDisplay *)ndpy;
+   return &disp->driScreen;
+}
+GLboolean __glXCreateContextWithConfig(__DRInativeDisplay* ndpy, int
screen, int configID, void* context, drm_context_t * hHWContext)
+{
+   return GL_TRUE;
+}
+GLboolean __glXCreateDrawable( __DRInativeDisplay * ndpy, int screen,
__DRIid drawable, drm_drawable_t * hHWDrawable )
+{
+   return GL_TRUE;
+}
+GLboolean __glXDestroyDrawable( __DRInativeDisplay * ndpy, int
screen, __DRIid drawable )
+{
+   return GL_TRUE;
+}
+GLboolean __glXDestroyContext( __DRInativeDisplay * ndpy, int screen,
 __DRIid context )
+{
+   return GL_TRUE;
+}
+GLboolean __glXGetDrawableInfo(__DRInativeDisplay * ndpy, int screen,
__DRIid drawable,
+    unsigned int* index, unsigned int* stamp,
+    int* X, int* Y, int* W, int* H,
+    int* numClipRects, drm_clip_rect_t ** pClipRects,
+    int* backX, int* backY,
+    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
+{
+   driSurface *surf = Lookup_driSurface(drawable);
+
+   *X = 0;
+   *Y = 0;
+   *W = surf->Base.Width;
+   *H = surf->Base.Height;
+
+   *numClipRects = 1;
+   *pClipRects = malloc(sizeof(**pClipRects));
+   **pClipRects = (drm_clip_rect_t){0, 0, surf->Base.Width, surf->Base.Height};
+
+   return GL_TRUE;
+}
+#else
+/* Return the DRI per screen structure */
+__DRIscreen *__glXFindDRIScreen(__DRInativeDisplay *ndpy, int scrn)
 {
     __DRIscreen *pDRIScreen = NULL;
-    XExtDisplayInfo *info = __glXFindDisplay(dpy);
+    XExtDisplayInfo *info = __glXFindDisplay(ndpy);
     XExtData **privList, *found;
     __GLXdisplayPrivate *dpyPriv;
     XEDataObject dataObj;
 
     __glXLock();
-    dataObj.display = dpy;
+    dataObj.display = ndpy;
     privList = XEHeadOfExtensionList(dataObj);
     found = XFindOnExtensionList(privList, info->codes->extension);
     __glXUnlock();
@@ -1530,6 +1577,33 @@ __DRIscreen *__glXFindDRIScreen(__DRInat
 
     return pDRIScreen;
 }
+GLboolean __glXCreateContextWithConfig(__DRInativeDisplay* ndpy, int
screen, int configID, void* context, drm_context_t * hHWContext)
+{
+   return XF86DRICreateContextWithConfig(ndpy, screen, configID,
context, hHWContext);
+}
+GLboolean __glXCreateDrawable( __DRInativeDisplay * ndpy, int screen,
__DRIid drawable, drm_drawable_t * hHWDrawable )
+{
+   return XF86DRICreateDrawable( ndpy, screen, drawable, hHWDrawable );
+}
+GLboolean __glXDestroyDrawable( __DRInativeDisplay * ndpy, int
screen, __DRIid drawable )
+{
+   return XF86DRIDestroyDrawable(ndpy, screen, drawable);
+}
+GLboolean __glXDestroyContext( __DRInativeDisplay * ndpy, int screen,
 __DRIid context )
+{
+   return XF86DRIDestroyContext(ndpy, screen, drawable);
+}
+GLboolean __glXGetDrawableInfo(__DRInativeDisplay * ndpy, int screen,
__DRIid drawable,
+    unsigned int* index, unsigned int* stamp,
+    int* X, int* Y, int* W, int* H,
+    int* numClipRects, drm_clip_rect_t ** pClipRects,
+    int* backX, int* backY,
+    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
+{
+   return XF86DRIGetDrawableInfo(ndpy, screen, drawable, index,
stamp, X, Y, W, H,
+               numClipRects, pClipRects, backX, backY,
numBackClipRects, pBackClipRects );
+}
+#endif
 #endif
 
 /************************************************************************/
diff --git a/src/mesa/drivers/dri/common/dri_util.c
b/src/mesa/drivers/dri/common/dri_util.c
--- a/src/mesa/drivers/dri/common/dri_util.c
+++ b/src/mesa/drivers/dri/common/dri_util.c
@@ -82,6 +82,18 @@ typedef GLboolean (*PFNGLXCREATECONTEXTW
 
 static PFNGLXCREATECONTEXTWITHCONFIGPROC create_context_with_config;
 
+typedef GLboolean (*PFNGLXCREATEDRAWABLE)( __DRInativeDisplay*, int,
__DRIid, drm_context_t * );
+
+static PFNGLXCREATEDRAWABLE create_drawable;
+
+typedef GLboolean (*PFNGLXDESTROYDRAWABLE)( __DRInativeDisplay*, int, __DRIid);
+
+static PFNGLXDESTROYDRAWABLE destroy_drawable;
+
+typedef GLboolean (*PFNGLXDESTROYCONTEXT)( __DRInativeDisplay*, int, __DRIid);
+
+static PFNGLXDESTROYCONTEXT destroy_context;
+
 /**
  * Cached copy of the internal API version used by libGL and the client-side
  * DRI driver.
@@ -824,7 +836,7 @@ static void *driCreateNewDrawable(__DRIn
        return NULL;
     }
 
-    if (!XF86DRICreateDrawable(dpy, modes->screen, draw, &pdp->hHWDrawable)) {
+    if (!create_drawable(dpy, modes->screen, draw, &pdp->hHWDrawable)) {
        _mesa_free(pdp);
        return NULL;
     }
@@ -854,7 +866,7 @@ static void *driCreateNewDrawable(__DRIn
        glXGetProcAddress( (const GLubyte *) "__glXGetDrawableInfo" );
     if ( pdp->getInfo == NULL ) {
 #ifdef DRI_NEW_INTERFACE_ONLY
-        (void)XF86DRIDestroyDrawable(dpy, modes->screen, pdp->draw);
+        (void)destroy_drawable(dpy, modes->screen, pdp->draw);
        _mesa_free(pdp);
        return NULL;
 #else
@@ -864,7 +876,7 @@ static void *driCreateNewDrawable(__DRIn
 
     if (!(*psp->DriverAPI.CreateBuffer)(psp, pdp, modes,
                                        renderType == GLX_PIXMAP_BIT)) {
-       (void)XF86DRIDestroyDrawable(dpy, modes->screen, pdp->draw);
+       (void)destroy_drawable(dpy, modes->screen, pdp->draw);
        _mesa_free(pdp);
        return NULL;
     }
@@ -922,7 +934,7 @@ static void driDestroyDrawable(__DRInati
     if (pdp) {
         (*psp->DriverAPI.DestroyBuffer)(pdp);
        if ((*window_exists)(dpy, pdp->draw))
-           (void)XF86DRIDestroyDrawable(dpy, scrn, pdp->draw);
+           (void)destroy_drawable(dpy, scrn, pdp->draw);
        if (pdp->pClipRects) {
            _mesa_free(pdp->pClipRects);
            pdp->pClipRects = NULL;
@@ -961,7 +973,7 @@ static void driDestroyContext(__DRInativ
     if (pcp) {
        (*pcp->driScreenPriv->DriverAPI.DestroyContext)(pcp);
        __driGarbageCollectDrawables(pcp->driScreenPriv->drawHash);
-       (void)XF86DRIDestroyContext(dpy, scrn, pcp->contextID);
+       (void)destroy_context(dpy, scrn, pcp->contextID);
        _mesa_free(pcp);
     }
 }
@@ -1242,6 +1254,30 @@ __driUtilCreateNewScreen(__DRInativeDisp
 #endif /* DRI_NEW_INTERFACE_ONLY */
     }
        
+    create_drawable = (PFNGLXCREATEDRAWABLE)
+       glXGetProcAddress( (const GLubyte *) "__glXCreateDrawable" );
+    if ( create_drawable == NULL ) {
+       fprintf( stderr, "libGL error: libGL.so version (%08u) is too old.  "
+                "20050713 or later is required.\n", internal_api_version );
+       return NULL;
+    }
+       
+    destroy_drawable = (PFNGLXDESTROYDRAWABLE)
+       glXGetProcAddress( (const GLubyte *) "__glXDestroyDrawable" );
+    if ( destroy_drawable == NULL ) {
+       fprintf( stderr, "libGL error: libGL.so version (%08u) is too old.  "
+                "20050713 or later is required.\n", internal_api_version );
+       return NULL;
+    }
+       
+    destroy_context = (PFNGLXDESTROYCONTEXT)
+       glXGetProcAddress( (const GLubyte *) "__glXDestroyDrawable" );
+    if ( destroy_context == NULL ) {
+       fprintf( stderr, "libGL error: libGL.so version (%08u) is too old.  "
+                "20050713 or later is required.\n", internal_api_version );
+       return NULL;
+    }
+       
     api_ver = internal_api_version;
 
     psp = (__DRIscreenPrivate *)_mesa_malloc(sizeof(__DRIscreenPrivate));


-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_idt77&alloc_id492&op=click
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to