mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-06 09:39:55 +00:00
rsx-capture: Map dynamically rsx data injection addresses
This commit is contained in:
parent
8e268aedc7
commit
5b0ed1e2eb
@ -91,8 +91,8 @@ namespace rsx
|
|||||||
const u32 ucode_size = program_info.program_ucode_length;
|
const u32 ucode_size = program_info.program_ucode_length;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = program_offset,
|
||||||
block.ioOffset = get_io_offset(program_offset, program_location);
|
block.location = program_location;
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
block_data.data.resize(ucode_size + program_start);
|
block_data.data.resize(ucode_size + program_start);
|
||||||
std::memcpy(block_data.data.data(), vm::base(addr), ucode_size + program_start);
|
std::memcpy(block_data.data.data(), vm::base(addr), ucode_size + program_start);
|
||||||
@ -118,8 +118,8 @@ namespace rsx
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = texaddr;
|
block.ioOffset = tex.offset();
|
||||||
block.ioOffset = get_io_offset(tex.offset(), tex.location());
|
block.location = tex.location();
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
block_data.data.resize(texSize);
|
block_data.data.resize(texSize);
|
||||||
@ -145,8 +145,8 @@ namespace rsx
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = texaddr;
|
block.ioOffset = tex.offset();
|
||||||
block.ioOffset = get_io_offset(tex.offset(), tex.location());
|
block.location = tex.location();
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
block_data.data.resize(texSize);
|
block_data.data.resize(texSize);
|
||||||
std::memcpy(block_data.data.data(), vm::base(texaddr), texSize);
|
std::memcpy(block_data.data.data(), vm::base(texaddr), texSize);
|
||||||
@ -181,10 +181,9 @@ namespace rsx
|
|||||||
const size_t bufferSize = vertCount * vertStride + vertSize;
|
const size_t bufferSize = vertCount * vertStride + vertSize;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = base_address;
|
||||||
block.ioOffset = get_io_offset(base_address, memory_location);
|
block.location = memory_location;
|
||||||
block.offset = (count.first * vertStride);
|
block.offset = (count.first * vertStride);
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
block_data.data.resize(bufferSize);
|
block_data.data.resize(bufferSize);
|
||||||
std::memcpy(block_data.data.data(), vm::base(addr + block.offset), bufferSize);
|
std::memcpy(block_data.data.data(), vm::base(addr + block.offset), bufferSize);
|
||||||
@ -221,8 +220,8 @@ namespace rsx
|
|||||||
const size_t bufferSize = idxCount * type_size;
|
const size_t bufferSize = idxCount * type_size;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = base_addr;
|
block.ioOffset = base_address;
|
||||||
block.ioOffset = get_io_offset(base_address, memory_location);
|
block.location = memory_location;
|
||||||
block.offset = (idxFirst * type_size);
|
block.offset = (idxFirst * type_size);
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
@ -289,8 +288,8 @@ namespace rsx
|
|||||||
const u32 bufferSize = vertStride * (max_index - min_index + 1) + vertSize;
|
const u32 bufferSize = vertStride * (max_index - min_index + 1) + vertSize;
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = base_address;
|
||||||
block.ioOffset = get_io_offset(base_address, memory_location);
|
block.location = memory_location;
|
||||||
block.offset = (min_index * vertStride);
|
block.offset = (min_index * vertStride);
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
@ -339,8 +338,8 @@ namespace rsx
|
|||||||
const tiled_region src_region = rsx->get_tiled_address(src_offset + in_offset, src_dma & 0xf);
|
const tiled_region src_region = rsx->get_tiled_address(src_offset + in_offset, src_dma & 0xf);
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = src_region.address;
|
block.ioOffset = src_region.tile ? src_region.base : src_offset + in_offset;
|
||||||
block.ioOffset = get_io_offset(src_region.tile ? src_region.base : src_offset + in_offset, src_dma & 0xf);
|
block.location = src_dma & 0xf;
|
||||||
|
|
||||||
u8* pixels_src = src_region.tile ? src_region.ptr + src_region.base : src_region.ptr;
|
u8* pixels_src = src_region.tile ? src_region.ptr + src_region.base : src_region.ptr;
|
||||||
|
|
||||||
@ -387,9 +386,9 @@ namespace rsx
|
|||||||
const tiled_region dst_region = rsx->get_tiled_address(dst_offset + out_offset, dst_dma & 0xf);
|
const tiled_region dst_region = rsx->get_tiled_address(dst_offset + out_offset, dst_dma & 0xf);
|
||||||
|
|
||||||
frame_capture_data::memory_block blockDst;
|
frame_capture_data::memory_block blockDst;
|
||||||
blockDst.addr = dst_region.address;
|
blockDst.ioOffset = dst_region.tile ? dst_region.base : dst_offset + out_offset;
|
||||||
blockDst.ioOffset = get_io_offset(dst_region.tile ? dst_region.base : dst_offset + out_offset, dst_dma & 0xf);
|
blockDst.location = dst_dma & 0xf;
|
||||||
if (blockDst.ioOffset != -1)
|
if (get_io_offset(blockDst.ioOffset, blockDst.location) != -1)
|
||||||
{
|
{
|
||||||
u32 blockSize = method_registers.blit_engine_context_surface() != blit_engine::context_surface::swizzle2d ? out_pitch * out_h : out_bpp * next_pow2(out_w) * next_pow2(out_h);
|
u32 blockSize = method_registers.blit_engine_context_surface() != blit_engine::context_surface::swizzle2d ? out_pitch * out_h : out_bpp * next_pow2(out_w) * next_pow2(out_h);
|
||||||
|
|
||||||
@ -422,8 +421,8 @@ namespace rsx
|
|||||||
const u8* src = (u8*)vm::base(src_addr);
|
const u8* src = (u8*)vm::base(src_addr);
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = src_addr;
|
block.ioOffset = src_offset;
|
||||||
block.ioOffset = get_io_offset(src_offset, 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);
|
||||||
@ -448,11 +447,11 @@ namespace rsx
|
|||||||
}
|
}
|
||||||
|
|
||||||
frame_capture_data::memory_block blockDst;
|
frame_capture_data::memory_block blockDst;
|
||||||
blockDst.addr = dst_addr;
|
blockDst.ioOffset = dst_offset;
|
||||||
blockDst.ioOffset = get_io_offset(dst_offset, dst_dma);
|
blockDst.location = dst_dma;
|
||||||
|
|
||||||
// only check for iooffset'd data
|
// check if allocated
|
||||||
if (blockDst.ioOffset != -1)
|
if (get_io_offset(blockDst.ioOffset, blockDst.location) != -1)
|
||||||
{
|
{
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
blockDst.size = out_pitch * line_count;
|
blockDst.size = out_pitch * line_count;
|
||||||
@ -543,11 +542,12 @@ namespace rsx
|
|||||||
u32 addr = get_address(offset, location);
|
u32 addr = get_address(offset, location);
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = offset;
|
||||||
block.ioOffset = get_io_offset(offset, location);
|
block.location = location;
|
||||||
block.size = 16;
|
block.size = 16;
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -579,11 +579,9 @@ namespace rsx
|
|||||||
if (ioOffset == -1)
|
if (ioOffset == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 addr = get_address(offset, dma);
|
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = offset;
|
||||||
block.ioOffset = ioOffset;
|
block.location = dma;
|
||||||
block.size = 64;
|
block.size = 64;
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
@ -608,15 +606,15 @@ namespace rsx
|
|||||||
|
|
||||||
// just need to capture dst for allocation later if in iomem
|
// just need to capture dst for allocation later if in iomem
|
||||||
|
|
||||||
u32 ioOffset = get_io_offset(addr_offset, method_registers.blit_engine_output_location_nv3062());
|
const u32 memory_location = method_registers.blit_engine_output_location_nv3062();
|
||||||
|
|
||||||
|
const u32 ioOffset = get_io_offset(addr_offset, memory_location);
|
||||||
if (ioOffset == -1)
|
if (ioOffset == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
u32 addr = get_address(addr_offset, method_registers.blit_engine_output_location_nv3062());
|
|
||||||
|
|
||||||
frame_capture_data::memory_block block;
|
frame_capture_data::memory_block block;
|
||||||
block.addr = addr;
|
block.ioOffset = addr_offset;
|
||||||
block.ioOffset = ioOffset;
|
block.location = memory_location;
|
||||||
block.size = 4;
|
block.size = 4;
|
||||||
|
|
||||||
frame_capture_data::memory_block_data block_data;
|
frame_capture_data::memory_block_data block_data;
|
||||||
|
@ -14,8 +14,8 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
// 'fake' initialize usermemory
|
// 'fake' initialize usermemory
|
||||||
// todo: seriously, need to probly watch the replay memory map and just make sure its mapped before we copy rather than do this
|
// todo: seriously, need to probly watch the replay memory map and just make sure its mapped before we copy rather than do this
|
||||||
const auto user_mem = vm::get(vm::user64k);
|
user_mem_addr = vm::falloc(vm::get(vm::user1m)->addr, 0x10000000);
|
||||||
vm::falloc(user_mem->addr, 0x10000000);
|
verify(HERE), user_mem_addr != 0;
|
||||||
|
|
||||||
const u32 contextAddr = vm::alloc(sizeof(rsx_context), vm::main);
|
const u32 contextAddr = vm::alloc(sizeof(rsx_context), vm::main);
|
||||||
if (contextAddr == 0)
|
if (contextAddr == 0)
|
||||||
@ -120,7 +120,7 @@ namespace rsx
|
|||||||
fmt::throw_exception("requested memory data state for command not found in memory_data_map");
|
fmt::throw_exception("requested memory data state for command not found in memory_data_map");
|
||||||
|
|
||||||
const auto& data_block = it_data->second;
|
const auto& data_block = it_data->second;
|
||||||
std::memcpy(vm::base(memblock.addr + memblock.offset), data_block.data.data(), data_block.data.size());
|
std::memcpy(vm::base(get_address(memblock.ioOffset + memblock.offset, memblock.location)), data_block.data.data(), data_block.data.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,10 +213,18 @@ namespace rsx
|
|||||||
for (const auto it : frame->memory_map)
|
for (const auto it : frame->memory_map)
|
||||||
{
|
{
|
||||||
const auto& memblock = it.second;
|
const auto& memblock = it.second;
|
||||||
if (memblock.ioOffset == 0xFFFFFFFF)
|
if (memblock.location == CELL_GCM_CONTEXT_DMA_REPORT_LOCATION_MAIN)
|
||||||
|
{
|
||||||
|
// Special area for reports
|
||||||
|
if (sys_rsx_context_iomap(context_id, (memblock.ioOffset & ~0xFFFFF) + 0x0e000000, (memblock.ioOffset & ~0xFFFFF) + user_mem_addr + 0x0e000000, 0x100000, 0) != CELL_OK)
|
||||||
|
fmt::throw_exception("rsx io map failed for block");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const u32 location = memblock.location; location != CELL_GCM_LOCATION_MAIN && location != CELL_GCM_CONTEXT_DMA_MEMORY_HOST_BUFFER)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (sys_rsx_context_iomap(context_id, memblock.ioOffset & ~0xFFFFF, memblock.addr & ~0xFFFFF, ::align<u32>(memblock.size + memblock.offset, 0x100000), 0) != CELL_OK)
|
if (sys_rsx_context_iomap(context_id, memblock.ioOffset & ~0xFFFFF, user_mem_addr + (memblock.ioOffset & ~0xFFFFF), ::align<u32>(memblock.size + memblock.offset, 0x100000), 0) != CELL_OK)
|
||||||
fmt::throw_exception("rsx io map failed for block");
|
fmt::throw_exception("rsx io map failed for block");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +233,7 @@ namespace rsx
|
|||||||
// start up fifo buffer by dumping the put ptr to first stop
|
// start up fifo buffer by dumping the put ptr to first stop
|
||||||
sys_rsx_context_attribute(context_id, 0x001, 0x20000000, fifo_stops[0], 0, 0);
|
sys_rsx_context_attribute(context_id, 0x001, 0x20000000, fifo_stops[0], 0, 0);
|
||||||
|
|
||||||
auto renderer = fxm::get<GSRender>();
|
auto renderer = rsx::get_current_renderer();
|
||||||
size_t stopIdx = 0;
|
size_t stopIdx = 0;
|
||||||
for (const auto& replay_cmd : frame->replay_commands)
|
for (const auto& replay_cmd : frame->replay_commands)
|
||||||
{
|
{
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "Emu/Cell/PPUModule.h"
|
#include "Emu/Cell/PPUModule.h"
|
||||||
#include "Emu/Cell/lv2/sys_sync.h"
|
#include "Emu/Cell/lv2/sys_sync.h"
|
||||||
#include "Emu/Cell/lv2/sys_ppu_thread.h"
|
#include "Emu/Cell/lv2/sys_ppu_thread.h"
|
||||||
|
#include "Emu/RSX/gcm_enums.h"
|
||||||
|
|
||||||
#include <cereal/types/vector.hpp>
|
#include <cereal/types/vector.hpp>
|
||||||
#include <cereal/types/array.hpp>
|
#include <cereal/types/array.hpp>
|
||||||
@ -15,7 +16,7 @@
|
|||||||
namespace rsx
|
namespace rsx
|
||||||
{
|
{
|
||||||
constexpr u32 FRAME_CAPTURE_MAGIC = 0x52524300; // ascii 'RRC/0'
|
constexpr u32 FRAME_CAPTURE_MAGIC = 0x52524300; // ascii 'RRC/0'
|
||||||
constexpr u32 FRAME_CAPTURE_VERSION = 0x1;
|
constexpr u32 FRAME_CAPTURE_VERSION = 0x2;
|
||||||
struct frame_capture_data
|
struct frame_capture_data
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -32,18 +33,18 @@ namespace rsx
|
|||||||
// simple block to hold ps3 address and data
|
// simple block to hold ps3 address and data
|
||||||
struct memory_block
|
struct memory_block
|
||||||
{
|
{
|
||||||
u32 addr{0};
|
|
||||||
u32 ioOffset{0xFFFFFFFF}; // rsx ioOffset, -1 signifies unused
|
u32 ioOffset{0xFFFFFFFF}; // rsx ioOffset, -1 signifies unused
|
||||||
u32 offset{0}; // offset into addr/ioOffset to copy state into
|
u32 offset{0}; // offset into addr/ioOffset to copy state into
|
||||||
u32 size{0}; // size of block needed
|
u32 size{0}; // size of block needed
|
||||||
|
u32 location{0xFFFFFFFF}; // Location of the block in RSX memory space
|
||||||
u64 data_state{0}; // this can be 0, in which case its just needed as an alloc
|
u64 data_state{0}; // this can be 0, in which case its just needed as an alloc
|
||||||
template<typename Archive>
|
template<typename Archive>
|
||||||
void serialize(Archive & ar)
|
void serialize(Archive & ar)
|
||||||
{
|
{
|
||||||
ar(addr);
|
|
||||||
ar(ioOffset);
|
ar(ioOffset);
|
||||||
ar(offset);
|
ar(offset);
|
||||||
ar(size);
|
ar(size);
|
||||||
|
ar(location);
|
||||||
ar(data_state);
|
ar(data_state);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -224,6 +225,7 @@ namespace rsx
|
|||||||
frame_capture_data::tile_state tile_state;
|
frame_capture_data::tile_state tile_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
u32 user_mem_addr;
|
||||||
current_state cs;
|
current_state cs;
|
||||||
std::unique_ptr<frame_capture_data> frame;
|
std::unique_ptr<frame_capture_data> frame;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user