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

📄 i810context.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   /* Initialize the software rasterizer and helper modules.    */   _swrast_CreateContext( ctx );   _vbo_CreateContext( ctx );   _tnl_CreateContext( ctx );   _swsetup_CreateContext( ctx );   /* Install the customized pipeline:    */   _tnl_destroy_pipeline( ctx );   _tnl_install_pipeline( ctx, i810_pipeline );   /* Configure swrast and T&L to match hardware characteristics:    */   _swrast_allow_pixel_fog( ctx, GL_FALSE );   _swrast_allow_vertex_fog( ctx, GL_TRUE );   _tnl_allow_pixel_fog( ctx, GL_FALSE );   _tnl_allow_vertex_fog( ctx, GL_TRUE );   /* Dri stuff    */   imesa->hHWContext = driContextPriv->hHWContext;   imesa->driFd = sPriv->fd;   imesa->driHwLock = &sPriv->pSAREA->lock;   imesa->stipple_in_hw = 1;   imesa->RenderIndex = ~0;   imesa->dirty = I810_UPLOAD_CTX|I810_UPLOAD_BUFFERS;   imesa->upload_cliprects = GL_TRUE;   imesa->CurrentTexObj[0] = 0;   imesa->CurrentTexObj[1] = 0;   _math_matrix_ctr( &imesa->ViewportMatrix );   driInitExtensions( ctx, card_extensions, GL_TRUE );   /* XXX these should really go right after _mesa_init_driver_functions() */   i810InitStateFuncs( ctx );   i810InitTriFuncs( ctx );   i810InitSpanFuncs( ctx );   i810InitVB( ctx );   i810InitState( ctx );#if DO_DEBUG   I810_DEBUG  = driParseDebugString( getenv( "I810_DEBUG" ),				      debug_control );   I810_DEBUG |= driParseDebugString( getenv( "INTEL_DEBUG" ),				      debug_control );#endif   return GL_TRUE;}voidi810DestroyContext(__DRIcontextPrivate *driContextPriv){   i810ContextPtr imesa = (i810ContextPtr) driContextPriv->driverPrivate;   assert(imesa); /* should never be null */   if (imesa) {      GLboolean   release_texture_heaps;      release_texture_heaps = (imesa->glCtx->Shared->RefCount == 1);      _swsetup_DestroyContext( imesa->glCtx );      _tnl_DestroyContext( imesa->glCtx );      _vbo_DestroyContext( imesa->glCtx );      _swrast_DestroyContext( imesa->glCtx );      i810FreeVB( imesa->glCtx );      /* free the Mesa context */      imesa->glCtx->DriverCtx = NULL;      _mesa_destroy_context(imesa->glCtx);      if ( release_texture_heaps ) { 	 /* This share group is about to go away, free our private          * texture object data.          */	 unsigned int i;         for ( i = 0 ; i < imesa->nr_heaps ; i++ ) {	    driDestroyTextureHeap( imesa->texture_heaps[ i ] );	    imesa->texture_heaps[ i ] = NULL;         }	 assert( is_empty_list( & imesa->swapped ) );      }      FREE(imesa);   }}void i810XMesaSetFrontClipRects( i810ContextPtr imesa ){   __DRIdrawablePrivate *dPriv = imesa->driDrawable;   imesa->numClipRects = dPriv->numClipRects;   imesa->pClipRects = dPriv->pClipRects;   imesa->drawX = dPriv->x;   imesa->drawY = dPriv->y;   i810EmitDrawingRectangle( imesa );   imesa->upload_cliprects = GL_TRUE;}void i810XMesaSetBackClipRects( i810ContextPtr imesa ){   __DRIdrawablePrivate *dPriv = imesa->driDrawable;   if (imesa->sarea->pf_enabled == 0 && dPriv->numBackClipRects == 0)   {      imesa->numClipRects = dPriv->numClipRects;      imesa->pClipRects = dPriv->pClipRects;      imesa->drawX = dPriv->x;      imesa->drawY = dPriv->y;   } else {      imesa->numClipRects = dPriv->numBackClipRects;      imesa->pClipRects = dPriv->pBackClipRects;      imesa->drawX = dPriv->backX;      imesa->drawY = dPriv->backY;   }   i810EmitDrawingRectangle( imesa );   imesa->upload_cliprects = GL_TRUE;}static void i810XMesaWindowMoved( i810ContextPtr imesa ){   /* Determine current color drawing buffer */   switch (imesa->glCtx->DrawBuffer->_ColorDrawBufferIndexes[0]) {   case BUFFER_FRONT_LEFT:      i810XMesaSetFrontClipRects( imesa );      break;   case BUFFER_BACK_LEFT:      i810XMesaSetBackClipRects( imesa );      break;   default:      /* glDrawBuffer(GL_NONE or GL_FRONT_AND_BACK): software fallback */      i810XMesaSetFrontClipRects( imesa );   }}GLbooleani810UnbindContext(__DRIcontextPrivate *driContextPriv){   i810ContextPtr imesa = (i810ContextPtr) driContextPriv->driverPrivate;   if (imesa) {      imesa->dirty = I810_UPLOAD_CTX|I810_UPLOAD_BUFFERS;      if (imesa->CurrentTexObj[0]) imesa->dirty |= I810_UPLOAD_TEX0;      if (imesa->CurrentTexObj[1]) imesa->dirty |= I810_UPLOAD_TEX1;   }   return GL_TRUE;}GLbooleani810MakeCurrent(__DRIcontextPrivate *driContextPriv,                __DRIdrawablePrivate *driDrawPriv,                __DRIdrawablePrivate *driReadPriv){   if (driContextPriv) {      i810ContextPtr imesa = (i810ContextPtr) driContextPriv->driverPrivate;      /* Shouldn't the readbuffer be stored also?       */      imesa->driDrawable = driDrawPriv;      _mesa_make_current(imesa->glCtx,                         (GLframebuffer *) driDrawPriv->driverPrivate,                         (GLframebuffer *) driReadPriv->driverPrivate);      /* Are these necessary?       */      i810XMesaWindowMoved( imesa );   }   else {      _mesa_make_current(NULL, NULL, NULL);   }   return GL_TRUE;}static voidi810UpdatePageFlipping( i810ContextPtr imesa ){   GLcontext *ctx = imesa->glCtx;   int front = 0;   /* Determine current color drawing buffer */   switch (ctx->DrawBuffer->_ColorDrawBufferIndexes[0]) {   case BUFFER_FRONT_LEFT:      front = 1;      break;   case BUFFER_BACK_LEFT:      front = 0;      break;   default:      return;   }   if ( imesa->sarea->pf_current_page == 1 )      front ^= 1;   driFlipRenderbuffers(ctx->WinSysDrawBuffer, front);      if (front) {      imesa->BufferSetup[I810_DESTREG_DI1] = imesa->i810Screen->fbOffset | imesa->i810Screen->backPitchBits;   } else {      imesa->BufferSetup[I810_DESTREG_DI1] = imesa->i810Screen->backOffset | imesa->i810Screen->backPitchBits;   }   imesa->dirty |= I810_UPLOAD_BUFFERS;}void i810GetLock( i810ContextPtr imesa, GLuint flags ){   __DRIdrawablePrivate *dPriv = imesa->driDrawable;   __DRIscreenPrivate *sPriv = imesa->driScreen;   I810SAREAPtr sarea = imesa->sarea;   int me = imesa->hHWContext;   unsigned i;   drmGetLock(imesa->driFd, imesa->hHWContext, flags);   /* If the window moved, may need to set a new cliprect now.    *    * NOTE: This releases and regains the hw lock, so all state    * checking must be done *after* this call:    */   DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);   /* If we lost context, need to dump all registers to hardware.    * Note that we don't care about 2d contexts, even if they perform    * accelerated commands, so the DRI locking in the X server is even    * more broken than usual.    */   if (sarea->ctxOwner != me) {      driUpdateFramebufferSize(imesa->glCtx, dPriv);      imesa->upload_cliprects = GL_TRUE;      imesa->dirty = I810_UPLOAD_CTX|I810_UPLOAD_BUFFERS;      if (imesa->CurrentTexObj[0]) imesa->dirty |= I810_UPLOAD_TEX0;      if (imesa->CurrentTexObj[1]) imesa->dirty |= I810_UPLOAD_TEX1;      sarea->ctxOwner = me;   }   /* Shared texture managment - if another client has played with    * texture space, figure out which if any of our textures have been    * ejected, and update our global LRU.    */    for ( i = 0 ; i < imesa->nr_heaps ; i++ ) {      DRI_AGE_TEXTURES( imesa->texture_heaps[ i ] );   }   if (imesa->lastStamp != dPriv->lastStamp) {      i810UpdatePageFlipping( imesa );      i810XMesaWindowMoved( imesa );      imesa->lastStamp = dPriv->lastStamp;   }}voidi810SwapBuffers( __DRIdrawablePrivate *dPriv ){   if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {      i810ContextPtr imesa;      GLcontext *ctx;      imesa = (i810ContextPtr) dPriv->driContextPriv->driverPrivate;      ctx = imesa->glCtx;      if (ctx->Visual.doubleBufferMode) {         _mesa_notifySwapBuffers( ctx );  /* flush pending rendering comands */         if ( imesa->sarea->pf_active ) {            i810PageFlip( dPriv );         } else {            i810CopyBuffer( dPriv );         }      }   }   else {      /* XXX this shouldn't be an error but we can't handle it for now */      _mesa_problem(NULL, "i810SwapBuffers: drawable has no context!\n");   }}

⌨️ 快捷键说明

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