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

📄 savagetex.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
    case GL_LINEAR_MIPMAP_NEAREST:	imesa->regs.s3d.texCtrl.ni.filterMode    = TFM_Bilin;	imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_FALSE;	break;    case GL_NEAREST_MIPMAP_LINEAR:    case GL_LINEAR_MIPMAP_LINEAR:	imesa->regs.s3d.texCtrl.ni.filterMode    = TFM_Trilin;	imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_FALSE;	break;    }    /* There is no way to specify a maximum mipmap level. We may have to       disable mipmapping completely. */    /*    if (t->max_level < t->image[0].image->WidthLog2 ||	t->max_level < t->image[0].image->HeightLog2) {	texCtrl.ni.mipmapEnable = GL_TRUE;	if (texCtrl.ni.filterMode == TFM_Trilin)	    texCtrl.ni.filterMode = TFM_Bilin;	texCtrl.ni.filterMode = TFM_Point;    }    */    if((ctx->Texture.Unit[0].LodBias !=0.0F) ||       (imesa->regs.s3d.texCtrl.ni.dBias != 0))    {	int bias = (int)(ctx->Texture.Unit[0].LodBias * 16.0);	if (bias < -256)	    bias = -256;	else if (bias > 255)	    bias = 255;	imesa->regs.s3d.texCtrl.ni.dBias = bias & 0x1ff;    }    image = tObj->Image[0][tObj->BaseLevel];    imesa->regs.s3d.texCtrl.ni.texEn = GL_TRUE;    imesa->regs.s3d.texDescr.ni.texWidth  = image->WidthLog2;    imesa->regs.s3d.texDescr.ni.texHeight = image->HeightLog2;    assert (t->hwFormat <= 7);    imesa->regs.s3d.texDescr.ni.texFmt = t->hwFormat;    imesa->regs.s3d.texAddr.ui = (u_int32_t) t->setup.physAddr | 2;    if(t->base.heap->heapId == SAVAGE_AGP_HEAP)	imesa->regs.s3d.texAddr.ui |= 0x1;}static void savageTimestampTextures( savageContextPtr imesa ){   /* Timestamp current texture objects for texture heap aging.    * Only useful with long-lived 32-bit event tags available    * with Savage DRM 2.3.x or later. */   if ((imesa->CurrentTexObj[0] || imesa->CurrentTexObj[1]) &&       imesa->savageScreen->driScrnPriv->drm_version.minor >= 3) {       unsigned int e;       FLUSH_BATCH(imesa);       e = savageEmitEvent(imesa, SAVAGE_WAIT_3D);       if (imesa->CurrentTexObj[0])	   imesa->CurrentTexObj[0]->timestamp = e;       if (imesa->CurrentTexObj[1])	   imesa->CurrentTexObj[1]->timestamp = e;   }}static void savageUpdateTextureState_s4( GLcontext *ctx ){   savageContextPtr imesa = SAVAGE_CONTEXT(ctx);   /* When a texture is about to change or be disabled, timestamp the    * old texture(s). We'll have to wait for this time stamp before    * uploading anything to the same texture heap.    */   if ((imesa->CurrentTexObj[0] && ctx->Texture.Unit[0]._ReallyEnabled &&	ctx->Texture.Unit[0]._Current->DriverData != imesa->CurrentTexObj[0]) ||       (imesa->CurrentTexObj[1] && ctx->Texture.Unit[1]._ReallyEnabled &&	ctx->Texture.Unit[1]._Current->DriverData != imesa->CurrentTexObj[1]) ||       (imesa->CurrentTexObj[0] && !ctx->Texture.Unit[0]._ReallyEnabled) ||       (imesa->CurrentTexObj[1] && !ctx->Texture.Unit[1]._ReallyEnabled))       savageTimestampTextures(imesa);   if (imesa->CurrentTexObj[0]) imesa->CurrentTexObj[0]->bound &= ~1;   if (imesa->CurrentTexObj[1]) imesa->CurrentTexObj[1]->bound &= ~2;   imesa->CurrentTexObj[0] = 0;   imesa->CurrentTexObj[1] = 0;      savageUpdateTex0State_s4( ctx );   savageUpdateTex1State_s4( ctx );   imesa->dirty |= (SAVAGE_UPLOAD_TEX0 | 		    SAVAGE_UPLOAD_TEX1);}static void savageUpdateTextureState_s3d( GLcontext *ctx ){    savageContextPtr imesa = SAVAGE_CONTEXT(ctx);   /* When a texture is about to change or be disabled, timestamp the    * old texture(s). We'll have to wait for this time stamp before    * uploading anything to the same texture heap.    */    if ((imesa->CurrentTexObj[0] && ctx->Texture.Unit[0]._ReallyEnabled &&	 ctx->Texture.Unit[0]._Current->DriverData != imesa->CurrentTexObj[0]) ||	(imesa->CurrentTexObj[0] && !ctx->Texture.Unit[0]._ReallyEnabled))	savageTimestampTextures(imesa);    if (imesa->CurrentTexObj[0]) imesa->CurrentTexObj[0]->bound &= ~1;    imesa->CurrentTexObj[0] = 0;    savageUpdateTexState_s3d( ctx );    imesa->dirty |= (SAVAGE_UPLOAD_TEX0);}void savageUpdateTextureState( GLcontext *ctx){    savageContextPtr imesa = SAVAGE_CONTEXT( ctx );    FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_FALSE);    FALLBACK(ctx, SAVAGE_FALLBACK_PROJ_TEXTURE, GL_FALSE);    if (imesa->savageScreen->chipset >= S3_SAVAGE4)	savageUpdateTextureState_s4 (ctx);    else	savageUpdateTextureState_s3d (ctx);}/***************************************** * DRIVER functions *****************************************/static void savageTexEnv( GLcontext *ctx, GLenum target, 			GLenum pname, const GLfloat *param ){   savageContextPtr imesa = SAVAGE_CONTEXT( ctx );   if (pname == GL_TEXTURE_ENV_MODE) {      imesa->new_state |= SAVAGE_NEW_TEXTURE;   } else if (pname == GL_TEXTURE_ENV_COLOR) {      struct gl_texture_unit *texUnit = 	 &ctx->Texture.Unit[ctx->Texture.CurrentUnit];      const GLfloat *fc = texUnit->EnvColor;      GLuint r, g, b, a;      CLAMPED_FLOAT_TO_UBYTE(r, fc[0]);      CLAMPED_FLOAT_TO_UBYTE(g, fc[1]);      CLAMPED_FLOAT_TO_UBYTE(b, fc[2]);      CLAMPED_FLOAT_TO_UBYTE(a, fc[3]);      imesa->texEnvColor = ((a << 24) | (r << 16) | 			    (g <<  8) | (b <<  0));       } }/* Update the heap's time stamp, so the new image is not uploaded * while the old one is still in use. If the texture that is going to * be changed is currently bound, we need to timestamp the texture * first. */static void savageTexImageChanged (savageTexObjPtr t) {    if (t->base.heap) {	if (t->base.bound)	    savageTimestampTextures(		(savageContextPtr)t->base.heap->driverContext);	if (t->base.timestamp > t->base.heap->timestamp)	    t->base.heap->timestamp = t->base.timestamp;    }}static void savageTexImage1D( GLcontext *ctx, GLenum target, GLint level,			      GLint internalFormat,			      GLint width, GLint border,			      GLenum format, GLenum type, const GLvoid *pixels,			      const struct gl_pixelstore_attrib *packing,			      struct gl_texture_object *texObj,			      struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   if (t) {      savageTexImageChanged (t);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");         return;      }   }   _mesa_store_teximage1d( ctx, target, level, internalFormat,			   width, border, format, type,			   pixels, packing, texObj, texImage );   t->base.dirty_images[0] |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static void savageTexSubImage1D( GLcontext *ctx, 				 GLenum target,				 GLint level,					 GLint xoffset,				 GLsizei width,				 GLenum format, GLenum type,				 const GLvoid *pixels,				 const struct gl_pixelstore_attrib *packing,				 struct gl_texture_object *texObj,				 struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   assert( t ); /* this _should_ be true */   if (t) {      savageTexImageChanged (t);      savageMarkDirtyTiles(t, level, texImage->Width2, 1,			   xoffset, 0, width, 1);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");         return;      }      t->base.dirty_images[0] |= (1 << level);   }   _mesa_store_texsubimage1d(ctx, target, level, xoffset, width, 			     format, type, pixels, packing, texObj,			     texImage);   t->dirtySubImages |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static void savageTexImage2D( GLcontext *ctx, GLenum target, GLint level,			      GLint internalFormat,			      GLint width, GLint height, GLint border,			      GLenum format, GLenum type, const GLvoid *pixels,			      const struct gl_pixelstore_attrib *packing,			      struct gl_texture_object *texObj,			      struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   if (t) {      savageTexImageChanged (t);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");         return;      }   }   _mesa_store_teximage2d( ctx, target, level, internalFormat,			   width, height, border, format, type,			   pixels, packing, texObj, texImage );   t->base.dirty_images[0] |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static void savageTexSubImage2D( GLcontext *ctx, 				 GLenum target,				 GLint level,					 GLint xoffset, GLint yoffset,				 GLsizei width, GLsizei height,				 GLenum format, GLenum type,				 const GLvoid *pixels,				 const struct gl_pixelstore_attrib *packing,				 struct gl_texture_object *texObj,				 struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   assert( t ); /* this _should_ be true */   if (t) {      savageTexImageChanged (t);      savageMarkDirtyTiles(t, level, texImage->Width2, texImage->Height2,			   xoffset, yoffset, width, height);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");         return;      }      t->base.dirty_images[0] |= (1 << level);   }   _mesa_store_texsubimage2d(ctx, target, level, xoffset, yoffset, width, 			     height, format, type, pixels, packing, texObj,			     texImage);   t->dirtySubImages |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static voidsavageCompressedTexImage2D( GLcontext *ctx, GLenum target, GLint level,			    GLint internalFormat,			    GLint width, GLint height, GLint border,			    GLsizei imageSize, const GLvoid *data,			    struct gl_texture_object *texObj,			    struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   if (t) {      savageTexImageChanged (t);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D");         return;      }   }   _mesa_store_compressed_teximage2d( ctx, target, level, internalFormat,				      width, height, border, imageSize,				      data, texObj, texImage );   t->base.dirty_images[0] |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static voidsavageCompressedTexSubImage2D( GLcontext *ctx, 			       GLenum target,			       GLint level,				       GLint xoffset, GLint yoffset,			       GLsizei width, GLsizei height,			       GLenum format, GLsizei imageSize,			       const GLvoid *data,			       struct gl_texture_object *texObj,			       struct gl_texture_image *texImage ){   savageTexObjPtr t = (savageTexObjPtr) texObj->DriverData;   assert( t ); /* this _should_ be true */   if (t) {      savageTexImageChanged (t);      savageMarkDirtyTiles(t, level, texImage->Width2, texImage->Height2,			   xoffset, yoffset, width, height);   } else {      t = savageAllocTexObj(texObj);      if (!t) {         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");         return;      }      t->base.dirty_images[0] |= (1 << level);   }   _mesa_store_compressed_texsubimage2d(ctx, target, level, xoffset, yoffset,					width, height, format, imageSize,					data, texObj, texImage);   t->dirtySubImages |= (1 << level);   SAVAGE_CONTEXT(ctx)->new_state |= SAVAGE_NEW_TEXTURE;}static void savageTexParameter( GLcontext *ctx, GLenum target,			      struct gl_texture_object *tObj,			      GLenum pname, const GLfloat *params ){   savageTexObjPtr t = (savageTexObjPtr) tObj->DriverData;   savageContextPtr imesa = SAVAGE_CONTEXT( ctx );   if (!t || (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D))      return;   switch (pname) {   case GL_TEXTURE_MIN_FILTER:   case GL_TEXTURE_MAG_FILTER:      savageSetTexFilter(t,tObj->MinFilter,tObj->MagFilter);      break;   case GL_TEXTURE_WRAP_S:   case GL_TEXTURE_WRAP_T:      savageSetTexWrapping(t,tObj->WrapS,tObj->WrapT);      break;     case GL_TEXTURE_BORDER_COLOR:      savageSetTexBorderColor(t,tObj->_BorderChan);      break;   default:      return;   }   imesa->new_state |= SAVAGE_NEW_TEXTURE;}static void savageBindTexture( GLcontext *ctx, GLenum target,			       struct gl_texture_object *tObj ){   savageContextPtr imesa = SAVAGE_CONTEXT( ctx );      assert( (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D) ||	   (tObj->DriverData != NULL) );   imesa->new_state |= SAVAGE_NEW_TEXTURE;}static void savageDeleteTexture( GLcontext *ctx, struct gl_texture_object *tObj ){   driTextureObject *t = (driTextureObject *)tObj->DriverData;   savageContextPtr imesa = SAVAGE_CONTEXT( ctx );   if (t) {      if (t->bound)	 savageTimestampTextures(imesa);      driDestroyTextureObject(t);   }   /* Free mipmap images and the texture object itself */   _mesa_delete_texture_object(ctx, tObj);}static struct gl_texture_object *savageNewTextureObject( GLcontext *ctx, GLuint name, GLenum target ){    struct gl_texture_object *obj;    obj = _mesa_new_texture_object(ctx, name, target);    savageAllocTexObj( obj );    return obj;}void savageDDInitTextureFuncs( struct dd_function_table *functions ){   functions->TexEnv = savageTexEnv;   functions->ChooseTextureFormat = savageChooseTextureFormat;   functions->TexImage1D 

⌨️ 快捷键说明

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