intel_context.c

来自「mesa-6.5-minigui源码」· C语言 代码 · 共 857 行 · 第 1/2 页

C
857
字号
   INTEL_DEBUG |= driParseDebugString( getenv( "INTEL_DEBUG" ),				       debug_control );#endif#ifndef VERBOSE   if (getenv("INTEL_VERBOSE"))      VERBOSE=1;#endif   if (getenv("INTEL_NO_RAST") ||        getenv("INTEL_NO_RAST")) {      fprintf(stderr, "disabling 3D rasterization\n");      FALLBACK(intel, INTEL_FALLBACK_USER, 1);    }   return GL_TRUE;}void intelDestroyContext(__DRIcontextPrivate *driContextPriv){   intelContextPtr intel = (intelContextPtr) driContextPriv->driverPrivate;   assert(intel); /* should never be null */   if (intel) {      GLboolean   release_texture_heaps;      intel->vtbl.destroy( intel );      release_texture_heaps = (intel->ctx.Shared->RefCount == 1);      _swsetup_DestroyContext (&intel->ctx);      _tnl_DestroyContext (&intel->ctx);      _ac_DestroyContext (&intel->ctx);      _swrast_DestroyContext (&intel->ctx);      intel->Fallback = 0;	/* don't call _swrast_Flush later */      intelDestroyBatchBuffer(&intel->ctx);            if ( release_texture_heaps ) {         /* This share group is about to go away, free our private          * texture object data.          */         int i;         for ( i = 0 ; i < intel->nr_heaps ; i++ ) {	    driDestroyTextureHeap( intel->texture_heaps[ i ] );	    intel->texture_heaps[ i ] = NULL;         }	 assert( is_empty_list( & intel->swapped ) );      }      /* free the Mesa context */      _mesa_destroy_context(&intel->ctx);   }}void intelSetFrontClipRects( intelContextPtr intel ){   __DRIdrawablePrivate *dPriv = intel->driDrawable;   if (!dPriv) return;   intel->numClipRects = dPriv->numClipRects;   intel->pClipRects = dPriv->pClipRects;   intel->drawX = dPriv->x;   intel->drawY = dPriv->y;}void intelSetBackClipRects( intelContextPtr intel ){   __DRIdrawablePrivate *dPriv = intel->driDrawable;   if (!dPriv) return;   if (intel->sarea->pf_enabled == 0 && dPriv->numBackClipRects == 0) {      intel->numClipRects = dPriv->numClipRects;      intel->pClipRects = dPriv->pClipRects;      intel->drawX = dPriv->x;      intel->drawY = dPriv->y;   } else {      intel->numClipRects = dPriv->numBackClipRects;      intel->pClipRects = dPriv->pBackClipRects;      intel->drawX = dPriv->backX;      intel->drawY = dPriv->backY;            if (dPriv->numBackClipRects == 1 &&	  dPriv->x == dPriv->backX &&	  dPriv->y == dPriv->backY) {      	 /* Repeat the calculation of the back cliprect dimensions here	  * as early versions of dri.a in the Xserver are incorrect.  Try	  * very hard not to restrict future versions of dri.a which	  * might eg. allocate truly private back buffers.	  */	 int x1, y1;	 int x2, y2;	 	 x1 = dPriv->x;	 y1 = dPriv->y;      	 x2 = dPriv->x + dPriv->w;	 y2 = dPriv->y + dPriv->h;	 	 if (x1 < 0) x1 = 0;	 if (y1 < 0) y1 = 0;	 if (x2 > intel->intelScreen->width) x2 = intel->intelScreen->width;	 if (y2 > intel->intelScreen->height) y2 = intel->intelScreen->height;	 if (x1 == dPriv->pBackClipRects[0].x1 &&	     y1 == dPriv->pBackClipRects[0].y1) {	    dPriv->pBackClipRects[0].x2 = x2;	    dPriv->pBackClipRects[0].y2 = y2;	 }      }   }}void intelWindowMoved( intelContextPtr intel ){   if (!intel->ctx.DrawBuffer) {      intelSetFrontClipRects( intel );   }   else {      driUpdateFramebufferSize(&intel->ctx, intel->driDrawable);          switch (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0]) {      case BUFFER_BIT_FRONT_LEFT:	 intelSetFrontClipRects( intel );	 break;      case BUFFER_BIT_BACK_LEFT:	 intelSetBackClipRects( intel );	 break;      default:	 /* glDrawBuffer(GL_NONE or GL_FRONT_AND_BACK): software fallback */	 intelSetFrontClipRects( intel );      }   }   /* Set state we know depends on drawable parameters:    */   {      GLcontext *ctx = &intel->ctx;      ctx->Driver.Scissor( ctx, ctx->Scissor.X, ctx->Scissor.Y,			   ctx->Scissor.Width, ctx->Scissor.Height );            ctx->Driver.DepthRange( ctx, 			      ctx->Viewport.Near,			      ctx->Viewport.Far );   }}GLboolean intelUnbindContext(__DRIcontextPrivate *driContextPriv){   return GL_TRUE;}GLboolean intelMakeCurrent(__DRIcontextPrivate *driContextPriv,			  __DRIdrawablePrivate *driDrawPriv,			  __DRIdrawablePrivate *driReadPriv){   if (driContextPriv) {      intelContextPtr intel = (intelContextPtr) driContextPriv->driverPrivate;      if ( intel->driDrawable != driDrawPriv ) {	 /* Shouldn't the readbuffer be stored also? */	 driDrawableInitVBlank( driDrawPriv, intel->vblank_flags );	 intel->driDrawable = driDrawPriv;	 intelWindowMoved( intel );      }      _mesa_make_current(&intel->ctx,			 (GLframebuffer *) driDrawPriv->driverPrivate,			 (GLframebuffer *) driReadPriv->driverPrivate);      intel->ctx.Driver.DrawBuffer( &intel->ctx, intel->ctx.Color.DrawBuffer[0] );   } else {      _mesa_make_current(NULL, NULL, NULL);   }   return GL_TRUE;}/** * Use the information in the sarea to update the screen parameters * related to screen rotation. */static voidintelUpdateScreenRotation(intelContextPtr intel,                          __DRIscreenPrivate *sPriv,                          drmI830Sarea *sarea){   intelScreenPrivate *intelScreen = (intelScreenPrivate *)sPriv->private;   intelRegion *colorBuf;   intelUnmapScreenRegions(intelScreen);   intelUpdateScreenFromSAREA(intelScreen, sarea);   /* update the current hw offsets for the color and depth buffers */   if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_BACK_LEFT)      colorBuf = &intelScreen->back;   else      colorBuf = &intelScreen->front;   intel->vtbl.update_color_z_regions(intel, colorBuf, &intelScreen->depth);   if (!intelMapScreenRegions(sPriv)) {      fprintf(stderr, "ERROR Remapping screen regions!!!\n");   }}void intelGetLock( intelContextPtr intel, GLuint flags ){   __DRIdrawablePrivate *dPriv = intel->driDrawable;   __DRIscreenPrivate *sPriv = intel->driScreen;   intelScreenPrivate *intelScreen = (intelScreenPrivate *)sPriv->private;   drmI830Sarea * sarea = intel->sarea;   unsigned   i;   drmGetLock(intel->driFd, intel->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:    */   if (dPriv)      DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);   if (dPriv && intel->lastStamp != dPriv->lastStamp) {      intelWindowMoved( intel );      intel->lastStamp = dPriv->lastStamp;   }   /* 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->width != intelScreen->width ||       sarea->height != intelScreen->height ||       sarea->rotation != intelScreen->current_rotation) {      intelUpdateScreenRotation(intel, sPriv, sarea);      /* This will drop the outstanding batchbuffer on the floor */      intel->batch.ptr -= (intel->batch.size - intel->batch.space);      intel->batch.space = intel->batch.size;      /* lose all primitives */      intel->prim.primitive = ~0;      intel->prim.start_ptr = 0;      intel->prim.flush = 0;      intel->vtbl.lost_hardware( intel );       intel->lastStamp = 0; /* force window update */      /* Release batch buffer       */      intelDestroyBatchBuffer(&intel->ctx);      intelInitBatchBuffer(&intel->ctx);      intel->prim.flush = intel_emit_invarient_state;      /* Still need to reset the global LRU?       */      intel_driReinitTextureHeap( intel->texture_heaps[0], intel->intelScreen->tex.size );   }   /* 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 < intel->nr_heaps ; i++ ) {      DRI_AGE_TEXTURES( intel->texture_heaps[ i ] );   }}void intelSwapBuffers( __DRIdrawablePrivate *dPriv ){   if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {      intelContextPtr intel;      GLcontext *ctx;      intel = (intelContextPtr) dPriv->driContextPriv->driverPrivate;      ctx = &intel->ctx;      if (ctx->Visual.doubleBufferMode) {         intelScreenPrivate *screen = intel->intelScreen;	 _mesa_notifySwapBuffers( ctx );  /* flush pending rendering comands */	 if ( 0 /*intel->doPageFlip*/ ) { /* doPageFlip is never set !!! */	    intelPageFlip( dPriv );	 } else {	     intelCopyBuffer( dPriv, NULL );	 }         if (screen->current_rotation != 0) {            intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);         }      }   } else {      /* XXX this shouldn't be an error but we can't handle it for now */      fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);   }}void intelCopySubBuffer( __DRIdrawablePrivate *dPriv,			 int x, int y, int w, int h ){   if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {      intelContextPtr intel;      GLcontext *ctx;      intel = (intelContextPtr) dPriv->driContextPriv->driverPrivate;      ctx = &intel->ctx;      if (ctx->Visual.doubleBufferMode) {         intelScreenPrivate *screen = intel->intelScreen;	 drm_clip_rect_t rect;	 rect.x1 = x + dPriv->x;	 rect.y1 = (dPriv->h - y - h) + dPriv->y;	 rect.x2 = rect.x1 + w;	 rect.y2 = rect.y1 + h;	 _mesa_notifySwapBuffers( ctx );  /* flush pending rendering comands */	 intelCopyBuffer( dPriv, &rect );      }   } else {      /* XXX this shouldn't be an error but we can't handle it for now */      fprintf(stderr, "%s: drawable has no context!\n", __FUNCTION__);   }}void intelInitState( GLcontext *ctx ){   /* Mesa should do this for us:    */   ctx->Driver.AlphaFunc( ctx, 			  ctx->Color.AlphaFunc,			  ctx->Color.AlphaRef);   ctx->Driver.BlendColor( ctx,			   ctx->Color.BlendColor );   ctx->Driver.BlendEquationSeparate( ctx, 				      ctx->Color.BlendEquationRGB,				      ctx->Color.BlendEquationA);   ctx->Driver.BlendFuncSeparate( ctx,				  ctx->Color.BlendSrcRGB,				  ctx->Color.BlendDstRGB,				  ctx->Color.BlendSrcA,				  ctx->Color.BlendDstA);   ctx->Driver.ColorMask( ctx, 			  ctx->Color.ColorMask[RCOMP],			  ctx->Color.ColorMask[GCOMP],			  ctx->Color.ColorMask[BCOMP],			  ctx->Color.ColorMask[ACOMP]);   ctx->Driver.CullFace( ctx, ctx->Polygon.CullFaceMode );   ctx->Driver.DepthFunc( ctx, ctx->Depth.Func );   ctx->Driver.DepthMask( ctx, ctx->Depth.Mask );   ctx->Driver.Enable( ctx, GL_ALPHA_TEST, ctx->Color.AlphaEnabled );   ctx->Driver.Enable( ctx, GL_BLEND, ctx->Color.BlendEnabled );   ctx->Driver.Enable( ctx, GL_COLOR_LOGIC_OP, ctx->Color.ColorLogicOpEnabled );   ctx->Driver.Enable( ctx, GL_COLOR_SUM, ctx->Fog.ColorSumEnabled );   ctx->Driver.Enable( ctx, GL_CULL_FACE, ctx->Polygon.CullFlag );   ctx->Driver.Enable( ctx, GL_DEPTH_TEST, ctx->Depth.Test );   ctx->Driver.Enable( ctx, GL_DITHER, ctx->Color.DitherFlag );   ctx->Driver.Enable( ctx, GL_FOG, ctx->Fog.Enabled );   ctx->Driver.Enable( ctx, GL_LIGHTING, ctx->Light.Enabled );   ctx->Driver.Enable( ctx, GL_LINE_SMOOTH, ctx->Line.SmoothFlag );   ctx->Driver.Enable( ctx, GL_POLYGON_STIPPLE, ctx->Polygon.StippleFlag );   ctx->Driver.Enable( ctx, GL_SCISSOR_TEST, ctx->Scissor.Enabled );   ctx->Driver.Enable( ctx, GL_STENCIL_TEST, ctx->Stencil.Enabled );   ctx->Driver.Enable( ctx, GL_TEXTURE_1D, GL_FALSE );   ctx->Driver.Enable( ctx, GL_TEXTURE_2D, GL_FALSE );   ctx->Driver.Enable( ctx, GL_TEXTURE_RECTANGLE_NV, GL_FALSE );   ctx->Driver.Enable( ctx, GL_TEXTURE_3D, GL_FALSE );   ctx->Driver.Enable( ctx, GL_TEXTURE_CUBE_MAP, GL_FALSE );   ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color );   ctx->Driver.Fogfv( ctx, GL_FOG_MODE, 0 );   ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density );   ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start );   ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End );   ctx->Driver.FrontFace( ctx, ctx->Polygon.FrontFace );   {      GLfloat f = (GLfloat)ctx->Light.Model.ColorControl;      ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_COLOR_CONTROL, &f );   }   ctx->Driver.LineWidth( ctx, ctx->Line.Width );   ctx->Driver.LogicOpcode( ctx, ctx->Color.LogicOp );   ctx->Driver.PointSize( ctx, ctx->Point.Size );   ctx->Driver.PolygonStipple( ctx, (const GLubyte *)ctx->PolygonStipple );   ctx->Driver.Scissor( ctx, ctx->Scissor.X, ctx->Scissor.Y,			ctx->Scissor.Width, ctx->Scissor.Height );   ctx->Driver.ShadeModel( ctx, ctx->Light.ShadeModel );   ctx->Driver.StencilFuncSeparate( ctx, GL_FRONT,                                    ctx->Stencil.Function[0],                                    ctx->Stencil.Ref[0],                                    ctx->Stencil.ValueMask[0] );   ctx->Driver.StencilFuncSeparate( ctx, GL_BACK,                                    ctx->Stencil.Function[1],                                    ctx->Stencil.Ref[1],                                    ctx->Stencil.ValueMask[1] );   ctx->Driver.StencilMaskSeparate( ctx, GL_FRONT, ctx->Stencil.WriteMask[0] );   ctx->Driver.StencilMaskSeparate( ctx, GL_BACK, ctx->Stencil.WriteMask[1] );   ctx->Driver.StencilOpSeparate( ctx, GL_FRONT,                                  ctx->Stencil.FailFunc[0],                                  ctx->Stencil.ZFailFunc[0],                                  ctx->Stencil.ZPassFunc[0]);   ctx->Driver.StencilOpSeparate( ctx, GL_BACK,                                  ctx->Stencil.FailFunc[1],                                  ctx->Stencil.ZFailFunc[1],                                  ctx->Stencil.ZPassFunc[1]);   ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] );}

⌨️ 快捷键说明

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