Add interfaces for overriding texture images with driver specific 'offsets'.
authorMichel Dänzer <michel@tungstengraphics.com>
Tue, 22 May 2007 12:08:10 +0000 (14:08 +0200)
committerMichel Dänzer <michel@tungstengraphics.com>
Tue, 22 May 2007 12:08:10 +0000 (14:08 +0200)
To be used by AIGLX for GLX_EXT_texture_from_pixmap without several
additional data copies.

include/GL/internal/dri_interface.h
src/mesa/drivers/dri/common/dri_util.c
src/mesa/drivers/dri/common/dri_util.h

index a3de2c6aab3ec16ad6b5ed47f7288ba6e3515911..8d24e311f848d0dbaa42f82f2087ef1b80acbaf2 100644 (file)
@@ -361,6 +361,18 @@ struct __DRIscreenRec {
     void * (*createNewContext)(__DRInativeDisplay *dpy, const __GLcontextModes *modes,
                               int render_type,
                               void *sharedPrivate, __DRIcontext *pctx);
+
+    /**
+     * Method to override base texture image with a driver specific 'offset'.
+     * The depth passed in allows e.g. to ignore the alpha channel of texture
+     * images where the non-alpha components don't occupy a whole texel.
+     *
+     * For GLX_EXT_texture_from_pixmap with AIGLX.
+     *
+     * \since Internal API version 20070121.
+     */
+    void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
+                        unsigned long long offset, GLint depth, GLuint pitch);
 };
 
 /**
index 07ac4c7cd5f22224e2408d171102cd762ea87a50..dd52f7e915139458961190c6e2b9a29b5364278c 100644 (file)
@@ -995,6 +995,9 @@ __driUtilCreateNewScreen(__DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,
     psc->getMSC            = driGetMSC;
     psc->createNewContext  = driCreateNewContext;
 
+    if (internal_api_version >= 20070121)
+       psc->setTexOffset  = psp->DriverAPI.setTexOffset;
+
     if ( (psp->DriverAPI.InitDriver != NULL)
         && !(*psp->DriverAPI.InitDriver)(psp) ) {
        _mesa_free( psp );
index 8639535abb2183b2bf13d89cc69ea9b05cff6961..539d28d1149a74d9d54d5aa3feb36ce1a0ec1977 100644 (file)
@@ -189,6 +189,12 @@ struct __DriverAPIRec {
     /*@}*/
     void (*CopySubBuffer)(__DRIdrawablePrivate *driDrawPriv,
                          int x, int y, int w, int h);
+
+    /**
+     * See corresponding field in \c __DRIscreenRec.
+     */
+    void (*setTexOffset)(__DRIcontext *pDRICtx, GLint texname,
+                        unsigned long long offset, GLint depth, GLuint pitch);
 };