📄 intel_context.c
字号:
voidintelInitDriverFunctions(struct dd_function_table *functions){ _mesa_init_driver_functions(functions); functions->Flush = intelFlush; functions->Finish = intelFinish; functions->GetString = intelGetString; functions->UpdateState = intelInvalidateState; functions->CopyColorTable = _swrast_CopyColorTable; functions->CopyColorSubTable = _swrast_CopyColorSubTable; functions->CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D; functions->CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D; functions->BeginQuery = intelBeginQuery; functions->EndQuery = intelEndQuery; intelInitTextureFuncs(functions); intelInitStateFuncs(functions); intelInitBufferFuncs(functions); intelInitPixelFuncs(functions);}GLbooleanintelInitContext(struct intel_context *intel, const __GLcontextModes * mesaVis, __DRIcontextPrivate * driContextPriv, void *sharedContextPrivate, struct dd_function_table *functions){ GLcontext *ctx = &intel->ctx; GLcontext *shareCtx = (GLcontext *) sharedContextPrivate; __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv; intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private; volatile struct drm_i915_sarea *saPriv = (struct drm_i915_sarea *) (((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset); int fthrottle_mode; if (!_mesa_initialize_context(&intel->ctx, mesaVis, shareCtx, functions, (void *) intel)) { _mesa_printf("%s: failed to init mesa context\n", __FUNCTION__); return GL_FALSE; } driContextPriv->driverPrivate = intel; intel->intelScreen = intelScreen; intel->driScreen = sPriv; intel->sarea = saPriv; /* Dri stuff */ intel->hHWContext = driContextPriv->hHWContext; intel->driFd = sPriv->fd; intel->driHwLock = sPriv->lock; intel->width = intelScreen->width; intel->height = intelScreen->height; driParseConfigFiles(&intel->optionCache, &intelScreen->optionCache, intel->driScreen->myNum, IS_965(intelScreen->deviceID) ? "i965" : "i915"); if (intelScreen->deviceID == PCI_CHIP_I865_G) intel->maxBatchSize = 4096; else intel->maxBatchSize = BATCH_SZ; if (!intel_init_bufmgr(intel)) return GL_FALSE; ctx->Const.MaxTextureMaxAnisotropy = 2.0; /* This doesn't yet catch all non-conformant rendering, but it's a * start. */ if (getenv("INTEL_STRICT_CONFORMANCE")) { intel->strict_conformance = 1; } if (intel->strict_conformance) { 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; } else { ctx->Const.MinLineWidth = 1.0; ctx->Const.MinLineWidthAA = 1.0; ctx->Const.MaxLineWidth = 5.0; ctx->Const.MaxLineWidthAA = 5.0; ctx->Const.LineWidthGranularity = 0.5; } ctx->Const.MinPointSize = 1.0; ctx->Const.MinPointSizeAA = 1.0; ctx->Const.MaxPointSize = 255.0; ctx->Const.MaxPointSizeAA = 3.0; ctx->Const.PointSizeGranularity = 1.0; /* reinitialize the context point state. * It depend on constants in __GLcontextRec::Const */ _mesa_init_point(ctx); ctx->Const.MaxColorAttachments = 4; /* XXX FBO: review this */ /* Initialize the software rasterizer and helper modules. */ _swrast_CreateContext(ctx); _vbo_CreateContext(ctx); _tnl_CreateContext(ctx); _swsetup_CreateContext(ctx); /* Configure swrast to match hardware characteristics: */ _swrast_allow_pixel_fog(ctx, GL_FALSE); _swrast_allow_vertex_fog(ctx, GL_TRUE); intel->hw_stencil = mesaVis->stencilBits && mesaVis->depthBits == 24; intel->hw_stipple = 1; /* XXX FBO: this doesn't seem to be used anywhere */ switch (mesaVis->depthBits) { case 0: /* what to do in this case? */ case 16: intel->polygon_offset_scale = 1.0; break; case 24: intel->polygon_offset_scale = 2.0; /* req'd to pass glean */ break; default: assert(0); break; } if (IS_965(intelScreen->deviceID)) intel->polygon_offset_scale /= 0xffff; intel->RenderIndex = ~0; fthrottle_mode = driQueryOptioni(&intel->optionCache, "fthrottle_mode"); intel->irqsEmitted = 0; intel->do_irqs = (intel->intelScreen->irq_active && fthrottle_mode == DRI_CONF_FTHROTTLE_IRQS); intel->do_usleeps = (fthrottle_mode == DRI_CONF_FTHROTTLE_USLEEPS); _math_matrix_ctr(&intel->ViewportMatrix); if (IS_965(intelScreen->deviceID) && !intel->intelScreen->irq_active) { _mesa_printf("IRQs not active. Exiting\n"); exit(1); } intelInitExtensions(ctx, GL_FALSE); INTEL_DEBUG = driParseDebugString(getenv("INTEL_DEBUG"), debug_control); if (INTEL_DEBUG & DEBUG_BUFMGR) dri_bufmgr_set_debug(intel->bufmgr, GL_TRUE); if (!sPriv->dri2.enabled) intel_recreate_static_regions(intel); intel->batch = intel_batchbuffer_alloc(intel); intel->last_swap_fence = NULL; intel->first_swap_fence = NULL; intel_bufferobj_init(intel); intel_fbo_init(intel); if (intel->ctx.Mesa_DXTn) { _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); _mesa_enable_extension(ctx, "GL_S3_s3tc"); } else if (driQueryOptionb(&intel->optionCache, "force_s3tc_enable")) { _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc"); } intel->prim.primitive = ~0; /* Force all software fallbacks */ if (driQueryOptionb(&intel->optionCache, "no_rast")) { fprintf(stderr, "disabling 3D rasterization\n"); FALLBACK(intel, INTEL_FALLBACK_USER, 1); intel->no_rast = 1; } /* Disable all hardware rendering (skip emitting batches and fences/waits * to the kernel) */ intel->no_hw = getenv("INTEL_NO_HW") != NULL; return GL_TRUE;}voidintelDestroyContext(__DRIcontextPrivate * driContextPriv){ struct intel_context *intel = (struct intel_context *) driContextPriv->driverPrivate; assert(intel); /* should never be null */ if (intel) { GLboolean release_texture_heaps; INTEL_FIREVERTICES(intel); intel->vtbl.destroy(intel); release_texture_heaps = (intel->ctx.Shared->RefCount == 1); _swsetup_DestroyContext(&intel->ctx); _tnl_DestroyContext(&intel->ctx); _vbo_DestroyContext(&intel->ctx); _swrast_DestroyContext(&intel->ctx); intel->Fallback = 0; /* don't call _swrast_Flush later */ intel_batchbuffer_free(intel->batch); if (intel->last_swap_fence) { dri_fence_wait(intel->last_swap_fence); dri_fence_unreference(intel->last_swap_fence); intel->last_swap_fence = NULL; } if (intel->first_swap_fence) { dri_fence_wait(intel->first_swap_fence); dri_fence_unreference(intel->first_swap_fence); intel->first_swap_fence = NULL; } if (release_texture_heaps) { /* This share group is about to go away, free our private * texture object data. */ if (INTEL_DEBUG & DEBUG_TEXTURE) fprintf(stderr, "do something to free texture heaps\n"); } /* free the Mesa context */ _mesa_free_context_data(&intel->ctx); dri_bufmgr_destroy(intel->bufmgr); }}GLbooleanintelUnbindContext(__DRIcontextPrivate * driContextPriv){ return GL_TRUE;}GLbooleanintelMakeCurrent(__DRIcontextPrivate * driContextPriv, __DRIdrawablePrivate * driDrawPriv, __DRIdrawablePrivate * driReadPriv){ __DRIscreenPrivate *psp = driDrawPriv->driScreenPriv; if (driContextPriv) { struct intel_context *intel = (struct intel_context *) driContextPriv->driverPrivate; struct intel_framebuffer *intel_fb = (struct intel_framebuffer *) driDrawPriv->driverPrivate; GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate; /* XXX FBO temporary fix-ups! */ /* if the renderbuffers don't have regions, init them from the context */ if (!driContextPriv->driScreenPriv->dri2.enabled) { struct intel_renderbuffer *irbDepth = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); struct intel_renderbuffer *irbStencil = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); if (intel_fb->color_rb[0]) { intel_renderbuffer_set_region(intel_fb->color_rb[0], intel->front_region); } if (intel_fb->color_rb[1]) { intel_renderbuffer_set_region(intel_fb->color_rb[1], intel->back_region); }#if 0 if (intel_fb->color_rb[2]) { intel_renderbuffer_set_region(intel_fb->color_rb[2], intel->third_region); }#endif if (irbDepth) { intel_renderbuffer_set_region(irbDepth, intel->depth_region); } if (irbStencil) { intel_renderbuffer_set_region(irbStencil, intel->depth_region); } } /* set GLframebuffer size to match window, if needed */ driUpdateFramebufferSize(&intel->ctx, driDrawPriv); if (driReadPriv != driDrawPriv) { driUpdateFramebufferSize(&intel->ctx, driReadPriv); } _mesa_make_current(&intel->ctx, &intel_fb->Base, readFb); /* The drawbuffer won't always be updated by _mesa_make_current: */ if (intel->ctx.DrawBuffer == &intel_fb->Base) { if (intel->driReadDrawable != driReadPriv) intel->driReadDrawable = driReadPriv; if (intel->driDrawable != driDrawPriv) { if (driDrawPriv->swap_interval == (unsigned)-1) { int i; driDrawPriv->vblFlags = (intel->intelScreen->irq_active != 0) ? driGetDefaultVBlankFlags(&intel->optionCache) : VBLANK_FLAG_NO_IRQ; (*psp->systemTime->getUST) (&intel_fb->swap_ust); driDrawableInitVBlank(driDrawPriv); intel_fb->vbl_waited = driDrawPriv->vblSeq; for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) { if (intel_fb->color_rb[i]) intel_fb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq; } } intel->driDrawable = driDrawPriv; intelWindowMoved(intel); } intel_draw_buffer(&intel->ctx, &intel_fb->Base); } } else { _mesa_make_current(NULL, NULL, NULL); } return GL_TRUE;}static voidintelContendedLock(struct intel_context *intel, GLuint flags){ __DRIdrawablePrivate *dPriv = intel->driDrawable; __DRIscreenPrivate *sPriv = intel->driScreen; volatile struct drm_i915_sarea *sarea = intel->sarea; int me = intel->hHWContext; drmGetLock(intel->driFd, intel->hHWContext, flags); intel->locked = 1; if (INTEL_DEBUG & DEBUG_LOCK) _mesa_printf("%s - got contended lock\n", __progname); /* 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 (sarea && sarea->ctxOwner != me) { if (INTEL_DEBUG & DEBUG_BUFMGR) { fprintf(stderr, "Lost Context: sarea->ctxOwner %x me %x\n", sarea->ctxOwner, me); } sarea->ctxOwner = me; } /* If the last consumer of the texture memory wasn't us, notify the fake * bufmgr and record the new owner. We should have the memory shared * between contexts of a single fake bufmgr, but this will at least make * things correct for now. */ if (!intel->ttm && sarea->texAge != intel->hHWContext) { sarea->texAge = intel->hHWContext; dri_bufmgr_fake_contended_lock_take(intel->bufmgr); if (INTEL_DEBUG & DEBUG_BATCH) intel_decode_context_reset(); if (INTEL_DEBUG & DEBUG_BUFMGR) fprintf(stderr, "Lost Textures: sarea->texAge %x hw context %x\n", sarea->ctxOwner, intel->hHWContext); } if (sarea->width != intel->width || sarea->height != intel->height) { int numClipRects = intel->numClipRects; /* * FIXME: Really only need to do this when drawing to a * common back- or front buffer. */ /* * This will essentially drop the outstanding batchbuffer on * the floor. */ intel->numClipRects = 0; if (intel->Fallback) _swrast_flush(&intel->ctx); if (!IS_965(intel->intelScreen->deviceID)) INTEL_FIREVERTICES(intel); if (intel->batch->map != intel->batch->ptr) intel_batchbuffer_flush(intel->batch); intel->numClipRects = numClipRects; /* force window update */ intel->lastStamp = 0; intel->width = sarea->width; intel->height = sarea->height; } /* Drawable changed? */ if (dPriv && intel->lastStamp != dPriv->lastStamp) { intelWindowMoved(intel); intel->lastStamp = dPriv->lastStamp; }}_glthread_DECLARE_STATIC_MUTEX(lockMutex);/* Lock the hardware and validate our state. */void LOCK_HARDWARE( struct intel_context *intel ){ __DRIdrawable *dPriv = intel->driDrawable; __DRIscreen *sPriv = intel->driScreen; char __ret = 0; struct intel_framebuffer *intel_fb = NULL; struct intel_renderbuffer *intel_rb = NULL; _glthread_LOCK_MUTEX(lockMutex); assert(!intel->locked); intel->locked = 1; if (intel->driDrawable) { intel_fb = intel->driDrawable->driverPrivate; if (intel_fb) intel_rb = intel_get_renderbuffer(&intel_fb->Base, intel_fb->Base._ColorDrawBufferIndexes[0]); } if (intel_rb && dPriv->vblFlags && !(dPriv->vblFlags & VBLANK_FLAG_NO_IRQ) && (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) { drmVBlank vbl; vbl.request.type = DRM_VBLANK_ABSOLUTE; if ( dPriv->vblFlags & VBLANK_FLAG_SECONDARY ) { vbl.request.type |= DRM_VBLANK_SECONDARY; } vbl.request.sequence = intel_rb->vbl_pending; drmWaitVBlank(intel->driFd, &vbl); intel_fb->vbl_waited = vbl.reply.sequence; } DRM_CAS(intel->driHwLock, intel->hHWContext, (DRM_LOCK_HELD|intel->hHWContext), __ret); if (sPriv->dri2.enabled) { if (__ret) drmGetLock(intel->driFd, intel->hHWContext, 0); if (__driParseEvents(dPriv->driContextPriv, dPriv)) { intelWindowMoved(intel); intel_draw_buffer(&intel->ctx, intel->ctx.DrawBuffer); } } else if (__ret) { intelContendedLock( intel, 0 ); } if (INTEL_DEBUG & DEBUG_LOCK) _mesa_printf("%s - locked\n", __progname);}/* Unlock the hardware using the global current context */void UNLOCK_HARDWARE( struct intel_context *intel ){ intel->vtbl.note_unlock( intel ); intel->locked = 0; DRM_UNLOCK(intel->driFd, intel->driHwLock, intel->hHWContext); _glthread_UNLOCK_MUTEX(lockMutex); if (INTEL_DEBUG & DEBUG_LOCK) _mesa_printf("%s - unlocked\n", __progname); /** * Nothing should be left in batch outside of LOCK/UNLOCK which references * cliprects. */ assert(intel->batch->cliprect_mode != REFERENCES_CLIPRECTS);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -