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

📄 r128_screen.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
static GLbooleanr128CreateBuffer( __DRIscreenPrivate *driScrnPriv,                  __DRIdrawablePrivate *driDrawPriv,                  const __GLcontextModes *mesaVis,                  GLboolean isPixmap ){   r128ScreenPtr screen = (r128ScreenPtr) driScrnPriv->private;   if (isPixmap) {      return GL_FALSE; /* not implemented */   }   else {      const GLboolean swDepth = GL_FALSE;      const GLboolean swAlpha = GL_FALSE;      const GLboolean swAccum = mesaVis->accumRedBits > 0;      const GLboolean swStencil = mesaVis->stencilBits > 0 &&         mesaVis->depthBits != 24;      struct gl_framebuffer *fb = _mesa_create_framebuffer(mesaVis);      {         driRenderbuffer *frontRb            = driNewRenderbuffer(GL_RGBA,                                 NULL,                                 screen->cpp,                                 screen->frontOffset, screen->frontPitch,                                 driDrawPriv);         r128SetSpanFunctions(frontRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &frontRb->Base);      }      if (mesaVis->doubleBufferMode) {         driRenderbuffer *backRb            = driNewRenderbuffer(GL_RGBA,                                 NULL,                                 screen->cpp,                                 screen->backOffset, screen->backPitch,                                 driDrawPriv);         r128SetSpanFunctions(backRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &backRb->Base);      }      if (mesaVis->depthBits == 16) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT16,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         r128SetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      else if (mesaVis->depthBits == 24) {         driRenderbuffer *depthRb            = driNewRenderbuffer(GL_DEPTH_COMPONENT24,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         r128SetSpanFunctions(depthRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);      }      if (mesaVis->stencilBits > 0 && !swStencil) {         driRenderbuffer *stencilRb            = driNewRenderbuffer(GL_STENCIL_INDEX8_EXT,                                 NULL,                                 screen->cpp,                                 screen->depthOffset, screen->depthPitch,                                 driDrawPriv);         r128SetSpanFunctions(stencilRb, mesaVis);         _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &stencilRb->Base);      }      _mesa_add_soft_renderbuffers(fb,                                   GL_FALSE, /* color */                                   swDepth,                                   swStencil,                                   swAccum,                                   swAlpha,                                   GL_FALSE /* aux */);      driDrawPriv->driverPrivate = (void *) fb;      return (driDrawPriv->driverPrivate != NULL);   }}static voidr128DestroyBuffer(__DRIdrawablePrivate *driDrawPriv){   _mesa_unreference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)));}/* Copy the back color buffer to the front color buffer */static voidr128SwapBuffers(__DRIdrawablePrivate *dPriv){   if (dPriv->driContextPriv && dPriv->driContextPriv->driverPrivate) {      r128ContextPtr rmesa;      GLcontext *ctx;      rmesa = (r128ContextPtr) dPriv->driContextPriv->driverPrivate;      ctx = rmesa->glCtx;      if (ctx->Visual.doubleBufferMode) {         _mesa_notifySwapBuffers( ctx );  /* flush pending rendering comands */         if ( rmesa->doPageFlip ) {            r128PageFlip( dPriv );         }         else {            r128CopyBuffer( dPriv );         }      }   }   else {      /* XXX this shouldn't be an error but we can't handle it for now */      _mesa_problem(NULL, "%s: drawable has no context!", __FUNCTION__);   }}/* Initialize the driver specific screen private data. */static GLbooleanr128InitDriver( __DRIscreenPrivate *sPriv ){   sPriv->private = (void *) r128CreateScreen( sPriv );   if ( !sPriv->private ) {      r128DestroyScreen( sPriv );      return GL_FALSE;   }   return GL_TRUE;}static const __DRIconfig **r128FillInModes( __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;    /* 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 */    };    u_int8_t depth_bits_array[2];    u_int8_t stencil_bits_array[2];    depth_bits_array[0] = depth_bits;    depth_bits_array[1] = 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] = (stencil_bits == 0) ? 8 : stencil_bits;    depth_buffer_factor = ((depth_bits != 0) || (stencil_bits != 0)) ? 2 : 1;    back_buffer_factor  = (have_back_buffer) ? 2 : 1;    if ( pixel_bits == 16 ) {        fb_format = GL_RGB;        fb_type = GL_UNSIGNED_SHORT_5_6_5;    }    else {        fb_format = GL_BGR;        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 (const __DRIconfig **) configs;}/** * This is the driver specific part of the createNewScreen entry point. *  * \todo maybe fold this into intelInitDriver * * \return the __GLcontextModes supported by this driver */static const __DRIconfig **r128InitScreen(__DRIscreenPrivate *psp){   static const __DRIversion ddx_expected = { 4, 0, 0 };   static const __DRIversion dri_expected = { 4, 0, 0 };   static const __DRIversion drm_expected = { 2, 2, 0 };   R128DRIPtr dri_priv = (R128DRIPtr) psp->pDevPriv;   if ( ! driCheckDriDdxDrmVersions2( "Rage128",				      &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?    */   driInitExtensions( NULL, card_extensions, GL_FALSE );   if (!r128InitDriver(psp))       return NULL;   return r128FillInModes( psp,			   dri_priv->bpp,			   (dri_priv->bpp == 16) ? 16 : 24,			   (dri_priv->bpp == 16) ? 0  : 8,			   (dri_priv->backOffset != dri_priv->depthOffset) );}const struct __DriverAPIRec driDriverAPI = {   .InitScreen      = r128InitScreen,   .DestroyScreen   = r128DestroyScreen,   .CreateContext   = r128CreateContext,   .DestroyContext  = r128DestroyContext,   .CreateBuffer    = r128CreateBuffer,   .DestroyBuffer   = r128DestroyBuffer,   .SwapBuffers     = r128SwapBuffers,   .MakeCurrent     = r128MakeCurrent,   .UnbindContext   = r128UnbindContext,   .GetSwapInfo     = NULL,   .GetDrawableMSC  = driDrawableGetMSC32,   .WaitForMSC      = driWaitForMSC32,   .WaitForSBC      = NULL,   .SwapBuffersMSC  = NULL};

⌨️ 快捷键说明

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