From 2e8e1e89090ddfc95ae3b732b7b810d68c3217e5 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sun, 22 May 2016 16:09:53 -0400 Subject: [PATCH] main: check driver float texture support before upgrading to 16F/32F When passing in GL_RGBA or other base formats, we will try to upgrade the format to whatever the passed in type was. However not all drivers (notably nv30) support 32F textures, and so this would lead to crashes down the line. Only upgrade when the relevant extensions are available. Signed-off-by: Ilia Mirkin Reviewed-by: Dave Airlie --- src/mesa/main/teximage.c | 61 ++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c index 7cf15f5be63..9da3be65466 100644 --- a/src/mesa/main/teximage.c +++ b/src/mesa/main/teximage.c @@ -72,40 +72,45 @@ * For example, given base format GL_RGBA, type GL_Float return GL_RGBA32F_ARB. */ static GLenum -adjust_for_oes_float_texture(GLenum format, GLenum type) +adjust_for_oes_float_texture(const struct gl_context *ctx, + GLenum format, GLenum type) { switch (type) { case GL_FLOAT: - switch (format) { - case GL_RGBA: - return GL_RGBA32F; - case GL_RGB: - return GL_RGB32F; - case GL_ALPHA: - return GL_ALPHA32F_ARB; - case GL_LUMINANCE: - return GL_LUMINANCE32F_ARB; - case GL_LUMINANCE_ALPHA: - return GL_LUMINANCE_ALPHA32F_ARB; - default: - break; + if (ctx->Extensions.OES_texture_float) { + switch (format) { + case GL_RGBA: + return GL_RGBA32F; + case GL_RGB: + return GL_RGB32F; + case GL_ALPHA: + return GL_ALPHA32F_ARB; + case GL_LUMINANCE: + return GL_LUMINANCE32F_ARB; + case GL_LUMINANCE_ALPHA: + return GL_LUMINANCE_ALPHA32F_ARB; + default: + break; + } } break; case GL_HALF_FLOAT_OES: - switch (format) { - case GL_RGBA: - return GL_RGBA16F; - case GL_RGB: - return GL_RGB16F; - case GL_ALPHA: - return GL_ALPHA16F_ARB; - case GL_LUMINANCE: - return GL_LUMINANCE16F_ARB; - case GL_LUMINANCE_ALPHA: - return GL_LUMINANCE_ALPHA16F_ARB; - default: - break; + if (ctx->Extensions.OES_texture_half_float) { + switch (format) { + case GL_RGBA: + return GL_RGBA16F; + case GL_RGB: + return GL_RGB16F; + case GL_ALPHA: + return GL_ALPHA16F_ARB; + case GL_LUMINANCE: + return GL_LUMINANCE16F_ARB; + case GL_LUMINANCE_ALPHA: + return GL_LUMINANCE_ALPHA16F_ARB; + default: + break; + } } break; @@ -2904,7 +2909,7 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, texObj->_IsHalfFloat = GL_TRUE; } - internalFormat = adjust_for_oes_float_texture(format, type); + internalFormat = adjust_for_oes_float_texture(ctx, format, type); } texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, -- 2.30.2