diff --git a/app/src/main/tinywrapper/basevertex.c b/app/src/main/tinywrapper/basevertex.c index b85c783..8bdfc1b 100644 --- a/app/src/main/tinywrapper/basevertex.c +++ b/app/src/main/tinywrapper/basevertex.c @@ -16,6 +16,10 @@ typedef struct { void basevertex_init(context_t* context) { basevertex_renderer_t *renderer = &context->basevertex; + if(!context->es31) { + printf("LTW: BaseVertex render calls not available: requires OpenGL ES 3.1\n"); + return; + } es3_functions.glGenBuffers(1, &renderer->indirectRenderBuffer); GLenum error = es3_functions.glGetError(); if(error != GL_NO_ERROR) { diff --git a/app/src/main/tinywrapper/es3_extended.h b/app/src/main/tinywrapper/es3_extended.h index eea3337..b727466 100644 --- a/app/src/main/tinywrapper/es3_extended.h +++ b/app/src/main/tinywrapper/es3_extended.h @@ -3,4 +3,4 @@ GLESFUNC(glDrawElementsIndirect,PFNGLDRAWELEMENTSINDIRECTPROC) GLESFUNC(glMultiDrawArraysEXT,PFNGLMULTIDRAWARRAYSEXTPROC) GLESFUNC(glMultiDrawElementsEXT,PFNGLMULTIDRAWELEMENTSEXTPROC) GLESFUNC(glGetTexLevelParameteriv,PFNGLGETTEXLEVELPARAMETERIVPROC) -GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERIVPROC) \ No newline at end of file +GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERFVPROC) \ No newline at end of file diff --git a/app/src/main/tinywrapper/es3_overrides.h b/app/src/main/tinywrapper/es3_overrides.h index f04a372..1a84d33 100644 --- a/app/src/main/tinywrapper/es3_overrides.h +++ b/app/src/main/tinywrapper/es3_overrides.h @@ -35,6 +35,7 @@ void glDepthRange(GLdouble nearVal, GLESOVERRIDE(glClearDepth) GLESOVERRIDE(glMapBuffer) GLESOVERRIDE(glGetTexLevelParameteriv) +GLESOVERRIDE(glGetTexLevelParameterfv) GLESOVERRIDE(glCreateShader) GLESOVERRIDE(glDeleteShader) GLESOVERRIDE(glShaderSource) 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 394d4a4..5b2f174 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 @@ -792,7 +792,8 @@ const char* const operator_glsl_strs[] = { "vector_extract_TODO", "interpolate_at_offse_TODOt", "interpolate_at_sample_TODO", - "atan2", + // NOTE: atan2 operation, replaced with atan(x,y) + "atan", "fma", "mix", // lrp ? "csel", @@ -937,7 +938,8 @@ const char* const operator_glsl_enum_strs[] = { "vector_extract", "interpolate_at_offset", "interpolate_at_sample", - "atan2", + // NOTE: atan2 operation, replaced with atan(x,y) + "atan", "fma", "lrp", "csel", @@ -961,7 +963,7 @@ static bool is_binop_func_like(ir_expression_operation op, const glsl_type* type { if (op == ir_binop_equal || op == ir_binop_nequal || - op == ir_binop_mod || + op == ir_binop_mod || op == ir_binop_atan2 || (op >= ir_binop_dot && op <= ir_binop_pow)) return true; if (type->is_vector() && (op >= ir_binop_less && op <= ir_binop_nequal)) diff --git a/app/src/main/tinywrapper/glsl_optimizer/src/compiler/glsl/glsl_parser_extras.cpp b/app/src/main/tinywrapper/glsl_optimizer/src/compiler/glsl/glsl_parser_extras.cpp index 4a4173e..a77f580 100644 --- a/app/src/main/tinywrapper/glsl_optimizer/src/compiler/glsl/glsl_parser_extras.cpp +++ b/app/src/main/tinywrapper/glsl_optimizer/src/compiler/glsl/glsl_parser_extras.cpp @@ -227,7 +227,6 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx, * outside the compatibility contexts of 3.x. */ this->num_supported_versions = 0; - printf("mesa_glsl: is_desktop=%i GLSLVersion=%i\n", _mesa_is_desktop_gl(ctx), ctx->Const.GLSLVersion); if (_mesa_is_desktop_gl(ctx)) { for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) { if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) { diff --git a/app/src/main/tinywrapper/main.c b/app/src/main/tinywrapper/main.c index 1d3163f..d7098bf 100644 --- a/app/src/main/tinywrapper/main.c +++ b/app/src/main/tinywrapper/main.c @@ -32,11 +32,11 @@ void *glMapBuffer(GLenum target, GLenum access) { case GL_SHADER_STORAGE_BUFFER: // GL 4.4 case GL_QUERY_BUFFER: - printf("ERROR: glMapBuffer unsupported target=0x%x", target); + printf("ERROR: glMapBuffer unsupported target=0x%x\n", target); break; // not supported for now case GL_DRAW_INDIRECT_BUFFER: case GL_TEXTURE_BUFFER: - printf("ERROR: glMapBuffer unimplemented target=0x%x", target); + printf("ERROR: glMapBuffer unimplemented target=0x%x\n", target); break; } @@ -79,30 +79,49 @@ static int inline nlevel(int size, int level) { static bool trigger_texlevelparameter = false; +static bool check_texlevelparameter() { + if(current_context->es31) return true; + if(trigger_texlevelparameter) return false; + printf("glGetTexLevelParameter* functions are not supported below OpenGL ES 3.1\n"); + trigger_texlevelparameter = true; + return false; +} + +static void proxy_getlevelparameter(GLenum target, GLint level, GLenum pname, GLint *params) { + switch (pname) { + case GL_TEXTURE_WIDTH: + (*params) = nlevel(current_context->proxy_width, level); + break; + case GL_TEXTURE_HEIGHT: + (*params) = nlevel(current_context->proxy_height, level); + break; + case GL_TEXTURE_INTERNAL_FORMAT: + (*params) = current_context->proxy_intformat; + break; + } +} + +void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params) { + if(!current_context) return; + if(isProxyTexture(target)) { + GLint param = 0; + proxy_getlevelparameter(target, level, pname, ¶m); + *params = (GLfloat) param; + return; + } + if(!check_texlevelparameter()) return; + es3_functions.glGetTexLevelParameterfv(target, level, pname, params); +} + void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) { if(!current_context) return; - // NSLog("glGetTexLevelParameteriv(%x, %d, %x, %p)", target, level, pname, params); if (isProxyTexture(target)) { - switch (pname) { - case GL_TEXTURE_WIDTH: - (*params) = nlevel(current_context->proxy_width, level); - break; - case GL_TEXTURE_HEIGHT: - (*params) = nlevel(current_context->proxy_height, level); - break; - case GL_TEXTURE_INTERNAL_FORMAT: - (*params) = current_context->proxy_intformat; - break; - } - } else { - if(trigger_texlevelparameter) return; - if(!current_context->es31) { - printf("glGetTexLevelParameter* functions are not supported on your device"); - trigger_texlevelparameter = true; - return; - } - es3_functions.glGetTexLevelParameteriv(target, level, pname, params); + proxy_getlevelparameter(target, level, pname, params); + return; } + if(!check_texlevelparameter()) return; + es3_functions.glGetTexLevelParameteriv(target, level, pname, params); + } void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data) { diff --git a/app/src/main/tinywrapper/of_buffer_copier.c b/app/src/main/tinywrapper/of_buffer_copier.c index de1fc7b..6893d08 100644 --- a/app/src/main/tinywrapper/of_buffer_copier.c +++ b/app/src/main/tinywrapper/of_buffer_copier.c @@ -72,8 +72,25 @@ void glGetTexImage( GLenum target, GLenum format, GLenum type, void * pixels) { - //printf("glGetTexImage(%x, %i, %x, %x, %p)\n", target, level, format, type, pixels); - printf("LTW: glGetTexImage is not supported yet\n"); + if(!current_context) return; + if(!current_context->es31) goto unsupported_esver; + if(format != GL_RGBA && format != GL_RGBA_INTEGER && type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_INT && type != GL_INT && type != GL_FLOAT) goto unsupported; + framebuffer_copier_t* copier = ¤t_context->framebuffer_copier; + GLint texture; + es3_functions.glGetIntegerv(get_target_query_param(target), &texture); + es3_functions.glBindFramebuffer(GL_READ_FRAMEBUFFER, copier->tempfb); + es3_functions.glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, texture, level); + GLint w, h; + es3_functions.glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &w); + es3_functions.glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &h); + es3_functions.glReadPixels(0, 0, w, h, format, type, pixels); + es3_functions.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0); + return; + unsupported_esver: + printf("LTW: glGetTexImage only supported on OpenGL ES 3.1"); + return; + unsupported: + printf("LTW: unsupported parameters for glGetTexImage"); } void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data) { diff --git a/app/src/main/tinywrapper/shader_wrapper.c b/app/src/main/tinywrapper/shader_wrapper.c index 6035f16..f987228 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, 410, 300); + GLchar* new_source = optimize_shader(target_string, shader_info->shader_type == GL_VERTEX_SHADER, 460, 300); //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;