gsdx: factorize the TEX0 generation for mipmap

This commit is contained in:
Gregory Hainaut 2016-09-25 11:51:48 +02:00
parent ccd9ce1728
commit 78b2848622
4 changed files with 62 additions and 105 deletions

View File

@ -484,7 +484,6 @@ void GSRendererHW::Draw()
const GSLocalMemory::psm_t& tex_psm = GSLocalMemory::m_psm[m_context->TEX0.PSM];
int lod = 0;
GIFRegCLAMP MIP_CLAMP = context->CLAMP;
TEX0 = m_context->TEX0;
// Code from the SW renderer
if (IsMipMapActive()) {
@ -513,54 +512,13 @@ void GSRendererHW::Draw()
lod = std::max<int>((int)round(m_vt.m_lod.x), 0);
}
TEX0 = GetTex0Layer(lod);
MIP_CLAMP.MINU >>= lod;
MIP_CLAMP.MINV >>= lod;
MIP_CLAMP.MAXU >>= lod;
MIP_CLAMP.MAXV >>= lod;
switch(lod)
{
case 0:
break;
case 1:
TEX0.TBP0 = m_context->MIPTBP1.TBP1;
TEX0.TBW = m_context->MIPTBP1.TBW1;
break;
case 2:
TEX0.TBP0 = m_context->MIPTBP1.TBP2;
TEX0.TBW = m_context->MIPTBP1.TBW2;
break;
case 3:
TEX0.TBP0 = m_context->MIPTBP1.TBP3;
TEX0.TBW = m_context->MIPTBP1.TBW3;
break;
case 4:
TEX0.TBP0 = m_context->MIPTBP2.TBP4;
TEX0.TBW = m_context->MIPTBP2.TBW4;
break;
case 5:
TEX0.TBP0 = m_context->MIPTBP2.TBP5;
TEX0.TBW = m_context->MIPTBP2.TBW5;
break;
case 6:
TEX0.TBP0 = m_context->MIPTBP2.TBP6;
TEX0.TBW = m_context->MIPTBP2.TBW6;
break;
default:
__assume(0);
}
if (TEX0.TH <= lod) {
TEX0.TH = 1;
} else {
TEX0.TH -= lod;
}
if (TEX0.TW <= lod) {
TEX0.TW = 1;
} else {
TEX0.TW -= lod;
}
for (int i = 0; i < lod; i++) {
m_vt.m_min.t *= 0.5f;
m_vt.m_max.t *= 0.5f;
@ -569,6 +527,8 @@ void GSRendererHW::Draw()
m_context->offset.tex = m_mem.GetOffset(TEX0.TBP0, TEX0.TBW, TEX0.PSM);
GL_INS("Mipmap LOD %d (%f %f) new size %dx%d", lod, m_vt.m_lod.x, m_vt.m_lod.y, 1 << TEX0.TW, 1 << TEX0.TH);
} else {
TEX0 = GetTex0Layer(0);
}

View File

@ -1201,7 +1201,6 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
gd.k = GSVector4((float)k);
}
GIFRegTEX0 MIP_TEX0 = TEX0;
GIFRegCLAMP MIP_CLAMP = context->CLAMP;
GSVector4 tmin = m_vt.m_min.t;
@ -1211,38 +1210,7 @@ bool GSRendererSW::GetScanlineGlobalData(SharedData* data)
for(int i = 1, j = std::min<int>((int)context->TEX1.MXL, 6); i <= j; i++)
{
switch(i)
{
case 1:
MIP_TEX0.TBP0 = context->MIPTBP1.TBP1;
MIP_TEX0.TBW = context->MIPTBP1.TBW1;
break;
case 2:
MIP_TEX0.TBP0 = context->MIPTBP1.TBP2;
MIP_TEX0.TBW = context->MIPTBP1.TBW2;
break;
case 3:
MIP_TEX0.TBP0 = context->MIPTBP1.TBP3;
MIP_TEX0.TBW = context->MIPTBP1.TBW3;
break;
case 4:
MIP_TEX0.TBP0 = context->MIPTBP2.TBP4;
MIP_TEX0.TBW = context->MIPTBP2.TBW4;
break;
case 5:
MIP_TEX0.TBP0 = context->MIPTBP2.TBP5;
MIP_TEX0.TBW = context->MIPTBP2.TBW5;
break;
case 6:
MIP_TEX0.TBP0 = context->MIPTBP2.TBP6;
MIP_TEX0.TBW = context->MIPTBP2.TBW6;
break;
default:
__assume(0);
}
if(MIP_TEX0.TW > 0) MIP_TEX0.TW--;
if(MIP_TEX0.TH > 0) MIP_TEX0.TH--;
const GIFRegTEX0& MIP_TEX0 = GetTex0Layer(i);
MIP_CLAMP.MINU >>= 1;
MIP_CLAMP.MINV >>= 1;
@ -1670,35 +1638,9 @@ void GSRendererSW::SharedData::UpdateSource()
{
for(size_t i = 0; m_tex[i].t != NULL; i++)
{
int TBP0 = 0;
switch(i)
{
case 0:
TBP0 = m_parent->m_context->TEX0.TBP0;
break;
case 1:
TBP0 = m_parent->m_context->MIPTBP1.TBP1;
break;
case 2:
TBP0 = m_parent->m_context->MIPTBP1.TBP2;
break;
case 3:
TBP0 = m_parent->m_context->MIPTBP1.TBP3;
break;
case 4:
TBP0 = m_parent->m_context->MIPTBP2.TBP4;
break;
case 5:
TBP0 = m_parent->m_context->MIPTBP2.TBP5;
break;
case 6:
TBP0 = m_parent->m_context->MIPTBP2.TBP6;
break;
default:
__assume(0);
}
const GIFRegTEX0& TEX0 = m_parent->GetTex0Layer(i);
s = format("%05d_f%lld_tex%d_%05x_%s.bmp", m_parent->s_n - 2, frame, i, TBP0, psm_str((int)m_parent->m_context->TEX0.PSM));
s = format("%05d_f%lld_tex%d_%05x_%s.bmp", m_parent->s_n - 2, frame, i, TEX0.TBP0, psm_str(TEX0.PSM));
m_tex[i].t->Save(root_sw+s);
}

View File

@ -3084,6 +3084,60 @@ bool GSState::IsMipMapActive()
return m_mipmap && m_context->TEX1.MXL > 0 && m_context->TEX1.MMIN >= 2 && m_context->TEX1.MMIN <= 5 && m_vt.m_lod.y > 0;
}
GIFRegTEX0 GSState::GetTex0Layer(int lod)
{
// Shortcut
if (lod == 0) {
return m_context->TEX0;
}
GIFRegTEX0 TEX0 = m_context->TEX0;
switch(lod)
{
case 1:
TEX0.TBP0 = m_context->MIPTBP1.TBP1;
TEX0.TBW = m_context->MIPTBP1.TBW1;
break;
case 2:
TEX0.TBP0 = m_context->MIPTBP1.TBP2;
TEX0.TBW = m_context->MIPTBP1.TBW2;
break;
case 3:
TEX0.TBP0 = m_context->MIPTBP1.TBP3;
TEX0.TBW = m_context->MIPTBP1.TBW3;
break;
case 4:
TEX0.TBP0 = m_context->MIPTBP2.TBP4;
TEX0.TBW = m_context->MIPTBP2.TBW4;
break;
case 5:
TEX0.TBP0 = m_context->MIPTBP2.TBP5;
TEX0.TBW = m_context->MIPTBP2.TBW5;
break;
case 6:
TEX0.TBP0 = m_context->MIPTBP2.TBP6;
TEX0.TBW = m_context->MIPTBP2.TBW6;
break;
default:
__assume(0);
}
// Correct the texture size
if (TEX0.TH <= lod) {
TEX0.TH = 1;
} else {
TEX0.TH -= lod;
}
if (TEX0.TW <= lod) {
TEX0.TW = 1;
} else {
TEX0.TW -= lod;
}
return TEX0;
}
// GSTransferBuffer
GSState::GSTransferBuffer::GSTransferBuffer()

View File

@ -204,6 +204,7 @@ protected:
bool TryAlphaTest(uint32& fm, uint32& zm);
bool IsOpaque();
bool IsMipMapActive();
GIFRegTEX0 GetTex0Layer(int lod);
public:
GIFPath m_path[4];