savagetex.c

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

C
2,043
字号
    switch (ctx->Texture.Unit[0].EnvMode) {    case GL_DECAL:	imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_DECALALPHA_S3D;	break;    case GL_REPLACE:	switch (format) {	case GL_ALPHA: /* FIXME */	    imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = 1;	    break;	case GL_LUMINANCE_ALPHA:	case GL_RGBA:	    imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = 4;	    break;	case GL_RGB:	case GL_LUMINANCE:	    imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_DECAL_S3D;	    break;	case GL_INTENSITY:	    imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_COPY_S3D;	}	break;    case GL_BLEND: /* hardware can't do GL_BLEND */	FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE);	return;    case GL_MODULATE:	imesa->regs.s3d.drawCtrl.ni.texBlendCtrl = SAVAGETBC_MODULATEALPHA_S3D;	break;    default:	fprintf(stderr, "unknown tex env mode\n");	/*exit(1);*/	break;			    }    /* The Savage3D can't handle different wrapping modes in s and t.     * If they are not the same, fall back to software. */    if (t->setup.sWrapMode != t->setup.tWrapMode) {	FALLBACK (ctx, SAVAGE_FALLBACK_TEXTURE, GL_TRUE);	return;    }    imesa->regs.s3d.texCtrl.ni.uWrapEn = 0;    imesa->regs.s3d.texCtrl.ni.vWrapEn = 0;    imesa->regs.s3d.texCtrl.ni.wrapMode =	(t->setup.sWrapMode == GL_REPEAT) ? TAM_Wrap : TAM_Clamp;    switch (t->setup.minFilter) {    case GL_NEAREST:	imesa->regs.s3d.texCtrl.ni.filterMode    = TFM_Point;	imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_TRUE;	break;    case GL_LINEAR:	imesa->regs.s3d.texCtrl.ni.filterMode    = TFM_Bilin;	imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_TRUE;	break;    case GL_NEAREST_MIPMAP_NEAREST:	imesa->regs.s3d.texCtrl.ni.filterMode    = TFM_Point;	imesa->regs.s3d.texCtrl.ni.mipmapDisable = GL_FALSE;	break;    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->drmMinor >= 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))      re

⌨️ 快捷键说明

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