From 7884289a2174194c0db5a6e19f93e55ba8e990aa Mon Sep 17 00:00:00 2001 From: Tungstend Date: Sun, 2 Feb 2025 23:57:23 +0800 Subject: [PATCH] sync --- app/src/main/cpp/CMakeLists.txt | 2 +- app/src/main/cpp/gl/getter.cpp | 2 +- app/src/main/cpp/gl/gl.c | 5 + app/src/main/cpp/gl/gl_native.c | 6 +- app/src/main/cpp/gl/gl_stub.c | 2 +- .../main/cpp/gl/{texture.c => texture.cpp} | 186 ++++++++++++++++-- app/src/main/cpp/gl/texture.h | 17 ++ app/src/main/cpp/gles/loader.h | 42 +++- 8 files changed, 228 insertions(+), 34 deletions(-) rename app/src/main/cpp/gl/{texture.c => texture.cpp} (77%) diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 1f423f6..8e509e4 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -29,7 +29,7 @@ add_library(${CMAKE_PROJECT_NAME} SHARED gl/envvars.c gl/log.c gl/shader.c - gl/texture.c + gl/texture.cpp gl/drawing.c gl/mg.c gl/buffer.cpp diff --git a/app/src/main/cpp/gl/getter.cpp b/app/src/main/cpp/gl/getter.cpp index 3e9c9e1..dce87a0 100644 --- a/app/src/main/cpp/gl/getter.cpp +++ b/app/src/main/cpp/gl/getter.cpp @@ -9,7 +9,7 @@ void glGetIntegerv(GLenum pname, GLint *params) { LOG(); - LOG_D("glGetIntegerv, pname: %d",pname); + LOG_D("glGetIntegerv, pname: 0x%x",pname); if (pname == GL_CONTEXT_PROFILE_MASK) { (*params) = GL_CONTEXT_CORE_PROFILE_BIT; return; diff --git a/app/src/main/cpp/gl/gl.c b/app/src/main/cpp/gl/gl.c index 36ab768..9e53f92 100644 --- a/app/src/main/cpp/gl/gl.c +++ b/app/src/main/cpp/gl/gl.c @@ -16,4 +16,9 @@ GLAPI GLAPIENTRY void glClearDepth(GLclampd depth) { LOG(); glClearDepthf(depth); glClear(GL_DEPTH_BUFFER_BIT); +} + + +void glHint(GLenum target, GLenum mode) { + LOG(); } \ No newline at end of file diff --git a/app/src/main/cpp/gl/gl_native.c b/app/src/main/cpp/gl/gl_native.c index 60728be..a629ce3 100644 --- a/app/src/main/cpp/gl/gl_native.c +++ b/app/src/main/cpp/gl/gl_native.c @@ -19,7 +19,7 @@ NATIVE_FUNCTION_HEAD(void, glBindAttribLocation, GLuint program, GLuint index, c NATIVE_FUNCTION_HEAD(void, glBindBuffer, GLenum target, GLuint buffer) NATIVE_FUNCTION_END_NO_RETURN(void, glBindBuffer, target,buffer) NATIVE_FUNCTION_HEAD(void, glBindFramebuffer, GLenum target, GLuint framebuffer) NATIVE_FUNCTION_END_NO_RETURN(void, glBindFramebuffer, target,framebuffer) NATIVE_FUNCTION_HEAD(void, glBindRenderbuffer, GLenum target, GLuint renderbuffer) NATIVE_FUNCTION_END_NO_RETURN(void, glBindRenderbuffer, target,renderbuffer) -NATIVE_FUNCTION_HEAD(void, glBindTexture, GLenum target, GLuint texture) NATIVE_FUNCTION_END_NO_RETURN(void, glBindTexture, target,texture) +//NATIVE_FUNCTION_HEAD(void, glBindTexture, GLenum target, GLuint texture) NATIVE_FUNCTION_END_NO_RETURN(void, glBindTexture, target,texture) NATIVE_FUNCTION_HEAD(void, glBlendColor, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) NATIVE_FUNCTION_END_NO_RETURN(void, glBlendColor, red,green,blue,alpha) NATIVE_FUNCTION_HEAD(void, glBlendEquation, GLenum mode) NATIVE_FUNCTION_END_NO_RETURN(void, glBlendEquation, mode) NATIVE_FUNCTION_HEAD(void, glBlendEquationSeparate, GLenum modeRGB, GLenum modeAlpha) NATIVE_FUNCTION_END_NO_RETURN(void, glBlendEquationSeparate, modeRGB,modeAlpha) @@ -46,7 +46,7 @@ NATIVE_FUNCTION_HEAD(void, glDeleteFramebuffers, GLsizei n, const GLuint *frameb NATIVE_FUNCTION_HEAD(void, glDeleteProgram, GLuint program) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteProgram, program) NATIVE_FUNCTION_HEAD(void, glDeleteRenderbuffers, GLsizei n, const GLuint *renderbuffers) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteRenderbuffers, n,renderbuffers) NATIVE_FUNCTION_HEAD(void, glDeleteShader, GLuint shader) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteShader, shader) -NATIVE_FUNCTION_HEAD(void, glDeleteTextures, GLsizei n, const GLuint *textures) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteTextures, n,textures) +//NATIVE_FUNCTION_HEAD(void, glDeleteTextures, GLsizei n, const GLuint *textures) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteTextures, n,textures) NATIVE_FUNCTION_HEAD(void, glDepthFunc, GLenum func) NATIVE_FUNCTION_END_NO_RETURN(void, glDepthFunc, func) NATIVE_FUNCTION_HEAD(void, glDepthMask, GLboolean flag) NATIVE_FUNCTION_END_NO_RETURN(void, glDepthMask, flag) NATIVE_FUNCTION_HEAD(void, glDepthRangef, GLfloat n, GLfloat f) NATIVE_FUNCTION_END_NO_RETURN(void, glDepthRangef, n,f) @@ -92,7 +92,7 @@ NATIVE_FUNCTION_HEAD(GLint, glGetUniformLocation, GLuint program, const GLchar * NATIVE_FUNCTION_HEAD(void, glGetVertexAttribfv, GLuint index, GLenum pname, GLfloat *params) NATIVE_FUNCTION_END_NO_RETURN(void, glGetVertexAttribfv, index,pname,params) NATIVE_FUNCTION_HEAD(void, glGetVertexAttribiv, GLuint index, GLenum pname, GLint *params) NATIVE_FUNCTION_END_NO_RETURN(void, glGetVertexAttribiv, index,pname,params) NATIVE_FUNCTION_HEAD(void, glGetVertexAttribPointerv, GLuint index, GLenum pname, void **pointer) NATIVE_FUNCTION_END_NO_RETURN(void, glGetVertexAttribPointerv, index,pname,pointer) -NATIVE_FUNCTION_HEAD(void, glHint, GLenum target, GLenum mode) NATIVE_FUNCTION_END_NO_RETURN(void, glHint, target,mode) +//NATIVE_FUNCTION_HEAD(void, glHint, GLenum target, GLenum mode) NATIVE_FUNCTION_END_NO_RETURN(void, glHint, target,mode) NATIVE_FUNCTION_HEAD(GLboolean, glIsBuffer, GLuint buffer) NATIVE_FUNCTION_END(GLboolean, glIsBuffer, buffer) NATIVE_FUNCTION_HEAD(GLboolean, glIsEnabled, GLenum cap) NATIVE_FUNCTION_END(GLboolean, glIsEnabled, cap) NATIVE_FUNCTION_HEAD(GLboolean, glIsFramebuffer, GLuint framebuffer) NATIVE_FUNCTION_END(GLboolean, glIsFramebuffer, framebuffer) diff --git a/app/src/main/cpp/gl/gl_stub.c b/app/src/main/cpp/gl/gl_stub.c index 50c2a6f..a708456 100644 --- a/app/src/main/cpp/gl/gl_stub.c +++ b/app/src/main/cpp/gl/gl_stub.c @@ -707,7 +707,7 @@ STUB_FUNCTION_HEAD(void, glTextureParameteri, GLuint texture, GLenum pname, GLin STUB_FUNCTION_HEAD(void, glTextureParameterIiv, GLuint texture, GLenum pname, const GLint* params); STUB_FUNCTION_END_NO_RETURN(void, glTextureParameterIiv,texture,pname,params) STUB_FUNCTION_HEAD(void, glTextureParameterIuiv, GLuint texture, GLenum pname, const GLuint* params); STUB_FUNCTION_END_NO_RETURN(void, glTextureParameterIuiv,texture,pname,params) STUB_FUNCTION_HEAD(void, glTextureParameteriv, GLuint texture, GLenum pname, const GLint* param); STUB_FUNCTION_END_NO_RETURN(void, glTextureParameteriv,texture,pname,param) -STUB_FUNCTION_HEAD(void, glGenerateTextureMipmap, GLuint texture); STUB_FUNCTION_END_NO_RETURN(void, glGenerateTextureMipmap,texture) +//STUB_FUNCTION_HEAD(void, glGenerateTextureMipmap, GLuint texture); STUB_FUNCTION_END_NO_RETURN(void, glGenerateTextureMipmap,texture) STUB_FUNCTION_HEAD(void, glBindTextureUnit, GLuint unit, GLuint texture); STUB_FUNCTION_END_NO_RETURN(void, glBindTextureUnit,unit,texture) STUB_FUNCTION_HEAD(void, glGetTextureImage, GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void* pixels); STUB_FUNCTION_END_NO_RETURN(void, glGetTextureImage,texture,level,format,type,bufSize,pixels) STUB_FUNCTION_HEAD(void, glGetCompressedTextureImage, GLuint texture, GLint level, GLsizei bufSize, void* pixels); STUB_FUNCTION_END_NO_RETURN(void, glGetCompressedTextureImage,texture,level,bufSize,pixels) diff --git a/app/src/main/cpp/gl/texture.c b/app/src/main/cpp/gl/texture.cpp similarity index 77% rename from app/src/main/cpp/gl/texture.c rename to app/src/main/cpp/gl/texture.cpp index 9dffaaa..026fc10 100644 --- a/app/src/main/cpp/gl/texture.c +++ b/app/src/main/cpp/gl/texture.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "gl.h" @@ -32,6 +33,9 @@ int nlevel(int size, int level) { static bool support_rgba16 = false; static bool checked_rgba16 = false; +std::unordered_map g_textures; +GLuint bound_texture = 0; + bool check_rgba16() { LOAD_GLES(glGetStringi, const GLubyte *, GLenum, GLuint); LOAD_GLES(glGetIntegerv, void, GLenum pname, GLint *params); @@ -51,6 +55,23 @@ bool check_rgba16() { void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { switch (*internal_format) { + case GL_DEPTH_COMPONENT16: + *type = GL_UNSIGNED_SHORT; + break; + + case GL_DEPTH_COMPONENT24: + *type = GL_UNSIGNED_INT; + break; + + case GL_DEPTH_COMPONENT32: + *internal_format = GL_DEPTH_COMPONENT32F; + *type = GL_FLOAT; + break; + + case GL_DEPTH_COMPONENT32F: + *type = GL_FLOAT; + break; + case GL_DEPTH_COMPONENT: *internal_format = GL_DEPTH_COMPONENT32F; *type = GL_FLOAT; @@ -161,6 +182,17 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { *format = GL_RG; break; + case GL_R8UI: + if (format) + *format = GL_RED_INTEGER; + *type = GL_UNSIGNED_BYTE; + break; + + case GL_RGB8_SNORM: + case GL_RGBA8_SNORM: + *type = GL_BYTE; + break; + default: if (*internal_format == GL_RGB8 && *type != GL_UNSIGNED_BYTE) { *type = GL_UNSIGNED_BYTE; @@ -189,7 +221,7 @@ void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei widt LOG_D("glTexImage1D, target: %d, level: %d, internalFormat: %d, width: %d, border: %d, format: %d, type: %d", target, level, internalFormat, width, border, format, type); return; - internal_convert(&internalFormat,& type,&format); + internal_convert(reinterpret_cast(&internalFormat), & type, &format); GLenum rtarget = map_tex_target(target); if (rtarget == GL_PROXY_TEXTURE_1D) { @@ -209,7 +241,9 @@ void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei widt void glTexImage2D(GLenum target, GLint level,GLint internalFormat,GLsizei width, GLsizei height,GLint border, GLenum format, GLenum type,const GLvoid* pixels) { LOG(); - internal_convert(&internalFormat,& type,&format); + auto& tex = g_textures[bound_texture]; + tex.format = format; + internal_convert(reinterpret_cast(&internalFormat), &type, &format); LOG_D("glTexImage2D,target: 0x%x,level: %d,internalFormat: 0x%x->0x%x,width: %d,height: %d,border: %d,format: 0x%x,type: 0x%x",target,level,internalFormat,internalFormat,width,height,border,format,type); GLenum rtarget = map_tex_target(target); if(rtarget == GL_PROXY_TEXTURE_2D) { @@ -223,15 +257,42 @@ void glTexImage2D(GLenum target, GLint level,GLint internalFormat,GLsizei width, } LOAD_GLES(glTexImage2D, void, GLenum target, GLint level,GLint internalFormat,GLsizei width, GLsizei height,GLint border, GLenum format, GLenum type,const GLvoid* pixels); gles_glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels); + if (tex.format == GL_BGRA) { + LOG_D("Detected GL_BGRA format @ tex = %d, do swizzle", bound_texture); + if (tex.swizzle_param[0] == 0) { // assert this as never called glTexParameteri(..., GL_TEXTURE_SWIZZLE_R, ...) + tex.swizzle_param[0] = GL_RED; + tex.swizzle_param[1] = GL_GREEN; + tex.swizzle_param[2] = GL_BLUE; + tex.swizzle_param[3] = GL_ALPHA; + } + + GLint r = tex.swizzle_param[0]; + GLint g = tex.swizzle_param[1]; + GLint b = tex.swizzle_param[2]; + GLint a = tex.swizzle_param[3]; + tex.swizzle_param[0] = g; + tex.swizzle_param[1] = b; + tex.swizzle_param[2] = a; + tex.swizzle_param[3] = r; + tex.format = GL_RGBA; + + LOAD_GLES_FUNC(glTexParameteri); + gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, tex.swizzle_param[0]); + gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, tex.swizzle_param[1]); + gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, tex.swizzle_param[2]); + gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, tex.swizzle_param[3]); + CHECK_GL_ERROR + } + CHECK_GL_ERROR } void glTexImage3D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels) { LOG(); - LOG_D("glTexImage3D, target: %d, level: %d, internalFormat: %d, width: %d, height: %d, depth: %d, border: %d, format: %d, type: %d", + LOG_D("glTexImage3D, target: 0x%x, level: %d, internalFormat: 0x%x, width: 0x%x, height: %d, depth: %d, border: %d, format: 0x%x, type: %d", target, level, internalFormat, width, height, depth, border, format, type); - internal_convert(&internalFormat, &type,&format); + internal_convert(reinterpret_cast(&internalFormat), &type, &format); GLenum rtarget = map_tex_target(target); if (rtarget == GL_PROXY_TEXTURE_3D) { @@ -257,7 +318,7 @@ void glTexStorage1D(GLenum target, GLsizei levels, GLenum internalFormat, GLsize LOG_D("glTexStorage1D, target: %d, levels: %d, internalFormat: %d, width: %d", target, levels, internalFormat, width); return; - internal_convert(&internalFormat,&GLUBYTE,NULL); + internal_convert(&internalFormat,const_cast(&GLUBYTE),NULL); // LOAD_GLES(glTexStorage1D, void, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width); // gles_glTexStorage1D(target, levels, internalFormat, width); @@ -270,7 +331,7 @@ void glTexStorage2D(GLenum target, GLsizei levels, GLenum internalFormat, GLsize LOG_D("glTexStorage2D, target: %d, levels: %d, internalFormat: %d, width: %d, height: %d", target, levels, internalFormat, width, height); - internal_convert(&internalFormat,&GLUBYTE,NULL); + internal_convert(&internalFormat,const_cast(&GLUBYTE),NULL); LOAD_GLES(glTexStorage2D, void, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height); gles_glTexStorage2D(target, levels, internalFormat, width, height); @@ -286,7 +347,7 @@ void glTexStorage3D(GLenum target, GLsizei levels, GLenum internalFormat, GLsize LOG_D("glTexStorage3D, target: %d, levels: %d, internalFormat: %d, width: %d, height: %d, depth: %d", target, levels, internalFormat, width, height, depth); - internal_convert(&internalFormat,&GLUBYTE,NULL); + internal_convert(&internalFormat,const_cast(&GLUBYTE),NULL); LOAD_GLES(glTexStorage3D, void, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth); gles_glTexStorage3D(target, levels, internalFormat, width, height, depth); @@ -336,6 +397,8 @@ static GLenum get_binding_for_target(GLenum target) { void glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { LOG(); + INIT_CHECK_GL_ERROR + LOAD_GLES_FUNC(glGetTexLevelParameteriv); GLint realInternalFormat; gles_glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat); @@ -347,41 +410,53 @@ void glCopyTexImage2D(GLenum target, GLint level, GLenum internalFormat, GLint x if (is_depth_format(internalFormat)) { GLenum format = GL_DEPTH_COMPONENT; GLenum type = GL_UNSIGNED_INT; - + internal_convert(&internalFormat, &type, &format); LOAD_GLES(glTexImage2D, void, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); gles_glTexImage2D(target, level, internalFormat, width, height, border, format, type, NULL); - - GLint prevReadFBO, prevDrawFBO; - glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &prevReadFBO); + CHECK_GL_ERROR_NO_INIT +// GLint prevReadFBO, prevDrawFBO; + GLint prevDrawFBO; +// glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &prevReadFBO); glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &prevDrawFBO); - + CHECK_GL_ERROR_NO_INIT GLuint tempDrawFBO; glGenFramebuffers(1, &tempDrawFBO); + CHECK_GL_ERROR_NO_INIT glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tempDrawFBO); - + CHECK_GL_ERROR_NO_INIT GLint currentTex; glGetIntegerv(get_binding_for_target(target), ¤tTex); + CHECK_GL_ERROR_NO_INIT glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target, currentTex, level); + CHECK_GL_ERROR_NO_INIT if (glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + CHECK_GL_ERROR_NO_INIT glDeleteFramebuffers(1, &tempDrawFBO); + CHECK_GL_ERROR_NO_INIT glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevDrawFBO); + CHECK_GL_ERROR_NO_INIT return; } + CHECK_GL_ERROR_NO_INIT LOAD_GLES(glBlitFramebuffer, void, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); gles_glBlitFramebuffer(x, y, x + width, y + height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST); + CHECK_GL_ERROR_NO_INIT glBindFramebuffer(GL_DRAW_FRAMEBUFFER, prevDrawFBO); + CHECK_GL_ERROR_NO_INIT glDeleteFramebuffers(1, &tempDrawFBO); + CHECK_GL_ERROR_NO_INIT } else { LOAD_GLES(glCopyTexImage2D, void, GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); gles_glCopyTexImage2D(target, level, internalFormat, x, y, width, height, border); + CHECK_GL_ERROR_NO_INIT } - CHECK_GL_ERROR + CHECK_GL_ERROR_NO_INIT } void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { @@ -390,6 +465,8 @@ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffse LOAD_GLES_FUNC(glGetTexLevelParameteriv); gles_glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, &internalFormat); + LOG_D("glCopyTexSubImage2D, target: %d, level: %d, ......, internalFormat: %d", target, level, internalFormat); + if (is_depth_format((GLenum)internalFormat)) { GLint prevReadFBO, prevDrawFBO; glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &prevReadFBO); @@ -427,27 +504,45 @@ void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffse void glRenderbufferStorage(GLenum target, GLenum internalFormat, GLsizei width, GLsizei height) { LOG(); + INIT_CHECK_GL_ERROR_FORCE + + CLEAR_GL_ERROR_NO_INIT + LOAD_GLES_FUNC(glGetTexLevelParameteriv); GLint realInternalFormat; gles_glGetTexLevelParameteriv(target, 0, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat); - internalFormat = (GLenum)realInternalFormat; + ERR = gles_glGetError(); + if (realInternalFormat != 0 && ERR == GL_NO_ERROR) + internalFormat = (GLenum)realInternalFormat; + else + internalFormat = GL_DEPTH_COMPONENT24; - LOG_D("glRenderbufferStorage, target: %d, internalFormat: %d, width: %d, height: %d", + CLEAR_GL_ERROR_NO_INIT + + LOG_D("glRenderbufferStorage, target: 0x%x, internalFormat: 0x%x, width: %d, height: %d", target, internalFormat, width, height); LOAD_GLES(glRenderbufferStorage, void, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height); gles_glRenderbufferStorage(target, internalFormat, width, height); - CHECK_GL_ERROR + CHECK_GL_ERROR_NO_INIT } void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height) { LOG(); + INIT_CHECK_GL_ERROR_FORCE + + CLEAR_GL_ERROR_NO_INIT + LOAD_GLES_FUNC(glGetTexLevelParameteriv); GLint realInternalFormat; gles_glGetTexLevelParameteriv(target, 0, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat); - internalFormat = (GLenum)realInternalFormat; + ERR = gles_glGetError(); + if (realInternalFormat != 0 && ERR == GL_NO_ERROR) + internalFormat = (GLenum)realInternalFormat; + else + internalFormat = GL_DEPTH_COMPONENT24; LOG_D("glRenderbufferStorageMultisample, target: %d, samples: %d, internalFormat: %d, width: %d, height: %d", @@ -456,7 +551,7 @@ void glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum int LOAD_GLES(glRenderbufferStorageMultisample, void, GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height); gles_glRenderbufferStorageMultisample(target, samples, internalFormat, width, height); - CHECK_GL_ERROR + CHECK_GL_ERROR_NO_INIT } void glGetTexLevelParameterfv(GLenum target, GLint level,GLenum pname, GLfloat *params) { @@ -515,10 +610,18 @@ void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { if (pname == GL_TEXTURE_SWIZZLE_RGBA) { LOG_D("find GL_TEXTURE_SWIZZLE_RGBA, now use glTexParameteri"); if (params) { + // deferred those call to draw call? gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, params[0]); gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, params[1]); gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, params[2]); gles_glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, params[3]); + + // save states for now + texture_t& tex = g_textures[bound_texture]; + tex.swizzle_param[0] = params[0]; + tex.swizzle_param[1] = params[1]; + tex.swizzle_param[2] = params[2]; + tex.swizzle_param[3] = params[3]; } else { LOG_E("glTexParameteriv: params is null for GL_TEXTURE_SWIZZLE_RGBA"); } @@ -532,9 +635,50 @@ void glTexParameteriv(GLenum target, GLenum pname, const GLint* params) { void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) { LOG(); LOAD_GLES_FUNC(glTexSubImage2D) - if (format == GL_BGRA) - format=GL_BGRA_EXT; gles_glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); CLEAR_GL_ERROR } + +void glBindTexture(GLenum target, GLuint texture) { + LOG(); + LOG_D("glBindTexture(0x%x, %d)", target, texture); + LOAD_GLES_FUNC(glBindTexture) + INIT_CHECK_GL_ERROR + gles_glBindTexture(target, texture); + CHECK_GL_ERROR_NO_INIT + + if (target == GL_TEXTURE_2D) { // only care about 2D textures for now + g_textures[texture] = { + .texture = texture, + .format = 0, + .swizzle_param = {0}, + }; + bound_texture = texture; + } +} + +void glDeleteTextures(GLsizei n, const GLuint *textures) { + LOG(); + LOAD_GLES_FUNC(glDeleteTextures) + INIT_CHECK_GL_ERROR + gles_glDeleteTextures(n, textures); + CHECK_GL_ERROR_NO_INIT + + for (GLsizei i = 0; i < n; ++i) { + g_textures.erase(textures[i]); + if (bound_texture == textures[i]) + bound_texture = 0; + } +} + +void glGenerateTextureMipmap(GLuint texture) { + GLint currentTexture; + // TODO: Use real target + GLenum binding = GL_TEXTURE_BINDING_2D; + GLenum target = GL_TEXTURE_2D; + glGetIntegerv(binding, ¤tTexture); + glBindTexture(target, texture); + glGenerateMipmap(target); + glBindTexture(target, currentTexture); +} \ No newline at end of file diff --git a/app/src/main/cpp/gl/texture.h b/app/src/main/cpp/gl/texture.h index 5d56b21..a09af20 100644 --- a/app/src/main/cpp/gl/texture.h +++ b/app/src/main/cpp/gl/texture.h @@ -5,8 +5,18 @@ #ifndef MOBILEGLUES_TEXTURE_H #define MOBILEGLUES_TEXTURE_H +#ifdef __cplusplus +extern "C" { +#endif + #include "gl.h" +struct texture_t { + GLuint texture; + GLenum format; + GLint swizzle_param[4]; +}; + GLAPI GLAPIENTRY void glTexParameterf(GLenum target, GLenum pname, GLfloat param); GLAPI GLAPIENTRY void glTexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid* pixels); GLAPI GLAPIENTRY void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid* pixels); @@ -23,5 +33,12 @@ GLAPI GLAPIENTRY void glGetTexLevelParameterfv(GLenum target, GLint level, GLenu GLAPI GLAPIENTRY void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params); GLAPI GLAPIENTRY void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); GLAPI GLAPIENTRY void glTexParameteriv(GLenum target, GLenum pname, const GLint* params); +GLAPI GLAPIENTRY void glGenerateTextureMipmap(GLuint texture); +GLAPI GLAPIENTRY void glBindTexture(GLenum target, GLuint texture); +GLAPI GLAPIENTRY void glDeleteTextures(GLsizei n, const GLuint *textures); + +#ifdef __cplusplus +} +#endif #endif \ No newline at end of file diff --git a/app/src/main/cpp/gles/loader.h b/app/src/main/cpp/gles/loader.h index b254d62..57484f2 100644 --- a/app/src/main/cpp/gles/loader.h +++ b/app/src/main/cpp/gles/loader.h @@ -91,11 +91,40 @@ static name##_PTR egl_##name = NULL; \ while (ERR != GL_NO_ERROR) \ ERR = gles_glGetError(); +#define CLEAR_GL_ERROR_NO_INIT \ + ERR = gles_glGetError(); \ + while (ERR != GL_NO_ERROR) \ + ERR = gles_glGetError(); + +#if GLOBAL_DEBUG #define CHECK_GL_ERROR \ LOAD_GLES(glGetError, GLenum) \ GLenum ERR = gles_glGetError(); \ - if (ERR != GL_NO_ERROR) \ - LOG_E("ERROR: %d", ERR) + while (ERR != GL_NO_ERROR) { \ + LOG_E("ERROR: %d @ %s:%d", ERR, __FILE__, __LINE__) \ + ERR = gles_glGetError(); \ + } + +#define INIT_CHECK_GL_ERROR \ + LOAD_GLES(glGetError, GLenum) \ + GLenum ERR = GL_NO_ERROR; + +#define CHECK_GL_ERROR_NO_INIT \ + ERR = gles_glGetError(); \ + while (ERR != GL_NO_ERROR) { \ + LOG_E("ERROR: %d @ %s:%d", ERR, __FILE__, __LINE__) \ + ERR = gles_glGetError(); \ + } +#else +#define CHECK_GL_ERROR +#define INIT_CHECK_GL_ERROR +#define CHECK_GL_ERROR_NO_INIT +#endif + +#define INIT_CHECK_GL_ERROR_FORCE \ + LOAD_GLES(glGetError, GLenum) \ + GLenum ERR = GL_NO_ERROR; + #define NATIVE_FUNCTION_HEAD(type,name,...) \ GLAPI GLAPIENTRY type name##ARB(__VA_ARGS__) __attribute__((alias(#name))); \ @@ -118,7 +147,9 @@ name##_PTR gles_##name = NULL; #define NATIVE_FUNCTION_END(type,name,...) \ LOG_D("Use native function: %s @ %s(...)", RENDERERNAME, __FUNCTION__); \ LOAD_RAW_GLES(name, type, __VA_ARGS__); \ - return gles_##name(__VA_ARGS__); \ + type ret = gles_##name(__VA_ARGS__); \ + CHECK_GL_ERROR \ + return ret; \ } #endif @@ -127,10 +158,7 @@ name##_PTR gles_##name = NULL; LOG_D("Use native function: %s @ %s(...)", RENDERERNAME, __FUNCTION__); \ LOAD_RAW_GLES(name, type, __VA_ARGS__); \ gles_##name(__VA_ARGS__); \ - LOAD_GLES(glGetError, GLenum) \ - GLenum ERR = gles_glGetError(); \ - if (ERR != GL_NO_ERROR) \ - LOG_E("ERROR: %d", ERR) \ + CHECK_GL_ERROR \ } #else #define NATIVE_FUNCTION_END_NO_RETURN(type,name,...) \