mirror of https://github.com/PCSX2/pcsx2.git
gsdx hw mipmap: tune the rounding + remove previous hack
GS really uses an invalid texture located at 0. Improve the rounding for R&C. The idea is to avoid the corner case were only the corner of the triangle touch the 7/16 edge.
This commit is contained in:
parent
adb8be3287
commit
90ad9cf668
|
@ -512,7 +512,17 @@ void GSRendererHW::Draw()
|
||||||
lod = std::max<int>((int)floor(m_vt.m_lod.x), 0);
|
lod = std::max<int>((int)floor(m_vt.m_lod.x), 0);
|
||||||
} else {
|
} else {
|
||||||
// On GS lod is a fixed float number 7:4 (4 bit for the frac part)
|
// On GS lod is a fixed float number 7:4 (4 bit for the frac part)
|
||||||
|
#if 0
|
||||||
lod = std::max<int>((int)round(m_vt.m_lod.x + 0.0625), 0);
|
lod = std::max<int>((int)round(m_vt.m_lod.x + 0.0625), 0);
|
||||||
|
#else
|
||||||
|
// Same as above with a bigger margin on rounding
|
||||||
|
// The goal is to avoid 1 undrawn pixels around the edge which trigger the load of the big
|
||||||
|
// layer.
|
||||||
|
if (ceil(m_vt.m_lod.x) < m_vt.m_lod.y)
|
||||||
|
lod = std::max<int>((int)round(m_vt.m_lod.x + 0.0625 + 0.01), 0);
|
||||||
|
else
|
||||||
|
lod = std::max<int>((int)round(m_vt.m_lod.x + 0.0625), 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,25 +530,6 @@ void GSRendererHW::Draw()
|
||||||
|
|
||||||
TEX0 = GetTex0Layer(lod);
|
TEX0 = GetTex0Layer(lod);
|
||||||
|
|
||||||
// FIXME: previous round lod is likely wrong. Following code is a workaround until it is done properly
|
|
||||||
// Ratchet & Clank set an address of 0 on invalid layer. Address 0 will be really awkward
|
|
||||||
// for a mipmap layer. So use it to avoid invalid data
|
|
||||||
if (TEX0.TBP0 == 0) {
|
|
||||||
GL_INS("Warning invalid lod %d", lod);
|
|
||||||
if (lod < mxl) {
|
|
||||||
lod++;
|
|
||||||
} else {
|
|
||||||
lod--;
|
|
||||||
}
|
|
||||||
TEX0 = GetTex0Layer(lod);
|
|
||||||
|
|
||||||
// Experience: will people complain more about missing or invalid texture ? The bets are open :)
|
|
||||||
if (TEX0.TBP0 == 0) {
|
|
||||||
fprintf(stderr, "Invalid mipmap layer\n");
|
|
||||||
throw GSDXRecoverableError();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MIP_CLAMP.MINU >>= lod;
|
MIP_CLAMP.MINU >>= lod;
|
||||||
MIP_CLAMP.MINV >>= lod;
|
MIP_CLAMP.MINV >>= lod;
|
||||||
MIP_CLAMP.MAXU >>= lod;
|
MIP_CLAMP.MAXU >>= lod;
|
||||||
|
|
Loading…
Reference in New Issue