via_screen.c

来自「mesa-6.5-minigui源码」· C语言 代码 · 共 503 行 · 第 1/2 页

C
503
字号
       * gl_framebuffer object.       */      /* XXX check/fix the offset/pitch parameters! */      {         driRenderbuffer *frontRb            = driNewRenderbuffer(GL_RGBA, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(frontRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);      }      if (mesaVis->doubleBufferMode) {         driRenderbuffer *backRb            = driNewRenderbuffer(GL_RGBA, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(backRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);      }      if (mesaVis->depthBits == 16) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT16, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      else if (mesaVis->depthBits == 24) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT24, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      else if (mesaVis->depthBits == 32) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT32, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      if (mesaVis->stencilBits > 0 && !swStencil) {         driRenderbuffer *stencilRb            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT, NULL,                                 screen->bytesPerPixel,                                 0, screen->width, driDrawPriv);         viaSetSpanFunctions(stencilRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);      }#endif      _mesa_add_soft_renderbuffers(fb,                                   GL_FALSE, /* color */                                   GL_FALSE, /* depth */                                   swStencil,                                   swAccum,                                   GL_FALSE, /* alpha */                                   GL_FALSE /* aux */);      driDrawPriv->driverPrivate = (void *) fb;      return (driDrawPriv->driverPrivate != NULL);   }}static voidviaDestroyBuffer(__DRIdrawablePrivate *driDrawPriv){    _mesa_destroy_framebuffer((GLframebuffer *)(driDrawPriv->driverPrivate));}static struct __DriverAPIRec viaAPI = {   .InitDriver      = viaInitDriver,   .DestroyScreen   = viaDestroyScreen,   .CreateContext   = viaCreateContext,   .DestroyContext  = viaDestroyContext,   .CreateBuffer    = viaCreateBuffer,   .DestroyBuffer   = viaDestroyBuffer,   .SwapBuffers     = viaSwapBuffers,   .MakeCurrent     = viaMakeCurrent,   .UnbindContext   = viaUnbindContext,   .GetSwapInfo     = getSwapInfo,   .GetMSC          = driGetMSC32,   .WaitForMSC      = driWaitForMSC32,   .WaitForSBC      = NULL,   .SwapBuffersMSC  = NULL};static __GLcontextModes *viaFillInModes( unsigned pixel_bits, GLboolean have_back_buffer ){    __GLcontextModes * modes;    __GLcontextModes * m;    unsigned num_modes;    const unsigned back_buffer_factor = (have_back_buffer) ? 2 : 1;    GLenum fb_format;    GLenum fb_type;    /* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy     * enough to add support.  Basically, if a context is created with an     * fbconfig where the swap method is GLX_SWAP_COPY_OML, pageflipping     * will never be used.     */    static const GLenum back_buffer_modes[] = {	GLX_NONE, GLX_SWAP_UNDEFINED_OML /*, GLX_SWAP_COPY_OML */    };    /* The 32-bit depth-buffer mode isn't supported yet, so don't actually     * enable it.     */    static const u_int8_t depth_bits_array[4]   = { 0, 16, 24, 32 };    static const u_int8_t stencil_bits_array[4] = { 0,  0,  8,  0 };    const unsigned depth_buffer_factor = 3;    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;    }    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 = { VIA_DRIDDX_VERSION_MAJOR,                                              VIA_DRIDDX_VERSION_MINOR,                                              VIA_DRIDDX_VERSION_PATCH };   static const __DRIversion dri_expected = { 4, 0, 0 };   static const __DRIversion drm_expected = { 2, 3, 0 };   dri_interface = interface;   if ( ! driCheckDriDdxDrmVersions2( "Unichrome",				      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, &viaAPI);   if ( psp != NULL ) {      VIADRIPtr dri_priv = (VIADRIPtr) psp->pDevPriv;      *driver_modes = viaFillInModes( dri_priv->bytesPerPixel * 8,				      GL_TRUE );      /* 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 );   }   fprintf(stderr, "%s - succeeded\n", __FUNCTION__);   return (void *) psp;}/** * Get information about previous buffer swaps. */static intgetSwapInfo( __DRIdrawablePrivate *dPriv, __DRIswapInfo * sInfo ){   struct via_context *vmesa;   if ( (dPriv == NULL) || (dPriv->driContextPriv == NULL)	|| (dPriv->driContextPriv->driverPrivate == NULL)	|| (sInfo == NULL) ) {      return -1;   }   vmesa = (struct via_context *) dPriv->driContextPriv->driverPrivate;   sInfo->swap_count = vmesa->swap_count;   sInfo->swap_ust = vmesa->swap_ust;   sInfo->swap_missed_count = vmesa->swap_missed_count;   sInfo->swap_missed_usage = (sInfo->swap_missed_count != 0)       ? driCalculateSwapUsage( dPriv, 0, vmesa->swap_missed_ust )       : 0.0;   return 0;}

⌨️ 快捷键说明

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