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

📄 intel_screen.c

📁 mesa-6.5-minigui源码
💻 C
📖 第 1 页 / 共 2 页
字号:
      (*glx_enable_extension)( psc, "GLX_MESA_allocate_memory" );      (*glx_enable_extension)( psc, "GLX_MESA_copy_sub_buffer" );   }      sPriv->psc->allocateMemory = (void *) intelAllocateMemoryMESA;   sPriv->psc->freeMemory     = (void *) intelFreeMemoryMESA;   sPriv->psc->memoryOffset   = (void *) intelGetMemoryOffsetMESA;   return GL_TRUE;}				static void intelDestroyScreen(__DRIscreenPrivate *sPriv){   intelScreenPrivate *intelScreen = (intelScreenPrivate *)sPriv->private;   intelUnmapScreenRegions(intelScreen);   FREE(intelScreen);   sPriv->private = NULL;}static GLboolean intelCreateBuffer( __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);      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);      {         driRenderbuffer *frontRb            = driNewRenderbuffer(GL_RGBA,                                 screen->front.map,                                 screen->cpp,                                 screen->front.offset, screen->front.pitch,                                 driDrawPriv);         intelSetSpanFunctions(frontRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);      }      if (mesaVis->doubleBufferMode) {         driRenderbuffer *backRb            = driNewRenderbuffer(GL_RGBA,                                 screen->back.map,                                 screen->cpp,                                 screen->back.offset, screen->back.pitch,                                 driDrawPriv);         intelSetSpanFunctions(backRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);      }      if (mesaVis->depthBits == 16) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT16,                                 screen->depth.map,                                 screen->cpp,                                 screen->depth.offset, screen->depth.pitch,                                 driDrawPriv);         intelSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      else if (mesaVis->depthBits == 24) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT24,                                 screen->depth.map,                                 screen->cpp,                                 screen->depth.offset, screen->depth.pitch,                                 driDrawPriv);         intelSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      if (mesaVis->stencilBits > 0 && !swStencil) {         driRenderbuffer *stencilRb            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT,                                 screen->depth.map,                                 screen->cpp,                                 screen->depth.offset, screen->depth.pitch,                                 driDrawPriv);         intelSetSpanFunctions(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;      return (driDrawPriv->driverPrivate != NULL);   }}static void intelDestroyBuffer(__DRIdrawablePrivate *driDrawPriv){   _mesa_destroy_framebuffer((GLframebuffer *) (driDrawPriv->driverPrivate));}/** * Get information about previous buffer swaps. */static intintelGetSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ){   intelContextPtr intel;   if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL)	|| (dPriv->driContextPriv->driverPrivate == NULL)	|| (sInfo == NULL) ) {      return -1;   }   intel = dPriv->driContextPriv->driverPrivate;   sInfo->swap_count = intel->swap_count;   sInfo->swap_ust = intel->swap_ust;   sInfo->swap_missed_count = intel->swap_missed_count;   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)       ? driCalculateSwapUsage( dPriv, 0, intel->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);static GLboolean intelCreateContext( const __GLcontextModes *mesaVis,				   __DRIcontextPrivate *driContextPriv,				   void *sharedContextPrivate){   __DRIscreenPrivate *sPriv = driContextPriv->driScreenPriv;   intelScreenPrivate *intelScreen = (intelScreenPrivate *)sPriv->private;   switch (intelScreen->deviceID) {   case PCI_CHIP_845_G:   case PCI_CHIP_I830_M:   case PCI_CHIP_I855_GM:   case PCI_CHIP_I865_G:      return i830CreateContext( mesaVis, driContextPriv, 				sharedContextPrivate );   case PCI_CHIP_I915_G:   case PCI_CHIP_I915_GM:   case PCI_CHIP_I945_G:   case PCI_CHIP_I945_GM:      return i915CreateContext( mesaVis, driContextPriv, 			       sharedContextPrivate );    default:      fprintf(stderr, "Unrecognized deviceID %x\n", intelScreen->deviceID);      return GL_FALSE;   }}static const struct __DriverAPIRec intelAPI = {   .InitDriver      = intelInitDriver,   .DestroyScreen   = intelDestroyScreen,   .CreateContext   = intelCreateContext,   .DestroyContext  = intelDestroyContext,   .CreateBuffer    = intelCreateBuffer,   .DestroyBuffer   = intelDestroyBuffer,   .SwapBuffers     = intelSwapBuffers,   .MakeCurrent     = intelMakeCurrent,   .UnbindContext   = intelUnbindContext,   .GetSwapInfo     = intelGetSwapInfo,   .GetMSC          = driGetMSC32,   .WaitForMSC      = driWaitForMSC32,   .WaitForSBC      = NULL,   .SwapBuffersMSC  = NULL,   .CopySubBuffer   = intelCopySubBuffer};static __GLcontextModes *intelFillInModes( unsigned pixel_bits, unsigned depth_bits,		 unsigned stencil_bits, GLboolean have_back_buffer ){   __GLcontextModes * modes;   __GLcontextModes * m;   unsigned num_modes;   unsigned depth_buffer_factor;   unsigned back_buffer_factor;   GLenum fb_format;   GLenum fb_type;   /* 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;   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;   num_modes = depth_buffer_factor * back_buffer_factor * 4;    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;    }   modes = (*dri_interface->createContextModes)( num_modes, sizeof( __GLcontextModes ) );   m = modes;   if ( ! driFillInModes( & m, fb_format, fb_type,			  depth_bits_array, stencil_bits_array, depth_buffer_factor,			  back_buffer_modes, back_buffer_factor,			  GLX_TRUE_COLOR ) ) {	fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",		 __func__, __LINE__ );	return NULL;   }   if ( ! driFillInModes( & m, fb_format, fb_type,			  depth_bits_array, stencil_bits_array, depth_buffer_factor,			  back_buffer_modes, back_buffer_factor,			  GLX_DIRECT_COLOR ) ) {	fprintf( stderr, "[%s:%u] Error creating FBConfig!\n",		 __func__, __LINE__ );	return NULL;   }   /* Mark the visual as slow if there are "fake" stencil bits.    */   for ( m = modes ; m != NULL ; m = m->next ) {      if ( (m->stencilBits != 0) && (m->stencilBits != stencil_bits) ) {	 m->visualRating = GLX_SLOW_CONFIG;      }   }   return modes;}/** * This is the bootstrap function for the driver.  libGL supplies all of the * requisite information about the system, and the driver initializes itself. * This routine also fills in the linked list pointed to by \c driver_modes * with the \c __GLcontextModes that the driver can support for windows or * pbuffers. *  * \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on  *         failure. */PUBLICvoid * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIscreen *psc,			     const __GLcontextModes * modes,			     const __DRIversion * ddx_version,			     const __DRIversion * dri_version,			     const __DRIversion * drm_version,			     const __DRIframebuffer * frame_buffer,			     drmAddress pSAREA, int fd, 			     int internal_api_version,			     const __DRIinterfaceMethods * interface,			     __GLcontextModes ** driver_modes )			     {   __DRIscreenPrivate *psp;   static const __DRIversion ddx_expected = { 1, 5, 0 };   static const __DRIversion dri_expected = { 4, 0, 0 };   static const __DRIversion drm_expected = { 1, 4, 0 };   dri_interface = interface;   if ( ! driCheckDriDdxDrmVersions2( "i915",				      dri_version, & dri_expected,				      ddx_version, & ddx_expected,				      drm_version, & drm_expected ) ) {      return NULL;   }   psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,				  ddx_version, dri_version, drm_version,				  frame_buffer, pSAREA, fd,				  internal_api_version, &intelAPI);   if ( psp != NULL ) {      I830DRIPtr dri_priv = (I830DRIPtr) psp->pDevPriv;      *driver_modes = intelFillInModes( dri_priv->cpp * 8,					(dri_priv->cpp == 2) ? 16 : 24,					(dri_priv->cpp == 2) ? 0  : 8,					(dri_priv->backOffset != dri_priv->depthOffset) );      /* 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 );   }   return (void *) psp;}

⌨️ 快捷键说明

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