mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-22 10:42:11 -04:00
sync
This commit is contained in:
parent
b9ebae2bfd
commit
bf31bd93a6
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
|
@ -20,8 +20,6 @@
|
||||
|
||||
#define DEBUG 0
|
||||
|
||||
const GLenum GLUBYTE = GL_UNSIGNED_BYTE;
|
||||
|
||||
int nlevel(int size, int level) {
|
||||
if(size) {
|
||||
size>>=level;
|
||||
@ -58,37 +56,45 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
*format = GL_RGBA;
|
||||
switch (*internal_format) {
|
||||
case GL_DEPTH_COMPONENT16:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_SHORT;
|
||||
break;
|
||||
|
||||
case GL_DEPTH_COMPONENT24:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_INT;
|
||||
break;
|
||||
|
||||
case GL_DEPTH_COMPONENT32:
|
||||
*internal_format = GL_DEPTH_COMPONENT32F;
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_DEPTH_COMPONENT32F:
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_DEPTH_COMPONENT:
|
||||
*internal_format = GL_DEPTH_COMPONENT32F;
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_DEPTH_STENCIL:
|
||||
*internal_format = GL_DEPTH32F_STENCIL8;
|
||||
if(type)
|
||||
*type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
|
||||
break;
|
||||
|
||||
case GL_RGB10_A2:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_INT_2_10_10_10_REV;
|
||||
break;
|
||||
|
||||
case GL_RGB5_A1:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_SHORT_5_5_5_1;
|
||||
break;
|
||||
|
||||
@ -98,6 +104,7 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
break;
|
||||
|
||||
case GL_SRGB8:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
|
||||
@ -105,14 +112,17 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
case GL_RGB32F:
|
||||
case GL_RG32F:
|
||||
case GL_R32F:
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_RGB9_E5:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_INT_5_9_9_9_REV;
|
||||
break;
|
||||
|
||||
case GL_R11F_G11F_B10F:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_INT_10F_11F_11F_REV;
|
||||
if (format)
|
||||
*format = GL_RGB;
|
||||
@ -122,6 +132,7 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
case GL_RGB32UI:
|
||||
case GL_RG32UI:
|
||||
case GL_R32UI:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_INT;
|
||||
break;
|
||||
|
||||
@ -129,6 +140,7 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
case GL_RGB32I:
|
||||
case GL_RG32I:
|
||||
case GL_R32I:
|
||||
if(type)
|
||||
*type = GL_INT;
|
||||
break;
|
||||
|
||||
@ -138,20 +150,24 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
checked_rgba16 = true;
|
||||
}
|
||||
if (support_rgba16) {
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_SHORT;
|
||||
} else {
|
||||
*internal_format = GL_RGBA16F;
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case GL_RGBA8:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_BYTE;
|
||||
if (format)
|
||||
*format = GL_RGBA;
|
||||
break;
|
||||
|
||||
case GL_RGBA:
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_BYTE;
|
||||
if (format)
|
||||
*format = GL_RGBA;
|
||||
@ -159,28 +175,33 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
|
||||
case GL_RGBA16F:
|
||||
case GL_R16F:
|
||||
if(type)
|
||||
*type = GL_HALF_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_R16:
|
||||
*internal_format = GL_R16F;
|
||||
if(type)
|
||||
*type = GL_FLOAT;
|
||||
break;
|
||||
|
||||
case GL_RGB16:
|
||||
*internal_format = GL_RGB16F;
|
||||
if(type)
|
||||
*type = GL_HALF_FLOAT;
|
||||
if(format)
|
||||
*format = GL_RGB;
|
||||
break;
|
||||
|
||||
case GL_RGB16F:
|
||||
if(type)
|
||||
*type = GL_HALF_FLOAT;
|
||||
if(format)
|
||||
*format = GL_RGB;
|
||||
break;
|
||||
|
||||
case GL_RG16F:
|
||||
if(type)
|
||||
*type = GL_HALF_FLOAT;
|
||||
if(format)
|
||||
*format = GL_RG;
|
||||
@ -189,27 +210,30 @@ void internal_convert(GLenum* internal_format, GLenum* type, GLenum* format) {
|
||||
case GL_R8:
|
||||
if (format)
|
||||
*format = GL_RED;
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case GL_R8UI:
|
||||
if (format)
|
||||
*format = GL_RED_INTEGER;
|
||||
if(type)
|
||||
*type = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
|
||||
case GL_RGB8_SNORM:
|
||||
case GL_RGBA8_SNORM:
|
||||
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, ¤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<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);
|
||||
}
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user