From 85f7c8f4a6fa1a35ad81e00b39df028f5afd3962 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 31 Jan 2026 16:41:21 +0800 Subject: [PATCH] [Feat] (MG_Backend/DirectVulkan): Add DirectVulkan backend. --- CMakeLists.txt | 5 ++++- MobileGL/Defines.h | 1 + MobileGL/Includes.h | 4 ++-- MobileGL/MG_Backend/Backends.h | 22 ++++++++++++++++++++-- MobileGL/MG_Backend/Init.cpp | 13 +++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ab6013f9..86557564 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -286,10 +286,13 @@ if (ANDROID) target_link_libraries(${CMAKE_PROJECT_NAME} PUBLIC android log + vulkan ) target_link_libraries(${CMAKE_PROJECT_NAME}_s PUBLIC android - log) + log + vulkan + ) endif() if (MOBILEGL_BUILD_TEST) diff --git a/MobileGL/Defines.h b/MobileGL/Defines.h index d7c5bd19..dcd984a3 100644 --- a/MobileGL/Defines.h +++ b/MobileGL/Defines.h @@ -37,6 +37,7 @@ #define MOBILEGL_BACKEND_TYPE_DILIGENT 1 #define MOBILEGL_BACKEND_TYPE_MRHI 2 #define MOBILEGL_BACKEND_TYPE_DIRECT_GLES 3 +#define MOBILEGL_BACKEND_TYPE_DIRECT_VULKAN 4 // ====================== MobileGL configurations ======================= // #define MOBILEGL_LOG_ACTIVE_LEVEL MOBILEGL_LOG_LEVEL_INFO diff --git a/MobileGL/Includes.h b/MobileGL/Includes.h index 621e7d83..d717ebe9 100644 --- a/MobileGL/Includes.h +++ b/MobileGL/Includes.h @@ -17,9 +17,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -40,8 +42,6 @@ #include #include #include -#include -#include #if __cplusplus >= 202302L && MOBILEGL_LOG_ENABLE_STACKTRACE #include #endif diff --git a/MobileGL/MG_Backend/Backends.h b/MobileGL/MG_Backend/Backends.h index 8b45d667..9d0beedb 100644 --- a/MobileGL/MG_Backend/Backends.h +++ b/MobileGL/MG_Backend/Backends.h @@ -36,7 +36,7 @@ namespace MobileGL { }; inline RendererInfo RendererInfoVulkan = { - .RendererName = "MG-DE-Vulkan", // Renderer Name + .RendererName = "Unknown", // Renderer Name .BackendName = "Diligent Engine (Vulkan)", // Backend Name .ExtraVendor = Nullopt, // Extra vendor .RendererGLInfo = @@ -52,7 +52,7 @@ namespace MobileGL { }; inline RendererInfo RendererInfoMetal = { - .RendererName = "MG-DE-Metal", // Renderer Name + .RendererName = "Unknown", // Renderer Name .BackendName = "Diligent Engine (Metal)", // Backend Name .ExtraVendor = Nullopt, // Extra vendor .RendererGLInfo = @@ -86,6 +86,24 @@ namespace MobileGL { }; } // namespace DirectGLES + namespace DirectVulkan { + inline RendererInfo RendererInfo = { + .RendererName = "Magma", // Renderer Name + .BackendName = "Direct (Vulkan)", // Backend Name + .ExtraVendor = Nullopt, // Extra vendor + .RendererGLInfo = + { + // OpenGL Info + .TargetGLVersion = {3, 3, 0}, // Target OpenGL Version + .TargetGLSLVersion = {4, 6, 0}, // Target Shading Language Version + .Extensions = {V_OpenGL30, V_OpenGL31, V_OpenGL32, // OpenGL Extensions + V_OpenGL33}, + .IsCompatibilityProfile = false // Is Compatibility Profile + }, + .BackendCapability = {.AllowVSOnlyPrograms = false} // Backend Capability + }; + } // namespace DirectVulkan + void Init(); } // namespace MG_Backend } // namespace MobileGL diff --git a/MobileGL/MG_Backend/Init.cpp b/MobileGL/MG_Backend/Init.cpp index 2530e531..85335437 100644 --- a/MobileGL/MG_Backend/Init.cpp +++ b/MobileGL/MG_Backend/Init.cpp @@ -7,6 +7,7 @@ // End of Source File Header #include "Backends.h" +#include "MG_Util/Debug/Log.h" #include "MG_Util/Types.h" #include #include @@ -51,6 +52,16 @@ namespace MobileGL { MGLOG_D("DirectGLES backend loaded, GLES version: %d.%d", MG_External::GLES::g_glesCaps.version.Major, MG_External::GLES::g_glesCaps.version.Minor); return result; +#elif MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_VULKAN +#ifdef __ANDROID__ + MGLOG_D("DirectVulkan backend loaded on Android"); + return true; +#else + MGLOG_E("TODO: add Vulkan loader for non-Android platforms"); // TODO: add Vulkan loader for non-Android + // platforms + return false; +#endif + #else MGLOG_W("Unknown backend, skipping backend initialization"); return false; @@ -73,6 +84,8 @@ namespace MobileGL { } #elif MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_GLES MG_Config::RendererInfoPtr = MakeUnique(DirectGLES::RendererInfo); +#elif MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_VULKAN + MG_Config::RendererInfoPtr = MakeUnique(DirectVulkan::RendererInfo); #else MG_Config::RendererInfoPtr = MakeUnique(Unknown::RendererInfoUnknown); #endif