OSDN Git Service

more work on fbconfig/pbuffer support
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 5 Oct 2002 03:02:34 +0000 (03:02 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 5 Oct 2002 03:02:34 +0000 (03:02 +0000)
src/mesa/drivers/x11/fakeglx.c
src/mesa/drivers/x11/xm_api.c
src/mesa/drivers/x11/xmesaP.h

index bc19496..5c6818d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: fakeglx.c,v 1.67 2002/08/22 21:10:01 brianp Exp $ */
+/* $Id: fakeglx.c,v 1.68 2002/10/05 03:02:34 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -897,10 +897,9 @@ static XVisualInfo *choose_x_overlay_visual( Display *dpy, int scr,
 /**********************************************************************/
 
 
-static XVisualInfo *
-Fake_glXChooseVisual( Display *dpy, int screen, int *list )
+static XMesaVisual choose_visual( Display *dpy, int screen, const int *list )
 {
-   int *parselist;
+   const int *parselist;
    XVisualInfo *vis;
    int min_ci = 0;
    int min_red=0, min_green=0, min_blue=0;
@@ -919,6 +918,7 @@ Fake_glXChooseVisual( Display *dpy, int screen, int *list )
    int trans_type = DONT_CARE;
    int trans_value = DONT_CARE;
    GLint caveat = DONT_CARE;
+   XMesaVisual xmvis = NULL;
 
    parselist = list;
 
@@ -1041,10 +1041,36 @@ Fake_glXChooseVisual( Display *dpy, int screen, int *list )
             caveat = *parselist++; /* ignored for now */
             break;
 
+         /*
+          * FBConfig attribs.
+          */
+         case GLX_RENDER_TYPE:
+            parselist++;
+            if (*parselist == GLX_RGBA_BIT) {
+               rgb_flag = GL_TRUE;
+            }
+            else if (*parselist == GLX_COLOR_INDEX_BIT) {
+               rgb_flag = GL_FALSE;
+            }
+            else if (*parselist == 0) {
+               rgb_flag = GL_TRUE;
+            }
+            parselist++;
+            break;
+         case GLX_DRAWABLE_TYPE:
+            parselist++;
+            if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) {
+               return NULL; /* bad bit */
+            }
+            parselist++;
+            break;
+
         case None:
            break;
+
         default:
            /* undefined attribute */
+            printf("unexpected attrib 0x%x\n", *parselist);
            return NULL;
       }
    }
@@ -1116,18 +1142,25 @@ Fake_glXChooseVisual( Display *dpy, int screen, int *list )
          accumAlphaSize = alpha_flag ? ACCUM_BITS : 0;
       }
 
-      if (!save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
-                            stereo_flag, depth_size, stencil_size,
-                            accumRedSize, accumGreenSize,
-                            accumBlueSize, accumAlphaSize,
-                            level ))
-         return NULL;
+      xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,
+                               stereo_flag, depth_size, stencil_size,
+                               accumRedSize, accumGreenSize,
+                               accumBlueSize, accumAlphaSize, level );
    }
 
-   return vis;
+   return xmvis;
 }
 
 
+static XVisualInfo *
+Fake_glXChooseVisual( Display *dpy, int screen, int *list )
+{
+   XMesaVisual xmvis = choose_visual(dpy, screen, list);
+   if (xmvis)
+      return xmvis->vishandle;
+   else
+      return NULL;
+}
 
 
 static GLXContext
@@ -1454,33 +1487,15 @@ Fake_glXQueryVersion( Display *dpy, int *maj, int *min )
  * Query the GLX attributes of the given XVisualInfo.
  */
 static int
-Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
-                   int attrib, int *value )
+get_config( XMesaVisual glxvis, int attrib, int *value, GLboolean fbconfig )
 {
-   XMesaVisual glxvis;
-
-   glxvis = find_glx_visual( dpy, visinfo );
-   if (!glxvis) {
-      /* this visual wasn't obtained with glXChooseVisual */
-      glxvis = create_glx_visual( dpy, visinfo );
-      if (!glxvis) {
-        /* this visual can't be used for GL rendering */
-        if (attrib==GLX_USE_GL) {
-           *value = (int) False;
-           return 0;
-        }
-        else {
-           return GLX_BAD_VISUAL;
-        }
-      }
-   }
-
+   ASSERT(glxvis);
    switch(attrib) {
       case GLX_USE_GL:
          *value = (int) True;
         return 0;
       case GLX_BUFFER_SIZE:
-        *value = visinfo->depth;
+        *value = glxvis->visinfo->depth;
         return 0;
       case GLX_LEVEL:
         *value = glxvis->level;
@@ -1599,14 +1614,101 @@ Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
          return 0;
 
       /*
-       * Extensions
+       * GLX_EXT_multisample
        */
+      case GLX_SAMPLE_BUFFERS_SGIS:
+         *value = 0;
+         return 0;
+      case GLX_SAMPLES_SGIS:
+         *value = 0;
+         return 0;
+
+      /*
+       * For FBConfigs:
+       */
+      case GLX_SCREEN_EXT:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = glxvis->visinfo->screen;
+         break;
+      case GLX_DRAWABLE_TYPE: /*SGIX too */
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT;
+         break;
+      case GLX_RENDER_TYPE_SGIX:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         if (glxvis->mesa_visual.rgbMode)
+            *value = GLX_RGBA_BIT;
+         else
+            *value = GLX_COLOR_INDEX_BIT;
+         break;
+      case GLX_X_RENDERABLE_SGIX:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = True; /* XXX really? */
+         break;
+      case GLX_FBCONFIG_ID_SGIX:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = glxvis->vishandle->visualid;
+         break;
+      case GLX_MAX_PBUFFER_WIDTH:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         /* XXX or MAX_WIDTH? */
+         *value = DisplayWidth(glxvis->display, glxvis->vishandle->screen);
+         break;
+      case GLX_MAX_PBUFFER_HEIGHT:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = DisplayHeight(glxvis->display, glxvis->vishandle->screen);
+         break;
+      case GLX_MAX_PBUFFER_PIXELS:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = DisplayWidth(glxvis->display, glxvis->vishandle->screen) *
+                  DisplayHeight(glxvis->display, glxvis->vishandle->screen);
+         break;
+      case GLX_VISUAL_ID:
+         if (!fbconfig)
+            return GLX_BAD_ATTRIBUTE;
+         *value = glxvis->vishandle->visualid;
+         break;
+
       default:
         return GLX_BAD_ATTRIBUTE;
    }
+   return Success;
 }
 
 
+static int
+Fake_glXGetConfig( Display *dpy, XVisualInfo *visinfo,
+                   int attrib, int *value )
+{
+   XMesaVisual glxvis;
+
+   glxvis = find_glx_visual( dpy, visinfo );
+   if (!glxvis) {
+      /* this visual wasn't obtained with glXChooseVisual */
+      glxvis = create_glx_visual( dpy, visinfo );
+      if (!glxvis) {
+        /* this visual can't be used for GL rendering */
+        if (attrib==GLX_USE_GL) {
+           *value = (int) False;
+           return 0;
+        }
+        else {
+           return GLX_BAD_VISUAL;
+        }
+      }
+   }
+
+   return get_config(glxvis, attrib, value, GL_FALSE);
+}
+
 
 static void
 Fake_glXWaitGL( void )
@@ -1633,10 +1735,10 @@ static const char *get_extensions( void )
 #ifdef FX
    const char *fx = getenv("MESA_GLX_FX");
    if (fx && fx[0] != 'd') {
-      return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_MESA_set_3dfx_mode GLX_ARB_get_proc_address";
+      return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_SGIX_fbconfig GLX_SGIX_pbuffer GLX_MESA_set_3dfx_mode GLX_ARB_get_proc_address";
    }
 #endif
-   return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_ARB_get_proc_address";
+   return "GLX_MESA_pixmap_colormap GLX_EXT_visual_info GLX_EXT_visual_rating GLX_MESA_release_buffers GLX_MESA_copy_sub_buffer GLX_SGI_video_sync GLX_SGIX_fbconfig GLX_SGIX_pbuffer GLX_ARB_get_proc_address";
 }
 
 
@@ -1705,25 +1807,27 @@ Fake_glXGetClientString( Display *dpy, int name )
  * GLX 1.3 and later
  */
 
-/* XXX Move this when done.
- * Create an XMesaBuffer as a Pbuffer.
- * New in Mesa 4.0 but untested.
- */
-extern XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
-                                    unsigned int width, unsigned int height );
-
-
 
 /* PBUFFER */
 static GLXFBConfig *
 Fake_glXChooseFBConfig( Display *dpy, int screen,
                         const int *attribList, int *nitems )
 {
-   (void) dpy;
-   (void) screen;
-   (void) attribList;
-   (void) nitems;
-   return 0;
+   XMesaVisual xmvis = choose_visual(dpy, screen, attribList);
+   if (xmvis) {
+      GLXFBConfig *config = malloc(sizeof(XMesaVisual));
+      if (!config) {
+         *nitems = 0;
+         return NULL;
+      }
+      *nitems = 1;
+      config[0] = (GLXFBConfig) xmvis;
+      return (GLXFBConfig *) config;
+   }
+   else {
+      *nitems = 0;
+      return NULL;
+   }
 }
 
 
@@ -1732,158 +1836,14 @@ static int
 Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
                            int attribute, int *value )
 {
-   XMesaVisual v = NULL; /* XXX Fix this */
+   XMesaVisual v = (XMesaVisual) config;
    (void) dpy;
    (void) config;
-   (void) attribute;
-   (void) value;
 
    if (!dpy || !config || !value)
       return -1;
 
-   switch (attribute) {
-      case GLX_FBCONFIG_ID:
-      case GLX_BUFFER_SIZE:
-         if (v->mesa_visual.rgbMode)
-            *value = v->mesa_visual.redBits + v->mesa_visual.greenBits +
-                     v->mesa_visual.blueBits + v->mesa_visual.alphaBits;
-         else
-            *value = v->mesa_visual.indexBits;
-         break;
-      case GLX_LEVEL:
-         *value = v->level;
-         break;
-      case GLX_DOUBLEBUFFER:
-         *value = v->mesa_visual.doubleBufferMode;
-         break;
-      case GLX_STEREO:
-         *value = v->mesa_visual.stereoMode;
-         break;
-      case GLX_AUX_BUFFERS:
-         *value = v->mesa_visual.numAuxBuffers;
-         break;
-      case GLX_RED_SIZE:
-         *value = v->mesa_visual.redBits;
-         break;
-      case GLX_GREEN_SIZE:
-         *value = v->mesa_visual.greenBits;
-         break;
-      case GLX_BLUE_SIZE:
-         *value = v->mesa_visual.blueBits;
-         break;
-      case GLX_ALPHA_SIZE:
-         *value = v->mesa_visual.alphaBits;
-         break;
-      case GLX_DEPTH_SIZE:
-         *value = v->mesa_visual.depthBits;
-         break;
-      case GLX_STENCIL_SIZE:
-         *value = v->mesa_visual.stencilBits;
-         break;
-      case GLX_ACCUM_RED_SIZE:
-         *value = v->mesa_visual.accumRedBits;
-         break;
-      case GLX_ACCUM_GREEN_SIZE:
-         *value = v->mesa_visual.accumGreenBits;
-         break;
-      case GLX_ACCUM_BLUE_SIZE:
-         *value = v->mesa_visual.accumBlueBits;
-         break;
-      case GLX_ACCUM_ALPHA_SIZE:
-         *value = v->mesa_visual.accumAlphaBits;
-         break;
-      case GLX_RENDER_TYPE:
-         *value = 0; /* XXX ??? */
-         break;
-      case GLX_DRAWABLE_TYPE:
-         *value = GLX_PBUFFER_BIT; /* XXX fix? */
-         break;
-      case GLX_X_RENDERABLE:
-         *value = False; /* XXX ??? */
-         break;
-      case GLX_X_VISUAL_TYPE:
-#if defined(__cplusplus) || defined(c_plusplus)
-         switch (v->vishandle->c_class) {
-#else
-         switch (v->vishandle->class) {
-#endif
-            case GrayScale:
-               *value = GLX_GRAY_SCALE;
-               break;
-            case StaticGray:
-               *value = GLX_STATIC_GRAY;
-               break;
-            case StaticColor:
-               *value = GLX_STATIC_COLOR;
-               break;
-            case PseudoColor:
-               *value = GLX_PSEUDO_COLOR;
-               break;
-            case TrueColor:
-               *value = GLX_TRUE_COLOR;
-               break;
-            case DirectColor:
-               *value = GLX_DIRECT_COLOR;
-               break;
-            default:
-               *value = 0;
-         }
-         break;
-      case GLX_CONFIG_CAVEAT:
-         *value = 0; /* XXX ??? */
-         break;
-      case GLX_TRANSPARENT_TYPE:
-         if (v->level == 0) {
-            /* normal planes */
-            *value = GLX_NONE_EXT;
-         }
-         else if (v->level > 0) {
-            /* overlay */
-            if (v->mesa_visual.rgbMode) {
-               *value = GLX_TRANSPARENT_RGB_EXT;
-            }
-            else {
-               *value = GLX_TRANSPARENT_INDEX_EXT;
-            }
-         }
-         else if (v->level < 0) {
-            /* underlay */
-            *value = GLX_NONE_EXT;
-         }
-         break;
-      case GLX_TRANSPARENT_INDEX_VALUE:
-         *value = transparent_pixel( v );
-         break;
-      case GLX_TRANSPARENT_RED_VALUE:
-         *value = 0;  /* not implemented */
-         break;
-      case GLX_TRANSPARENT_GREEN_VALUE:
-         *value = 0;  /* not implemented */
-         break;
-      case GLX_TRANSPARENT_BLUE_VALUE:
-         *value = 0;  /* not implemented */
-         break;
-      case GLX_TRANSPARENT_ALPHA_VALUE:
-         *value = 0;  /* not implemented */
-         break;
-      case GLX_MAX_PBUFFER_WIDTH:
-         *value = DisplayWidth(dpy, v->vishandle->screen);
-         break;
-      case GLX_MAX_PBUFFER_HEIGHT:
-         *value = DisplayHeight(dpy, v->vishandle->screen);
-         break;
-      case GLX_MAX_PBUFFER_PIXELS:
-         *value = DisplayWidth(dpy, v->vishandle->screen) *
-                  DisplayHeight(dpy, v->vishandle->screen);
-         break;
-      case GLX_VISUAL_ID:
-         *value = v->vishandle->visualid;
-         break;
-      default:
-         return GLX_BAD_ATTRIBUTE;
-   }
-
-   return Success;
+   return get_config(v, attribute, value, GL_TRUE);
 }
 
 
@@ -1891,11 +1851,26 @@ Fake_glXGetFBConfigAttrib( Display *dpy, GLXFBConfig config,
 static GLXFBConfig *
 Fake_glXGetFBConfigs( Display *dpy, int screen, int *nelements )
 {
-   /* Get list of all X visuals, create FBconfigs from them */
-   (void) dpy;
-   (void) screen;
-   nelements = 0;
-   return 0;
+   XVisualInfo *visuals, visTemplate;
+   const long visMask = VisualScreenMask;
+   int i;
+
+   /* Get list of all X visuals */
+   visTemplate.screen = screen;
+   visuals = XGetVisualInfo(dpy, visMask, &visTemplate, nelements);
+   if (*nelements > 0) {
+      XMesaVisual *results;
+      results = malloc(*nelements * sizeof(XMesaVisual));
+      if (!results) {
+         *nelements = 0;
+         return NULL;
+      }
+      for (i = 0; i < *nelements; i++) {
+         results[i] = create_glx_visual(dpy, visuals + i);
+      }
+      return (GLXFBConfig *) results;
+   }
+   return NULL;
 }
 
 
@@ -1989,26 +1964,31 @@ static GLXPbuffer
 Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
                        const int *attribList )
 {
+   XMesaVisual xmvis = (XMesaVisual) config;
+   XMesaBuffer xmbuf;
    const int *attrib;
    int width = 0, height = 0;
    GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
 
    (void) dpy;
-   (void) config;
 
-   for (attrib = attribList; attrib; attrib++) {
+   for (attrib = attribList; *attrib; attrib++) {
       switch (*attrib) {
          case GLX_PBUFFER_WIDTH:
-            width = *(++attrib);
+            attrib++;
+            width = *attrib;
             break;
          case GLX_PBUFFER_HEIGHT:
-            height = *(++attrib);
+            attrib++;
+            height = *attrib;
             break;
          case GLX_PRESERVED_CONTENTS:
-            preserveContents = GL_TRUE; /* ignored */
+            attrib++;
+            preserveContents = *attrib; /* ignored */
             break;
          case GLX_LARGEST_PBUFFER:
-            useLargest = GL_TRUE; /* ignored */
+            attrib++;
+            useLargest = *attrib; /* ignored */
             break;
          default:
             return 0;
@@ -2018,8 +1998,8 @@ Fake_glXCreatePbuffer( Display *dpy, GLXFBConfig config,
    if (width == 0 || height == 0)
       return 0;
 
-
-   return 0;
+   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
+   return (GLXPbuffer) xmbuf;
 }
 
 
@@ -2223,21 +2203,13 @@ Fake_glXQueryContextInfoEXT(Display *dpy, GLXContext context, int attribute, int
 static int
 Fake_glXGetFBConfigAttribSGIX(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value)
 {
-   (void) dpy;
-   (void) config;
-   (void) attribute;
-   (void) value;
-   return 0;
+   return Fake_glXGetFBConfigAttrib(dpy, config, attribute, value);
 }
 
 static GLXFBConfigSGIX *
 Fake_glXChooseFBConfigSGIX(Display *dpy, int screen, int *attrib_list, int *nelements)
 {
-   (void) dpy;
-   (void) screen;
-   (void) attrib_list;
-   (void) nelements;
-   return 0;
+   return (GLXFBConfig *) Fake_glXChooseFBConfig(dpy, screen, attrib_list, nelements);
 }
 
 static GLXPixmap
@@ -2263,9 +2235,7 @@ Fake_glXCreateContextWithConfigSGIX(Display *dpy, GLXFBConfigSGIX config, int re
 static XVisualInfo *
 Fake_glXGetVisualFromFBConfigSGIX(Display *dpy, GLXFBConfigSGIX config)
 {
-   (void) dpy;
-   (void) config;
-   return NULL;
+   return Fake_glXGetVisualFromFBConfig(dpy, config);
 }
 
 static GLXFBConfigSGIX
@@ -2281,14 +2251,34 @@ Fake_glXGetFBConfigFromVisualSGIX(Display *dpy, XVisualInfo *vis)
 /*** GLX_SGIX_pbuffer ***/
 
 static GLXPbufferSGIX
-Fake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list)
+Fake_glXCreateGLXPbufferSGIX(Display *dpy, GLXFBConfigSGIX config,
+                             unsigned int width, unsigned int height,
+                             int *attribList)
 {
+   XMesaVisual xmvis = (XMesaVisual) config;
+   XMesaBuffer xmbuf;
+   const int *attrib;
+   GLboolean useLargest = GL_FALSE, preserveContents = GL_FALSE;
+
    (void) dpy;
-   (void) config;
-   (void) width;
-   (void) height;
-   (void) attrib_list;
-   return 0;
+
+   for (attrib = attribList; *attrib; attrib++) {
+      switch (*attrib) {
+         case GLX_PRESERVED_CONTENTS_SGIX:
+            attrib++;
+            preserveContents = *attrib; /* ignored */
+            break;
+         case GLX_LARGEST_PBUFFER_SGIX:
+            attrib++;
+            useLargest = *attrib; /* ignored */
+            break;
+         default:
+            return 0;
+      }
+   }
+
+   xmbuf = XMesaCreatePBuffer( xmvis, 0, width, height);
+   return (GLXPbuffer) xmbuf;
 }
 
 static void
index cba660a..4f34e2b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xm_api.c,v 1.41 2002/08/21 02:57:58 brianp Exp $ */
+/* $Id: xm_api.c,v 1.42 2002/10/05 03:02:34 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1196,8 +1196,7 @@ static GLboolean initialize_visual_and_buffer( int client,
                                                XMesaBuffer b,
                                                GLboolean rgb_flag,
                                                XMesaDrawable window,
-                                               XMesaColormap cmap
-                                             )
+                                               XMesaColormap cmap )
 {
 #ifndef XFree86Server
    XGCValues gcvalues;
@@ -1929,18 +1928,18 @@ XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
 
 
 
-#if 0 /* not done */
 XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
                                 unsigned int width, unsigned int height )
 {
    int client = 0;
    XMesaBuffer b = alloc_xmesa_buffer();
    if (!b) {
+      printf("return NULL 1\n");
       return NULL;
    }
 
    b->xm_visual = v;
-   b->pbuffer_flag = GL_TRUE;
+   b->type = PBUFFER;
    b->display = v->display;
    b->cmap = cmap;
 
@@ -1969,12 +1968,12 @@ XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
    if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
                                     0, cmap)) {
       free_xmesa_buffer(client, b);
+      printf("return NULL\n");
       return NULL;
    }
 
    return b;
 }
-#endif
 
 
 
index 5e3ef9e..c3f9c1d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: xmesaP.h,v 1.29 2002/07/09 01:22:52 brianp Exp $ */
+/* $Id: xmesaP.h,v 1.30 2002/10/05 03:02:34 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -539,4 +539,5 @@ extern void XMesaReset( void );
 
 extern void xmesa_resize_buffers( GLframebuffer *buffer );
 
+
 #endif