be_t<u32> rsx_replay_thread::allocate_context() { // '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 user_mem_addr = vm::falloc(vm::get(vm::user1m)->addr, 0x10000000); verify(HERE), user_mem_addr != 0; const u32 contextAddr = vm::alloc(sizeof(rsx_context), vm::main); if (contextAddr == 0) fmt::throw_exception("Capture Replay: context alloc failed"); const auto& contextInfo = vm::_ref<rsx_context>(contextAddr); if (sys_rsx_device_map(vm::get_addr(&contextInfo.dev_addr), vm::null, 0x8) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_device_map failed!"); if (sys_rsx_memory_allocate(vm::get_addr(&contextInfo.mem_handle), vm::get_addr(&contextInfo.mem_addr), 0x0F900000, 0, 0, 0, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_memory_allocate failed!"); if (sys_rsx_context_allocate(vm::get_addr(&contextInfo.context_id), vm::get_addr(&contextInfo.dma_addr), vm::get_addr(&contextInfo.driver_info), vm::get_addr(&contextInfo.reports_addr), contextInfo.mem_handle, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_context_allocate failed!"); // 1024Mb, the extra 512Mb memory is needed to allocate FIFO commands on // So there wont be any conflicts with memory used in the capture get_current_renderer()->main_mem_size = 0x40000000; return contextInfo.context_id; }
be_t<u32> rsx_replay_thread::allocate_context() { u32 buffer_size = 4; // run through replay commands to figure out how big command buffer needs to be for (const auto& rc : frame->replay_commands) { const u32 count = (rc.rsx_command.first >> 18) & 0x7ff; // allocate for register plus w/e number of arguments it has buffer_size += (count * 4) + 4; } // User memory + fifo size buffer_size = ::align<u32>(buffer_size, 0x100000) + 0x10000000; // We are not allowed to drain all memory so add a little fxm::make_always<lv2_memory_container>(buffer_size + 0x1000000); const u32 contextAddr = vm::alloc(sizeof(rsx_context), vm::main); if (contextAddr == 0) fmt::throw_exception("Capture Replay: context alloc failed"); const auto& contextInfo = vm::_ref<rsx_context>(contextAddr); // 'fake' initialize usermemory sys_memory_allocate(buffer_size, SYS_MEMORY_PAGE_SIZE_1M, vm::get_addr(&contextInfo.user_addr)); verify(HERE), (user_mem_addr = contextInfo.user_addr) != 0; if (sys_rsx_device_map(vm::get_addr(&contextInfo.dev_addr), vm::null, 0x8) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_device_map failed!"); if (sys_rsx_memory_allocate(vm::get_addr(&contextInfo.mem_handle), vm::get_addr(&contextInfo.mem_addr), 0x0F900000, 0, 0, 0, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_memory_allocate failed!"); if (sys_rsx_context_allocate(vm::get_addr(&contextInfo.context_id), vm::get_addr(&contextInfo.dma_addr), vm::get_addr(&contextInfo.driver_info), vm::get_addr(&contextInfo.reports_addr), contextInfo.mem_handle, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_context_allocate failed!"); get_current_renderer()->main_mem_size = buffer_size; if (sys_rsx_context_iomap(contextInfo.context_id, 0, user_mem_addr, buffer_size, 0) != CELL_OK) fmt::throw_exception("Capture Replay: rsx io mapping failed!"); return contextInfo.context_id; }
be_t<u32> rsx_replay_thread::allocate_context() { const u32 contextAddr = vm::alloc(sizeof(rsx_context), vm::main); if (contextAddr == 0) fmt::throw_exception("Capture Replay: context alloc failed"); const auto& contextInfo = vm::_ref<rsx_context>(contextAddr); if (sys_rsx_device_map(vm::make_var<u64>(0), vm::null, 0x8) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_device_map failed!"); if (sys_rsx_memory_allocate(vm::get_addr(&contextInfo.mem_handle), vm::get_addr(&contextInfo.mem_addr), 0x0F900000, 0, 0, 0, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_memory_allocate failed!"); if (sys_rsx_context_allocate(vm::get_addr(&contextInfo.context_id), vm::get_addr(&contextInfo.dma_addr), vm::get_addr(&contextInfo.driver_info), vm::get_addr(&contextInfo.reports_addr), contextInfo.mem_handle, 0) != CELL_OK) fmt::throw_exception("Capture Replay: sys_rsx_context_allocate failed!"); // '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 vm::falloc(0x20000000, 0x10000000, vm::user_space); return contextInfo.context_id; }