From e8ab7727e1cb359be565b9d3dace1c0490e452ad Mon Sep 17 00:00:00 2001 From: Antia Puentes Date: Mon, 21 Dec 2015 18:55:56 +0100 Subject: [PATCH] mesa/formatquery: Added framebuffer renderability related queries From the ARB_internalformat_query2 specification: "- FRAMEBUFFER_RENDERABLE: The support for rendering to the resource via framebuffer attachment is returned in . - FRAMEBUFFER_RENDERABLE_LAYERED: The support for layered rendering to the resource via framebuffer attachment is returned in . - FRAMEBUFFER_BLEND: The support for rendering to the resource via framebuffer attachment when blending is enabled is returned in ." For all of them, "Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE. If the resource is unsupported, NONE is returned." Reviewed-by: Dave Airlie --- src/mesa/main/formatquery.c | 40 ++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c index e4ddb94978c..e7645b161ee 100644 --- a/src/mesa/main/formatquery.c +++ b/src/mesa/main/formatquery.c @@ -573,6 +573,23 @@ _is_internalformat_supported(struct gl_context *ctx, GLenum target, return (buffer[0] == GL_TRUE); } +static bool +_legal_target_for_framebuffer_texture_layer(struct gl_context *ctx, + GLenum target) +{ + switch (target) { + case GL_TEXTURE_3D: + case GL_TEXTURE_1D_ARRAY: + case GL_TEXTURE_2D_ARRAY: + case GL_TEXTURE_CUBE_MAP_ARRAY: + case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: + case GL_TEXTURE_CUBE_MAP: + return true; + default: + return false; + } +} + /* default implementation of QueryInternalFormat driverfunc, for * drivers not implementing ARB_internalformat_query2. */ @@ -622,6 +639,9 @@ _mesa_query_internal_format_default(struct gl_context *ctx, GLenum target, case GL_TEXTURE_SHADOW: case GL_TEXTURE_GATHER: case GL_TEXTURE_GATHER_SHADOW: + case GL_FRAMEBUFFER_RENDERABLE: + case GL_FRAMEBUFFER_RENDERABLE_LAYERED: + case GL_FRAMEBUFFER_BLEND: params[0] = GL_FULL_SUPPORT; break; @@ -1050,16 +1070,22 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, buffer[0] = GL_TRUE; break; + case GL_FRAMEBUFFER_RENDERABLE_LAYERED: + if (!_mesa_has_EXT_texture_array(ctx) || + _legal_target_for_framebuffer_texture_layer(ctx, target)) + goto end; + /* fallthrough */ case GL_FRAMEBUFFER_RENDERABLE: - /* @TODO */ - break; + case GL_FRAMEBUFFER_BLEND: + if (!_mesa_has_ARB_framebuffer_object(ctx)) + goto end; - case GL_FRAMEBUFFER_RENDERABLE_LAYERED: - /* @TODO */ - break; + if (target == GL_TEXTURE_BUFFER || + !_is_renderable(ctx, internalformat)) + goto end; - case GL_FRAMEBUFFER_BLEND: - /* @TODO */ + ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname, + buffer); break; case GL_READ_PIXELS: -- 2.30.2