From b76c23429fef1bfab70f78612a36d7ad96baf5c3 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Fri, 11 Jul 2025 18:09:45 +0800 Subject: [PATCH] [Feat] (All): Implement init, log and other related components. --- CMakeLists.txt | 6 +- MobileGL/Config.h | 13 +++++ MobileGL/Includes.h | 60 +++++++++++++++++++ MobileGL/Init.cpp | 42 +++++++++++++ MobileGL/MG_Util/Debug/Log.cpp | 104 +++++++++++++++++++++++++++++++++ MobileGL/MG_Util/Debug/Log.h | 56 ++++++++++++++++++ 6 files changed, 279 insertions(+), 2 deletions(-) create mode 100644 MobileGL/Config.h create mode 100644 MobileGL/Includes.h create mode 100644 MobileGL/Init.cpp create mode 100644 MobileGL/MG_Util/Debug/Log.cpp create mode 100644 MobileGL/MG_Util/Debug/Log.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1902ffff..462d6346 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,8 +15,10 @@ set(PROFILING OFF) find_library(GLSLANG_LIB glslang PATHS ${CMAKE_SOURCE_DIR}/libraries/arm64-v8a/) add_library(${CMAKE_PROJECT_NAME} SHARED - -) + MobileGL/Init.cpp + + MobileGL/MG_Util/Debug/Log.cpp + "MobileGL/Includes.h" "MobileGL/MG_Util/Debug/Log.cpp" "MobileGL/MG_Util/Debug/Log.h" "MobileGL/Config.h") target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/library/arm64-v8a/libglslang.a diff --git a/MobileGL/Config.h b/MobileGL/Config.h new file mode 100644 index 00000000..71ac257a --- /dev/null +++ b/MobileGL/Config.h @@ -0,0 +1,13 @@ +#pragma once + +#define MOBILEGL_LOG_ACTIVE_LEVEL MOBILEGL_LOG_LEVEL_DEBUG + +#define MOBILEGL_LOG_ENABLE_CONSOLE 0 +#define MOBILEGL_LOG_ENABLE_FILE 1 +#define MOBILEGL_LOG_ENABLE_ANDROID 1 + +#ifdef __ANDROID__ +#define MOBILEGL_LOG_FILE_PATH "/sdcard/MG/mobilegl_log.txt" +#elif +#define MOBILEGL_LOG_FILE_PATH "" +#endif \ No newline at end of file diff --git a/MobileGL/Includes.h b/MobileGL/Includes.h new file mode 100644 index 00000000..5b74793e --- /dev/null +++ b/MobileGL/Includes.h @@ -0,0 +1,60 @@ +#pragma once + +#ifdef __ANDROID__ +#define __ANDROID_API__ 26 // fix pthread_getname_np not defined +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __ANDROID__ +#include +#include +#include +#include +#include +#include +#include +#elif defined(_WIN32) +#include +#include +#include +#else +#include +#endif + +#include +#include +#include + +#include "MG_Util/Debug/Log.h" +#include "Config.h" \ No newline at end of file diff --git a/MobileGL/Init.cpp b/MobileGL/Init.cpp new file mode 100644 index 00000000..355b39de --- /dev/null +++ b/MobileGL/Init.cpp @@ -0,0 +1,42 @@ +#include "Includes.h" + +namespace MobileGL { + void MG_Initialize() { + MG_Util::Debug::InitFile(); + MGLOG_I("MobileGL Initializing..."); + } + + void MG_Destroy() { + MGLOG_I("MobileGL Closing..."); + MG_Util::Debug::Close(); + } + +#if defined(__linux__) || defined(__APPLE__) + __attribute__((constructor)) static void AutoInit() { + MG_Initialize(); + } + + __attribute__((destructor)) static void AutoDestroy() { + MG_Destroy(); + } +#endif + +#ifdef _WIN32 + BOOL WINAPI DllMain(HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved) + { + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + MG_Initialize(); + break; + + case DLL_PROCESS_DETACH: + MG_Destroy(); + break; + } + return TRUE; + } +#endif +} \ No newline at end of file diff --git a/MobileGL/MG_Util/Debug/Log.cpp b/MobileGL/MG_Util/Debug/Log.cpp new file mode 100644 index 00000000..41fd7583 --- /dev/null +++ b/MobileGL/MG_Util/Debug/Log.cpp @@ -0,0 +1,104 @@ +#include "../../Includes.h" + +namespace MobileGL { + namespace MG_Util::Debug { + static FILE* s_logFile = nullptr; + static std::mutex s_mutex; + + constexpr char* GetOSName() { +#if defined(_WIN32) + return "Windows"; +#elif defined(__ANDROID__) + return "Android"; +#elif defined(__APPLE__) + return "macOS"; +#elif defined(__linux__) + return "Linux"; +#else + return "UnknownOS"; +#endif + } + + std::string GetThreadName() { + char buffer[64] = { 0 }; +#if defined(_WIN32) + PWSTR desc = nullptr; + if (SUCCEEDED(GetThreadDescription(GetCurrentThread(), &desc))) { + WideCharToMultiByte(CP_UTF8, 0, desc, -1, buffer, sizeof(buffer), nullptr, nullptr); + LocalFree(desc); + } +#elif defined(__ANDROID__) || defined(__linux__) + pthread_getname_np(pthread_self(), buffer, sizeof(buffer)); +#elif defined(__APPLE__) + pthread_getname_np(buffer, sizeof(buffer)); +#endif + return buffer[0] ? buffer : "UnknownThread"; + } + + std::string GetCurrentTime() { + using namespace std::chrono; + auto now = system_clock::now(); + std::time_t tt = system_clock::to_time_t(now); + struct tm tm {}; +#if defined(_WIN32) + localtime_s(&tm, &tt); +#else + localtime_r(&tt, &tm); +#endif + char buf[16]; + std::strftime(buf, sizeof(buf), "%H:%M:%S", &tm); + return buf; + } + + void InitFile() { +#if MOBILEGL_LOG_ENABLE_FILE + if (!s_logFile && MOBILEGL_LOG_FILE_PATH && *MOBILEGL_LOG_FILE_PATH) { + s_logFile = std::fopen(MOBILEGL_LOG_FILE_PATH, "w"); + } +#endif + } + + void WriteToFile(const char* msg) { +#if MOBILEGL_LOG_ENABLE_FILE + if (!s_logFile) InitFile(); + if (s_logFile) { + std::fputs(msg, s_logFile); + std::fflush(s_logFile); + } +#endif + } + + void Log(const char* levelTag, android_LogPriority androidLogLevel, const char* fmt, ...) { + std::lock_guard lock(s_mutex); + + std::string header = "[" + GetCurrentTime() + "] [" + GetOSName() + " " + GetThreadName() + "/" + levelTag + "]: "; + + char buffer[1024]; + va_list args; + va_start(args, fmt); + int n = std::vsnprintf(buffer, sizeof(buffer), fmt, args); + std::string out = header + std::string(buffer, n) + "\n"; + +#if MOBILEGL_LOG_ENABLE_CONSOLE + std::fwrite(out.c_str(), 1, out.size(), stdout); +#endif + +#if MOBILEGL_LOG_ENABLE_ANDROID && defined(__ANDROID__) + __android_log_print(androidLogLevel, "MobileGL", "%s", out.c_str()); +#endif + + WriteToFile(out.c_str()); + + va_end(args); + } + + void Close() { +#if MOBILEGL_LOG_ENABLE_FILE + if (s_logFile) { + std::fclose(s_logFile); + s_logFile = nullptr; + } +#endif + } + } +} \ No newline at end of file diff --git a/MobileGL/MG_Util/Debug/Log.h b/MobileGL/MG_Util/Debug/Log.h new file mode 100644 index 00000000..7b379f69 --- /dev/null +++ b/MobileGL/MG_Util/Debug/Log.h @@ -0,0 +1,56 @@ +#pragma once + +#define MOBILEGL_LOG_LEVEL_DEBUG 0 +#define MOBILEGL_LOG_LEVEL_WARN 1 +#define MOBILEGL_LOG_LEVEL_ERROR 2 +#define MOBILEGL_LOG_LEVEL_INFO 3 +#define MOBILEGL_LOG_LEVEL_FATAL 4 + +#define MOBILEGL_LOG_INTERNAL(levelTag, androidLogLevel, fmt, ...) \ + do { \ + MobileGL::MG_Util::Debug::Log(levelTag, androidLogLevel, fmt, ##__VA_ARGS__); \ + } while(0) + +#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_DEBUG +# define MGLOG_D(fmt, ...) MOBILEGL_LOG_INTERNAL("DEBUG", ANDROID_LOG_DEBUG, fmt, ##__VA_ARGS__) +#else +# define MGLOG_D(fmt, ...) { } +#endif + +#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_INFO +# define MGLOG_I(fmt, ...) MOBILEGL_LOG_INTERNAL("INFO", ANDROID_LOG_INFO, fmt, ##__VA_ARGS__) +#else +# define MGLOG_I(fmt, ...) { } +#endif + +#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_WARN +# define MGLOG_W(fmt, ...) MOBILEGL_LOG_INTERNAL("WARN", ANDROID_LOG_WARN, fmt, ##__VA_ARGS__) +#else +# define MGLOG_W(fmt, ...) { } +#endif + +#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_ERROR +# define MGLOG_E(fmt, ...) MOBILEGL_LOG_INTERNAL("ERROR", ANDROID_LOG_ERROR, fmt, ##__VA_ARGS__) +#else +# define MGLOG_E(fmt, ...) { } +#endif + +#if MOBILEGL_LOG_ACTIVE_LEVEL <= MOBILEGL_LOG_LEVEL_FATAL +# define MGLOG_F(fmt, ...) MOBILEGL_LOG_INTERNAL("FATAL", ANDROID_LOG_FATAL, fmt, ##__VA_ARGS__) +#else +# define MGLOG_F(fmt, ...) { } +#endif + +namespace MobileGL { + namespace MG_Util { + namespace Debug { + void Log(const char* levelTag, android_LogPriority androidLogLevel, const char* fmt, ...); + void InitFile(); + void WriteToFile(const char* msg); + std::string GetCurrentTime(); + constexpr char* GetOSName(); + std::string GetThreadName(); + void Close(); + } + } +}