mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-24 03:31:43 -04:00
[Feat] (shader.c): Process uniform variables declarations.
Signed-off-by: BZLZHH <admin@bzlzhh.top>
This commit is contained in:
parent
5dfbed53e3
commit
b7d6c5b664
@ -16,6 +16,149 @@
|
|||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
|
void trim(char* str) {
|
||||||
|
char* end;
|
||||||
|
while (isspace((unsigned char)*str)) str++;
|
||||||
|
if (*str == 0) return;
|
||||||
|
end = str + strlen(str) - 1;
|
||||||
|
while (end > str && isspace((unsigned char)*end)) end--;
|
||||||
|
*(end + 1) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int startsWith(const char *str, const char *prefix) {
|
||||||
|
if (!str || !prefix) return 0;
|
||||||
|
while (*prefix) {
|
||||||
|
if (*str++ != *prefix++) return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* process_uniform_declarations(char* glslCode) {
|
||||||
|
char* cursor = glslCode;
|
||||||
|
char name[256], type[256], initial_value[1024];
|
||||||
|
int modifiedCodeIndex = 0;
|
||||||
|
size_t maxLength = 1024 * 10;
|
||||||
|
char* modifiedGlslCode = (char*)malloc(maxLength * sizeof(char));
|
||||||
|
if (!modifiedGlslCode) return NULL;
|
||||||
|
|
||||||
|
while (*cursor) {
|
||||||
|
if (strncmp(cursor, "uniform", 7) == 0) {
|
||||||
|
char* cursor_start = cursor;
|
||||||
|
|
||||||
|
cursor += 7;
|
||||||
|
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
|
||||||
|
// may be precision qualifier
|
||||||
|
char* precision = NULL;
|
||||||
|
if (startsWith(cursor, "highp")) {
|
||||||
|
precision = " highp";
|
||||||
|
cursor += 5;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
} else if (startsWith(cursor, "lowp")) {
|
||||||
|
precision = " lowp";
|
||||||
|
cursor += 4;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
} else if (startsWith(cursor, "mediump")) {
|
||||||
|
precision = " mediump";
|
||||||
|
cursor += 7;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
while (isalnum((unsigned char)*cursor) || *cursor == '_') {
|
||||||
|
type[i++] = *cursor++;
|
||||||
|
}
|
||||||
|
type[i] = '\0';
|
||||||
|
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
|
||||||
|
// may be precision qualifier
|
||||||
|
if(!precision)
|
||||||
|
{
|
||||||
|
if (startsWith(cursor, "highp")) {
|
||||||
|
precision = " highp";
|
||||||
|
cursor += 5;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
} else if (startsWith(cursor, "lowp")) {
|
||||||
|
precision = " lowp";
|
||||||
|
cursor += 4;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
} else if (startsWith(cursor, "mediump")) {
|
||||||
|
precision = " mediump";
|
||||||
|
cursor += 7;
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
} else {
|
||||||
|
precision = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (isalnum((unsigned char)*cursor) || *cursor == '_') {
|
||||||
|
name[i++] = *cursor++;
|
||||||
|
}
|
||||||
|
name[i] = '\0';
|
||||||
|
while (isspace((unsigned char)*cursor)) cursor++;
|
||||||
|
|
||||||
|
initial_value[0] = '\0';
|
||||||
|
if (*cursor == '=') {
|
||||||
|
cursor++;
|
||||||
|
i = 0;
|
||||||
|
while (*cursor && *cursor != ';') {
|
||||||
|
initial_value[i++] = *cursor++;
|
||||||
|
}
|
||||||
|
initial_value[i] = '\0';
|
||||||
|
trim(initial_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*cursor != ';' && *cursor) {
|
||||||
|
cursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* cursor_end = cursor;
|
||||||
|
|
||||||
|
int spaceLeft = maxLength - modifiedCodeIndex;
|
||||||
|
int len = 0;
|
||||||
|
|
||||||
|
if (*initial_value) {
|
||||||
|
len = snprintf(modifiedGlslCode + modifiedCodeIndex, spaceLeft, "uniform%s %s %s;", precision, type, name);
|
||||||
|
} else {
|
||||||
|
// use original declaration
|
||||||
|
size_t length = cursor_end - cursor_start + 1;
|
||||||
|
if (length < spaceLeft) {
|
||||||
|
memcpy(modifiedGlslCode + modifiedCodeIndex, cursor_start, length);
|
||||||
|
len = (int)length;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Error: Not enough space in buffer\n");
|
||||||
|
}
|
||||||
|
// len = snprintf(modifiedGlslCode + modifiedCodeIndex, spaceLeft, "uniform%s %s %s;", precision, type, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len < 0 || len >= spaceLeft) {
|
||||||
|
free(modifiedGlslCode);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
modifiedCodeIndex += len;
|
||||||
|
|
||||||
|
while (*cursor == ';') cursor++;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
modifiedGlslCode[modifiedCodeIndex++] = *cursor++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modifiedCodeIndex >= maxLength - 1) {
|
||||||
|
maxLength *= 2;
|
||||||
|
modifiedGlslCode = (char*)realloc(modifiedGlslCode, maxLength);
|
||||||
|
if (!modifiedGlslCode) return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
modifiedGlslCode[modifiedCodeIndex] = '\0';
|
||||||
|
return modifiedGlslCode;
|
||||||
|
}
|
||||||
|
|
||||||
bool can_run_essl3(int esversion, const char *glsl) {
|
bool can_run_essl3(int esversion, const char *glsl) {
|
||||||
int glsl_version;
|
int glsl_version;
|
||||||
|
|
||||||
@ -76,6 +219,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, c
|
|||||||
GLint shaderType;
|
GLint shaderType;
|
||||||
glGetShaderiv(shader, GL_SHADER_TYPE, &shaderType);
|
glGetShaderiv(shader, GL_SHADER_TYPE, &shaderType);
|
||||||
converted = glsl_version<140?GLSLtoGLSLES_1(source, shaderType):GLSLtoGLSLES_2(source,shaderType,320);
|
converted = glsl_version<140?GLSLtoGLSLES_1(source, shaderType):GLSLtoGLSLES_2(source,shaderType,320);
|
||||||
|
converted = process_uniform_declarations(converted);
|
||||||
LOG_D("\n[INFO] [Shader] Converted Shader source: \n%s", converted);
|
LOG_D("\n[INFO] [Shader] Converted Shader source: \n%s", converted);
|
||||||
}
|
}
|
||||||
if (converted)
|
if (converted)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user