Vendor Teakra, make emulator own DSP RAM and add DSP RAM to fastmem (#806)

* DSP: Own DSP RAM and add it to fastmem

* Vendor Teakra

* Add MacOS support to fastmem

* Fix MacOS fastmem paths

* Fix iOS build
This commit is contained in:
wheremyfoodat
2025-08-22 02:12:21 +03:00
committed by GitHub
parent ff100dc5ac
commit 78002be334
132 changed files with 37774 additions and 15 deletions

View File

@@ -22,7 +22,6 @@ std::unique_ptr<Audio::DSPCore> Audio::makeDSPCore(EmulatorConfig& config, Memor
break;
}
mem.setDSPMem(core->getDspMemory());
return core;
}

View File

@@ -23,7 +23,7 @@ namespace Audio {
}
HLE_DSP::HLE_DSP(Memory& mem, Scheduler& scheduler, DSPService& dspService, EmulatorConfig& config)
: DSPCore(mem, scheduler, dspService, config) {
: DSPCore(mem, scheduler, dspService, config), dspRam(*(Audio::HLE::DspMemory*)mem.getDSPMem()) {
// Set up source indices
for (int i = 0; i < sources.size(); i++) {
sources[i].index = i;

View File

@@ -11,7 +11,7 @@
using namespace Audio;
TeakraDSP::TeakraDSP(Memory& mem, Scheduler& scheduler, DSPService& dspService, EmulatorConfig& config)
: DSPCore(mem, scheduler, dspService, config), pipeBaseAddr(0), running(false) {
: DSPCore(mem, scheduler, dspService, config), pipeBaseAddr(0), teakra(getTeakraConfig()), running(false) {
// Set up callbacks for Teakra
Teakra::AHBMCallback ahbm;
@@ -82,6 +82,13 @@ TeakraDSP::TeakraDSP(Memory& mem, Scheduler& scheduler, DSPService& dspService,
teakra.SetSemaphoreHandler([processPipeEvent]() { processPipeEvent(false); });
}
Teakra::UserConfig TeakraDSP::getTeakraConfig() {
Teakra::UserConfig config;
config.dsp_memory = mem.getDSPMem();
return config;
}
void TeakraDSP::reset() {
teakra.Reset();
running = false;
@@ -237,7 +244,7 @@ void TeakraDSP::loadComponent(std::vector<u8>& data, u32 programMask, u32 dataMa
teakra.Reset();
running = true;
u8* dspCode = teakra.GetDspMemory().data();
u8* dspCode = teakra.GetDspMemory();
u8* dspData = dspCode + 0x40000;
Dsp1 dsp1;

View File

@@ -24,7 +24,7 @@ Memory::Memory(KFcram& fcramManager, const EmulatorConfig& config) : fcramManage
paddrTable.resize(totalPageCount, 0);
fcram = arena->BackingBasePointer() + FASTMEM_FCRAM_OFFSET;
// arenaDSPRam = arena->BackingBasePointer() + FASTMEM_DSP_RAM_OFFSET;
dspRam = arena->BackingBasePointer() + FASTMEM_DSP_RAM_OFFSET;
useFastmem = fastmemEnabled && arena->VirtualBasePointer() != nullptr;
}
@@ -395,6 +395,10 @@ void Memory::mapPhysicalMemory(u32 vaddr, u32 paddr, s32 pages, bool r, bool w,
}
} else if (paddr >= VirtualAddrs::DSPMemStart && paddr < VirtualAddrs::DSPMemStart + DSP_RAM_SIZE) {
hostPtr = dspRam + (paddr - VirtualAddrs::DSPMemStart);
if (useFastmem) {
addFastmemView(vaddr, FASTMEM_DSP_RAM_OFFSET + paddr - VirtualAddrs::DSPMemStart, usize(pages) * pageSize, w);
}
}
for (int i = 0; i < pages; i++) {