rsx image_in: Fix src size calculation when in_pitch != line_lengh

This commit is contained in:
eladash 2018-11-30 21:06:48 -08:00 committed by kd-11
parent 0a1da14a15
commit d1d3ac984e
2 changed files with 8 additions and 7 deletions

View File

@ -311,11 +311,12 @@ namespace rsx
in_pitch = in_bpp * in_w; in_pitch = in_bpp * in_w;
} }
rsx->read_barrier(src_region.address, in_pitch * in_h); const u32 src_size = in_pitch * (in_h - 1) + (in_w * in_bpp);
rsx->read_barrier(src_region.address, src_size);
frame_capture_data::memory_block_data block_data; frame_capture_data::memory_block_data block_data;
block_data.data.resize(in_pitch * in_h); block_data.data.resize(src_size);
std::memcpy(block_data.data.data(), pixels_src, in_pitch * in_h); std::memcpy(block_data.data.data(), pixels_src, src_size);
insert_mem_block_in_map(replay_command.memory_state, std::move(block), std::move(block_data)); insert_mem_block_in_map(replay_command.memory_state, std::move(block), std::move(block_data));
capture_display_tile_state(rsx, replay_command); capture_display_tile_state(rsx, replay_command);
@ -337,7 +338,7 @@ namespace rsx
u32 src_dma = method_registers.nv0039_input_location(); u32 src_dma = method_registers.nv0039_input_location();
u32 src_addr = get_address(src_offset, src_dma); u32 src_addr = get_address(src_offset, src_dma);
rsx->read_barrier(src_addr, in_pitch * line_count); rsx->read_barrier(src_addr, in_pitch * (line_count - 1) + line_length);
const u8* src = (u8*)vm::base(src_addr); const u8* src = (u8*)vm::base(src_addr);
@ -345,7 +346,7 @@ namespace rsx
block.offset = src_offset; block.offset = src_offset;
block.location = src_dma; block.location = src_dma;
frame_capture_data::memory_block_data block_data; frame_capture_data::memory_block_data block_data;
block_data.data.resize(in_pitch * line_count); block_data.data.resize(in_pitch * (line_count - 1) + line_length);
for (u32 i = 0; i < line_count; ++i) for (u32 i = 0; i < line_count; ++i)
{ {

View File

@ -900,7 +900,7 @@ namespace rsx
u8* pixels_dst = vm::_ptr<u8>(get_address(dst_offset + out_offset, dst_dma)); u8* pixels_dst = vm::_ptr<u8>(get_address(dst_offset + out_offset, dst_dma));
const auto read_address = get_address(src_offset, src_dma); const auto read_address = get_address(src_offset, src_dma);
rsx->read_barrier(read_address, in_pitch * in_h); rsx->read_barrier(read_address, in_pitch * (in_h - 1) + (in_w * in_bpp));
if (dst_color_format != rsx::blit_engine::transfer_destination_format::r5g6b5 && if (dst_color_format != rsx::blit_engine::transfer_destination_format::r5g6b5 &&
dst_color_format != rsx::blit_engine::transfer_destination_format::a8r8g8b8) dst_color_format != rsx::blit_engine::transfer_destination_format::a8r8g8b8)
@ -1182,7 +1182,7 @@ namespace rsx
u32 dst_dma = method_registers.nv0039_output_location(); u32 dst_dma = method_registers.nv0039_output_location();
const auto read_address = get_address(src_offset, src_dma); const auto read_address = get_address(src_offset, src_dma);
rsx->read_barrier(read_address, in_pitch * line_count); rsx->read_barrier(read_address, in_pitch * (line_count - 1) + line_length);
u8 *dst = (u8*)vm::base(get_address(dst_offset, dst_dma)); u8 *dst = (u8*)vm::base(get_address(dst_offset, dst_dma));
const u8 *src = (u8*)vm::base(read_address); const u8 *src = (u8*)vm::base(read_address);