From ba7111d33a8cf5dae894ba5e03c1760b12054f7b Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Sun, 20 Mar 2022 18:04:27 +0000 Subject: [PATCH] Add maxwell3d I2M support --- .../skyline/soc/gm20b/engines/maxwell_3d.cpp | 50 ++++++++++++------- .../skyline/soc/gm20b/engines/maxwell_3d.h | 4 ++ 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp index 5d1ef3d7..d2beb150 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.cpp @@ -11,6 +11,7 @@ namespace skyline::soc::gm20b::engine::maxwell3d { : MacroEngineBase(macroState), syncpoints(state.soc->host1x.syncpoints), context(*state.gpu, channelCtx, executor), + i2m(channelCtx.asCtx), channelCtx(channelCtx) { InitializeRegisters(); } @@ -29,15 +30,15 @@ namespace skyline::soc::gm20b::engine::maxwell3d { HandleMethod(method, argument); } - void Maxwell3D::HandleMethod(u32 method, u32 argument) { - #define MAXWELL3D_OFFSET(field) (sizeof(typeof(Registers::field)) - sizeof(std::remove_reference_t)) / sizeof(u32) - #define MAXWELL3D_STRUCT_OFFSET(field, member) MAXWELL3D_OFFSET(field) + U32_OFFSET(std::remove_reference_t, member) - #define MAXWELL3D_STRUCT_STRUCT_OFFSET(field, member, submember) MAXWELL3D_STRUCT_OFFSET(field, member) + U32_OFFSET(std::remove_reference_tmember)>, submember) - #define MAXWELL3D_STRUCT_ARRAY_OFFSET(field, member, index) MAXWELL3D_STRUCT_OFFSET(field, member) + ((sizeof(std::remove_reference_tmember[0])>) / sizeof(u32)) * index) - #define MAXWELL3D_ARRAY_OFFSET(field, index) MAXWELL3D_OFFSET(field) + ((sizeof(std::remove_reference_t) / sizeof(u32)) * index) - #define MAXWELL3D_ARRAY_STRUCT_OFFSET(field, index, member) MAXWELL3D_ARRAY_OFFSET(field, index) + U32_OFFSET(std::remove_reference_t, member) - #define MAXWELL3D_ARRAY_STRUCT_STRUCT_OFFSET(field, index, member, submember) MAXWELL3D_ARRAY_STRUCT_OFFSET(field, index, member) + U32_OFFSET(decltype(Registers::field[0].member), submember) + #define MAXWELL3D_OFFSET(field) (sizeof(typeof(Registers::field)) - sizeof(std::remove_reference_t)) / sizeof(u32) + #define MAXWELL3D_STRUCT_OFFSET(field, member) MAXWELL3D_OFFSET(field) + U32_OFFSET(std::remove_reference_t, member) + #define MAXWELL3D_STRUCT_STRUCT_OFFSET(field, member, submember) MAXWELL3D_STRUCT_OFFSET(field, member) + U32_OFFSET(std::remove_reference_tmember)>, submember) + #define MAXWELL3D_STRUCT_ARRAY_OFFSET(field, member, index) MAXWELL3D_STRUCT_OFFSET(field, member) + ((sizeof(std::remove_reference_tmember[0])>) / sizeof(u32)) * index) + #define MAXWELL3D_ARRAY_OFFSET(field, index) MAXWELL3D_OFFSET(field) + ((sizeof(std::remove_reference_t) / sizeof(u32)) * index) + #define MAXWELL3D_ARRAY_STRUCT_OFFSET(field, index, member) MAXWELL3D_ARRAY_OFFSET(field, index) + U32_OFFSET(std::remove_reference_t, member) + #define MAXWELL3D_ARRAY_STRUCT_STRUCT_OFFSET(field, index, member, submember) MAXWELL3D_ARRAY_STRUCT_OFFSET(field, index, member) + U32_OFFSET(decltype(Registers::field[0].member), submember) + void Maxwell3D::HandleMethod(u32 method, u32 argument) { #define MAXWELL3D_CASE(field, content) case MAXWELL3D_OFFSET(field): { \ auto field{util::BitCast>(argument)}; \ content \ @@ -598,6 +599,14 @@ namespace skyline::soc::gm20b::engine::maxwell3d { macroState.macroPositions[registers.mme->startAddressRamPointer++] = startAddressRamLoad; }) + MAXWELL3D_STRUCT_CASE(i2m, launchDma, { + i2m.LaunchDma(*registers.i2m); + }) + + MAXWELL3D_STRUCT_CASE(i2m, loadInlineData, { + i2m.LoadInlineData(*registers.i2m, loadInlineData); + }) + MAXWELL3D_CASE(syncpointAction, { Logger::Debug("Increment syncpoint: {}", static_cast(syncpointAction.id)); channelCtx.executor.Execute(); @@ -676,13 +685,6 @@ namespace skyline::soc::gm20b::engine::maxwell3d { break; } - #undef MAXWELL3D_OFFSET - #undef MAXWELL3D_STRUCT_OFFSET - #undef MAXWELL3D_STRUCT_ARRAY_OFFSET - #undef MAXWELL3D_ARRAY_OFFSET - #undef MAXWELL3D_ARRAY_STRUCT_OFFSET - #undef MAXWELL3D_ARRAY_STRUCT_STRUCT_OFFSET - #undef MAXWELL3D_CASE_BASE #undef MAXWELL3D_CASE #undef MAXWELL3D_STRUCT_CASE @@ -693,11 +695,25 @@ namespace skyline::soc::gm20b::engine::maxwell3d { } void Maxwell3D::CallMethodBatchNonInc(u32 method, span arguments) { - for (u32 argument : arguments) { - CallMethod(method, argument); + switch (method) { + case MAXWELL3D_STRUCT_OFFSET(i2m, loadInlineData): + i2m.LoadInlineData(*registers.i2m, arguments); + return; + default: + break; } + + for (u32 argument : arguments) + HandleMethod(method, argument); } + #undef MAXWELL3D_OFFSET + #undef MAXWELL3D_STRUCT_OFFSET + #undef MAXWELL3D_STRUCT_ARRAY_OFFSET + #undef MAXWELL3D_ARRAY_OFFSET + #undef MAXWELL3D_ARRAY_STRUCT_OFFSET + #undef MAXWELL3D_ARRAY_STRUCT_STRUCT_OFFSET + void Maxwell3D::WriteSemaphoreResult(u64 result) { struct FourWordResult { u64 value; diff --git a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h index c371b384..800c4254 100644 --- a/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h +++ b/app/src/main/cpp/skyline/soc/gm20b/engines/maxwell_3d.h @@ -6,6 +6,7 @@ #include #include "engine.h" +#include "inline2memory.h" namespace skyline::soc::gm20b { struct ChannelContext; @@ -19,6 +20,7 @@ namespace skyline::soc::gm20b::engine::maxwell3d { private: host1x::SyncpointSet &syncpoints; gpu::interconnect::GraphicsContext context; + Inline2MemoryBackend i2m; /** * @brief Calls the appropriate function corresponding to a certain method with the supplied argument @@ -56,6 +58,8 @@ namespace skyline::soc::gm20b::engine::maxwell3d { }; Register<0x45, MME> mme; + Register<0x60, Inline2MemoryBackend::RegisterState> i2m; + Register<0xB2, type::SyncpointAction> syncpointAction; Register<0xDF, u32> rasterizerEnable;