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 + -
显示快捷键?