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

📄 tdfx_context.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   tdfxDDInitStateFuncs( ctx );   tdfxDDInitTriFuncs( ctx );   tdfxInitVB( ctx );   tdfxInitState( fxMesa );#if DO_DEBUG   TDFX_DEBUG = driParseDebugString( getenv( "TDFX_DEBUG" ), debug_control );#endif   if (driQueryOptionb(&fxMesa->optionCache, "no_rast")) {      fprintf(stderr, "disabling 3D acceleration\n");      FALLBACK(fxMesa, TDFX_FALLBACK_DISABLE, 1);   }   return GL_TRUE;}static GLboolean tdfxInitVertexFormats( tdfxContextPtr fxMesa ){   FxI32 result;   int i;   LOCK_HARDWARE( fxMesa );   fxMesa->Glide.grGet( GR_GLIDE_VERTEXLAYOUT_SIZE, sizeof(FxI32), &result );   for ( i = 0 ; i < TDFX_NUM_LAYOUTS ; i++ ) {      fxMesa->layout[i] = MALLOC( result );      if ( !fxMesa->layout[i] ) {	 UNLOCK_HARDWARE( fxMesa );	 return GL_FALSE;      }   }   /* Tiny vertex format - 16 bytes.    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY,	TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_TINY] );   /* Non textured vertex format - 24 bytes (Need w for table fog)    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY,	TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_NOTEX] );   /* Single textured vertex format - 32 bytes.    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY,	TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_SINGLE] );   /* Multitextured vertex format - 40 bytes.    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST1, TDFX_ST1_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_MULTI] );   /* Projected texture vertex format - 36 bytes.    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q0, TDFX_Q0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_PROJ1] );   /* Projected multitexture vertex format - 48 bytes.    */   fxMesa->Glide.grReset( GR_VERTEX_PARAMETER );   fxMesa->Glide.grCoordinateSpace( GR_WINDOW_COORDS );   fxMesa->Glide.grVertexLayout( GR_PARAM_XY, TDFX_XY_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Z, TDFX_Z_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q, TDFX_Q_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_PARGB, TDFX_ARGB_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST0, TDFX_ST0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q0, TDFX_Q0_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_ST1, TDFX_ST1_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grVertexLayout( GR_PARAM_Q1, TDFX_Q1_OFFSET, GR_PARAM_ENABLE );   fxMesa->Glide.grGlideGetVertexLayout( fxMesa->layout[TDFX_LAYOUT_PROJ2] );   UNLOCK_HARDWARE( fxMesa );   return GL_TRUE;}/* * Initialize the state in an tdfxContextPtr struct. */static GLbooleantdfxInitContext( __DRIdrawablePrivate *driDrawPriv, tdfxContextPtr fxMesa ){   /* KW: Would be nice to make one of these a member of the other.    */   FxI32 result[2];   const char *gext;   if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {      fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)fxMesa );   }#if DEBUG_LOCKING   fprintf(stderr, "Debug locking enabled\n");#endif   if ( fxMesa->Glide.Initialized )      return GL_TRUE;   fxMesa->width = driDrawPriv->w;   fxMesa->height = driDrawPriv->h;   /* We have to use a light lock here, because we can't do any glide    * operations yet. No use of FX_* functions in this function.    */   DRM_LIGHT_LOCK( fxMesa->driFd, fxMesa->driHwLock, fxMesa->hHWContext );   fxMesa->Glide.grGlideInit();   fxMesa->Glide.grSstSelect( fxMesa->Glide.Board );   fxMesa->Glide.Context = fxMesa->Glide.grSstWinOpen( (FxU32) -1,					 GR_RESOLUTION_NONE,					 GR_REFRESH_NONE,					 fxMesa->Glide.ColorFormat,					 fxMesa->Glide.Origin,					 2, 1 );   fxMesa->Glide.grDRIResetSAREA();   DRM_UNLOCK( fxMesa->driFd, fxMesa->driHwLock, fxMesa->hHWContext );   if ( !fxMesa->Glide.Context )      return GL_FALSE;   /* Perform the Glide-dependant part of the context initialization.    */   FX_grColorMaskv( fxMesa->glCtx, true4 );   tdfxTMInit( fxMesa );   LOCK_HARDWARE( fxMesa );   /* JJJ - COMMAND_TRANSPORT, PALETTE6666 */   gext = fxMesa->Glide.grGetString( GR_EXTENSION );   fxMesa->Glide.HaveCombineExt = strstr(gext, "COMBINE") && !getenv("MESA_FX_IGNORE_CMBEXT");   fxMesa->Glide.HaveCommandTransportExt = GL_FALSE;   fxMesa->Glide.HaveFogCoordExt = GL_TRUE;   fxMesa->Glide.HavePixelExt = strstr(gext, "PIXEXT") && !getenv("MESA_FX_IGNORE_PIXEXT");   fxMesa->Glide.HaveTextureBufferExt = GL_TRUE;   fxMesa->Glide.HaveTexFmtExt = strstr(gext, "TEXFMT") && !getenv("MESA_FX_IGNORE_TEXFMT");   fxMesa->Glide.HaveTexUMAExt = strstr(gext, "TEXUMA") && !getenv("MESA_FX_IGNORE_TEXUMA");   fxMesa->Glide.HaveMirrorExt = strstr(gext, "TEXMIRROR") && !getenv("MESA_FX_IGNORE_MIREXT");   fxMesa->Glide.HaveTexus2 = GL_FALSE;   if ( fxMesa->glCtx->Visual.depthBits > 0 ) {      fxMesa->Glide.grDepthBufferMode(GR_DEPTHBUFFER_ZBUFFER);   } else {      fxMesa->Glide.grDepthBufferMode(GR_DEPTHBUFFER_DISABLE);   }   fxMesa->Glide.grLfbWriteColorFormat( GR_COLORFORMAT_ABGR );   fxMesa->Glide.grGet( GR_TEXTURE_ALIGN, sizeof(FxI32), result );   fxMesa->Glide.TextureAlign = result[0];   fxMesa->Glide.State = NULL;   fxMesa->Glide.grGet( GR_GLIDE_STATE_SIZE, sizeof(FxI32), result );   fxMesa->Glide.State = MALLOC( result[0] );   fxMesa->Fog.Table = NULL;   fxMesa->Glide.grGet( GR_FOG_TABLE_ENTRIES, sizeof(FxI32), result );   fxMesa->Fog.Table = MALLOC( result[0] * sizeof(GrFog_t) );   UNLOCK_HARDWARE( fxMesa );   if ( !fxMesa->Glide.State || !fxMesa->Fog.Table ) {      if ( fxMesa->Glide.State )	 FREE( fxMesa->Glide.State );      if ( fxMesa->Fog.Table )	 FREE( fxMesa->Fog.Table );      return GL_FALSE;   }   if ( !tdfxInitVertexFormats( fxMesa ) ) {      return GL_FALSE;   }   LOCK_HARDWARE( fxMesa );   fxMesa->Glide.grGlideGetState( fxMesa->Glide.State );   if ( getenv( "FX_GLIDE_INFO" ) ) {      printf( "GR_RENDERER  = %s\n", (char *) fxMesa->Glide.grGetString( GR_RENDERER ) );      printf( "GR_VERSION   = %s\n", (char *) fxMesa->Glide.grGetString( GR_VERSION ) );      printf( "GR_VENDOR    = %s\n", (char *) fxMesa->Glide.grGetString( GR_VENDOR ) );      printf( "GR_HARDWARE  = %s\n", (char *) fxMesa->Glide.grGetString( GR_HARDWARE ) );      printf( "GR_EXTENSION = %s\n", (char *) gext );   }   UNLOCK_HARDWARE( fxMesa );   fxMesa->numClipRects = 0;   fxMesa->pClipRects = NULL;   fxMesa->scissoredClipRects = GL_FALSE;   fxMesa->Glide.Initialized = GL_TRUE;   return GL_TRUE;}voidtdfxDestroyContext( __DRIcontextPrivate *driContextPriv ){   tdfxContextPtr fxMesa = (tdfxContextPtr) driContextPriv->driverPrivate;   if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {      fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)fxMesa );   }   if ( fxMesa ) {      if (fxMesa->glCtx->Shared->RefCount == 1 && fxMesa->driDrawable) {         /* This share group is about to go away, free our private          * texture object data.          */         struct _mesa_HashTable *textures = fxMesa->glCtx->Shared->TexObjects;         GLuint id;         for (id = _mesa_HashFirstEntry(textures);              id;              id = _mesa_HashNextEntry(textures, id)) {            struct gl_texture_object *tObj               = _mesa_lookup_texture(fxMesa->glCtx, id);            tdfxTMFreeTexture(fxMesa, tObj);         }      }      tdfxTMClose(fxMesa);  /* free texture memory */      _swsetup_DestroyContext( fxMesa->glCtx );      _tnl_DestroyContext( fxMesa->glCtx );      _vbo_DestroyContext( fxMesa->glCtx );      _swrast_DestroyContext( fxMesa->glCtx );      tdfxFreeVB( fxMesa->glCtx );      /* Free Mesa context */      fxMesa->glCtx->DriverCtx = NULL;      _mesa_destroy_context(fxMesa->glCtx);      /* free the tdfx context */      FREE( fxMesa );   }}GLbooleantdfxUnbindContext( __DRIcontextPrivate *driContextPriv ){   GET_CURRENT_CONTEXT(ctx);   tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);   if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {      fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)driContextPriv );   }   if ( driContextPriv && (tdfxContextPtr) driContextPriv == fxMesa ) {      LOCK_HARDWARE(fxMesa);      fxMesa->Glide.grGlideGetState(fxMesa->Glide.State);      UNLOCK_HARDWARE(fxMesa);   }   return GL_TRUE;}GLbooleantdfxMakeCurrent( __DRIcontextPrivate *driContextPriv,                 __DRIdrawablePrivate *driDrawPriv,                 __DRIdrawablePrivate *driReadPriv ){   if ( TDFX_DEBUG & DEBUG_VERBOSE_DRI ) {      fprintf( stderr, "%s( %p )\n", __FUNCTION__, (void *)driContextPriv );   }   if ( driContextPriv ) {      tdfxContextPtr newFx = (tdfxContextPtr) driContextPriv->driverPrivate;      GLcontext *newCtx = newFx->glCtx;      GET_CURRENT_CONTEXT(curCtx);      if ((newFx->driDrawable != driDrawPriv)	  || (newFx->driReadable != driReadPriv)) {	 newFx->driDrawable = driDrawPriv;	 newFx->driReadable = driReadPriv;	 newFx->dirty = ~0;      }      else {         if (curCtx == newCtx) {            /* same drawable, same context -> no-op */            /* Need to call _mesa_make_current2() in order to make sure API             * dispatch is set correctly.             */            _mesa_make_current( newCtx,                                (GLframebuffer *) driDrawPriv->driverPrivate,                                (GLframebuffer *) driReadPriv->driverPrivate );            return GL_TRUE;	 }	 /* [dBorca] tunnel2 requires this */	 newFx->dirty = ~0;      }      driUpdateFramebufferSize(newCtx, driDrawPriv);      if (driDrawPriv != driReadPriv) {	 driUpdateFramebufferSize(newCtx, driReadPriv);      }      if ( !newFx->Glide.Initialized ) {	 if ( !tdfxInitContext( driDrawPriv, newFx ) )	    return GL_FALSE;	 LOCK_HARDWARE( newFx );	 /* FIXME: Force loading of window information */

⌨️ 快捷键说明

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