📄 savagetex.c
字号:
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 + -