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

📄 intel_screen.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
   }   /* Allocate the private area */   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));   if (!intelScreen) {      fprintf(stderr, "\nERROR!  Allocating private area failed\n");      return GL_FALSE;   }   /* parse information in __driConfigOptions */   driParseOptionInfo(&intelScreen->optionCache,                      __driConfigOptions, __driNConfigOptions);   intelScreen->driScrnPriv = sPriv;   sPriv->private = (void *) intelScreen;   intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;   sarea = (struct drm_i915_sarea *)      (((GLubyte *) sPriv->pSAREA) + intelScreen->sarea_priv_offset);   intelScreen->deviceID = gDRIPriv->deviceID;   intelUpdateScreenFromSAREA(intelScreen, sarea);   if (!intelMapScreenRegions(sPriv)) {      fprintf(stderr, "\nERROR!  mapping regions\n");      _mesa_free(intelScreen);      sPriv->private = NULL;      return GL_FALSE;   }   intelScreen->sarea_priv_offset = gDRIPriv->sarea_priv_offset;   if (0)      intelPrintDRIInfo(intelScreen, sPriv, gDRIPriv);   intelScreen->drmMinor = sPriv->drm_version.minor;   /* Determine if IRQs are active? */   if (!intel_get_param(sPriv, I915_PARAM_IRQ_ACTIVE,			&intelScreen->irq_active))      return GL_FALSE;   /* Determine if batchbuffers are allowed */   if (!intel_get_param(sPriv, I915_PARAM_ALLOW_BATCHBUFFER,			&intelScreen->allow_batchbuffer))      return GL_FALSE;   sPriv->extensions = intelScreenExtensions;   return GL_TRUE;}static voidintelDestroyScreen(__DRIscreenPrivate * sPriv){   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;   intelUnmapScreenRegions(intelScreen);   FREE(intelScreen);   sPriv->private = NULL;}/** * This is called when we need to set up GL rendering to a new X window. */static GLbooleanintelCreateBuffer(__DRIscreenPrivate * driScrnPriv,                  __DRIdrawablePrivate * driDrawPriv,                  const __GLcontextModes * mesaVis, GLboolean isPixmap){   intelScreenPrivate *screen = (intelScreenPrivate *) driScrnPriv->private;   if (isPixmap) {      return GL_FALSE;          /* not implemented */   }   else {      GLboolean swStencil = (mesaVis->stencilBits > 0 &&                             mesaVis->depthBits != 24);      GLenum rgbFormat = (mesaVis->redBits == 5 ? GL_RGB5 : GL_RGBA8);      struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer);      if (!intel_fb)	 return GL_FALSE;      _mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);      /* setup the hardware-based renderbuffers */      {         intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat);         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,				&intel_fb->color_rb[0]->Base);      }      if (mesaVis->doubleBufferMode) {         intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat);         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,				&intel_fb->color_rb[1]->Base);	 if (screen->third.handle) {	    struct gl_renderbuffer *tmp_rb = NULL;	    intel_fb->color_rb[2] = intel_create_renderbuffer(rgbFormat);	    _mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base);	 }      }      if (mesaVis->depthBits == 24) {	 if (mesaVis->stencilBits == 8) {	    /* combined depth/stencil buffer */	    struct intel_renderbuffer *depthStencilRb	       = intel_create_renderbuffer(GL_DEPTH24_STENCIL8_EXT);	    /* note: bind RB to two attachment points */	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,				   &depthStencilRb->Base);	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL,				   &depthStencilRb->Base);	 } else {	    struct intel_renderbuffer *depthRb	       = intel_create_renderbuffer(GL_DEPTH_COMPONENT24);	    _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,				   &depthRb->Base);	 }      }      else if (mesaVis->depthBits == 16) {         /* just 16-bit depth buffer, no hw stencil */         struct intel_renderbuffer *depthRb            = intel_create_renderbuffer(GL_DEPTH_COMPONENT16);         _mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base);      }      /* now add any/all software-based renderbuffers we may need */      _mesa_add_soft_renderbuffers(&intel_fb->Base,                                   GL_FALSE, /* never sw color */                                   GL_FALSE, /* never sw depth */                                   swStencil, mesaVis->accumRedBits > 0,                                   GL_FALSE, /* never sw alpha */                                   GL_FALSE  /* never sw aux */ );      driDrawPriv->driverPrivate = (void *) intel_fb;      return GL_TRUE;   }}static voidintelDestroyBuffer(__DRIdrawablePrivate * driDrawPriv){   _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));}/** * Get information about previous buffer swaps. */static intintelGetSwapInfo(__DRIdrawablePrivate * dPriv, __DRIswapInfo * sInfo){   struct intel_framebuffer *intel_fb;   if ((dPriv == NULL) || (dPriv->driverPrivate == NULL)       || (sInfo == NULL)) {      return -1;   }   intel_fb = dPriv->driverPrivate;   sInfo->swap_count = intel_fb->swap_count;   sInfo->swap_ust = intel_fb->swap_ust;   sInfo->swap_missed_count = intel_fb->swap_missed_count;   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)      ? driCalculateSwapUsage(dPriv, 0, intel_fb->swap_missed_ust)      : 0.0;   return 0;}/* There are probably better ways to do this, such as an * init-designated function to register chipids and createcontext * functions. */extern GLboolean i830CreateContext(const __GLcontextModes * mesaVis,                                   __DRIcontextPrivate * driContextPriv,                                   void *sharedContextPrivate);extern GLboolean i915CreateContext(const __GLcontextModes * mesaVis,                                   __DRIcontextPrivate * driContextPriv,                                   void *sharedContextPrivate);extern GLboolean brwCreateContext(const __GLcontextModes * mesaVis,				  __DRIcontextPrivate * driContextPriv,				  void *sharedContextPrivate);static GLbooleanintelCreateContext(const __GLcontextModes * mesaVis,                   __DRIcontextPrivate * driContextPriv,                   void *sharedContextPrivate){   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;   intelScreenPrivate *intelScreen = (intelScreenPrivate *) sPriv->private;#ifdef I915   if (IS_9XX(intelScreen->deviceID)) {      if (!IS_965(intelScreen->deviceID)) {	 return i915CreateContext(mesaVis, driContextPriv,				  sharedContextPrivate);      }   } else {      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);   }#else   if (IS_965(intelScreen->deviceID))      return brwCreateContext(mesaVis, driContextPriv, sharedContextPrivate);#endif   fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);   return GL_FALSE;}static __DRIconfig **intelFillInModes(__DRIscreenPrivate *psp,		 unsigned pixel_bits, unsigned depth_bits,                 unsigned stencil_bits, GLboolean have_back_buffer){   __DRIconfig **configs;   __GLcontextModes *m;   unsigned depth_buffer_factor;   unsigned back_buffer_factor;   GLenum fb_format;   GLenum fb_type;   int i;   /* GLX_SWAP_COPY_OML is only supported because the Intel driver doesn't    * support pageflipping at all.    */   static const GLenum back_buffer_modes[] = {      GLX_NONE, GLX_SWAP_UNDEFINED_OML, GLX_SWAP_COPY_OML   };   u_int8_t depth_bits_array[3];   u_int8_t stencil_bits_array[3];   depth_bits_array[0] = 0;   depth_bits_array[1] = depth_bits;   depth_bits_array[2] = depth_bits;   /* Just like with the accumulation buffer, always provide some modes    * with a stencil buffer.  It will be a sw fallback, but some apps won't    * care about that.    */   stencil_bits_array[0] = 0;   stencil_bits_array[1] = 0;   if (depth_bits == 24)      stencil_bits_array[1] = (stencil_bits == 0) ? 8 : stencil_bits;   stencil_bits_array[2] = (stencil_bits == 0) ? 8 : stencil_bits;   depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 3 : 1;   back_buffer_factor = (have_back_buffer) ? 3 : 1;   if (pixel_bits == 16) {      fb_format = GL_RGB;      fb_type = GL_UNSIGNED_SHORT_5_6_5;   }   else {      fb_format = GL_BGRA;      fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;   }   configs = driCreateConfigs(fb_format, fb_type,			      depth_bits_array, stencil_bits_array,			      depth_buffer_factor, back_buffer_modes,			      back_buffer_factor);   if (configs == NULL) {    fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,              __LINE__);      return NULL;   }   /* Mark the visual as slow if there are "fake" stencil bits.    */   for (i = 0; configs[i]; i++) {      m = &configs[i]->modes;      if ((m->stencilBits != 0) && (m->stencilBits != stencil_bits)) {         m->visualRating = GLX_SLOW_CONFIG;      }   }   return configs;}/** * This is the driver specific part of the createNewScreen entry point. * Called when using legacy DRI. *  * \todo maybe fold this into intelInitDriver * * \return the __GLcontextModes supported by this driver */static const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp){#ifdef I915   static const __DRIversion ddx_expected = { 1, 5, 0 };#else   static const __DRIversion ddx_expected = { 1, 6, 0 };#endif   static const __DRIversion dri_expected = { 4, 0, 0 };   static const __DRIversion drm_expected = { 1, 5, 0 };   I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;   if (!driCheckDriDdxDrmVersions2("i915",                                   &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?    */   intelInitExtensions(NULL, GL_TRUE);	      if (!intelInitDriver(psp))       return NULL;   psp->extensions = intelScreenExtensions;   return (const __DRIconfig **)       intelFillInModes(psp, dri_priv->cpp * 8,			(dri_priv->cpp == 2) ? 16 : 24,			(dri_priv->cpp == 2) ? 0  : 8, 1);}struct intel_context *intelScreenContext(intelScreenPrivate *intelScreen){  /*   * This should probably change to have the screen allocate a dummy   * context at screen creation. For now just use the current context.   */  GET_CURRENT_CONTEXT(ctx);  if (ctx == NULL) {     _mesa_problem(NULL, "No current context in intelScreenContext\n");     return NULL;  }  return intel_context(ctx);}/** * This is the driver specific part of the createNewScreen entry point. * Called when using DRI2. * * \return the __GLcontextModes supported by this driver */static const__DRIconfig **intelInitScreen2(__DRIscreenPrivate *psp){   intelScreenPrivate *intelScreen;   /* 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?    */   intelInitExtensions(NULL, GL_TRUE);   /* Allocate the private area */   intelScreen = (intelScreenPrivate *) CALLOC(sizeof(intelScreenPrivate));   if (!intelScreen) {      fprintf(stderr, "\nERROR!  Allocating private area failed\n");      return GL_FALSE;   }   /* parse information in __driConfigOptions */   driParseOptionInfo(&intelScreen->optionCache,                      __driConfigOptions, __driNConfigOptions);   intelScreen->driScrnPriv = psp;   psp->private = (void *) intelScreen;   intelScreen->drmMinor = psp->drm_version.minor;   /* Determine chipset ID? */   if (!intel_get_param(psp, I915_PARAM_CHIPSET_ID,			&intelScreen->deviceID))      return GL_FALSE;   /* Determine if IRQs are active? */   if (!intel_get_param(psp, I915_PARAM_IRQ_ACTIVE,			&intelScreen->irq_active))      return GL_FALSE;   /* Determine if batchbuffers are allowed */   if (!intel_get_param(psp, I915_PARAM_ALLOW_BATCHBUFFER,			&intelScreen->allow_batchbuffer))      return GL_FALSE;   if (!intelScreen->allow_batchbuffer) {      fprintf(stderr, "batch buffer not allowed\n");      return GL_FALSE;   }   psp->extensions = intelScreenExtensions;   return driConcatConfigs(intelFillInModes(psp, 16, 16, 0, 1),			   intelFillInModes(psp, 32, 24, 8, 1));}const struct __DriverAPIRec driDriverAPI = {   .InitScreen		 = intelInitScreen,   .DestroyScreen	 = intelDestroyScreen,   .CreateContext	 = intelCreateContext,   .DestroyContext	 = intelDestroyContext,   .CreateBuffer	 = intelCreateBuffer,   .DestroyBuffer	 = intelDestroyBuffer,   .SwapBuffers		 = intelSwapBuffers,   .MakeCurrent		 = intelMakeCurrent,   .UnbindContext	 = intelUnbindContext,   .GetSwapInfo		 = intelGetSwapInfo,   .GetDrawableMSC	 = driDrawableGetMSC32,   .WaitForMSC		 = driWaitForMSC32,   .CopySubBuffer	 = intelCopySubBuffer,   .InitScreen2		 = intelInitScreen2,   .HandleDrawableConfig = intelHandleDrawableConfig,   .HandleBufferAttach	 = intelHandleBufferAttach,};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -