From bf31bd93a63c44a718744f63826364e59225bf6b Mon Sep 17 00:00:00 2001 From: Tungstend Date: Tue, 4 Feb 2025 01:28:19 +0800 Subject: [PATCH] sync --- app/src/main/cpp/gl/drawing.c | 20 +++- app/src/main/cpp/gl/drawing.h | 2 + app/src/main/cpp/gl/getter.cpp | 19 ++- app/src/main/cpp/gl/gl_stub.c | 4 +- app/src/main/cpp/gl/glsl/glsl_for_es.cpp | 27 +++++ app/src/main/cpp/gl/texture.cpp | 145 +++++++++++++++++------ app/src/main/cpp/gl/texture.h | 2 + 7 files changed, 176 insertions(+), 43 deletions(-) diff --git a/app/src/main/cpp/gl/drawing.c b/app/src/main/cpp/gl/drawing.c index 62cafe4..5e4fb93 100644 --- a/app/src/main/cpp/gl/drawing.c +++ b/app/src/main/cpp/gl/drawing.c @@ -9,9 +9,7 @@ void glMultiDrawElementsBaseVertex( GLenum mode, GLsizei *counts, GLenum type, const void * const *indices, GLsizei primcount, const GLint * basevertex) { LOG(); - -// force_unmap(); - + if (primcount <= 0 || !counts || !indices) return; for (int i = 0; i < primcount; i++) { if (counts[i] > 0) glDrawElementsBaseVertex(mode, @@ -22,6 +20,22 @@ void glMultiDrawElementsBaseVertex( GLenum mode, GLsizei *counts, GLenum type, c } } + +void glMultiDrawElements(GLenum mode,const GLsizei * count,GLenum type,const void * const * indices,GLsizei primcount) { + LOG(); + if (primcount <= 0 || !count || !indices) return; + for (GLsizei i = 0; i < primcount; ++i) { + if (count[i] > 0) { + glDrawElements( + mode, + count[i], + type, + indices[i] + ); + } + } +} + void glDrawBuffer(GLenum buffer) { LOG() diff --git a/app/src/main/cpp/gl/drawing.h b/app/src/main/cpp/gl/drawing.h index 1526dc2..dfc9ebb 100644 --- a/app/src/main/cpp/gl/drawing.h +++ b/app/src/main/cpp/gl/drawing.h @@ -25,4 +25,6 @@ GLAPI GLAPIENTRY void glDrawBuffer(GLenum buf); GLAPI GLAPIENTRY void glDrawBuffers(GLsizei n, const GLenum *bufs); +GLAPI GLAPIENTRY void glMultiDrawElements(GLenum mode,const GLsizei * count,GLenum type,const void * const * indices,GLsizei primcount); + #endif //MOBILEGLUES_DRAWING_H diff --git a/app/src/main/cpp/gl/getter.cpp b/app/src/main/cpp/gl/getter.cpp index dce87a0..420b0e7 100644 --- a/app/src/main/cpp/gl/getter.cpp +++ b/app/src/main/cpp/gl/getter.cpp @@ -70,7 +70,8 @@ void InitGLESBaseExtensions() { "OpenGL32 " "OpenGL33 " "OpenGL40 " - "OpenGL40 " + "OpenGL43 " + "ARB_compute_shader " "GL_ARB_get_program_binary "; } @@ -82,6 +83,21 @@ void AppendExtension(const char* ext) { const GLubyte * glGetString( GLenum name ) { LOG(); LOAD_GLES(glGetString, const GLubyte *, GLenum); + /* Feature in the Future + * Advanced OpenGL driver: NV renderer. + switch (name) { + case GL_VENDOR: + return (const GLubyte *) "NVIDIA Corporation"; + case GL_VERSION: + return (const GLubyte *) "4.6.0 NVIDIA 572.16"; + case GL_RENDERER: + return (const GLubyte *) "NVIDIA GeForce RTX 5090/PCIe/SSE2"; + case GL_SHADING_LANGUAGE_VERSION: + return (const GLubyte *) "4.50 MobileGlues with glslang and SPIRV-Cross"; + case GL_EXTENSIONS: + return (const GLubyte *) GetExtensionsList(); + } + */ switch (name) { case GL_VENDOR: return (const GLubyte *) "Swung0x48, BZLZHH, Tungsten"; @@ -94,6 +110,7 @@ const GLubyte * glGetString( GLenum name ) { case GL_EXTENSIONS: return (const GLubyte *) GetExtensionsList(); } + return gles_glGetString(name); } diff --git a/app/src/main/cpp/gl/gl_stub.c b/app/src/main/cpp/gl/gl_stub.c index 7a4caa7..098db15 100644 --- a/app/src/main/cpp/gl/gl_stub.c +++ b/app/src/main/cpp/gl/gl_stub.c @@ -295,7 +295,7 @@ STUB_FUNCTION_HEAD(void, glGetTexEnviv, GLenum target, GLenum pname, GLint *para //STUB_FUNCTION_HEAD(void, glTexImage1D, GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, GLenum type,const GLvoid* pixels ) STUB_FUNCTION_END_NO_RETURN(void, glTexImage1D,target,level,internalFormat,width,border,format,type,pixels) -STUB_FUNCTION_HEAD(void, glGetTexImage, GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels ) STUB_FUNCTION_END_NO_RETURN(void, glGetTexImage,target,level,format,type,pixels) +//STUB_FUNCTION_HEAD(void, glGetTexImage, GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels ) STUB_FUNCTION_END_NO_RETURN(void, glGetTexImage,target,level,format,type,pixels) /* 1.1 functions */ STUB_FUNCTION_HEAD(void, glPrioritizeTextures, GLsizei n,const GLuint *textures,const GLclampf *priorities ) STUB_FUNCTION_END_NO_RETURN(void, glPrioritizeTextures,n,textures,priorities) @@ -419,7 +419,7 @@ STUB_FUNCTION_HEAD(void, glLoadTransposeMatrixd,const GLdouble* m); STUB_FUNCTIO STUB_FUNCTION_HEAD(void, glMultTransposeMatrixf,const GLfloat* m); STUB_FUNCTION_END_NO_RETURN(void, glMultTransposeMatrixf,m) STUB_FUNCTION_HEAD(void, glMultTransposeMatrixd,const GLdouble* m); STUB_FUNCTION_END_NO_RETURN(void, glMultTransposeMatrixd,m) STUB_FUNCTION_HEAD(void, glMultiDrawArrays, GLenum mode, const GLint* first, const GLsizei* count, GLsizei drawcount); STUB_FUNCTION_END_NO_RETURN(void, glMultiDrawArrays,mode,first,count,drawcount) -STUB_FUNCTION_HEAD(void, glMultiDrawElements, GLenum mode, const GLsizei* count, GLenum type, const void* const*indices, GLsizei drawcount); STUB_FUNCTION_END_NO_RETURN(void, glMultiDrawElements,mode,count,type,indices,drawcount) +//STUB_FUNCTION_HEAD(void, glMultiDrawElements, GLenum mode, const GLsizei* count, GLenum type, const void* const*indices, GLsizei drawcount); STUB_FUNCTION_END_NO_RETURN(void, glMultiDrawElements,mode,count,type,indices,drawcount) STUB_FUNCTION_HEAD(void, glPointParameterf, GLenum pname, GLfloat param); STUB_FUNCTION_END_NO_RETURN(void, glPointParameterf,pname,param) STUB_FUNCTION_HEAD(void, glPointParameterfv, GLenum pname, const GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glPointParameterfv,pname,params) STUB_FUNCTION_HEAD(void, glPointParameteri, GLenum pname, GLint param); STUB_FUNCTION_END_NO_RETURN(void, glPointParameteri,pname,param) diff --git a/app/src/main/cpp/gl/glsl/glsl_for_es.cpp b/app/src/main/cpp/gl/glsl/glsl_for_es.cpp index 21654af..d7e6093 100644 --- a/app/src/main/cpp/gl/glsl/glsl_for_es.cpp +++ b/app/src/main/cpp/gl/glsl/glsl_for_es.cpp @@ -310,6 +310,32 @@ std::string forceSupporterOutput(const std::string& glslCode) { std::string removeLayoutBinding(const std::string& glslCode) { std::regex bindingRegex(R"(layout\s*\(\s*binding\s*=\s*\d+\s*\)\s*)"); std::string result = std::regex_replace(glslCode, bindingRegex, ""); + std::regex bindingRegex2(R"(layout\s*\(\s*binding\s*=\s*\d+\s*,)"); + result = std::regex_replace(result, bindingRegex2, "layout("); + return result; +} +// TODO +std::string makeRGBWriteonly(const std::string& input) { + std::regex pattern(R"(.*layout\([^)]*rgba[^)]*\).*?)"); + std::string result; + std::string::size_type start = 0; + std::string::size_type end; + while ((end = input.find('\n', start)) != std::string::npos) { + std::string line = input.substr(start, end - start); + if (std::regex_search(line, pattern)) { + result += "writeonly " + line + "\n"; + } else { + result += line + "\n"; + } + start = end + 1; + } + std::string lastLine = input.substr(start); + if (std::regex_search(lastLine, pattern)) { + result += "writeonly " + lastLine; + } else { + result += lastLine; + } + return result; } @@ -512,6 +538,7 @@ char* GLSLtoGLSLES_2(char* glsl_code, GLenum glsl_type, uint essl_version) { //essl = removeLocationBinding(essl); //essl = addPrecisionToSampler2DShadow(essl); essl = forceSupporterOutput(essl); + essl = makeRGBWriteonly(essl); char* result_essl = new char[essl.length() + 1]; std::strcpy(result_essl, essl.c_str()); diff --git a/app/src/main/cpp/gl/texture.cpp b/app/src/main/cpp/gl/texture.cpp index a0cbb38..69f4829 100644 --- a/app/src/main/cpp/gl/texture.cpp +++ b/app/src/main/cpp/gl/texture.cpp @@ -20,8 +20,6 @@ #define DEBUG 0 -const GLenum GLUBYTE = GL_UNSIGNED_BYTE; - int nlevel(int size, int level) { if(size) { size>>=level; @@ -58,38 +56,46 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { *format = GL_RGBA; switch (*internal_format) { case GL_DEPTH_COMPONENT16: - *type = GL_UNSIGNED_SHORT; + if(type) + *type = GL_UNSIGNED_SHORT; break; case GL_DEPTH_COMPONENT24: - *type = GL_UNSIGNED_INT; + if(type) + *type = GL_UNSIGNED_INT; break; case GL_DEPTH_COMPONENT32: *internal_format = GL_DEPTH_COMPONENT32F; - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; break; case GL_DEPTH_COMPONENT32F: - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; break; case GL_DEPTH_COMPONENT: *internal_format = GL_DEPTH_COMPONENT32F; - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; break; case GL_DEPTH_STENCIL: *internal_format = GL_DEPTH32F_STENCIL8; - *type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; + if(type) + *type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV; break; case GL_RGB10_A2: - *type = GL_UNSIGNED_INT_2_10_10_10_REV; + if(type) + *type = GL_UNSIGNED_INT_2_10_10_10_REV; break; case GL_RGB5_A1: - *type = GL_UNSIGNED_SHORT_5_5_5_1; + if(type) + *type = GL_UNSIGNED_SHORT_5_5_5_1; break; case GL_COMPRESSED_RED_RGTC1: @@ -98,22 +104,26 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { break; case GL_SRGB8: - *type = GL_UNSIGNED_BYTE; + if(type) + *type = GL_UNSIGNED_BYTE; break; case GL_RGBA32F: case GL_RGB32F: case GL_RG32F: case GL_R32F: - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; break; case GL_RGB9_E5: - *type = GL_UNSIGNED_INT_5_9_9_9_REV; + if(type) + *type = GL_UNSIGNED_INT_5_9_9_9_REV; break; case GL_R11F_G11F_B10F: - *type = GL_UNSIGNED_INT_10F_11F_11F_REV; + if(type) + *type = GL_UNSIGNED_INT_10F_11F_11F_REV; if (format) *format = GL_RGB; break; @@ -122,14 +132,16 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { case GL_RGB32UI: case GL_RG32UI: case GL_R32UI: - *type = GL_UNSIGNED_INT; + if(type) + *type = GL_UNSIGNED_INT; break; case GL_RGBA32I: case GL_RGB32I: case GL_RG32I: case GL_R32I: - *type = GL_INT; + if(type) + *type = GL_INT; break; case GL_RGBA16: { @@ -138,50 +150,59 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { checked_rgba16 = true; } if (support_rgba16) { - *type = GL_UNSIGNED_SHORT; + if(type) + *type = GL_UNSIGNED_SHORT; } else { *internal_format = GL_RGBA16F; - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; } break; } case GL_RGBA8: - *type = GL_UNSIGNED_BYTE; + if(type) + *type = GL_UNSIGNED_BYTE; if (format) *format = GL_RGBA; break; case GL_RGBA: - *type = GL_UNSIGNED_BYTE; + if(type) + *type = GL_UNSIGNED_BYTE; if (format) *format = GL_RGBA; break; case GL_RGBA16F: case GL_R16F: - *type = GL_HALF_FLOAT; + if(type) + *type = GL_HALF_FLOAT; break; case GL_R16: *internal_format = GL_R16F; - *type = GL_FLOAT; + if(type) + *type = GL_FLOAT; break; case GL_RGB16: *internal_format = GL_RGB16F; - *type = GL_HALF_FLOAT; + if(type) + *type = GL_HALF_FLOAT; if(format) *format = GL_RGB; break; case GL_RGB16F: - *type = GL_HALF_FLOAT; + if(type) + *type = GL_HALF_FLOAT; if(format) *format = GL_RGB; break; case GL_RG16F: - *type = GL_HALF_FLOAT; + if(type) + *type = GL_HALF_FLOAT; if(format) *format = GL_RG; break; @@ -189,27 +210,30 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) { case GL_R8: if (format) *format = GL_RED; - *type = GL_UNSIGNED_BYTE; + if(type) + *type = GL_UNSIGNED_BYTE; break; case GL_R8UI: if (format) *format = GL_RED_INTEGER; - *type = GL_UNSIGNED_BYTE; + if(type) + *type = GL_UNSIGNED_BYTE; break; case GL_RGB8_SNORM: case GL_RGBA8_SNORM: - *type = GL_BYTE; + if(type) + *type = GL_BYTE; break; default: if (*internal_format == GL_RGB8) { - if (*type != GL_UNSIGNED_BYTE) + if (type && *type != GL_UNSIGNED_BYTE) *type = GL_UNSIGNED_BYTE; if (format) *format = GL_RGB; } - else if (*internal_format == GL_RGBA16_SNORM && *type != GL_SHORT) { + else if (type && *internal_format == GL_RGBA16_SNORM && *type != GL_SHORT) { *type = GL_SHORT; } break; @@ -330,7 +354,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,const_cast(&GLUBYTE),NULL); + internal_convert(&internalFormat,NULL,NULL); // LOAD_GLES(glTexStorage1D, void, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width); // gles_glTexStorage1D(target, levels, internalFormat, width); @@ -343,7 +367,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,const_cast(&GLUBYTE),NULL); + internal_convert(&internalFormat,NULL,NULL); LOAD_GLES(glTexStorage2D, void, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height); gles_glTexStorage2D(target, levels, internalFormat, width, height); @@ -359,7 +383,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,const_cast(&GLUBYTE),NULL); + internal_convert(&internalFormat,NULL,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); @@ -662,9 +686,10 @@ void glBindTexture(GLenum target, GLuint texture) { if (target == GL_TEXTURE_2D) { // only care about 2D textures for now g_textures[texture] = { + .target = target, .texture = texture, .format = 0, - .swizzle_param = {0}, + .swizzle_param = {0} }; bound_texture = texture; } @@ -686,11 +711,57 @@ void glDeleteTextures(GLsizei n, const GLuint *textures) { void glGenerateTextureMipmap(GLuint texture) { GLint currentTexture; - // TODO: Use real target - GLenum binding = GL_TEXTURE_BINDING_2D; - GLenum target = GL_TEXTURE_2D; + auto& tex = g_textures[bound_texture]; + GLenum target = tex.target; + GLenum binding = get_binding_for_target(target); + if (binding == 0) return; glGetIntegerv(binding, ¤tTexture); glBindTexture(target, texture); glGenerateMipmap(target); glBindTexture(target, currentTexture); +} + +void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels) { + GLint prevFBO; + glGetIntegerv(GL_FRAMEBUFFER_BINDING, &prevFBO); + GLenum bindingTarget = get_binding_for_target(target); + if (bindingTarget == 0) return; + GLint oldTexBinding; + glActiveTexture(GL_TEXTURE0); + glGetIntegerv(bindingTarget, &oldTexBinding); + GLuint texture = static_cast(oldTexBinding); + if (texture == 0) return; + GLint width, height; + glBindTexture(target, texture); + glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &width); + glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &height); + glBindTexture(target, oldTexBinding); + if (width <= 0 || height <= 0) return; + GLuint fbo; + glGenFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, fbo); + if (target == GL_TEXTURE_2D || (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)) { + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, texture, level); + } else { + glDeleteFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, prevFBO); + return; + } + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { + glDeleteFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, prevFBO); + return; + } + GLint oldViewport[4]; + glGetIntegerv(GL_VIEWPORT, oldViewport); + glViewport(0, 0, width, height); + GLint oldPackAlignment; + glGetIntegerv(GL_PACK_ALIGNMENT, &oldPackAlignment); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + glReadBuffer(GL_COLOR_ATTACHMENT0); + glReadPixels(0, 0, width, height, format, type, pixels); + glPixelStorei(GL_PACK_ALIGNMENT, oldPackAlignment); + glViewport(oldViewport[0], oldViewport[1], oldViewport[2], oldViewport[3]); + glDeleteFramebuffers(1, &fbo); + glBindFramebuffer(GL_FRAMEBUFFER, prevFBO); } \ 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 a09af20..ba1a165 100644 --- a/app/src/main/cpp/gl/texture.h +++ b/app/src/main/cpp/gl/texture.h @@ -12,6 +12,7 @@ extern "C" { #include "gl.h" struct texture_t { + GLenum target; GLuint texture; GLenum format; GLint swizzle_param[4]; @@ -36,6 +37,7 @@ GLAPI GLAPIENTRY void glTexParameteriv(GLenum target, GLenum pname, const GLint* GLAPI GLAPIENTRY void glGenerateTextureMipmap(GLuint texture); GLAPI GLAPIENTRY void glBindTexture(GLenum target, GLuint texture); GLAPI GLAPIENTRY void glDeleteTextures(GLsizei n, const GLuint *textures); +GLAPI GLAPIENTRY void glGetTexImage(GLenum target, GLint level, GLenum format, GLenum type, void* pixels); #ifdef __cplusplus }