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

📄 mga_xmesa.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
         for ( i = 0 ; i < mmesa->nr_heaps ; i++ ) {	    driDestroyTextureHeap( mmesa->texture_heaps[ i ] );	    mmesa->texture_heaps[ i ] = NULL;         }	 assert( is_empty_list( & mmesa->swapped ) );      }      /* free the option cache */      driDestroyOptionCache (&mmesa->optionCache);      FREE(mmesa);   }   if (MGA_DEBUG&DEBUG_VERBOSE_DRI)      fprintf( stderr, "[%s:%d] mgaDestroyContext done\n",	       __FILE__, __LINE__ );}static GLbooleanmgaCreateBuffer( __DRIscreenPrivate *driScrnPriv,                 __DRIdrawablePrivate *driDrawPriv,                 const __GLcontextModes *mesaVis,                 GLboolean isPixmap ){   mgaScreenPrivate *screen = (mgaScreenPrivate *) driScrnPriv->private;   if (isPixmap) {      return GL_FALSE; /* not implemented */   }   else {      GLboolean swStencil = (mesaVis->stencilBits > 0 && 			     mesaVis->depthBits != 24);#if 0      driDrawPriv->driverPrivate = (void *)          _mesa_create_framebuffer(mesaVis,                                  GL_FALSE,  /* software depth buffer? */                                  swStencil,                                  mesaVis->accumRedBits > 0,                                  mesaVis->alphaBits > 0 );#else      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);      {         driRenderbuffer *frontRb            = driNewRenderbuffer(GL_RGBA,                                 NULL,                                 screen->cpp,                                 screen->frontOffset, screen->frontPitch,                                 driDrawPriv);         mgaSetSpanFunctions(frontRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);      }      if (mesaVis->doubleBufferMode) {         driRenderbuffer *backRb            = driNewRenderbuffer(GL_RGBA,                                 NULL,                                 screen->cpp,                                 screen->backOffset, screen->backPitch,                                 driDrawPriv);         mgaSetSpanFunctions(backRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);      }      if (mesaVis->depthBits == 16) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT16,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         mgaSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      else if (mesaVis->depthBits == 24) {         /* XXX is this right? */         if (mesaVis->stencilBits) {            driRenderbuffer *depthRb               = driNewRenderbuffer(GL_DEPTH_COMPONENT24,                                    NULL,                                    screen->cpp,                                    screen->depthOffset, screen->depthPitch,                                    driDrawPriv);            mgaSetSpanFunctions(depthRb, mesaVis);            _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);         }         else {            driRenderbuffer *depthRb               = driNewRenderbuffer(GL_DEPTH_COMPONENT32,                                    NULL,                                    screen->cpp,                                    screen->depthOffset, screen->depthPitch,                                    driDrawPriv);            mgaSetSpanFunctions(depthRb, mesaVis);            _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);         }      }      else if (mesaVis->depthBits == 32) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT32,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         mgaSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      if (mesaVis->stencilBits > 0 && !swStencil) {         driRenderbuffer *stencilRb            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         mgaSetSpanFunctions(stencilRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);      }      _mesa_add_soft_renderbuffers(fb,                                   GL_FALSE, /* color */                                   GL_FALSE, /* depth */                                   swStencil,                                   mesaVis->accumRedBits > 0,                                   GL_FALSE, /* alpha */                                   GL_FALSE /* aux */);      driDrawPriv->driverPrivate = (void *) fb;#endif      return (driDrawPriv->driverPrivate != NULL);   }}static voidmgaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv){   _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));}static voidmgaSwapBuffers(__DRIdrawablePrivate *dPriv){   if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {      mgaContextPtr mmesa;      GLcontext *ctx;      mmesa = (mgaContextPtr) dPriv->driContextPriv->driverPrivate;      ctx = mmesa->glCtx;      if (ctx->Visual.doubleBufferMode) {         _mesa_notifySwapBuffers( ctx );         mgaCopyBuffer( dPriv );      }   } else {      /* XXX this shouldn't be an error but we can't handle it for now */      _mesa_problem(NULL, "%s: drawable has no context!\n", __FUNCTION__);   }}static GLbooleanmgaUnbindContext(__DRIcontextPrivate *driContextPriv){   mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate;   if (mmesa)      mmesa->dirty = ~0;   return GL_TRUE;}/* This looks buggy to me - the 'b' variable isn't used anywhere... * Hmm - It seems that the drawable is already hooked in to * driDrawablePriv. * * But why are we doing context initialization here??? */static GLbooleanmgaMakeCurrent(__DRIcontextPrivate *driContextPriv,               __DRIdrawablePrivate *driDrawPriv,               __DRIdrawablePrivate *driReadPriv){   if (driContextPriv) {      mgaContextPtr mmesa = (mgaContextPtr) driContextPriv->driverPrivate;      if (mmesa->driDrawable != driDrawPriv) {	 if (driDrawPriv->swap_interval == (unsigned)-1) {	    driDrawPriv->vblFlags = (mmesa->mgaScreen->irq == 0)	       ? VBLANK_FLAG_NO_IRQ	       : driGetDefaultVBlankFlags(&mmesa->optionCache);	    driDrawableInitVBlank( driDrawPriv );	 }	 mmesa->driDrawable = driDrawPriv;	 mmesa->dirty = ~0; 	 mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK);       }      mmesa->driReadable = driReadPriv;      _mesa_make_current(mmesa->glCtx,                         (GLframebuffer *) driDrawPriv->driverPrivate,                         (GLframebuffer *) driReadPriv->driverPrivate);   }   else {      _mesa_make_current(NULL, NULL, NULL);   }   return GL_TRUE;}void mgaGetLock( mgaContextPtr mmesa, GLuint flags ){   __DRIdrawablePrivate *dPriv = mmesa->driDrawable;   drm_mga_sarea_t *sarea = mmesa->sarea;   int me = mmesa->hHWContext;   int i;   drmGetLock(mmesa->driFd, mmesa->hHWContext, flags);   DRI_VALIDATE_DRAWABLE_INFO( mmesa->driScreen, dPriv );   if (*(dPriv->pStamp) != mmesa->lastStamp) {      mmesa->lastStamp = *(dPriv->pStamp);      mmesa->SetupNewInputs |= VERT_BIT_POS;      mmesa->dirty_cliprects = (MGA_FRONT|MGA_BACK);      mgaUpdateRects( mmesa, (MGA_FRONT|MGA_BACK) );      driUpdateFramebufferSize(mmesa->glCtx, dPriv);   }   mmesa->dirty |= MGA_UPLOAD_CONTEXT | MGA_UPLOAD_CLIPRECTS;   mmesa->sarea->dirty |= MGA_UPLOAD_CONTEXT;   if (sarea->ctxOwner != me) {      mmesa->dirty |= (MGA_UPLOAD_CONTEXT | MGA_UPLOAD_TEX0 |		       MGA_UPLOAD_TEX1 | MGA_UPLOAD_PIPE);      sarea->ctxOwner=me;   }   for ( i = 0 ; i < mmesa->nr_heaps ; i++ ) {      DRI_AGE_TEXTURES( mmesa->texture_heaps[ i ] );   }}/** * This is the driver specific part of the createNewScreen entry point. *  * \todo maybe fold this into intelInitDriver * * \return the __GLcontextModes supported by this driver */static const __DRIconfig **mgaInitScreen(__DRIscreen *psp){   static const __DRIversion ddx_expected = { 1, 2, 0 };   static const __DRIversion dri_expected = { 4, 0, 0 };   static const __DRIversion drm_expected = { 3, 0, 0 };   MGADRIPtr dri_priv = (MGADRIPtr) psp->pDevPriv;   if ( ! driCheckDriDdxDrmVersions2( "MGA",				      &psp->dri_version, & dri_expected,				      &psp->ddx_version, & ddx_expected,				      &psp->drm_version, & drm_expected ) )      return NULL;   /* Calling driInitExtensions here, with a NULL context pointer,    * does not actually enable the extensions.  It just makes sure    * that all the dispatch offsets for all the extensions that    * *might* be enables are known.  This is needed because the    * dispatch offsets need to be known when _mesa_context_create is    * called, but we can't enable the extensions until we have a    * context pointer.    *    * Hello chicken.  Hello egg.  How are you two today?    */   driInitExtensions( NULL, card_extensions, GL_FALSE );   driInitExtensions( NULL, g400_extensions, GL_FALSE );   driInitExtensions(NULL, ARB_vp_extensions, GL_FALSE);   driInitExtensions( NULL, NV_vp_extensions, GL_FALSE );   if (!mgaInitDriver(psp))       return NULL;   return mgaFillInModes( psp,			  dri_priv->cpp * 8,			  (dri_priv->cpp == 2) ? 16 : 24,			  (dri_priv->cpp == 2) ? 0  : 8,			  (dri_priv->backOffset != dri_priv->depthOffset) );}/** * Get information about previous buffer swaps. */static intgetSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ){   mgaContextPtr  mmesa;   if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL)	|| (dPriv->driContextPriv->driverPrivate == NULL)	|| (sInfo == NULL) ) {      return -1;   }   mmesa = (mgaContextPtr) dPriv->driContextPriv->driverPrivate;   sInfo->swap_count = mmesa->swap_count;   sInfo->swap_ust = mmesa->swap_ust;   sInfo->swap_missed_count = mmesa->swap_missed_count;   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)       ? driCalculateSwapUsage( dPriv, 0, mmesa->swap_missed_ust )       : 0.0;   return 0;}const struct __DriverAPIRec driDriverAPI = {   .InitScreen      = mgaInitScreen,   .DestroyScreen   = mgaDestroyScreen,   .CreateContext   = mgaCreateContext,   .DestroyContext  = mgaDestroyContext,   .CreateBuffer    = mgaCreateBuffer,   .DestroyBuffer   = mgaDestroyBuffer,   .SwapBuffers     = mgaSwapBuffers,   .MakeCurrent     = mgaMakeCurrent,   .UnbindContext   = mgaUnbindContext,   .GetSwapInfo     = getSwapInfo,   .GetDrawableMSC  = driDrawableGetMSC32,   .WaitForMSC      = driWaitForMSC32,   .WaitForSBC      = NULL,   .SwapBuffersMSC  = NULL};

⌨️ 快捷键说明

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