⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fakeglx.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
   GLint depth_size = 0;   GLint stencil_size = 0;   GLint accumRedSize = 0;   GLint accumGreenSize = 0;   GLint accumBlueSize = 0;   GLint accumAlphaSize = 0;   int level = 0;   int visual_type = DONT_CARE;   int trans_type = DONT_CARE;   int trans_value = DONT_CARE;   GLint caveat = DONT_CARE;   XMesaVisual xmvis = NULL;   int desiredVisualID = -1;   int numAux = 0;   parselist = list;   while (*parselist) {      switch (*parselist) {	 case GLX_USE_GL:            if (fbConfig) {               /* invalid token */               return NULL;            }            else {               /* skip */               parselist++;            }	    break;	 case GLX_BUFFER_SIZE:	    parselist++;	    min_ci = *parselist++;	    break;	 case GLX_LEVEL:	    parselist++;            level = *parselist++;	    break;	 case GLX_RGBA:            if (fbConfig) {               /* invalid token */               return NULL;            }            else {               rgb_flag = GL_TRUE;               parselist++;            }	    break;	 case GLX_DOUBLEBUFFER:            parselist++;            if (fbConfig) {               double_flag = *parselist++;            }            else {               double_flag = GL_TRUE;            }	    break;	 case GLX_STEREO:            parselist++;            if (fbConfig) {               stereo_flag = *parselist++;            }            else {               stereo_flag = GL_TRUE;            }            return NULL; /* stereo not supported */	 case GLX_AUX_BUFFERS:	    parselist++;            numAux = *parselist++;            if (numAux > MAX_AUX_BUFFERS)               return NULL;	    break;	 case GLX_RED_SIZE:	    parselist++;	    min_red = *parselist++;	    break;	 case GLX_GREEN_SIZE:	    parselist++;	    min_green = *parselist++;	    break;	 case GLX_BLUE_SIZE:	    parselist++;	    min_blue = *parselist++;	    break;	 case GLX_ALPHA_SIZE:	    parselist++;            {               GLint size = *parselist++;               alpha_flag = size ? GL_TRUE : GL_FALSE;            }	    break;	 case GLX_DEPTH_SIZE:	    parselist++;	    depth_size = *parselist++;	    break;	 case GLX_STENCIL_SIZE:	    parselist++;	    stencil_size = *parselist++;	    break;	 case GLX_ACCUM_RED_SIZE:	    parselist++;            {               GLint size = *parselist++;               accumRedSize = MAX2( accumRedSize, size );            }            break;	 case GLX_ACCUM_GREEN_SIZE:	    parselist++;            {               GLint size = *parselist++;               accumGreenSize = MAX2( accumGreenSize, size );            }            break;	 case GLX_ACCUM_BLUE_SIZE:	    parselist++;            {               GLint size = *parselist++;               accumBlueSize = MAX2( accumBlueSize, size );            }            break;	 case GLX_ACCUM_ALPHA_SIZE:	    parselist++;            {               GLint size = *parselist++;               accumAlphaSize = MAX2( accumAlphaSize, size );            }	    break;         /*          * GLX_EXT_visual_info extension          */         case GLX_X_VISUAL_TYPE_EXT:            parselist++;            visual_type = *parselist++;            break;         case GLX_TRANSPARENT_TYPE_EXT:            parselist++;            trans_type = *parselist++;            break;         case GLX_TRANSPARENT_INDEX_VALUE_EXT:            parselist++;            trans_value = *parselist++;            break;         case GLX_TRANSPARENT_RED_VALUE_EXT:         case GLX_TRANSPARENT_GREEN_VALUE_EXT:         case GLX_TRANSPARENT_BLUE_VALUE_EXT:         case GLX_TRANSPARENT_ALPHA_VALUE_EXT:	    /* ignore */	    parselist++;	    parselist++;	    break;         /*          * GLX_EXT_visual_info extension          */         case GLX_VISUAL_CAVEAT_EXT:            parselist++;            caveat = *parselist++; /* ignored for now */            break;         /*          * GLX_ARB_multisample          */         case GLX_SAMPLE_BUFFERS_ARB:            /* ms not supported */            return NULL;         case GLX_SAMPLES_ARB:            /* ms not supported */            return NULL;         /*          * FBConfig attribs.          */         case GLX_RENDER_TYPE:            if (!fbConfig)               return NULL;            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:            if (!fbConfig)               return NULL;            parselist++;            if (*parselist & ~(GLX_WINDOW_BIT | GLX_PIXMAP_BIT | GLX_PBUFFER_BIT)) {               return NULL; /* bad bit */            }            parselist++;            break;         case GLX_FBCONFIG_ID:            if (!fbConfig)               return NULL;            parselist++;            desiredVisualID = *parselist++;            break;         case GLX_X_RENDERABLE:            if (!fbConfig)               return NULL;            parselist += 2;            /* ignore */            break;	 case None:            /* end of list */	    break;	 default:	    /* undefined attribute */            _mesa_warning(NULL, "unexpected attrib 0x%x in choose_visual()",                          *parselist);	    return NULL;      }   }   (void) caveat;   /*    * Since we're only simulating the GLX extension this function will never    * find any real GL visuals.  Instead, all we can do is try to find an RGB    * or CI visual of appropriate depth.  Other requested attributes such as    * double buffering, depth buffer, etc. will be associated with the X    * visual and stored in the VisualTable[].    */   if (desiredVisualID != -1) {      /* try to get a specific visual, by visualID */      XVisualInfo temp;      int n;      temp.visualid = desiredVisualID;      temp.screen = screen;      vis = XGetVisualInfo(dpy, VisualIDMask | VisualScreenMask, &temp, &n);      if (vis) {         /* give the visual some useful GLX attributes */         double_flag = GL_TRUE;         if (vis->depth > 8)            rgb_flag = GL_TRUE;         depth_size = default_depth_bits();         stencil_size = STENCIL_BITS;         /* XXX accum??? */      }   }   else if (level==0) {      /* normal color planes */      if (rgb_flag) {         /* Get an RGB visual */         int min_rgb = min_red + min_green + min_blue;         if (min_rgb>1 && min_rgb<8) {            /* a special case to be sure we can get a monochrome visual */            min_rgb = 1;         }         vis = choose_x_visual( dpy, screen, rgb_flag, min_rgb, visual_type );      }      else {         /* Get a color index visual */         vis = choose_x_visual( dpy, screen, rgb_flag, min_ci, visual_type );         accumRedSize = accumGreenSize = accumBlueSize = accumAlphaSize = 0;      }   }   else {      /* over/underlay planes */      if (rgb_flag) {         /* rgba overlay */         int min_rgb = min_red + min_green + min_blue;         if (min_rgb>1 && min_rgb<8) {            /* a special case to be sure we can get a monochrome visual */            min_rgb = 1;         }         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,                              trans_type, trans_value, min_rgb, visual_type );      }      else {         /* color index overlay */         vis = choose_x_overlay_visual( dpy, screen, rgb_flag, level,                              trans_type, trans_value, min_ci, visual_type );      }   }   if (vis) {      /* Note: we're not exactly obeying the glXChooseVisual rules here.       * When GLX_DEPTH_SIZE = 1 is specified we're supposed to choose the       * largest depth buffer size, which is 32bits/value.  Instead, we       * return 16 to maintain performance with earlier versions of Mesa.       */      if (depth_size > 24)         depth_size = 32;      else if (depth_size > 16)         depth_size = 24;      else if (depth_size > 0) {         depth_size = default_depth_bits();      }      if (!alpha_flag) {         alpha_flag = default_alpha_bits() > 0;      }      /* we only support one size of stencil and accum buffers. */      if (stencil_size > 0)         stencil_size = STENCIL_BITS;      if (accumRedSize > 0 || accumGreenSize > 0 || accumBlueSize > 0 ||          accumAlphaSize > 0) {         accumRedSize =          accumGreenSize =          accumBlueSize = default_accum_bits();         accumAlphaSize = alpha_flag ? accumRedSize : 0;      }      xmvis = save_glx_visual( dpy, vis, rgb_flag, alpha_flag, double_flag,                               stereo_flag, depth_size, stencil_size,                               accumRedSize, accumGreenSize,                               accumBlueSize, accumAlphaSize, level, numAux );   }   return xmvis;}static XVisualInfo *Fake_glXChooseVisual( Display *dpy, int screen, int *list ){   XMesaVisual xmvis = choose_visual(dpy, screen, list, GL_FALSE);   if (xmvis) {#if 0      return xmvis->vishandle;#else      /* create a new vishandle - the cached one may be stale */      xmvis->vishandle = (XVisualInfo *) _mesa_malloc(sizeof(XVisualInfo));      if (xmvis->vishandle) {         _mesa_memcpy(xmvis->vishandle, xmvis->visinfo, sizeof(XVisualInfo));      }      return xmvis->vishandle;#endif   }   else      return NULL;}static GLXContextFake_glXCreateContext( Display *dpy, XVisualInfo *visinfo,                       GLXContext share_list, Bool direct ){   XMesaVisual xmvis;   struct fake_glx_context *glxCtx;   struct fake_glx_context *shareCtx = (struct fake_glx_context *) share_list;   if (!dpy || !visinfo)      return 0;   glxCtx = CALLOC_STRUCT(fake_glx_context);   if (!glxCtx)      return 0;   /* deallocate unused windows/buffers */   XMesaGarbageCollect();   xmvis = find_glx_visual( dpy, visinfo );   if (!xmvis) {      /* This visual wasn't found with glXChooseVisual() */      xmvis = create_glx_visual( dpy, visinfo );      if (!xmvis) {         /* unusable visual */         FREE(glxCtx);         return NULL;      }   }   glxCtx->xmesaContext = XMesaCreateContext(xmvis,                                   shareCtx ? shareCtx->xmesaContext : NULL);   if (!glxCtx->xmesaContext) {      FREE(glxCtx);      return NULL;   }   glxCtx->xmesaContext->direct = GL_FALSE;   glxCtx->glxContext.isDirect = GL_FALSE;   glxCtx->glxContext.currentDpy = dpy;   glxCtx->glxContext.xid = (XID) glxCtx;  /* self pointer */   assert((void *) glxCtx == (void *) &(glxCtx->glxContext));   return (GLXContext) glxCtx;}/* XXX these may have to be removed due to thread-safety issues. */static GLXContext MakeCurrent_PrevContext = 0;static GLXDrawable MakeCurrent_PrevDrawable = 0;static GLXDrawable MakeCurrent_PrevReadable = 0;static XMesaBuffer MakeCurrent_PrevDrawBuffer = 0;static XMesaBuffer MakeCurrent_PrevReadBuffer = 0;/* GLX 1.3 and later */static BoolFake_glXMakeContextCurrent( Display *dpy, GLXDrawable draw,                            GLXDrawable read, GLXContext ctx ){   struct fake_glx_context *glxCtx = (struct fake_glx_context *) ctx;   if (ctx && draw && read) {      XMesaBuffer drawBuffer, readBuffer;      XMesaContext xmctx = glxCtx->xmesaContext;      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'draw' */      if (ctx == MakeCurrent_PrevContext          && draw == MakeCurrent_PrevDrawable) {         drawBuffer = MakeCurrent_PrevDrawBuffer;      }      else {         drawBuffer = XMesaFindBuffer( dpy, draw );      }      if (!drawBuffer) {         /* drawable must be a new window! */         drawBuffer = XMesaCreateWindowBuffer2( xmctx->xm_visual, draw, xmctx);         if (!drawBuffer) {            /* Out of memory, or context/drawable depth mismatch */            return False;         }      }      /* Find the XMesaBuffer which corresponds to the GLXDrawable 'read' */      if (ctx == MakeCurrent_PrevContext          && read == MakeCurrent_PrevReadable) {         readBuffer = MakeCurrent_PrevReadBuffer;      }      else {         readBuffer = XMesaFindBuffer( dpy, read );      }      if (!readBuffer) {         /* drawable must be a new window! */         readBuffer = XMesaCreateWindowBuffer2(glxCtx->xmesaContext->xm_visual,                                               read, xmctx);         if (!readBuffer) {            /* Out of memory, or context/drawable depth mismatch */            return False;         }      }      MakeCurrent_PrevContext = ctx;      MakeCurrent_PrevDrawable = draw;      MakeCurrent_PrevReadable = read;      MakeCurrent_PrevDrawBuffer = drawBuffer;      MakeCurrent_PrevReadBuffer = readBuffer;      /* Now make current! */      if (XMesaMakeCurrent2(xmctx, drawBuffer, readBuffer)) {         ((__GLXcontext *) ctx)->currentDpy = dpy;         ((__GLXcontext *) ctx)->currentDrawable = draw;         ((__GLXcontext *) ctx)->currentReadable = read;         return True;      }      else {         return False;      }   }   else if (!ctx && !draw && !read) {      /* release current context w/out assigning new one. */      XMesaMakeCurrent( NULL, NULL );      MakeCurrent_PrevContext = 0;      MakeCurrent_PrevDrawable = 0;      MakeCurrent_PrevReadable = 0;      MakeCurrent_PrevDrawBuffer = 0;      MakeCurrent_PrevReadBuffer = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -