xlib: remove empty GLX_MESA_agp_offset stubs
[mesa.git] / src / mesa / drivers / x11 / xm_api.c
index 43a97f9eb5d233c7c4e1827ab5f9348335f74347..ec2a73cb369f79714d8d5a7476e611504980baaf 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Mesa 3-D graphics library
- * Version:  7.1
  *
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
  */
 
 /**
 #undef __WIN32__
 #endif
 
+#include <stdio.h>
 #include "glxheader.h"
 #include "xmesaP.h"
+#include "main/api_exec.h"
 #include "main/context.h"
 #include "main/extensions.h"
 #include "main/framebuffer.h"
@@ -71,7 +73,8 @@
 #include "main/macros.h"
 #include "main/renderbuffer.h"
 #include "main/teximage.h"
-#include "glapi/glthread.h"
+#include "main/version.h"
+#include "main/vtxfmt.h"
 #include "swrast/swrast.h"
 #include "swrast/s_renderbuffer.h"
 #include "swrast_setup/swrast_setup.h"
@@ -85,7 +88,7 @@
 /**
  * Global X driver lock
  */
-_glthread_Mutex _xmesa_lock;
+mtx_t _xmesa_lock;
 
 
 
@@ -193,7 +196,7 @@ bits_per_pixel( XMesaVisual xmv )
  * Do this by calling XGetWindowAttributes() for the window and
  * checking if we catch an X error.
  * Input:  dpy - the display
- *         win - the window to check for existance
+ *         win - the window to check for existence
  * Return:  GL_TRUE - window exists
  *          GL_FALSE - window doesn't exist
  */
@@ -245,10 +248,10 @@ xmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
 {
    Status stat;
 
-   _glthread_LOCK_MUTEX(_xmesa_lock);
+   mtx_lock(&_xmesa_lock);
    XSync(b->xm_visual->display, 0); /* added for Chromium */
    stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height);
-   _glthread_UNLOCK_MUTEX(_xmesa_lock);
+   mtx_unlock(&_xmesa_lock);
 
    if (!stat) {
       /* probably querying a window that's recently been destroyed */
@@ -283,7 +286,7 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type,
 {
    XMesaBuffer b;
 
-   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
+   assert(type == WINDOW || type == PIXMAP || type == PBUFFER);
 
    b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
    if (!b)
@@ -308,8 +311,8 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type,
    b->frontxrb->Parent = b;
    b->frontxrb->drawable = d;
    b->frontxrb->pixmap = (XMesaPixmap) d;
-   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
-                          &b->frontxrb->Base.Base);
+   _mesa_attach_and_own_rb(&b->mesa_buffer, BUFFER_FRONT_LEFT,
+                           &b->frontxrb->Base.Base);
 
    /*
     * Back renderbuffer
@@ -325,8 +328,8 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type,
       /* determine back buffer implementation */
       b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
       
-      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
-                             &b->backxrb->Base.Base);
+      _mesa_attach_and_own_rb(&b->mesa_buffer, BUFFER_BACK_LEFT,
+                              &b->backxrb->Base.Base);
    }
 
    /*
@@ -562,7 +565,7 @@ initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
    const int xclass = v->visualType;
 
 
-   ASSERT(!b || b->xm_visual == v);
+   assert(!b || b->xm_visual == v);
 
    /* Save true bits/pixel */
    v->BitsPerPixel = bits_per_pixel(v);
@@ -580,7 +583,7 @@ initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
    }
    v->mesa_visual.indexBits = 0;
 
-   if (_mesa_getenv("MESA_NO_DITHER")) {
+   if (getenv("MESA_NO_DITHER")) {
       v->dithered_pf = v->undithered_pf;
    }
 
@@ -590,7 +593,7 @@ initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
     * which can help Brian figure out what's going on when a user
     * reports bugs.
     */
-   if (_mesa_getenv("MESA_INFO")) {
+   if (getenv("MESA_INFO")) {
       printf("X/Mesa visual = %p\n", (void *) v);
       printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
       printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
@@ -603,8 +606,8 @@ initialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
       /* Do window-specific initializations */
 
       /* these should have been set in create_xmesa_buffer */
-      ASSERT(b->frontxrb->drawable == window);
-      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
+      assert(b->frontxrb->drawable == window);
+      assert(b->frontxrb->pixmap == (XMesaPixmap) window);
 
       /* Setup for single/double buffering */
       if (v->mesa_visual.doubleBufferMode) {
@@ -758,7 +761,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
    GLint red_bits, green_bits, blue_bits, alpha_bits;
 
    /* For debugging only */
-   if (_mesa_getenv("MESA_XSYNC")) {
+   if (getenv("MESA_XSYNC")) {
       /* This makes debugging X easier.
        * In your debugger, set a breakpoint on _XError to stop when an
        * X protocol error is generated.
@@ -781,7 +784,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
     * the struct but we may need some of the information contained in it
     * at a later time.
     */
-   v->visinfo = (XVisualInfo *) malloc(sizeof(*visinfo));
+   v->visinfo = malloc(sizeof(*visinfo));
    if(!v->visinfo) {
       free(v);
       return NULL;
@@ -789,7 +792,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
    memcpy(v->visinfo, visinfo, sizeof(*visinfo));
 
    /* check for MESA_GAMMA environment variable */
-   gamma = _mesa_getenv("MESA_GAMMA");
+   gamma = getenv("MESA_GAMMA");
    if (gamma) {
       v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
       sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
@@ -844,15 +847,19 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
       alpha_bits = v->mesa_visual.alphaBits;
    }
 
-   _mesa_initialize_visual( &v->mesa_visual,
-                            db_flag, stereo_flag,
-                            red_bits, green_bits,
-                            blue_bits, alpha_bits,
-                            depth_size,
-                            stencil_size,
-                            accum_red_size, accum_green_size,
-                            accum_blue_size, accum_alpha_size,
-                            0 );
+   if (!_mesa_initialize_visual(&v->mesa_visual,
+                                db_flag, stereo_flag,
+                                red_bits, green_bits,
+                                blue_bits, alpha_bits,
+                                depth_size,
+                                stencil_size,
+                                accum_red_size, accum_green_size,
+                                accum_blue_size, accum_alpha_size,
+                                0)) {
+      free(v->visinfo);
+      free(v);
+      return NULL;
+   }
 
    /* XXX minor hack */
    v->mesa_visual.level = level;
@@ -886,7 +893,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
    TNLcontext *tnl;
 
    if (firstTime) {
-      _glthread_INIT_MUTEX(_xmesa_lock);
+      mtx_init(&_xmesa_lock, mtx_plain);
       firstTime = GL_FALSE;
    }
 
@@ -900,7 +907,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
    /* initialize with default driver functions, then plug in XMesa funcs */
    _mesa_init_driver_functions(&functions);
    xmesa_init_driver_functions(v, &functions);
-   if (!_mesa_initialize_context(mesaCtx, API_OPENGL, &v->mesa_visual,
+   if (!_mesa_initialize_context(mesaCtx, API_OPENGL_COMPAT, &v->mesa_visual,
                       share_list ? &(share_list->mesa) : (struct gl_context *) NULL,
                       &functions)) {
       free(c);
@@ -916,22 +923,14 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
    }
 
    _mesa_enable_sw_extensions(mesaCtx);
-   _mesa_enable_1_3_extensions(mesaCtx);
-   _mesa_enable_1_4_extensions(mesaCtx);
-   _mesa_enable_1_5_extensions(mesaCtx);
-   _mesa_enable_2_0_extensions(mesaCtx);
-   _mesa_enable_2_1_extensions(mesaCtx);
-    if (mesaCtx->Mesa_DXTn) {
-       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
-       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
-    }
-    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
+
 #if ENABLE_EXT_timer_query
-    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
+    mesaCtx->Extensions.EXT_timer_query = GL_TRUE;
 #endif
 
 
    /* finish up xmesa context initializations */
+   c->direct = GL_TRUE;
    c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
    c->xm_visual = v;
    c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
@@ -958,6 +957,13 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
 
    _mesa_meta_init(mesaCtx);
 
+   _mesa_override_extensions(mesaCtx);
+   _mesa_compute_version(mesaCtx);
+
+    /* Exec table initialization requires the version to be computed */
+   _mesa_initialize_dispatch_tables(mesaCtx);
+   _mesa_initialize_vbo_vtxfmt(mesaCtx);
+
    return c;
 }
 
@@ -1181,7 +1187,6 @@ xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
       struct gl_context *ctx = xmctx ? &xmctx->mesa : NULL;
       _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height);
    }
-   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
 }
 
 
@@ -1300,6 +1305,14 @@ XMesaBuffer XMesaGetCurrentReadBuffer( void )
 }
 
 
+Display *XMesaGetCurrentDisplay(void)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   XMesaContext xmctx = XMESA_CONTEXT(ctx);
+   return xmctx ? xmctx->display : NULL;
+}
+
+
 
 GLboolean XMesaSetFXmode( GLint mode )
 {
@@ -1334,28 +1347,28 @@ void XMesaSwapBuffers( XMesaBuffer b )
         /* Copy Ximage (back buf) from client memory to server window */
 #if defined(USE_XSHM) 
         if (b->shm) {
-            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
+            /*mtx_lock(&_xmesa_lock);*/
            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
                          b->swapgc,
                          b->backxrb->ximage, 0, 0,
                          0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
                           False );
-            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
+            /*mtx_unlock(&_xmesa_lock);*/
         }
         else
 #endif
          {
-            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
+            /*mtx_lock(&_xmesa_lock);*/
             XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
                           b->swapgc,
                           b->backxrb->ximage, 0, 0,
                           0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
-            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
+            /*mtx_unlock(&_xmesa_lock);*/
          }
       }
       else if (b->backxrb->pixmap) {
         /* Copy pixmap (back buf) to window (front buf) on server */
-         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
+         /*mtx_lock(&_xmesa_lock);*/
         XMesaCopyArea( b->xm_visual->display,
                        b->backxrb->pixmap,   /* source drawable */
                        b->frontxrb->drawable,  /* dest. drawable */
@@ -1363,7 +1376,7 @@ void XMesaSwapBuffers( XMesaBuffer b )
                        0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
                        0, 0                 /* dest region */
                      );
-         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
+         /*mtx_unlock(&_xmesa_lock);*/
       }
    }
    XSync( b->xm_visual->display, False );