1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2025-01-31 12:31:45 +01:00

rsx: Fix blit intersection falling outside the available texture

- Just becaue we have a hit inside the tile of interest does not guarantee that it sits inside the texture!
This commit is contained in:
kd-11 2019-03-19 11:30:39 +03:00 committed by kd-11
parent 1a13d3ae4e
commit 03fca73cf4

View File

@ -935,9 +935,17 @@ namespace rsx
const auto int_required_width = required_width / scale_x;
const auto int_required_height = required_height / scale_y;
auto offset = texaddr - this_address;
const auto offset = texaddr - this_address;
info.src_y = (offset / required_pitch) / scale_y;
info.src_x = (offset % required_pitch) / surface_info.bpp / scale_x;
if (UNLIKELY(info.src_x >= surface_info.surface_width || info.src_y >= surface_info.surface_height))
{
// Region lies outside the actual texture area, but inside the 'tile'
// In this case, a small region lies to the top-left corner, partially occupying the target
continue;
}
info.dst_x = 0;
info.dst_y = 0;
info.width = std::min<u32>(int_required_width, surface_info.surface_width - info.src_x);
@ -949,11 +957,18 @@ namespace rsx
const auto int_surface_width = surface_info.surface_width * scale_x;
const auto int_surface_height = surface_info.surface_height * scale_y;
auto offset = this_address - texaddr;
info.src_x = 0;
info.src_y = 0;
const auto offset = this_address - texaddr;
info.dst_y = (offset / required_pitch);
info.dst_x = (offset % required_pitch) / surface_info.bpp;
if (UNLIKELY(info.dst_x >= int_surface_width || info.dst_y >= int_surface_height))
{
// False positive
continue;
}
info.src_x = 0;
info.src_y = 0;
info.width = std::min<u32>(int_surface_width, required_width - info.dst_x);
info.height = std::min<u32>(int_surface_height, required_height - info.dst_y);
info.is_clipped = (info.width < required_width || info.height < required_height);