don't enable mipmaps for dynamic textures

This commit is contained in:
David Rose 2004-12-11 16:39:28 +00:00
parent 1a6e7ff58b
commit 60193c50ae
2 changed files with 155 additions and 141 deletions

View File

@ -3091,7 +3091,14 @@ apply_texture(TextureContext *tc) {
#endif #endif
D3DTEXTUREFILTERTYPE newMipFilter = PandaToD3DMipType[(DWORD)ft]; D3DTEXTUREFILTERTYPE newMipFilter = PandaToD3DMipType[(DWORD)ft];
if (!tex->might_have_ram_image()) {
// If the texture is completely dynamic, don't try to issue
// mipmaps--pandadx doesn't support auto-generated mipmaps at this
// point.
newMipFilter = D3DTEXF_NONE;
}
#ifndef NDEBUG #ifndef NDEBUG
// sanity check // sanity check
extern char *PandaFilterNameStrs[]; extern char *PandaFilterNameStrs[];

View File

@ -2973,160 +2973,167 @@ prepare_texture(Texture *tex) {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void DXGraphicsStateGuardian9:: void DXGraphicsStateGuardian9::
apply_texture(TextureContext *tc) { apply_texture(TextureContext *tc) {
if (tc==NULL) { if (tc==NULL) {
// The texture wasn't bound properly or something, so ensure // The texture wasn't bound properly or something, so ensure
// texturing is disabled and just return. // texturing is disabled and just return.
enable_texturing(false); enable_texturing(false);
return;
}
#ifdef DO_PSTATS
add_to_texture_record(tc);
#endif
// Note: if this code changes, make sure to change initialization
// SetTSS code in dx_init as well so DX TSS renderstate matches
// dxgsg state
DXTextureContext9 *dtc = DCAST(DXTextureContext9, tc);
int dirty = dtc->get_dirty_flags();
if (dirty) {
// If the texture image has changed, or if its use of mipmaps has
// changed, we need to re-create the image. Ignore other types of
// changes, which arent significant for dx
if((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
// If this is *only* because of a mipmap change, issue a
// warning--it is likely that this change is the result of an
// error or oversight.
if ((dirty & Texture::DF_image) == 0) {
dxgsg9_cat.warning()
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n";
}
dtc->DeleteTexture();
if (dtc->CreateTexture(*_pScrn) == NULL) {
// Oops, we can't re-create the texture for some reason.
dxgsg9_cat.error() << "Unable to re-create texture " << *dtc->_texture << endl;
enable_texturing(false);
return;
}
}
dtc->clear_dirty_flags();
} else {
if(_pCurTexContext == dtc) {
enable_texturing(true);
return; return;
} }
}
#ifdef DO_PSTATS
add_to_texture_record(tc); Texture *tex = tc->_texture;
#endif Texture::WrapMode wrapU,wrapV;
wrapU=tex->get_wrapu();
// Note: if this code changes, make sure to change initialization wrapV=tex->get_wrapv();
// SetTSS code in dx_init as well so DX TSS renderstate matches
// dxgsg state if (wrapU!=_CurTexWrapModeU) {
_pD3DDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,get_texture_wrap_mode(wrapU));
DXTextureContext9 *dtc = DCAST(DXTextureContext9, tc); _CurTexWrapModeU = wrapU;
}
int dirty = dtc->get_dirty_flags(); if (wrapV!=_CurTexWrapModeV) {
_pD3DDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,get_texture_wrap_mode(wrapV));
if (dirty) { _CurTexWrapModeV = wrapV;
// If the texture image has changed, or if its use of mipmaps has }
// changed, we need to re-create the image. Ignore other types of
// changes, which arent significant for dx uint aniso_degree=tex->get_anisotropic_degree();
Texture::FilterType ft=tex->get_magfilter();
if((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
// If this is *only* because of a mipmap change, issue a if(_CurTexAnisoDegree != aniso_degree) {
// warning--it is likely that this change is the result of an _pD3DDevice->SetSamplerState(0,D3DSAMP_MAXANISOTROPY,aniso_degree);
// error or oversight. _CurTexAnisoDegree = aniso_degree;
if ((dirty & Texture::DF_image) == 0) { }
dxgsg9_cat.warning()
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n"; D3DTEXTUREFILTERTYPE newMagFilter;
} if (aniso_degree<=1) {
newMagFilter=((ft!=Texture::FT_nearest) ? D3DTEXF_LINEAR : D3DTEXF_POINT);
dtc->DeleteTexture();
if (dtc->CreateTexture(*_pScrn) == NULL) {
// Oops, we can't re-create the texture for some reason.
dxgsg9_cat.error() << "Unable to re-create texture " << *dtc->_texture << endl;
enable_texturing(false);
return;
}
}
dtc->clear_dirty_flags();
} else {
if(_pCurTexContext == dtc) {
enable_texturing(true);
return;
}
}
Texture *tex = tc->_texture;
Texture::WrapMode wrapU,wrapV;
wrapU=tex->get_wrapu();
wrapV=tex->get_wrapv();
if (wrapU!=_CurTexWrapModeU) {
_pD3DDevice->SetSamplerState(0,D3DSAMP_ADDRESSU,get_texture_wrap_mode(wrapU));
_CurTexWrapModeU = wrapU;
}
if (wrapV!=_CurTexWrapModeV) {
_pD3DDevice->SetSamplerState(0,D3DSAMP_ADDRESSV,get_texture_wrap_mode(wrapV));
_CurTexWrapModeV = wrapV;
}
uint aniso_degree=tex->get_anisotropic_degree();
Texture::FilterType ft=tex->get_magfilter();
if(_CurTexAnisoDegree != aniso_degree) {
_pD3DDevice->SetSamplerState(0,D3DSAMP_MAXANISOTROPY,aniso_degree);
_CurTexAnisoDegree = aniso_degree;
}
D3DTEXTUREFILTERTYPE newMagFilter;
if (aniso_degree<=1) {
newMagFilter=((ft!=Texture::FT_nearest) ? D3DTEXF_LINEAR : D3DTEXF_POINT);
#ifdef _DEBUG
if((ft!=Texture::FT_linear)&&(ft!=Texture::FT_nearest)) {
dxgsg9_cat.error() << "MipMap filter type setting for texture magfilter makes no sense, texture: " << tex->get_name() << "\n";
}
#endif
} else {
newMagFilter=D3DTEXF_ANISOTROPIC;
}
if(_CurTexMagFilter!=newMagFilter) {
_CurTexMagFilter=newMagFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, newMagFilter);
}
#ifdef _DEBUG #ifdef _DEBUG
assert(Texture::FT_linear_mipmap_linear < 8); if((ft!=Texture::FT_linear)&&(ft!=Texture::FT_nearest)) {
dxgsg9_cat.error() << "MipMap filter type setting for texture magfilter makes no sense, texture: " << tex->get_name() << "\n";
}
#endif #endif
/* } else {
enum FilterType { newMagFilter=D3DTEXF_ANISOTROPIC;
}
if(_CurTexMagFilter!=newMagFilter) {
_CurTexMagFilter=newMagFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, newMagFilter);
}
#ifdef _DEBUG
assert(Texture::FT_linear_mipmap_linear < 8);
#endif
/*
enum FilterType {
FT_nearest,FT_linear,FT_nearest_mipmap_nearest,FT_linear_mipmap_nearest, FT_nearest,FT_linear,FT_nearest_mipmap_nearest,FT_linear_mipmap_nearest,
FT_nearest_mipmap_linear, FT_linear_mipmap_linear, }; FT_nearest_mipmap_linear, FT_linear_mipmap_linear, };
*/ */
// map Panda composite min+mip filter types to d3d's separate min & mip filter types // map Panda composite min+mip filter types to d3d's separate min & mip filter types
static D3DTEXTUREFILTERTYPE PandaToD3DMinType[8] = static D3DTEXTUREFILTERTYPE PandaToD3DMinType[8] =
{D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_POINT,D3DTEXF_LINEAR}; {D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_POINT,D3DTEXF_LINEAR};
static D3DTEXTUREFILTERTYPE PandaToD3DMipType[8] = static D3DTEXTUREFILTERTYPE PandaToD3DMipType[8] =
{D3DTEXF_NONE,D3DTEXF_NONE,D3DTEXF_POINT,D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_LINEAR}; {D3DTEXF_NONE,D3DTEXF_NONE,D3DTEXF_POINT,D3DTEXF_POINT,D3DTEXF_LINEAR,D3DTEXF_LINEAR};
ft=tex->get_minfilter(); ft=tex->get_minfilter();
#ifdef _DEBUG #ifdef _DEBUG
if(ft > Texture::FT_linear_mipmap_linear) { if(ft > Texture::FT_linear_mipmap_linear) {
dxgsg9_cat.error() << "Unknown tex filter type for tex: " << tex->get_name() << " filter: "<<(DWORD)ft<<"\n"; dxgsg9_cat.error() << "Unknown tex filter type for tex: " << tex->get_name() << " filter: "<<(DWORD)ft<<"\n";
return; return;
} }
#endif #endif
D3DTEXTUREFILTERTYPE newMipFilter = PandaToD3DMipType[(DWORD)ft]; D3DTEXTUREFILTERTYPE newMipFilter = PandaToD3DMipType[(DWORD)ft];
#ifndef NDEBUG if (!tex->might_have_ram_image()) {
// sanity check // If the texture is completely dynamic, don't try to issue
extern char *PandaFilterNameStrs[]; // mipmaps--pandadx doesn't support auto-generated mipmaps at this
if((!(dtc->_bHasMipMaps))&&(newMipFilter!=D3DTEXF_NONE)) { // point.
dxgsg9_cat.error() << "Trying to set mipmap filtering for texture with no generated mipmaps!! texname[" << tex->get_name() << "], filter("<<PandaFilterNameStrs[ft]<<")\n"; newMipFilter = D3DTEXF_NONE;
}
#ifndef NDEBUG
// sanity check
extern char *PandaFilterNameStrs[];
if((!(dtc->_bHasMipMaps))&&(newMipFilter!=D3DTEXF_NONE)) {
dxgsg9_cat.error() << "Trying to set mipmap filtering for texture with no generated mipmaps!! texname[" << tex->get_name() << "], filter("<<PandaFilterNameStrs[ft]<<")\n";
newMipFilter=D3DTEXF_NONE; newMipFilter=D3DTEXF_NONE;
} }
#endif
D3DTEXTUREFILTERTYPE newMinFilter = PandaToD3DMinType[(DWORD)ft];
if(aniso_degree>=2) {
newMinFilter=D3DTEXF_ANISOTROPIC;
}
if(newMinFilter!=_CurTexMinFilter) {
_CurTexMinFilter = newMinFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, newMinFilter);
}
if(newMipFilter!=_CurTexMipFilter) {
_CurTexMipFilter = newMipFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, newMipFilter);
}
// bugbug: does this handle the case of untextured geometry?
// we dont see this bug cause we never mix textured/untextured
_pD3DDevice->SetTexture(0,dtc->_pD3DTexture9);
#if 0
if (dtc!=NULL) {
dxgsg9_cat.spam() << "Setting active DX texture: " << dtc->_tex->get_name() << "\n";
}
#endif #endif
_pCurTexContext = dtc; // enable_texturing needs this
enable_texturing(true); D3DTEXTUREFILTERTYPE newMinFilter = PandaToD3DMinType[(DWORD)ft];
if(aniso_degree>=2) {
newMinFilter=D3DTEXF_ANISOTROPIC;
}
if(newMinFilter!=_CurTexMinFilter) {
_CurTexMinFilter = newMinFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, newMinFilter);
}
if(newMipFilter!=_CurTexMipFilter) {
_CurTexMipFilter = newMipFilter;
_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, newMipFilter);
}
// bugbug: does this handle the case of untextured geometry?
// we dont see this bug cause we never mix textured/untextured
_pD3DDevice->SetTexture(0,dtc->_pD3DTexture9);
#if 0
if (dtc!=NULL) {
dxgsg9_cat.spam() << "Setting active DX texture: " << dtc->_tex->get_name() << "\n";
}
#endif
_pCurTexContext = dtc; // enable_texturing needs this
enable_texturing(true);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////