mirror of https://github.com/PCSX2/pcsx2.git
gsdx: factorize the TEX0 generation for mipmap
This commit is contained in:
parent
ccd9ce1728
commit
78b2848622
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -204,6 +204,7 @@ protected:
|
|||
bool TryAlphaTest(uint32& fm, uint32& zm);
|
||||
bool IsOpaque();
|
||||
bool IsMipMapActive();
|
||||
GIFRegTEX0 GetTex0Layer(int lod);
|
||||
|
||||
public:
|
||||
GIFPath m_path[4];
|
||||
|
|
Loading…
Reference in New Issue