mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-20 09:44:51 -04:00
sync
This commit is contained in:
parent
eddeee203f
commit
7884289a21
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include <unordered_map>
|
||||
#include <android/log.h>
|
||||
|
||||
#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<GLuint, texture_t> 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<GLenum *>(&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<GLenum *>(&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<GLenum *>(&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<GLenum*>(&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<GLenum*>(&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<GLenum*>(&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);
|
||||
}
|
@ -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
|
@ -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,...) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user