This commit is contained in:
Tungstend 2025-02-02 23:57:23 +08:00
parent eddeee203f
commit 7884289a21
8 changed files with 228 additions and 34 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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), &currentTex);
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, &currentTexture);
glBindTexture(target, texture);
glGenerateMipmap(target);
glBindTexture(target, currentTexture);
}

View File

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

View File

@ -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,...) \