⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intel_context.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
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 + -