From b9b4d486a37cdca4b3a70c9fd8267c85f4679760 Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 18 Jan 2019 00:38:47 +0100 Subject: [PATCH] Fix GPUCMD_Add with more than 256 words (thanks to iMackshun for testing) --- libctru/source/gpu/gpu.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/libctru/source/gpu/gpu.c b/libctru/source/gpu/gpu.c index 3b7afd2..02cea77 100644 --- a/libctru/source/gpu/gpu.c +++ b/libctru/source/gpu/gpu.c @@ -22,14 +22,13 @@ void GPUCMD_AddRawCommands(const u32* cmd, u32 size) gpuCmdBufOffset+=size; } -void GPUCMD_Add(u32 header, const u32* param, u32 paramlength) +static void GPUCMD_AddInternal(u32 header, const u32* param, u32 paramlength) { - if(!paramlength)paramlength=1; if(!gpuCmdBuf || gpuCmdBufOffset+paramlength+1>gpuCmdBufSize) svcBreak(USERBREAK_PANIC); // Shouldn't happen. paramlength--; - header|=(paramlength&0x7ff)<<20; + header|=(paramlength&0xff)<<20; gpuCmdBuf[gpuCmdBufOffset]=param ? param[0] : 0; gpuCmdBuf[gpuCmdBufOffset+1]=header; @@ -45,6 +44,20 @@ void GPUCMD_Add(u32 header, const u32* param, u32 paramlength) if(paramlength&1)gpuCmdBuf[gpuCmdBufOffset++]=0x00000000; //alignment } +void GPUCMD_Add(u32 header, const u32* param, u32 paramlength) +{ + if(!paramlength)paramlength=1; + + while(paramlength) + { + u32 remaining = paramlength > 0x100 ? 0x100 : paramlength; + GPUCMD_AddInternal(header, param, remaining); + param += remaining; + paramlength -= remaining; + if(header & BIT(31)) header += remaining; + } +} + void GPUCMD_Split(u32** addr, u32* size) { GPUCMD_AddWrite(GPUREG_FINALIZE, 0x12345678);