Fix[gen]: add feature testing, implement glGetTexImage, fix atan2 in shaderconv
This commit is contained in:
parent
065544502a
commit
f7f9a81572
@ -16,6 +16,10 @@ typedef struct {
|
|||||||
|
|
||||||
void basevertex_init(context_t* context) {
|
void basevertex_init(context_t* context) {
|
||||||
basevertex_renderer_t *renderer = &context->basevertex;
|
basevertex_renderer_t *renderer = &context->basevertex;
|
||||||
|
if(!context->es31) {
|
||||||
|
printf("LTW: BaseVertex render calls not available: requires OpenGL ES 3.1\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
es3_functions.glGenBuffers(1, &renderer->indirectRenderBuffer);
|
es3_functions.glGenBuffers(1, &renderer->indirectRenderBuffer);
|
||||||
GLenum error = es3_functions.glGetError();
|
GLenum error = es3_functions.glGetError();
|
||||||
if(error != GL_NO_ERROR) {
|
if(error != GL_NO_ERROR) {
|
||||||
|
@ -3,4 +3,4 @@ GLESFUNC(glDrawElementsIndirect,PFNGLDRAWELEMENTSINDIRECTPROC)
|
|||||||
GLESFUNC(glMultiDrawArraysEXT,PFNGLMULTIDRAWARRAYSEXTPROC)
|
GLESFUNC(glMultiDrawArraysEXT,PFNGLMULTIDRAWARRAYSEXTPROC)
|
||||||
GLESFUNC(glMultiDrawElementsEXT,PFNGLMULTIDRAWELEMENTSEXTPROC)
|
GLESFUNC(glMultiDrawElementsEXT,PFNGLMULTIDRAWELEMENTSEXTPROC)
|
||||||
GLESFUNC(glGetTexLevelParameteriv,PFNGLGETTEXLEVELPARAMETERIVPROC)
|
GLESFUNC(glGetTexLevelParameteriv,PFNGLGETTEXLEVELPARAMETERIVPROC)
|
||||||
GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERIVPROC)
|
GLESFUNC(glGetTexLevelParameterfv,PFNGLGETTEXLEVELPARAMETERFVPROC)
|
@ -35,6 +35,7 @@ void glDepthRange(GLdouble nearVal,
|
|||||||
GLESOVERRIDE(glClearDepth)
|
GLESOVERRIDE(glClearDepth)
|
||||||
GLESOVERRIDE(glMapBuffer)
|
GLESOVERRIDE(glMapBuffer)
|
||||||
GLESOVERRIDE(glGetTexLevelParameteriv)
|
GLESOVERRIDE(glGetTexLevelParameteriv)
|
||||||
|
GLESOVERRIDE(glGetTexLevelParameterfv)
|
||||||
GLESOVERRIDE(glCreateShader)
|
GLESOVERRIDE(glCreateShader)
|
||||||
GLESOVERRIDE(glDeleteShader)
|
GLESOVERRIDE(glDeleteShader)
|
||||||
GLESOVERRIDE(glShaderSource)
|
GLESOVERRIDE(glShaderSource)
|
||||||
|
@ -792,7 +792,8 @@ const char* const operator_glsl_strs[] = {
|
|||||||
"vector_extract_TODO",
|
"vector_extract_TODO",
|
||||||
"interpolate_at_offse_TODOt",
|
"interpolate_at_offse_TODOt",
|
||||||
"interpolate_at_sample_TODO",
|
"interpolate_at_sample_TODO",
|
||||||
"atan2",
|
// NOTE: atan2 operation, replaced with atan(x,y)
|
||||||
|
"atan",
|
||||||
"fma",
|
"fma",
|
||||||
"mix", // lrp ?
|
"mix", // lrp ?
|
||||||
"csel",
|
"csel",
|
||||||
@ -937,7 +938,8 @@ const char* const operator_glsl_enum_strs[] = {
|
|||||||
"vector_extract",
|
"vector_extract",
|
||||||
"interpolate_at_offset",
|
"interpolate_at_offset",
|
||||||
"interpolate_at_sample",
|
"interpolate_at_sample",
|
||||||
"atan2",
|
// NOTE: atan2 operation, replaced with atan(x,y)
|
||||||
|
"atan",
|
||||||
"fma",
|
"fma",
|
||||||
"lrp",
|
"lrp",
|
||||||
"csel",
|
"csel",
|
||||||
@ -961,7 +963,7 @@ static bool is_binop_func_like(ir_expression_operation op, const glsl_type* type
|
|||||||
{
|
{
|
||||||
if (op == ir_binop_equal ||
|
if (op == ir_binop_equal ||
|
||||||
op == ir_binop_nequal ||
|
op == ir_binop_nequal ||
|
||||||
op == ir_binop_mod ||
|
op == ir_binop_mod || op == ir_binop_atan2 ||
|
||||||
(op >= ir_binop_dot && op <= ir_binop_pow))
|
(op >= ir_binop_dot && op <= ir_binop_pow))
|
||||||
return true;
|
return true;
|
||||||
if (type->is_vector() && (op >= ir_binop_less && op <= ir_binop_nequal))
|
if (type->is_vector() && (op >= ir_binop_less && op <= ir_binop_nequal))
|
||||||
|
@ -227,7 +227,6 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
|
|||||||
* outside the compatibility contexts of 3.x.
|
* outside the compatibility contexts of 3.x.
|
||||||
*/
|
*/
|
||||||
this->num_supported_versions = 0;
|
this->num_supported_versions = 0;
|
||||||
printf("mesa_glsl: is_desktop=%i GLSLVersion=%i\n", _mesa_is_desktop_gl(ctx), ctx->Const.GLSLVersion);
|
|
||||||
if (_mesa_is_desktop_gl(ctx)) {
|
if (_mesa_is_desktop_gl(ctx)) {
|
||||||
for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) {
|
for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) {
|
||||||
if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) {
|
if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) {
|
||||||
|
@ -32,11 +32,11 @@ void *glMapBuffer(GLenum target, GLenum access) {
|
|||||||
case GL_SHADER_STORAGE_BUFFER:
|
case GL_SHADER_STORAGE_BUFFER:
|
||||||
// GL 4.4
|
// GL 4.4
|
||||||
case GL_QUERY_BUFFER:
|
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
|
break; // not supported for now
|
||||||
case GL_DRAW_INDIRECT_BUFFER:
|
case GL_DRAW_INDIRECT_BUFFER:
|
||||||
case GL_TEXTURE_BUFFER:
|
case GL_TEXTURE_BUFFER:
|
||||||
printf("ERROR: glMapBuffer unimplemented target=0x%x", target);
|
printf("ERROR: glMapBuffer unimplemented target=0x%x\n", target);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,10 +79,15 @@ static int inline nlevel(int size, int level) {
|
|||||||
|
|
||||||
static bool trigger_texlevelparameter = false;
|
static bool trigger_texlevelparameter = false;
|
||||||
|
|
||||||
void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params) {
|
static bool check_texlevelparameter() {
|
||||||
if(!current_context) return;
|
if(current_context->es31) return true;
|
||||||
// NSLog("glGetTexLevelParameteriv(%x, %d, %x, %p)", target, level, pname, params);
|
if(trigger_texlevelparameter) return false;
|
||||||
if (isProxyTexture(target)) {
|
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) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_WIDTH:
|
case GL_TEXTURE_WIDTH:
|
||||||
(*params) = nlevel(current_context->proxy_width, level);
|
(*params) = nlevel(current_context->proxy_width, level);
|
||||||
@ -94,15 +99,29 @@ void glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *p
|
|||||||
(*params) = current_context->proxy_intformat;
|
(*params) = current_context->proxy_intformat;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
if(trigger_texlevelparameter) return;
|
|
||||||
if(!current_context->es31) {
|
void glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params) {
|
||||||
printf("glGetTexLevelParameter* functions are not supported on your device");
|
if(!current_context) return;
|
||||||
trigger_texlevelparameter = true;
|
if(isProxyTexture(target)) {
|
||||||
|
GLint param = 0;
|
||||||
|
proxy_getlevelparameter(target, level, pname, ¶m);
|
||||||
|
*params = (GLfloat) param;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
es3_functions.glGetTexLevelParameteriv(target, level, pname, params);
|
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;
|
||||||
|
if (isProxyTexture(target)) {
|
||||||
|
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) {
|
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 format,
|
||||||
GLenum type,
|
GLenum type,
|
||||||
void * pixels) {
|
void * pixels) {
|
||||||
//printf("glGetTexImage(%x, %i, %x, %x, %p)\n", target, level, format, type, pixels);
|
if(!current_context) return;
|
||||||
printf("LTW: glGetTexImage is not supported yet\n");
|
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) {
|
void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid * data) {
|
||||||
|
@ -170,7 +170,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const*string, co
|
|||||||
target_string[target_length] = 0;
|
target_string[target_length] = 0;
|
||||||
|
|
||||||
#undef SRC_LEN
|
#undef SRC_LEN
|
||||||
GLchar* new_source = optimize_shader(target_string, shader_info->shader_type == GL_VERTEX_SHADER, 410, 300);
|
GLchar* new_source = optimize_shader(target_string, shader_info->shader_type == GL_VERTEX_SHADER, 460, 300);
|
||||||
//printf("\n\n\nShader Result\n%s\n\n\n", new_source);
|
//printf("\n\n\nShader Result\n%s\n\n\n", new_source);
|
||||||
if(shader_info->source != NULL) free((void*)shader_info->source);
|
if(shader_info->source != NULL) free((void*)shader_info->source);
|
||||||
shader_info->source = new_source;
|
shader_info->source = new_source;
|
||||||
|
Reference in New Issue
Block a user