This commit is contained in:
Tungstend 2025-02-04 01:28:19 +08:00
parent b9ebae2bfd
commit bf31bd93a6
7 changed files with 176 additions and 43 deletions

View File

@ -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()

View File

@ -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

View File

@ -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);
}

View File

@ -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)

View File

@ -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());

View File

@ -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<GLenum*>(&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<GLenum*>(&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<GLenum*>(&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, &currentTexture);
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<GLuint>(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);
}

View File

@ -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
}