[GPU] DMA

This commit is contained in:
wheremyfoodat 2022-12-11 21:32:36 +02:00
parent 8f796352a6
commit e1ac986009
4 changed files with 32 additions and 4 deletions

View file

@ -158,4 +158,25 @@ void GPU::drawArrays() {
};
const auto shape = primTypes[primType];
drawVertices(shape, vertices, vertexCount);
}
void GPU::fireDMA(u32 dest, u32 source, u32 size) {
printf("[GPU] DMA of %08X bytes from %08X to %08X\n", size, source, dest);
constexpr u32 vramStart = VirtualAddrs::VramStart;
constexpr u32 vramSize = VirtualAddrs::VramSize;
const u32 fcramStart = mem.getLinearHeapVaddr();
constexpr u32 fcramSize = VirtualAddrs::FcramTotalSize;
if (dest - vramStart >= vramSize || size > (vramSize - (dest - vramStart))) [[unlikely]] {
Helpers::panic("GPU DMA does not target VRAM");
}
if (source - fcramStart >= fcramSize || size > (fcramSize - (dest - fcramStart))) {
Helpers::panic("GPU DMA does not have FCRAM as its source");
}
// Valid, optimized FCRAM->VRAM DMA. TODO: Is VRAM->VRAM DMA allowed?
u8* fcram = mem.getFCRAM();
std::memcpy(&vram[dest - vramStart], &fcram[source - fcramStart], size);
}

View file

@ -278,7 +278,8 @@ void GPUService::triggerDMARequest(u32* cmd) {
u32 size = cmd[3];
bool flush = cmd[7] == 1;
log("GSP::GPU::TriggerDMARequest (source = %08X, dest = %08X, size = %08X) (Unimplemented)\n", source, dest, size);
log("GSP::GPU::TriggerDMARequest (source = %08X, dest = %08X, size = %08X)\n", source, dest, size);
gpu.fireDMA(dest, source, size);
requestInterrupt(GPUInterrupt::DMA);
}