diff --git a/CMakeLists.txt b/CMakeLists.txt index 2adb7e21..f4fb70e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,24 @@ if (MSVC) set(CMAKE_CXX_FLAGS "/EHsc ${CMAKE_CXX_FLAGS}") endif() +# Generate GitVersion.h +execute_process( + COMMAND git rev-parse HEAD + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_COMMIT_HASH_FULL + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +string(SUBSTRING "${GIT_COMMIT_HASH_FULL}" 0 7 GIT_COMMIT_HASH_SHORT) + +configure_file( + ${CMAKE_SOURCE_DIR}/MobileGL/MG_Util/Miscellany/GitVersion.h.in + ${CMAKE_BINARY_DIR}/generated/GitVersion.h + @ONLY +) + +include_directories(${CMAKE_BINARY_DIR}/generated) + set(ENABLE_RTTI ON CACHE BOOL "Enables RTTI (will be took by glslang)" FORCE) set(ENABLE_GLSLANG_BINARIES OFF CACHE BOOL "Disable glslangValidator/spirv-remap" FORCE) diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index a63e7883..c3fb35f0 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -1,14 +1,13 @@ #include "GL_Getter.h" -#include "GL/gl.h" -#include "GL/glext.h" -#include "MG_State/GLState/ErrorState/ErrorInfo.h" -#include "MG_State/GLState/FramebufferState/FramebufferObject.h" #include +#include #include +#include #include #include #include #include +#include #if MOBILEGL_BACKEND == MOBILEGL_BACKEND_TYPE_DIRECT_GLES #include #endif @@ -21,6 +20,34 @@ namespace MobileGL { #endif } + inline String GetFormattedBackendGLVersion() { + const char* raw = reinterpret_cast(GetString_Backend(GL_VERSION)); + if (!raw || raw[0] == '\0') { + return "Unknown"; + } + + constexpr SizeT kOpenGLESLen = 9; // "OpenGL ES" + if (std::strncmp(raw, "OpenGL ES", kOpenGLESLen) == 0) { + std::istringstream iss(raw); + String a, b, c; + if (iss >> a >> b >> c) { + return a + " " + b + " " + c; // e.g. "OpenGL ES 3.2" + } else { + return "OpenGL ES ?"; + } + } + + { + std::istringstream iss(raw); + String ver; + if (iss >> ver) { + return String("OpenGL ") + ver; // e.g. "OpenGL 4.6" + } + } + + return "Unknown"; + } + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ const GLubyte* GetString(GLenum name) { static String vendorString; @@ -43,7 +70,7 @@ namespace MobileGL { case GL_VERSION: { if (versionStr.empty()) { versionStr = - std::format("{} {} {}, {} Backend", + std::format("{} {} {}, {} Backend, GIT@" GIT_COMMIT_HASH_SHORT, MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLVersion.toString().c_str(), MG_Config::ProjectName.c_str(), MG_Config::CoreVersion.toString().c_str(), MG_Config::RendererInfoPtr->BackendName.c_str()); @@ -54,18 +81,19 @@ namespace MobileGL { case GL_RENDERER: { if (rendererString.empty()) { const char* backendStr = (const char*)GetString_Backend(GL_RENDERER); - const char* backendVersionStr = (const char*)GetString_Backend(GL_VERSION); - rendererString = std::format("{} ({}) ({} | {})", MG_Config::RendererInfoPtr->RendererName.c_str(), - MG_Config::CoreName.c_str(), backendStr ? backendStr : "", - backendVersionStr ? backendVersionStr : ""); + String backendVersionStr = GetFormattedBackendGLVersion(); + rendererString = std::format("{} ({}) ({}, {})", MG_Config::RendererInfoPtr->RendererName.c_str(), + MG_Config::CoreName.c_str(), backendStr ? backendStr : "", + !backendVersionStr.empty() ? backendVersionStr : ""); } return (const GLubyte*)rendererString.c_str(); } case GL_SHADING_LANGUAGE_VERSION: if (shadingLanguageVersion.empty()) { shadingLanguageVersion = std::format( - "{} MobileGL", - MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLSLVersion.toString({true, false}).c_str()); + "{} {}", + MG_Config::RendererInfoPtr->RendererGLInfo.TargetGLSLVersion.toString({true, false}).c_str(), + MG_Config::ProjectName.c_str()); } return (const GLubyte*)shadingLanguageVersion.c_str(); case GL_EXTENSIONS: @@ -78,7 +106,7 @@ namespace MobileGL { } return (const GLubyte*)extensionsString.c_str(); default: - return (const GLubyte*)"Unknown enum"; + return (const GLubyte*)"Unknown Enum"; } } @@ -109,7 +137,9 @@ namespace MobileGL { void GetIntegerv(GLenum pname, GLint* params) { MGLOG_D("glGetIntegerv, pname: %s", MG_Util::ConvertGLEnumToString(pname).c_str()); if (!params) { - // TODO: report GL_INVALID_VALUE. + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "GetIntegerv", "params pointer cannot be null")); return; } diff --git a/MobileGL/MG_Util/Miscellany/GitVersion.h.in b/MobileGL/MG_Util/Miscellany/GitVersion.h.in new file mode 100644 index 00000000..57652f62 --- /dev/null +++ b/MobileGL/MG_Util/Miscellany/GitVersion.h.in @@ -0,0 +1,4 @@ +#pragma once + +#define GIT_COMMIT_HASH_SHORT "@GIT_COMMIT_HASH_SHORT@" +#define GIT_COMMIT_HASH_FULL "@GIT_COMMIT_HASH_FULL@"