Merge branch 'sdl_android' of github.com:pelya/commandergenius into sdl_android

This commit is contained in:
Gerhard Stein
2017-02-05 15:15:23 +01:00
6 changed files with 81 additions and 65 deletions

View File

@@ -9,7 +9,8 @@ GLenum gl4es_glGetError() {
if(globals4es.noerror)
return GL_NO_ERROR;
if (glstate->shim_error) {
GLenum tmp = glstate->last_error;
GLenum tmp = gles_glGetError(); // to purge GLES error stack
tmp = glstate->last_error;
glstate->last_error = GL_NO_ERROR;
return tmp;
}

View File

@@ -276,13 +276,13 @@ void gl4es_glEnable(GLenum cap) {
}
}
PUSH_IF_COMPILING(glEnable)
#ifdef TEXSTREAM
if (globals4es.texstream && (cap==GL_TEXTURE_2D)) {
if (glstate->texture.bound[glstate->texture.active][ENABLED_TEX2D])
if (glstate->texture.bound[glstate->texture.active][ENABLED_TEX2D]->streamed)
cap = GL_TEXTURE_STREAM_IMG;
}
#endif
LOAD_GLES(glEnable);
proxy_glEnable(cap, true, gles_glEnable);
}
@@ -502,6 +502,10 @@ static inline bool should_intercept_render(GLenum mode) {
if (glstate->enable.texture[aa]) {
if ((glstate->enable.texgen_s[aa] || glstate->enable.texgen_t[aa] || glstate->enable.texgen_r[aa] || glstate->enable.texgen_q[aa]))
return true;
if ((!glstate->vao->tex_coord_array[aa]) && !(mode==GL_POINT && glstate->texture.pscoordreplace[aa]))
return true;
if ((glstate->vao->tex_coord_array[aa]) && (glstate->vao->pointers.tex_coord[aa].size == 1))
return true;
}
}
if(glstate->polygon_mode == GL_LINE && mode>=GL_TRIANGLES)
@@ -513,7 +517,7 @@ static inline bool should_intercept_render(GLenum mode) {
return (
(glstate->vao->vertex_array && ! valid_vertex_type(glstate->vao->pointers.vertex.type)) ||
(mode == GL_LINES && glstate->enable.line_stipple) ||
(mode == GL_QUADS) || (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
/*(mode == GL_QUADS) ||*/ (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
);
}
@@ -568,7 +572,7 @@ void gl4es_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
return;
}
if (should_intercept_render(mode)) {
if (should_intercept_render(mode) || (mode==GL_QUADS)) {
renderlist_t *list = NULL;
GLsizei min, max;
@@ -599,6 +603,7 @@ void gl4es_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
LOAD_GLES(glDisable);
LOAD_GLES(glEnableClientState);
LOAD_GLES(glDisableClientState);
LOAD_GLES(glMultiTexCoord4f);
GLuint len = 0;
for (int i=0; i<count; i++)
if (len<sindices[i]) len = sindices[i]; // get the len of the arrays
@@ -638,7 +643,7 @@ void gl4es_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
gles_glVertexPointer(glstate->vao->pointers.vertex.size, glstate->vao->pointers.vertex.type, glstate->vao->pointers.vertex.stride, glstate->vao->pointers.vertex.pointer);
GLuint old_tex = glstate->texture.client;
#define TEXTURE(A) gl4es_glClientActiveTexture(A+GL_TEXTURE0);
for (int aa=0; aa<MAX_TEX; aa++) {
for (int aa=0; aa<hardext.maxtex; aa++) {
client_state(tex_coord_array[aa], GL_TEXTURE_COORD_ARRAY, TEXTURE(aa););
// get 1st enabled target
const GLint itarget = get_target(glstate->enable.texture[aa]);
@@ -650,7 +655,13 @@ void gl4es_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
if (glstate->vao->tex_coord_array[aa]) {
TEXTURE(aa);
tex_setup_texcoord(len, itarget);
}
} else
gles_glMultiTexCoord4f(GL_TEXTURE0+aa, glstate->texcoord[aa][0], glstate->texcoord[aa][1], glstate->texcoord[aa][2], glstate->texcoord[aa][3]);
} else if (glstate->clientstate.tex_coord_array[aa]) {
// special case, Tex disable but CoordArray enabled... disabling it temporarly
TEXTURE(aa);
glstate->clientstate.tex_coord_array[aa] = 0;
gles_glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
if (glstate->texture.client!=old_tex)
@@ -658,7 +669,7 @@ void gl4es_glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid
// POLYGON mode as LINE is "intercepted" and drawn using list
gles_glDrawElements(mode, count, GL_UNSIGNED_SHORT, sindices);
for (int aa=0; aa<MAX_TEX; aa++) {
for (int aa=0; aa<hardext.maxtex; aa++) {
if (!IS_TEX2D(glstate->enable.texture[aa]) && (IS_ANYTEX(glstate->enable.texture[aa]))) {
TEXTURE(aa);
gles_glDisable(GL_TEXTURE_2D);
@@ -706,6 +717,7 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
LOAD_GLES(glDisable);
LOAD_GLES(glEnableClientState);
LOAD_GLES(glDisableClientState);
LOAD_GLES(glMultiTexCoord4f);
if (glstate->list.active && (glstate->list.compiling || glstate->gl_batch)) {
NewStage(glstate->list.active, STAGE_DRAW);
@@ -719,31 +731,6 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
if (glstate->polygon_mode == GL_POINT && mode>=GL_TRIANGLES)
mode = GL_POINTS;
if (glstate->polygon_mode != GL_LINES && mode==GL_QUADS) {
static GLushort *indices = NULL;
static int indcnt = 0;
if(indcnt < count+first) {
indcnt = count + first;
if (indices) free(indices);
indices = (GLushort*)malloc(sizeof(GLushort)*(indcnt*3/2));
for (int i=0, j=0; i+3<indcnt; i+=4, j+=6) {
indices[j+0] = i+0;
indices[j+1] = i+1;
indices[j+2] = i+2;
indices[j+3] = i+0;
indices[j+4] = i+2;
indices[j+5] = i+3;
}
}
// take care of vao elements, just in case
glbuffer_t *old_vao_elements = glstate->vao->elements;
glstate->vao->elements = NULL;
gl4es_glDrawElements(GL_TRIANGLES, count*3/2, GL_UNSIGNED_SHORT, indices+first*3/2);
glstate->vao->elements = old_vao_elements;
return;
}
if (should_intercept_render(mode)) {
renderlist_t *list;
list = arrays_to_renderlist(NULL, mode, first, count+first);
@@ -751,6 +738,35 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
draw_renderlist(list);
free_renderlist(list);
} else {
if (mode==GL_QUADS) {
static GLushort *indices = NULL;
static int indcnt = 0;
static int indfirst = 0;
if((indcnt < count) || (indfirst!=first)) {
if(indcnt < count) {
indcnt = count;
if (indices) free(indices);
indices = (GLushort*)malloc(sizeof(GLushort)*(indcnt*3/2));
}
indfirst = first;
for (int i=0, j=0; i+3<indcnt; i+=4, j+=6) {
indices[j+0] = indfirst + i+0;
indices[j+1] = indfirst + i+1;
indices[j+2] = indfirst + i+2;
indices[j+3] = indfirst + i+0;
indices[j+4] = indfirst + i+2;
indices[j+5] = indfirst + i+3;
}
}
// take care of vao elements, just in case
glbuffer_t *old_vao_elements = glstate->vao->elements;
glstate->vao->elements = NULL;
gl4es_glDrawElements(GL_TRIANGLES, count*3/2, GL_UNSIGNED_SHORT, indices);
glstate->vao->elements = old_vao_elements;
return;
}
LOAD_GLES(glDrawArrays);
GLenum mode_init = mode;
@@ -774,7 +790,7 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
gles_glVertexPointer(glstate->vao->pointers.vertex.size, glstate->vao->pointers.vertex.type, glstate->vao->pointers.vertex.stride, glstate->vao->pointers.vertex.pointer);
GLuint old_tex = glstate->texture.client;
#define TEXTURE(A) gl4es_glClientActiveTexture(A+GL_TEXTURE0);
for (int aa=0; aa<MAX_TEX; aa++) {
for (int aa=0; aa<hardext.maxtex; aa++) {
client_state(tex_coord_array[aa], GL_TEXTURE_COORD_ARRAY, TEXTURE(aa););
// get 1st enabled target
const GLint itarget = get_target(glstate->enable.texture[aa]);
@@ -786,9 +802,13 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
if (glstate->vao->tex_coord_array[aa]) {
TEXTURE(aa);
tex_setup_texcoord(count+first, itarget);
/*glClientActiveTexture(aa+GL_TEXTURE0);
gles_glTexCoordPointer(glstate->pointers.tex_coord[aa].size, glstate->pointers.tex_coord[aa].type, glstate->pointers.tex_coord[aa].stride, glstate->pointers.tex_coord[aa].pointer);*/
}
} else
gles_glMultiTexCoord4f(GL_TEXTURE0+aa, glstate->texcoord[aa][0], glstate->texcoord[aa][1], glstate->texcoord[aa][2], glstate->texcoord[aa][3]);
} else if (glstate->clientstate.tex_coord_array[aa]) {
// special case, Tex disable but CoordArray enabled... disabling it temporarly
TEXTURE(aa);
glstate->clientstate.tex_coord_array[aa] = 0;
gles_glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
if (glstate->texture.client!=old_tex)
@@ -796,7 +816,7 @@ void gl4es_glDrawArrays(GLenum mode, GLint first, GLsizei count) {
gles_glDrawArrays(mode, first, count);
for (int aa=0; aa<MAX_TEX; aa++) {
for (int aa=0; aa<hardext.maxtex; aa++) {
if (!IS_TEX2D(glstate->enable.texture[aa]) && (IS_ANYTEX(glstate->enable.texture[aa]))) {
TEXTURE(aa);
gles_glDisable(GL_TEXTURE_2D);
@@ -1660,9 +1680,10 @@ void glPointParameterfv(GLenum pname, const GLfloat * params) AliasExport("gl4es
void gl4es_glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount)
{
LOAD_GLES_EXT(glMultiDrawArrays);
if((!gles_glMultiDrawArrays) || should_intercept_render(mode) || (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
if((!gles_glMultiDrawArrays) || should_intercept_render(mode) || (mode==GL_QUADS) || (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
|| (glstate->render_mode == GL_SELECT) || ((glstate->polygon_mode == GL_LINE) || (glstate->polygon_mode == GL_POINT)) )
{
// GL_QUADS special case can probably by improved
// divide the call
// TODO optimize with forcing Batch mode
for (int i=0; i<primcount; i++)
@@ -1681,7 +1702,7 @@ void glMultiDrawArrays(GLenum mode, const GLint *first, const GLsizei *count, GL
void gl4es_glMultiDrawElements( GLenum mode, GLsizei *count, GLenum type, const void * const *indices, GLsizei primcount)
{
LOAD_GLES_EXT(glMultiDrawElements);
if((!gles_glMultiDrawElements) || should_intercept_render(mode) || (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
if((!gles_glMultiDrawElements) || should_intercept_render(mode) || (mode==GL_QUADS) || (glstate->list.active && (glstate->list.compiling || glstate->gl_batch))
|| (glstate->render_mode == GL_SELECT) || ((glstate->polygon_mode == GL_LINE) || (glstate->polygon_mode == GL_POINT)) || (type != GL_UNSIGNED_SHORT) )
{
// divide the call

View File

@@ -681,12 +681,13 @@ void adjust_renderlist(renderlist_t *list) {
list->stage = STAGE_LAST;
list->open = false;
for (int a=0; a<hardext.maxtex; a++) {
gltexture_t *bound = glstate->texture.bound[a][ENABLED_TEX2D]; //TODO check if hardcoded TEX2D is ok
const GLint itarget = get_target(glstate->enable.texture[a]);
gltexture_t *bound = glstate->texture.bound[a][itarget];
// in case of Texture bounding inside a list
if (list->set_texture && (list->tmu == a))
bound = gl4es_getTexture(list->target_texture, list->texture);
// GL_ARB_texture_rectangle
if ((list->tex[a]) && glstate->texture.rect_arb[a] && (bound)) {
if ((list->tex[a]) && (itarget == ENABLED_TEXTURE_RECTANGLE) && (bound)) {
tex_coord_rect_arb(list->tex[a], list->len, bound->width, bound->height);
}
}

View File

@@ -51,8 +51,6 @@ typedef struct {
pack_skip_rows,
pack_image_height;
GLboolean pack_lsb_first;
// TODO: do we only need to worry about GL_TEXTURE_2D?
GLboolean rect_arb[MAX_TEX];
gltexture_t *bound[MAX_TEX][ENABLED_TEXTURE_LAST];
GLboolean pscoordreplace[MAX_TEX];
khash_t(tex) *list;

View File

@@ -88,7 +88,7 @@ void tex_setup_texcoord(GLuint len, GLuint itarget) {
// check if some changes are needed
int changes = 0;
if ((glstate->texture.rect_arb[texunit])
if ((itarget == ENABLED_TEXTURE_RECTANGLE)
|| (bound && ((bound->width!=bound->nwidth)||(bound->height!=bound->nheight)
)) || !(globals4es.texmat || glstate->texture_matrix[texunit]->identity)
)
@@ -102,7 +102,7 @@ void tex_setup_texcoord(GLuint len, GLuint itarget) {
}
copy_gl_pointer_tex_noalloc(tex[texunit], &glstate->vao->pointers.tex_coord[texunit], 4, 0, len);
// Normalize if needed
if ((glstate->texture.rect_arb[texunit]))
if (itarget == ENABLED_TEXTURE_RECTANGLE)
tex_coord_rect_arb(tex[texunit], len, bound->width, bound->height);
// Apply transformation matrix if any
if (!(globals4es.texmat || glstate->texture_matrix[texunit]->identity))
@@ -940,8 +940,8 @@ void gl4es_glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoff
errorGL();
}
if (bound && bound->mipmap_need && !bound->mipmap_auto && (globals4es.automipmap!=3) && (!globals4es.texstream || (globals4es.texstream && !bound->streamed)))
gles_glTexParameteri( target, GL_GENERATE_MIPMAP, GL_FALSE );
/*if (bound && bound->mipmap_need && !bound->mipmap_auto && (globals4es.automipmap!=3) && (!globals4es.texstream || (globals4es.texstream && !bound->streamed)))
gles_glTexParameteri( target, GL_GENERATE_MIPMAP, GL_FALSE );*/
if ((target==GL_TEXTURE_2D) && globals4es.texcopydata && bound && ((globals4es.texstream && !bound->streamed) || !globals4es.texstream)) {
//printf("*texcopy* glTexSubImage2D, xy=%i,%i, size=%i,%i=>%i,%i, format=%s, type=%s, tex=%u\n", xoffset, yoffset, width, height, bound->width, bound->height, PrintEnum(format), PrintEnum(type), bound->glname);
@@ -1173,7 +1173,6 @@ tex_changed=1; // seems buggy, temporary disabling that...
}
#endif
glstate->texture.rect_arb[glstate->texture.active] = (target == GL_TEXTURE_RECTANGLE_ARB);
target = map_tex_target(target);
glstate->texture.bound[glstate->texture.active][itarget] = tex;
@@ -1373,28 +1372,20 @@ void gl4es_glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GL
case GL_TEXTURE_WIDTH:
if (target==GL_PROXY_TEXTURE_2D)
(*params) = nlevel(proxy_width,level);
else
else {
(*params) = nlevel((bound)?bound->width:2048,level);
/*if(bound && ((bound->orig_internal==GL_COMPRESSED_RGB) || (bound->orig_internal==GL_COMPRESSED_RGBA))) {
if (*params<4) // minimum size of a compressed block is 4
*params = 0;
} else {
if (*params<=0) // 1 is the minimum, not 0
*params = 1;
}*/
if(level && (!bound || (bound && !(bound->mipmap_auto || bound->mipmap_need))))
(*params) = 0; // Mipmap level not loaded
}
break;
case GL_TEXTURE_HEIGHT:
if (target==GL_PROXY_TEXTURE_2D)
(*params) = nlevel(proxy_height,level);
else
else {
(*params) = nlevel((bound)?bound->height:2048,level);
/*if(bound && ((bound->orig_internal==GL_COMPRESSED_RGB) || (bound->orig_internal==GL_COMPRESSED_RGBA))) {
if (*params<4) // minimum size of a compressed block is 4
*params = 0;
} else {
if (*params<=0) // 1 is the minimum, not 0, but only on uncompressed textures
*params = 1;
}*/
if(level && (!bound || (bound && !(bound->mipmap_auto || bound->mipmap_need))))
(*params) = 0; // Mipmap level not loaded
}
break;
case GL_TEXTURE_INTERNAL_FORMAT:
if (target==GL_PROXY_TEXTURE_2D)

View File

@@ -97,6 +97,7 @@ typedef enum {
ENABLED_TEX1D = 0,
ENABLED_TEX2D,
ENABLED_TEX3D,
ENABLED_TEXTURE_RECTANGLE,
ENABLED_CUBE_MAP,
ENABLED_TEXTURE_LAST
} texture_enabled_t;
@@ -161,6 +162,7 @@ static inline GLuint what_target(GLenum target) {
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
return ENABLED_CUBE_MAP;
case GL_TEXTURE_RECTANGLE_ARB:
return ENABLED_TEXTURE_RECTANGLE;
case GL_TEXTURE_2D:
default:
return ENABLED_TEX2D;
@@ -172,6 +174,8 @@ static inline GLenum to_target(GLuint itarget) {
return GL_TEXTURE_1D;
case ENABLED_TEX3D:
return GL_TEXTURE_3D;
case ENABLED_TEXTURE_RECTANGLE:
return GL_TEXTURE_RECTANGLE_ARB;
case ENABLED_CUBE_MAP:
return GL_TEXTURE_CUBE_MAP;
case ENABLED_TEX2D: