mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-07-22 23:03:00 +12:00
[GPU] DMA
This commit is contained in:
parent
8f796352a6
commit
e1ac986009
4 changed files with 32 additions and 4 deletions
|
@ -47,9 +47,11 @@ class GPU {
|
||||||
u32 index = paddr - PhysicalAddrs::FCRAM;
|
u32 index = paddr - PhysicalAddrs::FCRAM;
|
||||||
|
|
||||||
return (T*)&fcram[index];
|
return (T*)&fcram[index];
|
||||||
}
|
} else if (paddr >= PhysicalAddrs::VRAM && paddr <= PhysicalAddrs::VRAMEnd) {
|
||||||
else {
|
u32 index = paddr - PhysicalAddrs::VRAM;
|
||||||
Helpers::panic("[PICA] Pointer to unimplemented paddr %08X", paddr);
|
return (T*)&vram[index];
|
||||||
|
} else [[unlikely]] {
|
||||||
|
Helpers::panic("[GPU] Tried to access unknown physical address: %08X", paddr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,6 +104,7 @@ public:
|
||||||
void getGraphicsContext(); // Set up the graphics context for rendering
|
void getGraphicsContext(); // Set up the graphics context for rendering
|
||||||
void display(); // Display the screen contents onto our window
|
void display(); // Display the screen contents onto our window
|
||||||
|
|
||||||
|
void fireDMA(u32 dest, u32 source, u32 size);
|
||||||
void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control);
|
void clearBuffer(u32 startAddress, u32 endAddress, u32 value, u32 control);
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
namespace PhysicalAddrs {
|
namespace PhysicalAddrs {
|
||||||
enum : u32 {
|
enum : u32 {
|
||||||
|
VRAM = 0x18000000,
|
||||||
|
VRAMEnd = VRAM + 0x005FFFFF,
|
||||||
FCRAM = 0x20000000,
|
FCRAM = 0x20000000,
|
||||||
FCRAMEnd = FCRAM + 0x07FFFFFF
|
FCRAMEnd = FCRAM + 0x07FFFFFF
|
||||||
};
|
};
|
||||||
|
@ -38,6 +40,7 @@ namespace VirtualAddrs {
|
||||||
|
|
||||||
VramStart = 0x1F000000,
|
VramStart = 0x1F000000,
|
||||||
VramSize = 0x00600000,
|
VramSize = 0x00600000,
|
||||||
|
FcramTotalSize = 128_MB,
|
||||||
DSPMemStart = 0x1FF00000
|
DSPMemStart = 0x1FF00000
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -158,4 +158,25 @@ void GPU::drawArrays() {
|
||||||
};
|
};
|
||||||
const auto shape = primTypes[primType];
|
const auto shape = primTypes[primType];
|
||||||
drawVertices(shape, vertices, vertexCount);
|
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);
|
||||||
}
|
}
|
|
@ -278,7 +278,8 @@ void GPUService::triggerDMARequest(u32* cmd) {
|
||||||
u32 size = cmd[3];
|
u32 size = cmd[3];
|
||||||
bool flush = cmd[7] == 1;
|
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);
|
requestInterrupt(GPUInterrupt::DMA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue