diff --git a/app/src/main/tinywrapper/egl.c b/app/src/main/tinywrapper/egl.c index a4e4583..5a45132 100644 --- a/app/src/main/tinywrapper/egl.c +++ b/app/src/main/tinywrapper/egl.c @@ -111,14 +111,15 @@ void build_extension_string(context_t* context) { static void find_esversion(context_t* context) { const char* version = (const char*) es3_functions.glGetString(GL_VERSION); - const size_t len = strlen(version); - if(len < 12) goto fail; - const char* versionstart = strchr(version + 9, ' '); - int esmajor = 0, esminor = 0; - sscanf(versionstart, " %i.%i ", &esmajor, &esminor); - printf("LTW: Running on OpenGL ES %i.%i\n", esmajor, esminor); - if(esmajor == 0 && esminor == 0) return; - if(esmajor < 3) { + const char* shader_version = (const char*) es3_functions.glGetString(GL_SHADING_LANGUAGE_VERSION); + + int esmajor = 0, esminor = 0, shadermajor = 3, shaderminor = 0; + sscanf(version, " OpenGL ES %i.%i", &esmajor, &esminor); + sscanf(shader_version, " OpenGL ES GLSL ES %i.%i", &shadermajor, &shaderminor); + context->shader_version = shadermajor * 100 + shaderminor; + printf("LTW: Running on OpenGL ES %i.%i with ESSL %i\n", esmajor, esminor, context->shader_version); + if(esmajor == 0 && esminor == 0) goto fail; + if(esmajor < 3 || context->shader_version < 300) { printf("Unsupported OpenGL ES version. This will cause you problems down the line.\n"); return; } @@ -136,7 +137,7 @@ static void find_esversion(context_t* context) { return; fail: - printf("LTW: Failed to detect GL ES version"); + printf("LTW: Failed to detect OpenGL ES version"); } void basevertex_init(context_t* context); diff --git a/app/src/main/tinywrapper/egl.h b/app/src/main/tinywrapper/egl.h index 74108d9..60075d5 100644 --- a/app/src/main/tinywrapper/egl.h +++ b/app/src/main/tinywrapper/egl.h @@ -58,6 +58,7 @@ typedef struct { EGLContext phys_context; bool context_rdy; bool es31, es32, buffer_storage; + GLint shader_version; basevertex_renderer_t basevertex; GLuint multidraw_element_buffer; framebuffer_copier_t framebuffer_copier; diff --git a/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.cpp b/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.cpp index 7f4c265..03051d7 100644 --- a/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.cpp +++ b/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.cpp @@ -6,18 +6,36 @@ #include "c_wrapper.h" #include "GlslConvert.h" +GlslConvert::ShaderStage getStageForGlEnum(GLenum shader_type) { + switch(shader_type) { + case GL_VERTEX_SHADER: return GlslConvert::MESA_SHADER_VERTEX; + case GL_FRAGMENT_SHADER: return GlslConvert::MESA_SHADER_FRAGMENT; + case GL_COMPUTE_SHADER: return GlslConvert::MESA_SHADER_COMPUTE; + case GL_GEOMETRY_SHADER: return GlslConvert::MESA_SHADER_GEOMETRY; + case GL_TESS_CONTROL_SHADER: return GlslConvert::MESA_SHADER_TESS_CTRL; + case GL_TESS_EVALUATION_SHADER: return GlslConvert::MESA_SHADER_TESS_EVAL; + default: return GlslConvert::MESA_SHADER_NONE; + } +} + #ifdef __cplusplus extern "C" { #endif GlslConvert::OptimizationStruct optimizationStruct {}; // Default struct with everything enabled -char *optimize_shader(char *source, int isVertex, int vGLSLVersion, int vTargetGLSLVersion) { - GlslConvert& converter = GlslConvert::Instance(); + +char *optimize_shader(char *source, GLenum type, int vGLSLVersion, int vTargetGLSLVersion) { + GlslConvert& converter = GlslConvert::Instance(); + GlslConvert::ShaderStage stage = getStageForGlEnum(type); + if(stage == GlslConvert::MESA_SHADER_NONE) { + printf("Unknown shader type %x\n", type); + return nullptr; + } char * optimized_shader = converter.Optimize( source, - isVertex ? GlslConvert::MESA_SHADER_VERTEX : GlslConvert::MESA_SHADER_FRAGMENT, + stage, GlslConvert::API_OPENGL_COMPAT, GlslConvert::LANGUAGE_TARGET_GLSL, vGLSLVersion, diff --git a/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.h b/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.h index e03872b..7983094 100644 --- a/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.h +++ b/app/src/main/tinywrapper/glsl_optimizer/src/code/c_wrapper.h @@ -7,11 +7,13 @@ #ifndef GL4ES_C_WRAPPER_H #define GL4ES_C_WRAPPER_H +#include "GL/gl.h" + #ifdef __cplusplus extern "C" { #endif -char *optimize_shader(char *source, int isVertex, int vGLSLVersion, int vTargetGLSLVersion ); +char *optimize_shader(char *source, GLenum type, int vGLSLVersion, int vTargetGLSLVersion ); #ifdef __cplusplus } /* extern C */ diff --git a/app/src/main/tinywrapper/glsl_optimizer/src/code/ir_print_glsl_visitor.cpp b/app/src/main/tinywrapper/glsl_optimizer/src/code/ir_print_glsl_visitor.cpp index 5b2f174..2ab21cc 100644 --- a/app/src/main/tinywrapper/glsl_optimizer/src/code/ir_print_glsl_visitor.cpp +++ b/app/src/main/tinywrapper/glsl_optimizer/src/code/ir_print_glsl_visitor.cpp @@ -1302,7 +1302,7 @@ IR_TO_GLSL::visit(ir_texture* ir) // Handle forward/back porting if (is_shadow) { - printf("stateversion: %i, %i\n", state->language_version, state->original_language_version); + //printf("stateversion: %i, %i\n", state->language_version, state->original_language_version); if (state->language_version >= 130 && ir->type->vector_elements > 2){ printf("closing vec4 wrapper"); generated_source.append(")"); // Close the vec4 wrapper diff --git a/app/src/main/tinywrapper/shader_wrapper.c b/app/src/main/tinywrapper/shader_wrapper.c index f987228..ef33322 100644 --- a/app/src/main/tinywrapper/shader_wrapper.c +++ b/app/src/main/tinywrapper/shader_wrapper.c @@ -170,7 +170,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, co target_string[target_length] = 0; #undef SRC_LEN - GLchar* new_source = optimize_shader(target_string, shader_info->shader_type == GL_VERTEX_SHADER, 460, 300); + GLchar* new_source = optimize_shader(target_string, shader_info->shader_type, 460, current_context->shader_version); //printf("\n\n\nShader Result\n%s\n\n\n", new_source); if(shader_info->source != NULL) free((void*)shader_info->source); shader_info->source = new_source;