X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fformatquery.c;h=215c14f889fe131c1e350f1bf1d347e15e7a0a0a;hb=37266dfb7c747536d254b32eefa9222c60a37508;hp=28d82a206eb4fa3fd5995864e84f47208b70f474;hpb=09550c16a51e89dbf64b0864d3fb4ddb6accac52;p=mesa.git diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c index 28d82a206eb..215c14f889f 100644 --- a/src/mesa/main/formatquery.c +++ b/src/mesa/main/formatquery.c @@ -590,6 +590,17 @@ _legal_target_for_framebuffer_texture_layer(struct gl_context *ctx, } } +static GLenum +_mesa_generic_type_for_internal_format(GLenum internalFormat) +{ + if (_mesa_is_enum_format_unsigned_int(internalFormat)) + return GL_UNSIGNED_BYTE; + else if (_mesa_is_enum_format_signed_int(internalFormat)) + return GL_BYTE; + else + return GL_FLOAT; +} + /* default implementation of QueryInternalFormat driverfunc, for * drivers not implementing ARB_internalformat_query2. */ @@ -598,9 +609,7 @@ _mesa_query_internal_format_default(struct gl_context *ctx, GLenum target, GLenum internalFormat, GLenum pname, GLint *params) { - (void) ctx; (void) target; - (void) internalFormat; switch (pname) { case GL_SAMPLES: @@ -616,6 +625,52 @@ _mesa_query_internal_format_default(struct gl_context *ctx, GLenum target, params[0] = internalFormat; break; + case GL_READ_PIXELS_FORMAT: { + GLenum base_format = _mesa_base_tex_format(ctx, internalFormat); + switch (base_format) { + case GL_STENCIL_INDEX: + case GL_DEPTH_COMPONENT: + case GL_DEPTH_STENCIL: + case GL_RED: + case GL_RGB: + case GL_BGR: + case GL_RGBA: + case GL_BGRA: + params[0] = base_format; + break; + default: + params[0] = GL_NONE; + break; + } + break; + } + + case GL_READ_PIXELS_TYPE: + case GL_TEXTURE_IMAGE_TYPE: + case GL_GET_TEXTURE_IMAGE_TYPE: { + GLenum base_format = _mesa_base_tex_format(ctx, internalFormat); + if (base_format > 0) + params[0] = _mesa_generic_type_for_internal_format(internalFormat); + else + params[0] = GL_NONE; + break; + } + + case GL_TEXTURE_IMAGE_FORMAT: + case GL_GET_TEXTURE_IMAGE_FORMAT: { + GLenum format = GL_NONE; + GLenum base_format = _mesa_base_tex_format(ctx, internalFormat); + if (base_format > 0) { + if (_mesa_is_enum_format_integer(internalFormat)) + format = _mesa_base_format_to_integer_format(base_format); + else + format = base_format; + } + + params[0] = format; + break; + } + case GL_MANUAL_GENERATE_MIPMAP: case GL_AUTO_GENERATE_MIPMAP: case GL_SRGB_READ: @@ -1090,32 +1145,18 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname, break; case GL_READ_PIXELS: - ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname, - buffer); - break; - case GL_READ_PIXELS_FORMAT: - /* @TODO */ - break; - case GL_READ_PIXELS_TYPE: - /* @TODO */ + ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname, + buffer); break; case GL_TEXTURE_IMAGE_FORMAT: - /* @TODO */ - break; - - case GL_TEXTURE_IMAGE_TYPE: - /* @TODO */ - break; - case GL_GET_TEXTURE_IMAGE_FORMAT: - /* @TODO */ - break; - + case GL_TEXTURE_IMAGE_TYPE: case GL_GET_TEXTURE_IMAGE_TYPE: - /* @TODO */ + ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname, + buffer); break; case GL_MIPMAP: