📄 mga_xmesa.c
字号:
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 + -