📄 i810context.c
字号:
/* 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 + -