Skip to content

Commit 9f1a0e3

Browse files
committed
WIP
1 parent 211b909 commit 9f1a0e3

File tree

18 files changed

+479
-155
lines changed

18 files changed

+479
-155
lines changed

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "vitaGL"]
22
path = vitaGL
33
url = https://github.com/Rinnegatamante/vitaGL.git
4+
[submodule "kubridge"]
5+
path = kubridge
6+
url = https://github.com/bythos14/kubridge.git

Cargo.lock

Lines changed: 11 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ affinity = "0.1.2"
3232
[build-dependencies]
3333
bindgen = "0.70.0"
3434
cc = "1.0.100"
35+
cmake = "0.1"
3536

3637
[target.armv7-sony-vita-newlibeabihf.dependencies]
3738
vitasdk-sys = { version = "0.3.2", features = [

build.rs

Lines changed: 77 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,47 +25,82 @@ fn main() {
2525
let vitasdk_include_path = vitasdk_path.join("arm-vita-eabi").join("include");
2626
let vitasdk_lib_path = vitasdk_path.join("arm-vita-eabi").join("lib");
2727

28-
let bindings_file = out_path.join("imgui_bindings.rs");
29-
30-
const IMGUI_HEADERS: [&str; 3] = ["imgui.h", "imgui_internal.h", "imgui_impl_vitagl.h"];
31-
let mut bindings = bindgen::Builder::default()
32-
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
33-
.clang_args(["-x", "c++"])
34-
.clang_args(["-std=c++17"])
35-
.clang_args(["-target", "armv7a-none-eabihf"])
36-
.formatter(Formatter::Prettyplease);
37-
for header in IMGUI_HEADERS {
38-
let header_path = vitasdk_include_path.join(header);
39-
println!("cargo:rerun-if-changed={header_path:?}");
40-
bindings = bindings.header(header_path.to_str().unwrap());
28+
let kubridge_path = PathBuf::from("kubridge");
29+
30+
{
31+
let bindings_file = out_path.join("imgui_bindings.rs");
32+
33+
const IMGUI_HEADERS: [&str; 3] = ["imgui.h", "imgui_internal.h", "imgui_impl_vitagl.h"];
34+
let mut bindings = bindgen::Builder::default()
35+
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
36+
.clang_args(["-x", "c++"])
37+
.clang_args(["-std=c++17"])
38+
.clang_args(["-target", "armv7a-none-eabihf"])
39+
.formatter(Formatter::Prettyplease);
40+
for header in IMGUI_HEADERS {
41+
let header_path = vitasdk_include_path.join(header);
42+
println!("cargo:rerun-if-changed={header_path:?}");
43+
bindings = bindings.header(header_path.to_str().unwrap());
44+
}
45+
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
46+
47+
println!("cargo:rustc-link-search=native={vitasdk_lib_path:?}");
48+
println!("cargo:rustc-link-lib=static=imgui");
49+
}
50+
51+
{
52+
let bindings_file = out_path.join("kubridge_bindings.rs");
53+
54+
const KUBRIDGE_HEADERS: [&str; 1] = ["kubridge.h"];
55+
let mut bindings = bindgen::Builder::default()
56+
.clang_args(["-I", vitasdk_include_path.to_str().unwrap()])
57+
.clang_args(["-I", kubridge_path.to_str().unwrap()])
58+
.clang_args(["-x", "c++"])
59+
.clang_args(["-std=c++17"])
60+
.clang_args(["-target", "armv7a-none-eabihf"])
61+
.formatter(Formatter::Prettyplease);
62+
for header in KUBRIDGE_HEADERS {
63+
let header_path = kubridge_path.join(header);
64+
println!("cargo:rerun-if-changed={header_path:?}");
65+
bindings = bindings.header(header_path.to_str().unwrap());
66+
}
67+
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
68+
}
69+
70+
{
71+
let vita_gl_path = PathBuf::from("vitaGL");
72+
let vita_gl_lib_path = vita_gl_path.join("libvitaGL.a");
73+
let vita_gl_lib_new_path = vita_gl_path.join("libvitaGL_dsvita.a");
74+
75+
Command::new("make")
76+
.current_dir("vitaGL")
77+
.args(["-j", &num_jobs])
78+
.envs([
79+
("HAVE_UNFLIPPED_FBOS", "1"),
80+
("NO_TEX_COMBINER", "1"),
81+
("NO_DEBUG", "1"),
82+
("SHADER_COMPILER_SPEEDHACK", "1"),
83+
("MATH_SPEEDHACK", "1"),
84+
("HAVE_SHADER_CACHE", "1"),
85+
// ("HAVE_SHARK_LOG", "1"),
86+
// ("LOG_ERRORS", "1"),
87+
// ("HAVE_RAZOR", "1"),
88+
])
89+
.status()
90+
.unwrap();
91+
92+
fs::rename(vita_gl_lib_path, vita_gl_lib_new_path).unwrap();
93+
println!("cargo:rustc-link-search=native={}", fs::canonicalize(vita_gl_path).unwrap().to_str().unwrap());
94+
println!("cargo:rustc-link-lib=static=vitaGL_dsvita");
95+
}
96+
97+
{
98+
let kubridge_dst_path = cmake::Config::new(&kubridge_path).build_target("libkubridge_stub.a").build().join("build");
99+
let kubridge_lib_path = kubridge_dst_path.join("libkubridge_stub.a");
100+
let kubridge_lib_new_path = kubridge_dst_path.join("libkubridge_stub_dsvita.a");
101+
fs::rename(kubridge_lib_path, kubridge_lib_new_path).unwrap();
102+
103+
println!("cargo:rustc-link-search=native={}", fs::canonicalize(kubridge_dst_path).unwrap().to_str().unwrap());
104+
println!("cargo:rustc-link-lib=static=kubridge_stub_dsvita");
41105
}
42-
bindings.rust_target(bindgen::RustTarget::Nightly).generate().unwrap().write_to_file(bindings_file).unwrap();
43-
44-
println!("cargo:rustc-link-search=native={vitasdk_lib_path:?}");
45-
println!("cargo:rustc-link-lib=static=imgui");
46-
47-
let vita_gl_path = PathBuf::from("vitaGL");
48-
let vita_gl_lib_path = vita_gl_path.join("libvitaGL.a");
49-
let vita_gl_lib_new_path = vita_gl_path.join("libvitaGL_dsvita.a");
50-
51-
Command::new("make")
52-
.current_dir("vitaGL")
53-
.args(["-j", &num_jobs])
54-
.envs([
55-
("HAVE_UNFLIPPED_FBOS", "1"),
56-
("NO_TEX_COMBINER", "1"),
57-
("NO_DEBUG", "1"),
58-
("SHADER_COMPILER_SPEEDHACK", "1"),
59-
("MATH_SPEEDHACK", "1"),
60-
("HAVE_SHADER_CACHE", "1"),
61-
// ("HAVE_SHARK_LOG", "1"),
62-
// ("LOG_ERRORS", "1"),
63-
// ("HAVE_RAZOR", "1"),
64-
])
65-
.status()
66-
.unwrap();
67-
68-
fs::rename(vita_gl_lib_path, vita_gl_lib_new_path).unwrap();
69-
println!("cargo:rustc-link-search=native={}", fs::canonicalize(vita_gl_path).unwrap().to_str().unwrap());
70-
println!("cargo:rustc-link-lib=static=vitaGL_dsvita");
71106
}

kubridge

Submodule kubridge added at a4ef20f

src/core/emu.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ use crate::core::memory::cartridge::Cartridge;
217217
use crate::core::memory::mem::Memory;
218218
use crate::core::spu::SoundSampler;
219219
use crate::core::CpuType;
220+
use crate::mmap::ShmMem;
220221
use crate::settings::Settings;
221222
use crate::utils::Convert;
222223
use std::cell::UnsafeCell;
@@ -267,10 +268,10 @@ pub struct Emu {
267268
}
268269

269270
impl Emu {
270-
pub fn new(cartridge_io: CartridgeIo, fps: Arc<AtomicU16>, key_map: Arc<AtomicU32>, touch_points: Arc<AtomicU16>, sound_sampler: Arc<SoundSampler>, settings: Settings) -> Self {
271+
pub fn new(cartridge_io: CartridgeIo, shm_mem: &ShmMem, fps: Arc<AtomicU16>, key_map: Arc<AtomicU32>, touch_points: Arc<AtomicU16>, sound_sampler: Arc<SoundSampler>, settings: Settings) -> Self {
271272
Emu {
272273
common: UnsafeCell::new(Common::new(cartridge_io, fps, key_map)),
273-
mem: UnsafeCell::new(Memory::new(touch_points, sound_sampler)),
274+
mem: UnsafeCell::new(Memory::new(shm_mem, touch_points, sound_sampler)),
274275
arm7_hle: UnsafeCell::new(Arm7Hle::new()),
275276
settings,
276277
}

src/core/memory/main.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::utils::{Convert, HeapMemU8};
44
use std::ops::{Deref, DerefMut};
55

66
pub struct Main {
7-
main: HeapMemU8<{ regions::MAIN_MEMORY_SIZE as usize }>,
7+
main: HeapMemU8<{ regions::MAIN_SIZE as usize }>,
88
}
99

1010
impl Main {
@@ -13,18 +13,18 @@ impl Main {
1313
}
1414

1515
pub fn get_ptr(&self, addr: u32) -> *const u8 {
16-
unsafe { self.main.as_ptr().add((addr & (regions::MAIN_MEMORY_SIZE - 1)) as usize) }
16+
unsafe { self.main.as_ptr().add((addr & (regions::MAIN_SIZE - 1)) as usize) }
1717
}
1818

1919
pub fn read<T: Convert>(&self, addr_offset: u32) -> T {
20-
utils::read_from_mem(self.main.deref(), addr_offset & (regions::MAIN_MEMORY_SIZE - 1))
20+
utils::read_from_mem(self.main.deref(), addr_offset & (regions::MAIN_SIZE - 1))
2121
}
2222

2323
pub fn write<T: Convert>(&mut self, addr_offset: u32, value: T) {
24-
utils::write_to_mem(self.main.deref_mut(), addr_offset & (regions::MAIN_MEMORY_SIZE - 1), value);
24+
utils::write_to_mem(self.main.deref_mut(), addr_offset & (regions::MAIN_SIZE - 1), value);
2525
}
2626

2727
pub fn write_slice<T: Convert>(&mut self, addr_offset: u32, slice: &[T]) {
28-
utils::write_to_mem_slice(self.main.deref_mut(), (addr_offset & (regions::MAIN_MEMORY_SIZE - 1)) as usize, slice);
28+
utils::write_to_mem_slice(self.main.deref_mut(), (addr_offset & (regions::MAIN_SIZE - 1)) as usize, slice);
2929
}
3030
}

src/core/memory/mem.rs

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::core::memory::oam::Oam;
88
use crate::core::memory::palettes::Palettes;
99
use crate::core::memory::regions;
1010
use crate::core::memory::tcm::Tcm;
11+
use crate::core::memory::vmem::Vmem;
1112
use crate::core::memory::vram::Vram;
1213
use crate::core::memory::wifi::Wifi;
1314
use crate::core::memory::wram::Wram;
@@ -16,26 +17,24 @@ use crate::core::CpuType;
1617
use crate::core::CpuType::ARM9;
1718
use crate::jit::jit_memory::{JitMemory, JitRegion};
1819
use crate::logging::debug_println;
20+
use crate::mmap::ShmMem;
1921
use crate::utils::Convert;
2022
use std::intrinsics::{likely, unlikely};
2123
use std::sync::atomic::AtomicU16;
2224
use std::sync::Arc;
2325
use CpuType::ARM7;
2426

2527
pub struct Memory {
26-
pub tcm: Tcm,
27-
pub main: Main,
2828
pub wram: Wram,
2929
pub io_arm7: IoArm7,
3030
pub io_arm9: IoArm9,
31-
pub wifi: Wifi,
3231
pub palettes: Palettes,
3332
pub vram: Vram,
3433
pub oam: Oam,
3534
pub jit: JitMemory,
3635
pub breakout_imm: bool,
37-
pub mmu_arm9: MmuArm9,
38-
pub mmu_arm7: MmuArm7,
36+
pub vmem_arm9: Vmem,
37+
pub vmem_arm7: Vmem,
3938
}
4039

4140
macro_rules! get_mem_mmu {
@@ -48,52 +47,36 @@ macro_rules! get_mem_mmu {
4847
}
4948

5049
impl Memory {
51-
pub fn new(touch_points: Arc<AtomicU16>, sound_sampler: Arc<SoundSampler>) -> Self {
50+
pub fn new(shm_mem: &ShmMem, touch_points: Arc<AtomicU16>, sound_sampler: Arc<SoundSampler>) -> Self {
5251
Memory {
53-
tcm: Tcm::new(),
54-
main: Main::new(),
5552
wram: Wram::new(),
5653
io_arm7: IoArm7::new(touch_points, sound_sampler),
5754
io_arm9: IoArm9::new(),
58-
wifi: Wifi::new(),
5955
palettes: Palettes::new(),
6056
vram: Vram::new(),
6157
oam: Oam::new(),
6258
jit: JitMemory::new(),
6359
breakout_imm: false,
64-
mmu_arm9: MmuArm9::new(),
65-
mmu_arm7: MmuArm7::new(),
60+
vmem_arm9: Vmem::new(regions::V_MEM_ARM9_RANGE, shm_mem, &regions::V_MEM_REGIONS_ARM9),
61+
vmem_arm7: Vmem::new(regions::V_MEM_ARM7_RANGE, shm_mem, &regions::V_MEM_REGIONS_ARM7),
6662
}
6763
}
6864

6965
pub fn read<const CPU: CpuType, T: Convert>(&mut self, addr: u32, emu: &mut Emu) -> T {
70-
self.read_with_options::<CPU, true, true, T>(addr, emu)
71-
}
72-
73-
pub fn read_no_mmu<const CPU: CpuType, T: Convert>(&mut self, addr: u32, emu: &mut Emu) -> T {
74-
self.read_with_options::<CPU, true, false, T>(addr, emu)
66+
self.read_with_options::<CPU, true, T>(addr, emu)
7567
}
7668

7769
pub fn read_no_tcm<const CPU: CpuType, T: Convert>(&mut self, addr: u32, emu: &mut Emu) -> T {
78-
self.read_with_options::<CPU, false, true, T>(addr, emu)
70+
self.read_with_options::<CPU, false, T>(addr, emu)
7971
}
8072

81-
pub fn read_with_options<const CPU: CpuType, const TCM: bool, const MMU: bool, T: Convert>(&mut self, addr: u32, emu: &mut Emu) -> T {
73+
pub fn read_with_options<const CPU: CpuType, const TCM: bool, T: Convert>(&mut self, addr: u32, emu: &mut Emu) -> T {
8274
debug_println!("{:?} memory read at {:x}", CPU, addr);
8375
let aligned_addr = addr & !(size_of::<T>() as u32 - 1);
8476

8577
let addr_base = aligned_addr & 0xFF000000;
8678
let addr_offset = aligned_addr - addr_base;
8779

88-
if MMU && (CPU == ARM7 || TCM) {
89-
let base_ptr = get_mem_mmu!(self, CPU).get_base_ptr(aligned_addr);
90-
if likely(!base_ptr.is_null()) {
91-
let ret = unsafe { (base_ptr.add((aligned_addr & (MMU_BLOCK_SIZE - 1)) as usize) as *const T).read() };
92-
debug_println!("{:?} mmu read at {:x} with value {:x}", CPU, aligned_addr, ret.into());
93-
return ret;
94-
}
95-
}
96-
9780
if CPU == ARM9 && TCM {
9881
let cp15 = get_cp15!(emu, ARM9);
9982
if unlikely(aligned_addr >= cp15.dtcm_addr && aligned_addr < cp15.dtcm_addr + cp15.dtcm_size && cp15.dtcm_state == TcmState::RW) {
@@ -104,7 +87,7 @@ impl Memory {
10487
}
10588

10689
let ret = match addr_base {
107-
regions::INSTRUCTION_TCM_OFFSET | regions::INSTRUCTION_TCM_MIRROR_OFFSET => match CPU {
90+
regions::ITCM_OFFSET | regions::ITCM_OFFSET2 => match CPU {
10891
ARM9 => {
10992
let mut ret = T::from(0);
11093
if TCM {
@@ -125,7 +108,7 @@ impl Memory {
125108
}
126109
}
127110
},
128-
regions::MAIN_MEMORY_OFFSET => self.main.read(addr_offset),
111+
regions::MAIN_OFFSET => self.main.read(addr_offset),
129112
regions::SHARED_WRAM_OFFSET => self.wram.read::<CPU, _>(addr_offset),
130113
regions::IO_PORTS_OFFSET => match CPU {
131114
ARM9 => self.io_arm9.read(addr_offset, emu),
@@ -189,7 +172,7 @@ impl Memory {
189172
}
190173

191174
match addr_base {
192-
regions::INSTRUCTION_TCM_OFFSET | regions::INSTRUCTION_TCM_MIRROR_OFFSET => match CPU {
175+
regions::ITCM_OFFSET | regions::ITCM_OFFSET2 => match CPU {
193176
ARM9 => {
194177
if TCM {
195178
let cp15 = get_cp15!(emu, ARM9);
@@ -205,7 +188,7 @@ impl Memory {
205188
// todo!("{:x} {:x}", aligned_addr, addr_base)
206189
}
207190
},
208-
regions::MAIN_MEMORY_OFFSET => {
191+
regions::MAIN_OFFSET => {
209192
self.main.write(addr_offset, value);
210193
self.jit.invalidate_block::<{ JitRegion::Main }>(aligned_addr, size_of::<T>());
211194
}

src/core/memory/mmu.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl MmuArm9Inner {
4545
*read_ptr = 0;
4646

4747
match addr & 0xFF000000 {
48-
regions::MAIN_MEMORY_OFFSET => *read_ptr = get_mem!(emu).main.get_ptr(addr) as u32,
48+
regions::MAIN_OFFSET => *read_ptr = get_mem!(emu).main.get_ptr(addr) as u32,
4949
regions::SHARED_WRAM_OFFSET => *read_ptr = get_mem!(emu).wram.get_ptr::<{ ARM9 }>(addr) as u32,
5050
// regions::VRAM_OFFSET => *read_ptr = emu.mem.vram.get_ptr::<{ ARM9 }>(addr) as u32,
5151
_ => {}
@@ -92,7 +92,7 @@ impl Mmu for MmuArm9 {
9292

9393
fn update_itcm(&self, emu: &Emu) {
9494
let inner = unsafe { self.inner.get().as_mut().unwrap_unchecked() };
95-
inner.update(regions::INSTRUCTION_TCM_OFFSET, max(inner.current_itcm_size, get_cp15!(emu, ARM9).itcm_size), emu);
95+
inner.update(regions::ITCM_OFFSET, max(inner.current_itcm_size, get_cp15!(emu, ARM9).itcm_size), emu);
9696
}
9797

9898
fn update_dtcm(&self, emu: &Emu) {
@@ -149,7 +149,7 @@ impl MmuArm7Inner {
149149
*read_ptr = 0;
150150

151151
match addr & 0xFF000000 {
152-
regions::MAIN_MEMORY_OFFSET => *read_ptr = get_mem!(emu).main.get_ptr(addr) as u32,
152+
regions::MAIN_OFFSET => *read_ptr = get_mem!(emu).main.get_ptr(addr) as u32,
153153
regions::SHARED_WRAM_OFFSET => *read_ptr = get_mem!(emu).wram.get_ptr::<{ ARM7 }>(addr) as u32,
154154
regions::IO_PORTS_OFFSET => {
155155
if unlikely(addr >= regions::WIFI_IO_OFFSET) {

src/core/memory/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ pub mod tcm;
1212
pub mod vram;
1313
mod wifi;
1414
pub mod wram;
15+
mod vmem;

0 commit comments

Comments
 (0)