GS/HW: Improve some tex in rt handling

This commit is contained in:
refractionpcsx2 2024-05-31 22:22:30 +01:00
parent 4c8e42d801
commit 7de06e340b
1 changed files with 7 additions and 7 deletions

View File

@ -238,16 +238,16 @@ bool GSTextureCache::CanTranslate(u32 bp, u32 bw, u32 spsm, GSVector4i r, u32 db
const bool width_match = ((bw * 64) / src_page_size.x) == ((dbw * 64) / dst_page_size.x); const bool width_match = ((bw * 64) / src_page_size.x) == ((dbw * 64) / dst_page_size.x);
const bool sequential_pages = page_aligned_rect && r.x == 0 && r.z == src_pixel_width; const bool sequential_pages = page_aligned_rect && r.x == 0 && r.z == src_pixel_width;
const bool single_row = (((bw * 64) / src_page_size.x) <= ((dbw * 64) / dst_page_size.x)) && r.z <= src_pixel_width && r.w <= src_page_size.y; const bool single_row = (((bw * 64) / src_page_size.x) <= ((dbw * 64) / dst_page_size.x)) && r.z <= src_pixel_width && r.w <= src_page_size.y;
const bool single_page_aligned = page_aligned_rect && r.z <= src_page_size.x && r.w <= src_page_size.y;
if (block_layout_match) if (block_layout_match)
{ {
// Same swizzle, so as long as the block is aligned and it's not a crazy size, we can translate it. // Same swizzle, so as long as the block is aligned and it's not a crazy size, we can translate it.
return bp_page_aligned_bp && (width_match || single_row || sequential_pages); return bp_page_aligned_bp && (width_match || single_row || single_page_aligned || sequential_pages);
} }
else else
{ {
// If the format is different, the rect needs to additionally aligned to the pages. // If the format is different, the rect needs to additionally aligned to the pages.
return bp_page_aligned_bp && page_aligned_rect && (single_row || width_match || sequential_pages); return bp_page_aligned_bp && page_aligned_rect && (single_row || single_page_aligned || width_match || sequential_pages);
} }
} }
@ -836,7 +836,7 @@ GSTextureCache::Source* GSTextureCache::LookupDepthSource(const bool is_depth, c
const u32 bp = TEX0.TBP0; const u32 bp = TEX0.TBP0;
const u32 psm = TEX0.PSM; const u32 psm = TEX0.PSM;
bool inside_target = false; bool inside_target = false;
GSVector4i target_rc; GSVector4i target_rc(r);
for (auto t : m_dst[DepthStencil]) for (auto t : m_dst[DepthStencil])
{ {
@ -1431,8 +1431,8 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const bool is_color, const
} }
// Make sure the texture actually is INSIDE the RT, it's possibly not valid if it isn't. // Make sure the texture actually is INSIDE the RT, it's possibly not valid if it isn't.
// Also check BP >= TBP, create source isn't equpped to expand it backwards and all data comes from the target. (GH3) // Also check BP >= TBP, create source isn't equpped to expand it backwards and all data comes from the target. (GH3)
else if (GSConfig.UserHacks_TextureInsideRt >= GSTextureInRtMode::InsideTargets && color_psm >= PSMCT32 && else if (GSConfig.UserHacks_TextureInsideRt >= GSTextureInRtMode::InsideTargets && GSLocalMemory::m_psm[color_psm].bpp >= 16 &&
color_psm <= PSMCT16S && t->m_age <= 1 && (!found_t || t->m_last_draw > dst->m_last_draw) && CanTranslate(bp, bw, psm, block_boundary_rect, t->m_TEX0.TBP0, t->m_TEX0.PSM, t->m_TEX0.TBW)) t->m_age <= 1 && (!found_t || t->m_last_draw > dst->m_last_draw) && CanTranslate(bp, bw, psm, block_boundary_rect, t->m_TEX0.TBP0, t->m_TEX0.PSM, t->m_TEX0.TBW))
{ {
if (!t->HasValidBitsForFormat(psm, req_color, req_alpha) && !(possible_shuffle && GSLocalMemory::m_psm[psm].bpp == 16 && GSLocalMemory::m_psm[t->m_TEX0.PSM].bpp == 32)) if (!t->HasValidBitsForFormat(psm, req_color, req_alpha) && !(possible_shuffle && GSLocalMemory::m_psm[psm].bpp == 16 && GSLocalMemory::m_psm[t->m_TEX0.PSM].bpp == 32))
@ -1644,7 +1644,7 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const bool is_color, const
{ {
for (auto t : m_dst[DepthStencil]) for (auto t : m_dst[DepthStencil])
{ {
if (t->m_age <= 1 && t->m_used && t->m_dirty.empty() && GSUtil::HasSharedBits(bp, psm, t->m_TEX0.TBP0, t->m_TEX0.PSM) && t->Inside(bp, bw, psm, new_rect)) if (t->m_age <= 1 && t->m_used && t->m_dirty.empty() && GSUtil::HasSharedBits(psm, t->m_TEX0.PSM) && t->Inside(bp, bw, psm, new_rect))
{ {
GL_INS("TC: Warning depth format read as color format. Pixels will be scrambled"); GL_INS("TC: Warning depth format read as color format. Pixels will be scrambled");
// Let's fetch a depth format texture. Rational, it will avoid the texture allocation and the // Let's fetch a depth format texture. Rational, it will avoid the texture allocation and the