Fix[gen]: add feature testing, implement glGetTexImage, fix atan2 in shaderconv
This commit is contained in:
parent
70a60a1098
commit
9c2ea5dc84
@ -16,10 +16,6 @@ typedef struct {
|
||||
|
||||
void basevertex_init(context_t* context) {
|
||||
basevertex_renderer_t *renderer = &context->basevertex;
|
||||
if(context->es32) {
|
||||
printf("LTW: BaseVertex render calls will use OpenGL ES 3.2 variants\n");
|
||||
return;
|
||||
}
|
||||
if(!context->es31) {
|
||||
printf("LTW: BaseVertex render calls not available: requires OpenGL ES 3.1\n");
|
||||
return;
|
||||
@ -46,12 +42,12 @@ static void restore_state(GLuint element_buffer) {
|
||||
es3_functions.glBindBuffer(GL_DRAW_INDIRECT_BUFFER, current_context->bound_buffers[get_buffer_index(GL_DRAW_INDIRECT_BUFFER)]);
|
||||
}
|
||||
|
||||
void glDrawElementsBaseVertex(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex) {
|
||||
void glDrawElementsBaseVertex(GLenum mode,
|
||||
GLsizei count,
|
||||
GLenum type,
|
||||
void *indices,
|
||||
GLint basevertex) {
|
||||
if(!current_context) return;
|
||||
if(current_context->es32) {
|
||||
es3_functions.glDrawElementsBaseVertex(mode, count, type, indices, basevertex);
|
||||
return;
|
||||
}
|
||||
basevertex_renderer_t *renderer = ¤t_context->basevertex;
|
||||
if(!renderer->ready) return;
|
||||
GLint elementbuffer;
|
||||
@ -87,12 +83,6 @@ void glMultiDrawElementsBaseVertex(GLenum mode,
|
||||
GLsizei drawcount,
|
||||
const GLint *basevertex) {
|
||||
if(!current_context) return;
|
||||
if(current_context->es32) {
|
||||
for(GLsizei i = 0; i < drawcount; i++) {
|
||||
es3_functions.glDrawElementsBaseVertex(mode, count[i], type, indices[i], basevertex[i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
basevertex_renderer_t *renderer = ¤t_context->basevertex;
|
||||
if(!renderer->ready) return;
|
||||
GLint elementbuffer;
|
||||
|
@ -3,4 +3,4 @@ GLESFUNC(glDrawElementsIndirect,PFNGLDRAWELEMENTSINDIRECTPROC)
|
||||
GLESFUNC(glMultiDrawArraysEXT,PFNGLMULTIDRAWARRAYSEXTPROC)
|
||||
GLESFUNC(glMultiDrawElementsEXT,PFNGLMULTIDRAWELEMENTSEXTPROC)
|
||||
GLESFUNC(glGetTexLevelParameteriv,PFNGLGETTEXLEVELPARAMETERIVPROC)
|
||||
GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERIVPROC)
|
||||
GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERFVPROC)
|
@ -32,11 +32,11 @@ void *glMapBuffer(GLenum target, GLenum access) {
|
||||
case GL_SHADER_STORAGE_BUFFER:
|
||||
// GL 4.4
|
||||
case GL_QUERY_BUFFER:
|
||||
printf("ERROR: glMapBuffer unsupported target=0x%x", target);
|
||||
printf("ERROR: glMapBuffer unsupported target=0x%x\n", target);
|
||||
break; // not supported for now
|
||||
case GL_DRAW_INDIRECT_BUFFER:
|
||||
case GL_TEXTURE_BUFFER:
|
||||
printf("ERROR: glMapBuffer unimplemented target=0x%x", target);
|
||||
printf("ERROR: glMapBuffer unimplemented target=0x%x\n", target);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -79,30 +79,49 @@ static int inline nlevel(int size, int level) {
|
||||
|
||||
static bool trigger_texlevelparameter = false;
|
||||
|
||||
static bool check_texlevelparameter() {
|
||||
if(current_context->es31) return true;
|
||||
if(trigger_texlevelparameter) return false;
|
||||
printf("glGetTexLevelParameter* functions are not supported below OpenGL ES 3.1\n");
|
||||
trigger_texlevelparameter = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void proxy_getlevelparameter(GLenum target, GLint level, GLenum pname, GLint *params) {
|
||||
switch (pname) {
|
||||
case GL_TEXTURE_WIDTH:
|
||||
(*params) = nlevel(current_context->proxy_width, level);
|
||||
break;
|
||||
case GL_TEXTURE_HEIGHT:
|
||||
(*params) = nlevel(current_context->proxy_height, level);
|
||||
break;
|
||||
case GL_TEXTURE_INTERNAL_FORMAT:
|
||||
(*params) = current_context->proxy_intformat;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params) {
|
||||
if(!current_context) return;
|
||||
if(isProxyTexture(target)) {
|
||||
GLint param = 0;
|
||||
proxy_getlevelparameter(target, level, pname, ¶m);
|
||||
*params = (GLfloat) param;
|
||||
return;
|
||||
}
|
||||
if(!check_texlevelparameter()) return;
|
||||
es3_functions.glGetTexLevelParameterfv(target, level, pname, params);
|
||||
}
|
||||
|
||||
void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) {
|
||||
if(!current_context) return;
|
||||
// NSLog("glGetTexLevelParameteriv(%x, %d, %x, %p)", target, level, pname, params);
|
||||
if (isProxyTexture(target)) {
|
||||
switch (pname) {
|
||||
case GL_TEXTURE_WIDTH:
|
||||
(*params) = nlevel(current_context->proxy_width, level);
|
||||
break;
|
||||
case GL_TEXTURE_HEIGHT:
|
||||
(*params) = nlevel(current_context->proxy_height, level);
|
||||
break;
|
||||
case GL_TEXTURE_INTERNAL_FORMAT:
|
||||
(*params) = current_context->proxy_intformat;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if(trigger_texlevelparameter) return;
|
||||
if(!current_context->es31) {
|
||||
printf("glGetTexLevelParameter* functions are not supported on your device");
|
||||
trigger_texlevelparameter = true;
|
||||
return;
|
||||
}
|
||||
es3_functions.glGetTexLevelParameteriv(target, level, pname, params);
|
||||
proxy_getlevelparameter(target, level, pname, params);
|
||||
return;
|
||||
}
|
||||
if(!check_texlevelparameter()) return;
|
||||
es3_functions.glGetTexLevelParameteriv(target, level, pname, params);
|
||||
|
||||
}
|
||||
|
||||
void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *data) {
|
||||
|
@ -72,8 +72,25 @@ void glGetTexImage( GLenum target,
|
||||
GLenum format,
|
||||
GLenum type,
|
||||
void * pixels) {
|
||||
//printf("glGetTexImage(%x, %i, %x, %x, %p)\n", target, level, format, type, pixels);
|
||||
printf("LTW: glGetTexImage is not supported yet\n");
|
||||
if(!current_context) return;
|
||||
if(!current_context->es31) goto unsupported_esver;
|
||||
if(format != GL_RGBA && format != GL_RGBA_INTEGER && type != GL_UNSIGNED_BYTE && type != GL_UNSIGNED_INT && type != GL_INT && type != GL_FLOAT) goto unsupported;
|
||||
framebuffer_copier_t* copier = ¤t_context->framebuffer_copier;
|
||||
GLint texture;
|
||||
es3_functions.glGetIntegerv(get_target_query_param(target), &texture);
|
||||
es3_functions.glBindFramebuffer(GL_READ_FRAMEBUFFER, copier->tempfb);
|
||||
es3_functions.glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target, texture, level);
|
||||
GLint w, h;
|
||||
es3_functions.glGetTexLevelParameteriv(target, level, GL_TEXTURE_WIDTH, &w);
|
||||
es3_functions.glGetTexLevelParameteriv(target, level, GL_TEXTURE_HEIGHT, &h);
|
||||
es3_functions.glReadPixels(0, 0, w, h, format, type, pixels);
|
||||
es3_functions.glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
|
||||
return;
|
||||
unsupported_esver:
|
||||
printf("LTW: glGetTexImage only supported on OpenGL ES 3.1");
|
||||
return;
|
||||
unsupported:
|
||||
printf("LTW: unsupported parameters for glGetTexImage");
|
||||
}
|
||||
|
||||
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data) {
|
||||
|
Reference in New Issue
Block a user