via_context.c
来自「mesa-6.5-minigui源码」· C语言 代码 · 共 899 行 · 第 1/2 页
C
899 行
if (vmesa->breadcrumb.map) via_free_draw_buffer(vmesa, &vmesa->breadcrumb); if (vmesa->dma) via_free_dma_buffer(vmesa);}GLbooleanviaCreateContext(const __GLcontextModes *visual, __DRIcontextPrivate *driContextPriv, void *sharedContextPrivate){ GLcontext *ctx, *shareCtx; struct via_context *vmesa; __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; viaScreenPrivate *viaScreen = (viaScreenPrivate *)sPriv->private; drm_via_sarea_t *saPriv = (drm_via_sarea_t *) (((GLubyte *)sPriv->pSAREA) + viaScreen->sareaPrivOffset); struct dd_function_table functions; /* Allocate via context */ vmesa = (struct via_context *) CALLOC_STRUCT(via_context); if (!vmesa) { return GL_FALSE; } /* Parse configuration files. */ driParseConfigFiles (&vmesa->optionCache, &viaScreen->optionCache, sPriv->myNum, "via"); /* pick back buffer */ vmesa->hasBack = visual->doubleBufferMode; switch(visual->depthBits) { case 0: vmesa->hasDepth = GL_FALSE; vmesa->depthBits = 0; vmesa->depth_max = 1.0; break; case 16: vmesa->hasDepth = GL_TRUE; vmesa->depthBits = visual->depthBits; vmesa->have_hw_stencil = GL_FALSE; vmesa->depth_max = (GLfloat)0xffff; vmesa->depth_clear_mask = 0xf << 28; vmesa->ClearDepth = 0xffff; vmesa->polygon_offset_scale = 1.0 / vmesa->depth_max; break; case 24: vmesa->hasDepth = GL_TRUE; vmesa->depthBits = visual->depthBits; vmesa->depth_max = (GLfloat) 0xffffff; vmesa->depth_clear_mask = 0xe << 28; vmesa->ClearDepth = 0xffffff00; assert(visual->haveStencilBuffer); assert(visual->stencilBits == 8); vmesa->have_hw_stencil = GL_TRUE; vmesa->stencilBits = visual->stencilBits; vmesa->stencil_clear_mask = 0x1 << 28; vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max; break; case 32: vmesa->hasDepth = GL_TRUE; vmesa->depthBits = visual->depthBits; assert(!visual->haveStencilBuffer); vmesa->have_hw_stencil = GL_FALSE; vmesa->depth_max = (GLfloat)0xffffffff; vmesa->depth_clear_mask = 0xf << 28; vmesa->ClearDepth = 0xffffffff; vmesa->polygon_offset_scale = 2.0 / vmesa->depth_max; break; default: assert(0); break; } make_empty_list(&vmesa->freed_tex_buffers); make_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO]); make_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP]); make_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM]); _mesa_init_driver_functions(&functions); viaInitTextureFuncs(&functions); /* Allocate the Mesa context */ if (sharedContextPrivate) shareCtx = ((struct via_context *) sharedContextPrivate)->glCtx; else shareCtx = NULL; vmesa->glCtx = _mesa_create_context(visual, shareCtx, &functions, (void*) vmesa); vmesa->shareCtx = shareCtx; if (!vmesa->glCtx) { FREE(vmesa); return GL_FALSE; } driContextPriv->driverPrivate = vmesa; ctx = vmesa->glCtx; ctx->Const.MaxTextureLevels = 10; ctx->Const.MaxTextureUnits = 2; ctx->Const.MaxTextureImageUnits = ctx->Const.MaxTextureUnits; ctx->Const.MaxTextureCoordUnits = ctx->Const.MaxTextureUnits; ctx->Const.MinLineWidth = 1.0; ctx->Const.MinLineWidthAA = 1.0; ctx->Const.MaxLineWidth = 1.0; ctx->Const.MaxLineWidthAA = 1.0; ctx->Const.LineWidthGranularity = 1.0; ctx->Const.MinPointSize = 1.0; ctx->Const.MinPointSizeAA = 1.0; ctx->Const.MaxPointSize = 1.0; ctx->Const.MaxPointSizeAA = 1.0; ctx->Const.PointSizeGranularity = 1.0; ctx->Driver.GetBufferSize = viaBufferSize;/* ctx->Driver.ResizeBuffers = _swrast_alloc_buffers; *//* FIXME ?? */ ctx->Driver.GetString = viaGetString; ctx->DriverCtx = (void *)vmesa; vmesa->glCtx = ctx; /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(ctx); _ac_CreateContext(ctx); _tnl_CreateContext(ctx); _swsetup_CreateContext(ctx); /* Install the customized pipeline: */ _tnl_destroy_pipeline(ctx); _tnl_install_pipeline(ctx, via_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);/* vmesa->display = dpy; */ vmesa->display = sPriv->display; vmesa->hHWContext = driContextPriv->hHWContext; vmesa->driFd = sPriv->fd; vmesa->driHwLock = &sPriv->pSAREA->lock; vmesa->viaScreen = viaScreen; vmesa->driScreen = sPriv; vmesa->sarea = saPriv; vmesa->renderIndex = ~0; vmesa->setupIndex = ~0; vmesa->hwPrimitive = GL_POLYGON+1; /* KW: Hardwire this. Was previously set bogusly in * viaCreateBuffer. Needs work before PBUFFER can be used: */ vmesa->drawType = GLX_WINDOW_BIT; _math_matrix_ctr(&vmesa->ViewportMatrix); /* Do this early, before VIA_FLUSH_DMA can be called: */ if (!AllocateDmaBuffer(vmesa)) { fprintf(stderr ,"AllocateDmaBuffer fail\n"); FreeBuffer(vmesa); FREE(vmesa); return GL_FALSE; } /* Allocate a small piece of fb memory for synchronization: */ vmesa->breadcrumb.bpp = 32; vmesa->breadcrumb.pitch = buffer_align( 64 ) << 2; vmesa->breadcrumb.size = vmesa->breadcrumb.pitch; if (!via_alloc_draw_buffer(vmesa, &vmesa->breadcrumb)) { fprintf(stderr ,"AllocateDmaBuffer fail\n"); FreeBuffer(vmesa); FREE(vmesa); return GL_FALSE; } driInitExtensions( ctx, card_extensions, GL_TRUE ); viaInitStateFuncs(ctx); viaInitTriFuncs(ctx); viaInitSpanFuncs(ctx); viaInitIoctlFuncs(ctx); viaInitState(ctx); if (getenv("VIA_DEBUG")) VIA_DEBUG = driParseDebugString( getenv( "VIA_DEBUG" ), debug_control ); if (getenv("VIA_NO_RAST")) FALLBACK(vmesa, VIA_FALLBACK_USER_DISABLE, 1); /* I don't understand why this isn't working: */ vmesa->vblank_flags = vmesa->viaScreen->irqEnabled ? driGetDefaultVBlankFlags(&vmesa->optionCache) : VBLANK_FLAG_NO_IRQ; /* Hack this up in its place: */ vmesa->vblank_flags = (getenv("VIA_VSYNC") ? VBLANK_FLAG_SYNC : VBLANK_FLAG_NO_IRQ); if (getenv("VIA_PAGEFLIP")) vmesa->allowPageFlip = 1; (*dri_interface->getUST)( &vmesa->swap_ust ); vmesa->regMMIOBase = (GLuint *)((unsigned long)viaScreen->reg); vmesa->pnGEMode = (GLuint *)((unsigned long)viaScreen->reg + 0x4); vmesa->regEngineStatus = (GLuint *)((unsigned long)viaScreen->reg + 0x400); vmesa->regTranSet = (GLuint *)((unsigned long)viaScreen->reg + 0x43C); vmesa->regTranSpace = (GLuint *)((unsigned long)viaScreen->reg + 0x440); vmesa->agpBase = viaScreen->agpBase; return GL_TRUE;}voidviaDestroyContext(__DRIcontextPrivate *driContextPriv){ GET_CURRENT_CONTEXT(ctx); struct via_context *vmesa = (struct via_context *)driContextPriv->driverPrivate; struct via_context *current = ctx ? VIA_CONTEXT(ctx) : NULL; assert(vmesa); /* should never be null */ /* check if we're deleting the currently bound context */ if (vmesa == current) { VIA_FLUSH_DMA(vmesa); _mesa_make_current(NULL, NULL, NULL); } if (vmesa) { viaWaitIdle(vmesa, GL_FALSE); if (vmesa->doPageFlip) { LOCK_HARDWARE(vmesa); if (vmesa->pfCurrentOffset != 0) { fprintf(stderr, "%s - reset pf\n", __FUNCTION__); viaResetPageFlippingLocked(vmesa); } UNLOCK_HARDWARE(vmesa); } _swsetup_DestroyContext(vmesa->glCtx); _tnl_DestroyContext(vmesa->glCtx); _ac_DestroyContext(vmesa->glCtx); _swrast_DestroyContext(vmesa->glCtx); /* free the Mesa context */ _mesa_destroy_context(vmesa->glCtx); /* release our data */ FreeBuffer(vmesa); assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_AGP])); assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_VIDEO])); assert (is_empty_list(&vmesa->tex_image_list[VIA_MEM_SYSTEM])); assert (is_empty_list(&vmesa->freed_tex_buffers)); FREE(vmesa); }}void viaXMesaWindowMoved(struct via_context *vmesa){ __DRIdrawablePrivate *dPriv = vmesa->driDrawable; GLuint bytePerPixel = vmesa->viaScreen->bitsPerPixel >> 3; if (!dPriv) return; switch (vmesa->glCtx->DrawBuffer->_ColorDrawBufferMask[0]) { case BUFFER_BIT_BACK_LEFT: if (dPriv->numBackClipRects == 0) { vmesa->numClipRects = dPriv->numClipRects; vmesa->pClipRects = dPriv->pClipRects; } else { vmesa->numClipRects = dPriv->numBackClipRects; vmesa->pClipRects = dPriv->pBackClipRects; } break; case BUFFER_BIT_FRONT_LEFT: vmesa->numClipRects = dPriv->numClipRects; vmesa->pClipRects = dPriv->pClipRects; break; default: vmesa->numClipRects = 0; break; } if (vmesa->drawW != dPriv->w || vmesa->drawH != dPriv->h) calculate_buffer_parameters( vmesa, vmesa->glCtx->DrawBuffer ); vmesa->drawXoff = (GLuint)(((dPriv->x * bytePerPixel) & 0x1f) / bytePerPixel); vmesa->drawX = dPriv->x - vmesa->drawXoff; vmesa->drawY = dPriv->y; vmesa->drawW = dPriv->w; vmesa->drawH = dPriv->h; vmesa->front.orig = (vmesa->front.offset + vmesa->drawY * vmesa->front.pitch + vmesa->drawX * bytePerPixel); vmesa->front.origMap = (vmesa->front.map + vmesa->drawY * vmesa->front.pitch + vmesa->drawX * bytePerPixel); vmesa->back.orig = vmesa->back.offset; vmesa->depth.orig = vmesa->depth.offset; vmesa->back.origMap = vmesa->back.map; vmesa->depth.origMap = vmesa->depth.map; viaCalcViewport(vmesa->glCtx);}GLbooleanviaUnbindContext(__DRIcontextPrivate *driContextPriv){ return GL_TRUE;}GLbooleanviaMakeCurrent(__DRIcontextPrivate *driContextPriv, __DRIdrawablePrivate *driDrawPriv, __DRIdrawablePrivate *driReadPriv){ if (VIA_DEBUG & DEBUG_DRI) { fprintf(stderr, "driContextPriv = %016lx\n", (unsigned long)driContextPriv); fprintf(stderr, "driDrawPriv = %016lx\n", (unsigned long)driDrawPriv); fprintf(stderr, "driReadPriv = %016lx\n", (unsigned long)driReadPriv); } if (driContextPriv) { struct via_context *vmesa = (struct via_context *)driContextPriv->driverPrivate; GLcontext *ctx = vmesa->glCtx; struct gl_framebuffer *drawBuffer, *readBuffer; drawBuffer = (GLframebuffer *)driDrawPriv->driverPrivate; readBuffer = (GLframebuffer *)driReadPriv->driverPrivate; if ( vmesa->driDrawable != driDrawPriv ) { driDrawableInitVBlank( driDrawPriv, vmesa->vblank_flags ); vmesa->driDrawable = driDrawPriv; if ( ! calculate_buffer_parameters( vmesa, drawBuffer ) ) { return GL_FALSE; } } _mesa_make_current(vmesa->glCtx, drawBuffer, readBuffer); ctx->Driver.DrawBuffer( ctx, ctx->Color.DrawBuffer[0] ); viaXMesaWindowMoved(vmesa); ctx->Driver.Scissor(vmesa->glCtx, vmesa->glCtx->Scissor.X, vmesa->glCtx->Scissor.Y, vmesa->glCtx->Scissor.Width, vmesa->glCtx->Scissor.Height); } else { _mesa_make_current(NULL, NULL, NULL); } return GL_TRUE;}void viaGetLock(struct via_context *vmesa, GLuint flags){ __DRIdrawablePrivate *dPriv = vmesa->driDrawable; __DRIscreenPrivate *sPriv = vmesa->driScreen; drmGetLock(vmesa->driFd, vmesa->hHWContext, flags); DRI_VALIDATE_DRAWABLE_INFO( sPriv, dPriv ); if (vmesa->sarea->ctxOwner != vmesa->hHWContext) { vmesa->sarea->ctxOwner = vmesa->hHWContext; vmesa->newEmitState = ~0; } if (vmesa->lastStamp != dPriv->lastStamp) { viaXMesaWindowMoved(vmesa); driUpdateFramebufferSize(vmesa->glCtx, dPriv); vmesa->newEmitState = ~0; vmesa->lastStamp = dPriv->lastStamp; } if (vmesa->doPageFlip && vmesa->pfCurrentOffset != vmesa->sarea->pfCurrentOffset) { fprintf(stderr, "%s - reset pf\n", __FUNCTION__); viaResetPageFlippingLocked(vmesa); }}voidviaSwapBuffers(__DRIdrawablePrivate *drawablePrivate){ __DRIdrawablePrivate *dPriv = (__DRIdrawablePrivate *)drawablePrivate; if (dPriv && dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) { struct via_context *vmesa = (struct via_context *)dPriv->driContextPriv->driverPrivate; GLcontext *ctx = vmesa->glCtx; _mesa_notifySwapBuffers(ctx); if (ctx->Visual.doubleBufferMode) { if (vmesa->doPageFlip) { viaPageFlip(dPriv); } else { viaCopyBuffer(dPriv); } } else VIA_FLUSH_DMA(vmesa); } else { _mesa_problem(NULL, "viaSwapBuffers: drawable has no context!\n"); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?