Merge pull request #4496 from wwylele/smd-fix

gl_rasterizer_cache/MortonCopy: avoid read/write to invalid address
This commit is contained in:
Weiyi Wang 2018-12-19 19:46:10 -05:00 committed by GitHub
commit 83e3e30d0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -147,9 +147,18 @@ static void MortonCopy(u32 stride, u32 height, u8* gl_buffer, PAddr base, PAddr
} }
const u8* const buffer_end = tile_buffer + aligned_end - aligned_start; const u8* const buffer_end = tile_buffer + aligned_end - aligned_start;
PAddr current_paddr = aligned_start;
while (tile_buffer < buffer_end) { while (tile_buffer < buffer_end) {
// Pokemon Super Mystery Dungeon will try to use textures that go beyond
// the end address of VRAM. Stop reading if reaches invalid address
if (!VideoCore::g_memory->IsValidPhysicalAddress(current_paddr) ||
!VideoCore::g_memory->IsValidPhysicalAddress(current_paddr + tile_size)) {
LOG_ERROR(Render_OpenGL, "Out of bound texture");
break;
}
MortonCopyTile<morton_to_gl, format>(stride, tile_buffer, gl_buffer); MortonCopyTile<morton_to_gl, format>(stride, tile_buffer, gl_buffer);
tile_buffer += tile_size; tile_buffer += tile_size;
current_paddr += tile_size;
glbuf_next_tile(); glbuf_next_tile();
} }