diff --git a/source/tests/gpu/gpu.cpp b/source/tests/gpu/gpu.cpp index 7b08ff7..360151b 100644 --- a/source/tests/gpu/gpu.cpp +++ b/source/tests/gpu/gpu.cpp @@ -1,6 +1,7 @@ #include <3ds.h> #include "tests/gpu/gpu.h" #include "tests/gpu/displaytransfer.h" +#include "tests/gpu/memoryfills.h" namespace GPU { @@ -9,6 +10,7 @@ void TestAll() { GPU_Init(nullptr); DisplayTransfer::TestAll(); + MemoryFills::TestAll(); } } \ No newline at end of file diff --git a/source/tests/gpu/memoryfills.cpp b/source/tests/gpu/memoryfills.cpp new file mode 100644 index 0000000..dfea209 --- /dev/null +++ b/source/tests/gpu/memoryfills.cpp @@ -0,0 +1,91 @@ +#include +#include +#include "output.h" +#include "common/scope_exit.h" +#include "common/string_funcs.h" +#include "tests/test.h" +#include "tests/gpu/memoryfills.h" + +namespace GPU { +namespace MemoryFills { + +static void FillAndWait(u8* buffer, u32 value, u32 size, u32 control, bool first_engine = true) { + if (first_engine) { + GX_SetMemoryFill(nullptr, (u32*)buffer, value, (u32*)(buffer + size), control, 0, 0, 0, control); + gspWaitForPSC0(); + } else { + GX_SetMemoryFill(nullptr, 0, 0, 0, control, (u32*)buffer, value, (u32*)(buffer + size), control); + gspWaitForPSC1(); + } + GSPGPU_InvalidateDataCache(nullptr, buffer, size); +} + +static bool Fill32bits(u8* buffer) { + FillAndWait(buffer, 0x00FFFFFF, 48, 0x201, false); + TestEquals(buffer[0], 0xFFu); + TestEquals(buffer[1], 0xFFu); + TestEquals(buffer[2], 0xFFu); + TestEquals(buffer[3], 0x00u); + TestEquals(buffer[4], 0xFFu); + TestEquals(buffer[5], 0xFFu); + TestEquals(buffer[6], 0xFFu); + TestEquals(buffer[7], 0x00u); + TestEquals(buffer[48], 0x00u); + TestEquals(buffer[49], 0x00u); + TestEquals(buffer[49], 0x00u); + + FillAndWait(buffer, 0x0000FFFF, 48, 0x201, false); + TestEquals(buffer[0], 0xFFu); + TestEquals(buffer[1], 0xFFu); + TestEquals(buffer[2], 0x00u); + TestEquals(buffer[3], 0x00u); + TestEquals(buffer[4], 0xFFu); + TestEquals(buffer[5], 0xFFu); + TestEquals(buffer[6], 0x00u); + TestEquals(buffer[7], 0x00u); + + return true; +} + +static bool Fill24bits(u8* buffer) { + FillAndWait(buffer, 0x00FFFFFF, 48, 0x101); + TestEquals(buffer[0], 0xFFu); + TestEquals(buffer[1], 0xFFu); + TestEquals(buffer[2], 0xFFu); + TestEquals(buffer[3], 0xFFu); + TestEquals(buffer[4], 0xFFu); + TestEquals(buffer[5], 0xFFu); + TestEquals(buffer[6], 0xFFu); + TestEquals(buffer[7], 0xFFu); + TestEquals(buffer[48], 0x00u); + TestEquals(buffer[49], 0x00u); + TestEquals(buffer[49], 0x00u); + + FillAndWait(buffer, 0xFFFFFFFF, 48, 0x101); + TestEquals(buffer[0], 0xFFu); + TestEquals(buffer[1], 0xFFu); + TestEquals(buffer[2], 0xFFu); + TestEquals(buffer[3], 0xFFu); + + FillAndWait(buffer, 0x00FFFF00, 48, 0x101); + TestEquals(buffer[0], 0x00u); + TestEquals(buffer[1], 0xFFu); + TestEquals(buffer[2], 0xFFu); + TestEquals(buffer[3], 0x00u); + + return true; +} + +void TestAll() { + const std::string tag = "MemoryFills"; + + u8* buffer = (u8*)vramAlloc(0x400); + + Test(tag, "Fill24bits", Fill24bits(buffer), true); + Test(tag, "Fill32bits", Fill32bits(buffer), true); + + vramFree(buffer); +} + +} +} \ No newline at end of file diff --git a/source/tests/gpu/memoryfills.h b/source/tests/gpu/memoryfills.h new file mode 100644 index 0000000..db1809b --- /dev/null +++ b/source/tests/gpu/memoryfills.h @@ -0,0 +1,9 @@ +#pragma once + +namespace GPU { +namespace MemoryFills { + +void TestAll(); + +} +} \ No newline at end of file