From 1e508e10d9ae649bfe5ab7b1842993be50052b21 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tapani=20P=C3=A4lli?= Date: Mon, 20 Nov 2017 15:00:19 +0200 Subject: [PATCH] mesa/gles: adjust internal format in glTexSubImage2D error checks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When floating point textures are created on OpenGL ES 2.0, driver is free to choose used internal format. Mesa makes this decision in adjust_for_oes_float_texture. Error checking for glTexImage2D properly checks that sized formats are not used. We use same error checking path for glTexSubImage2D (since there is lot of overlap), however since those checks include internalFormat checks, we need to pass original internalFormat passed by the client. Patch adds oes_float_internal_format that does reverse adjust_for_oes_float_texture to get that format. Fixes following test failure: ES2-CTS.gtf.GL2ExtensionTests.texture_float.texture_float (when running test with MESA_GLES_VERSION_OVERRIDE=2.0) Signed-off-by: Tapani Pälli Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=103227 Cc: "17.3" Reviewed-by: Matt Turner --- src/mesa/main/teximage.c | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 3f3fcf6f84b..41de966d793 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -122,6 +122,56 @@ adjust_for_oes_float_texture(const struct gl_context *ctx, return format; } +/** + * Returns a corresponding base format for a given internal floating point + * format as specifed by OES_texture_float. + */ +static GLenum +oes_float_internal_format(const struct gl_context *ctx, + GLenum format, GLenum type) +{ + switch (type) { + case GL_FLOAT: + if (ctx->Extensions.OES_texture_float) { + switch (format) { + case GL_RGBA32F: + return GL_RGBA; + case GL_RGB32F: + return GL_RGB; + case GL_ALPHA32F_ARB: + return GL_ALPHA; + case GL_LUMINANCE32F_ARB: + return GL_LUMINANCE; + case GL_LUMINANCE_ALPHA32F_ARB: + return GL_LUMINANCE_ALPHA; + default: + break; + } + } + break; + + case GL_HALF_FLOAT_OES: + if (ctx->Extensions.OES_texture_half_float) { + switch (format) { + case GL_RGBA16F: + return GL_RGBA; + case GL_RGB16F: + return GL_RGB; + case GL_ALPHA16F_ARB: + return GL_ALPHA; + case GL_LUMINANCE16F_ARB: + return GL_LUMINANCE; + case GL_LUMINANCE_ALPHA16F_ARB: + return GL_LUMINANCE_ALPHA; + default: + break; + } + } + break; + } + return format; +} + /** * Install gl_texture_image in a gl_texture_object according to the target @@ -2173,6 +2223,10 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions, return GL_TRUE; } + GLenum internalFormat = _mesa_is_gles(ctx) ? + oes_float_internal_format(ctx, texImage->InternalFormat, type) : + texImage->InternalFormat; + /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the * combinations of format, internalFormat, and type that can be used. * Formats and types that require additional extensions (e.g., GL_FLOAT @@ -2180,7 +2234,7 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions, */ if (_mesa_is_gles(ctx) && texture_format_error_check_gles(ctx, format, type, - texImage->InternalFormat, + internalFormat, dimensions, callerName)) { return GL_TRUE; } -- 2.30.2