From fa483e886e7c8f5b527165ed7a3f7bb308c725a4 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Thu, 13 Feb 2025 01:17:36 +0800 Subject: [PATCH] [Release|...] (...): Version dump to 1.0.3. Use simulated glBindFragDataLocation and fix its bug. Format the renderer name of ANGLE. Signed-off-by: BZLZHH --- src/main/cpp/gl/getter.cpp | 29 +++++- src/main/cpp/gl/program.c | 187 +++++++++++++++++++++---------------- src/main/cpp/gl/shader.h | 1 + src/main/cpp/version.h | 2 +- 4 files changed, 135 insertions(+), 84 deletions(-) diff --git a/src/main/cpp/gl/getter.cpp b/src/main/cpp/gl/getter.cpp index 92ff047..a696211 100644 --- a/src/main/cpp/gl/getter.cpp +++ b/src/main/cpp/gl/getter.cpp @@ -5,6 +5,7 @@ #include "getter.h" #include "../config/settings.h" #include +#include #define DEBUG 0 @@ -112,11 +113,35 @@ const char* getBeforeThirdSpace(const char* str) { return buffer; } - const char* getGpuName() { LOAD_GLES_FUNC(glGetString); const char *gpuName = (const char *) gles_glGetString(GL_RENDERER); - return gpuName ? gpuName : ""; + + if (!gpuName) { + return ""; + } + + if (strncmp(gpuName, "ANGLE", 5) == 0) { + std::string gpuStr(gpuName); + + size_t firstParen = gpuStr.find('('); + size_t secondParen = gpuStr.find('(', firstParen + 1); + size_t lastParen = gpuStr.rfind('('); + + std::string gpu = gpuStr.substr(secondParen + 1, lastParen - secondParen - 2); + + size_t vulkanStart = gpuStr.find("Vulkan "); + size_t vulkanEnd = gpuStr.find(' ', vulkanStart + 7); + std::string vulkanVersion = gpuStr.substr(vulkanStart + 7, vulkanEnd - (vulkanStart + 7)); + + std::string formattedGpuName = gpu + " | ANGLE | Vulkan " + vulkanVersion; + + char* result = new char[formattedGpuName.size() + 1]; + std::strcpy(result, formattedGpuName.c_str()); + return result; + } + + return gpuName; } void set_es_version() { diff --git a/src/main/cpp/gl/program.c b/src/main/cpp/gl/program.c index b23a6cb..cb80b11 100644 --- a/src/main/cpp/gl/program.c +++ b/src/main/cpp/gl/program.c @@ -13,85 +13,109 @@ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name) { LOG() LOG_D("glBindFragDataLocation(%d, %d, %s)", program, color, name) - if (g_gles_caps.GL_EXT_blend_func_extended) { - LOAD_GLES_FUNC(glBindFragDataLocationEXT) - gles_glBindFragDataLocationEXT(program, color, name); +// if (g_gles_caps.GL_EXT_blend_func_extended) { +// LOAD_GLES_FUNC(glBindFragDataLocationEXT) +// gles_glBindFragDataLocationEXT(program, color, name); +// } else { +// LOG_W("Warning: No GL_EXT_blend_func_extended, skipping glBindFragDataLocation..."); +// } + char* origin_glsl = NULL; + + if (shaderInfo.frag_data_changed) { + size_t glslLen = strlen(shaderInfo.frag_data_changed_converted) + 1; + origin_glsl = (char *)malloc(glslLen); + if (origin_glsl == NULL) { + LOG_E("Memory reallocation failed for frag_data_changed_converted\n"); + return; + } + strcpy(origin_glsl, shaderInfo.frag_data_changed_converted); } else { - LOG_W("Warning: No GL_EXT_blend_func_extended, skipping glBindFragDataLocation..."); + size_t glslLen = strlen(shaderInfo.converted) + 1; + origin_glsl = (char *)malloc(glslLen); + if (origin_glsl == NULL) { + LOG_E("Memory reallocation failed for converted\n"); + return; + } + strcpy(origin_glsl, shaderInfo.converted); } - - //if (shaderInfo.converted) { - // int len = strlen(name); - // int tlen = len + 32; - // char *targetPattern = malloc(sizeof(char) * tlen); - // if (!targetPattern) { - // LOG_E("Memory allocation failed for targetPattern") - // return; - // } - // sprintf(targetPattern, "out[ ]+[A-Za-z0-9 ]+[ ]+%s", name); - // regex_t regex; - // regmatch_t pmatch[1]; - // char *origin = NULL; - // char *result = NULL; - // - // if (regcomp(®ex, targetPattern, REG_EXTENDED) != 0) { - // LOG_E("Failed to compile regex\n"); - // return; - // } - // - // char *searchStart = shaderInfo.converted; - // while (regexec(®ex, searchStart, 1, pmatch, 0) == 0) { - // size_t matchLen = pmatch[0].rm_eo - pmatch[0].rm_so; - // origin = (char *)malloc(matchLen + 1); - // if (!origin) { - // LOG_E("Memory allocation failed\n"); - // break; - // } - // strncpy(origin, searchStart + pmatch[0].rm_so, matchLen); - // origin[matchLen] = '\0'; - // - // size_t resultLen = strlen(origin) + 30; // "layout (location = )" + colorNumber + null terminator - // result = (char *)malloc(resultLen); - // if (!result) { - // LOG_E("Memory allocation failed\n"); - // free(origin); - // break; - // } - // snprintf(result, resultLen, "layout (location = %d) %s", color, origin); - // - // char *temp = strstr(searchStart, origin); - // if (temp) { - // size_t prefixLen = temp - shaderInfo.converted; - // size_t suffixLen = strlen(temp + matchLen); - // size_t newLen = prefixLen + strlen(result) + suffixLen + 1; - // - // char *newConverted = (char *)malloc(newLen); - // if (!newConverted) { - // LOG_E("Memory allocation failed\n"); - // free(origin); - // free(result); - // break; - // } - // - // strncpy(newConverted, shaderInfo.converted, prefixLen); - // newConverted[prefixLen] = '\0'; - // strcat(newConverted, result); - // strcat(newConverted, temp + matchLen); - // - // strcpy(shaderInfo.converted, newConverted); - // free(newConverted); - // } - // - // free(origin); - // free(result); - // - // searchStart += pmatch[0].rm_eo; - // } - // - // regfree(®ex); - // //LOG_D("Patched shader:\n%s", shaderInfo.converted) - // shaderInfo.frag_data_changed = 1; - //} + + int len = strlen(name); + int tlen = len + 32; + char *targetPattern = malloc(sizeof(char) * tlen); + if (!targetPattern) { + LOG_E("Memory allocation failed for targetPattern") + return; + } + sprintf(targetPattern, "out[ ]+[A-Za-z0-9 ]+[ ]+%s", name); + regex_t regex; + regmatch_t pmatch[1]; + char *origin = NULL; + char *result = NULL; + if (regcomp(®ex, targetPattern, REG_EXTENDED) != 0) { + LOG_E("Failed to compile regex\n"); + return; + } + char *searchStart = origin_glsl; + while (regexec(®ex, searchStart, 1, pmatch, 0) == 0) { + size_t matchLen = pmatch[0].rm_eo - pmatch[0].rm_so; + origin = (char *) malloc(matchLen + 1); + if (!origin) { + LOG_E("Memory allocation failed\n"); + break; + } + strncpy(origin, searchStart + pmatch[0].rm_so, matchLen); + origin[matchLen] = '\0'; + + size_t resultLen = + strlen(origin) + 30; // "layout (location = )" + colorNumber + null terminator + result = (char *) malloc(resultLen); + if (!result) { + LOG_E("Memory allocation failed\n"); + free(origin); + break; + } + snprintf(result, resultLen, "layout (location = %d) %s", color, origin); + + char *temp = strstr(searchStart, origin); + if (temp) { + size_t prefixLen = temp - origin_glsl; + size_t suffixLen = strlen(temp + matchLen); + size_t newLen = prefixLen + strlen(result) + suffixLen + 1; + + char *newConverted = (char *) malloc(newLen); + if (!newConverted) { + LOG_E("Memory allocation failed\n"); + free(origin); + free(result); + break; + } + + strncpy(newConverted, origin_glsl, prefixLen); + newConverted[prefixLen] = '\0'; + strcat(newConverted, result); + strcat(newConverted, temp + matchLen); + + size_t newLen_2 = strlen(newConverted) + 1; + shaderInfo.frag_data_changed_converted = (char *) realloc( + shaderInfo.frag_data_changed_converted, newLen_2); + if (shaderInfo.frag_data_changed_converted == NULL) { + LOG_E("Memory reallocation failed for frag_data_changed_converted\n"); + return; + } + strcpy(shaderInfo.frag_data_changed_converted, newConverted); + + free(newConverted); + } + + free(origin); + free(result); + + searchStart += pmatch[0].rm_eo; + } + free(targetPattern); + regfree(®ex);//LOG_D("Patched shader:\n%s", origin_glsl) + free(origin_glsl); + shaderInfo.frag_data_changed = 1; } void glLinkProgram(GLuint program) { @@ -103,7 +127,7 @@ void glLinkProgram(GLuint program) { LOAD_GLES(glCompileShader, void, GLuint shader) LOAD_GLES(glDetachShader, void, GLuint program, GLuint shader) LOAD_GLES(glAttachShader, void, GLuint program, GLuint shader) - gles_glShaderSource(shaderInfo.id, 1, (const GLchar * const*) &shaderInfo.converted, NULL); + gles_glShaderSource(shaderInfo.id, 1, (const GLchar * const*) &shaderInfo.frag_data_changed_converted, NULL); gles_glCompileShader(shaderInfo.id); LOAD_GLES(glGetShaderiv, void, GLuint shader, GLenum pname, GLint *params) GLint status = 0; @@ -112,7 +136,7 @@ void glLinkProgram(GLuint program) { char tmp[500]; LOAD_GLES(glGetShaderInfoLog, void, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); gles_glGetShaderInfoLog(shaderInfo.id, 500, NULL, tmp); - LOG_W("Failed to compile patched shader, log:\n%s", tmp) + LOG_E("Failed to compile patched shader, log:\n%s", tmp) } gles_glDetachShader(program, shaderInfo.id); gles_glAttachShader(program, shaderInfo.id); @@ -120,6 +144,7 @@ void glLinkProgram(GLuint program) { } shaderInfo.id = 0; shaderInfo.converted = NULL; + shaderInfo.frag_data_changed_converted = NULL; shaderInfo.frag_data_changed = 0; LOAD_GLES(glLinkProgram, void, GLuint program) gles_glLinkProgram(program); @@ -132,9 +157,9 @@ void glGetProgramiv(GLuint program, GLenum pname, GLint *params) { LOAD_GLES_FUNC(glGetProgramiv) gles_glGetProgramiv(program, pname, params); if(global_settings.ignore_error >= 1 && (pname == GL_LINK_STATUS || pname == GL_VALIDATE_STATUS) && !*params) { - GLchar infoLog[512]; + GLchar* infoLog; LOAD_GLES_FUNC(glGetShaderInfoLog) - gles_glGetShaderInfoLog(program, 512, NULL, infoLog); + gles_glGetShaderInfoLog(program, (GLsizei) NULL, NULL, infoLog); LOG_W_FORCE("Program %d linking failed: \n%s", program, infoLog); LOG_W_FORCE("Now try to cheat."); *params = GL_TRUE; diff --git a/src/main/cpp/gl/shader.h b/src/main/cpp/gl/shader.h index 08a11a3..7c84075 100644 --- a/src/main/cpp/gl/shader.h +++ b/src/main/cpp/gl/shader.h @@ -9,6 +9,7 @@ struct shader_t { GLuint id; char * converted; + char * frag_data_changed_converted; int frag_data_changed; }; diff --git a/src/main/cpp/version.h b/src/main/cpp/version.h index f8ca5d4..063bfda 100644 --- a/src/main/cpp/version.h +++ b/src/main/cpp/version.h @@ -10,7 +10,7 @@ #define MAJOR 1 #define MINOR 0 -#define REVISION 2 +#define REVISION 3 const int version_type = VERSION_RELEASE;