X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fglformats.c;h=252599340aa05f70072f1de109888c356464fa10;hp=c5ade2dc0e05ad779840dc5bec513d1b8a5c93f7;hb=f931099270497d5ede856fe0cbc35b8b878011b0;hpb=2e753b77ddb0854d455c3cae826ae4412a64c3eb diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c index c5ade2dc0e0..252599340aa 100644 --- a/src/mesa/main/glformats.c +++ b/src/mesa/main/glformats.c @@ -1142,6 +1142,9 @@ _mesa_is_color_format(GLenum format) case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: + case GL_ATC_RGB_AMD: + case GL_ATC_RGBA_EXPLICIT_ALPHA_AMD: + case GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD: /* generic integer formats */ case GL_RED_INTEGER_EXT: case GL_GREEN_INTEGER_EXT: @@ -1354,8 +1357,7 @@ _mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) case GL_RGBA4_S3TC: return _mesa_has_S3_s3tc(ctx); case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: - return ctx->API == API_OPENGL_COMPAT - && ctx->Extensions.ATI_texture_compression_3dc; + return _mesa_has_ATI_texture_compression_3dc(ctx); case GL_PALETTE4_RGB8_OES: case GL_PALETTE4_RGBA8_OES: case GL_PALETTE4_R5_G6_B5_OES: @@ -1371,34 +1373,31 @@ _mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) switch (_mesa_get_format_layout(m_format)) { case MESA_FORMAT_LAYOUT_S3TC: - if (_mesa_get_format_color_encoding(m_format) == GL_LINEAR) { - /* Assume that the ANGLE flag will always be set if the - * EXT flag is set. - */ - return ctx->Extensions.ANGLE_texture_compression_dxt; + if (!_mesa_is_format_srgb(m_format)) { + return _mesa_has_EXT_texture_compression_s3tc(ctx); } else { - return _mesa_has_EXT_texture_sRGB(ctx) && + return (_mesa_has_EXT_texture_sRGB(ctx) || + _mesa_has_EXT_texture_compression_s3tc_srgb(ctx)) && _mesa_has_EXT_texture_compression_s3tc(ctx); } case MESA_FORMAT_LAYOUT_FXT1: - return _mesa_is_desktop_gl(ctx) - && ctx->Extensions.TDFX_texture_compression_FXT1; + return _mesa_has_3DFX_texture_compression_FXT1(ctx); case MESA_FORMAT_LAYOUT_RGTC: - return _mesa_is_desktop_gl(ctx) - && ctx->Extensions.ARB_texture_compression_rgtc; + return _mesa_has_ARB_texture_compression_rgtc(ctx) || + _mesa_has_EXT_texture_compression_rgtc(ctx); case MESA_FORMAT_LAYOUT_LATC: - return ctx->API == API_OPENGL_COMPAT - && ctx->Extensions.EXT_texture_compression_latc; + return _mesa_has_EXT_texture_compression_latc(ctx); case MESA_FORMAT_LAYOUT_ETC1: - return _mesa_is_gles(ctx) - && ctx->Extensions.OES_compressed_ETC1_RGB8_texture; + return _mesa_has_OES_compressed_ETC1_RGB8_texture(ctx); case MESA_FORMAT_LAYOUT_ETC2: - return _mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility; + return _mesa_is_gles3(ctx) || _mesa_has_ARB_ES3_compatibility(ctx); case MESA_FORMAT_LAYOUT_BPTC: - return _mesa_is_desktop_gl(ctx) && - ctx->Extensions.ARB_texture_compression_bptc; + return _mesa_has_ARB_texture_compression_bptc(ctx) || + _mesa_has_EXT_texture_compression_bptc(ctx); case MESA_FORMAT_LAYOUT_ASTC: - return ctx->Extensions.KHR_texture_compression_astc_ldr; + return _mesa_has_KHR_texture_compression_astc_ldr(ctx); + case MESA_FORMAT_LAYOUT_ATC: + return _mesa_has_AMD_compressed_ATC_texture(ctx); default: return GL_FALSE; } @@ -1809,7 +1808,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, break; /* OK */ } if (format == GL_RGB_INTEGER_EXT && - ctx->Extensions.ARB_texture_rgb10_a2ui) { + _mesa_has_texture_rgb10_a2ui(ctx)) { break; /* OK */ } return GL_INVALID_OPERATION; @@ -1824,7 +1823,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, break; /* OK */ } if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && - ctx->Extensions.ARB_texture_rgb10_a2ui) { + _mesa_has_texture_rgb10_a2ui(ctx)) { break; /* OK */ } return GL_INVALID_OPERATION; @@ -1838,7 +1837,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, break; /* OK */ } if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) && - ctx->Extensions.ARB_texture_rgb10_a2ui) { + _mesa_has_texture_rgb10_a2ui(ctx)) { break; /* OK */ } if (type == GL_UNSIGNED_INT_2_10_10_10_REV && format == GL_RGB && @@ -1858,7 +1857,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, return GL_NO_ERROR; case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: - if (!ctx->Extensions.ARB_depth_buffer_float) { + if (!_mesa_has_float_depth_buffer(ctx)) { return GL_INVALID_ENUM; } if (format != GL_DEPTH_STENCIL) { @@ -1867,7 +1866,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, return GL_NO_ERROR; case GL_UNSIGNED_INT_10F_11F_11F_REV: - if (!ctx->Extensions.EXT_packed_float) { + if (!_mesa_has_packed_float(ctx)) { return GL_INVALID_ENUM; } if (format != GL_RGB) { @@ -1885,8 +1884,9 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, return GL_NO_ERROR; case GL_RG: case GL_RED: - if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_texture_rg) + if (_mesa_has_rg_textures(ctx)) return GL_NO_ERROR; + /* fallthrough */ default: return GL_INVALID_OPERATION; } @@ -1939,8 +1939,8 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, } case GL_RG: - if (!ctx->Extensions.ARB_texture_rg) - return GL_INVALID_ENUM; + if (!_mesa_has_rg_textures(ctx)) + return GL_INVALID_ENUM; switch (type) { case GL_BYTE: case GL_UNSIGNED_BYTE: @@ -1975,10 +1975,10 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, return (ctx->API == API_OPENGLES2) ? GL_NO_ERROR : GL_INVALID_ENUM; case GL_UNSIGNED_INT_5_9_9_9_REV: - return ctx->Extensions.EXT_texture_shared_exponent + return _mesa_has_texture_shared_exponent(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; case GL_UNSIGNED_INT_10F_11F_11F_REV: - return ctx->Extensions.EXT_packed_float + return _mesa_has_packed_float(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2046,7 +2046,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, } case GL_YCBCR_MESA: - if (!ctx->Extensions.MESA_ycbcr_texture) + if (!_mesa_has_MESA_ycbcr_texture(ctx)) return GL_INVALID_ENUM; if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_SHORT_8_8_REV_MESA) @@ -2057,7 +2057,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_DEPTH_STENCIL: if (type == GL_UNSIGNED_INT_24_8) return GL_NO_ERROR; - else if (ctx->Extensions.ARB_depth_buffer_float && + else if (_mesa_has_float_depth_buffer(ctx) && type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV) return GL_NO_ERROR; else @@ -2076,8 +2076,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: - return (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) + return _mesa_has_integer_textures(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2091,14 +2090,13 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: - return (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) + return _mesa_has_integer_textures(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; case GL_UNSIGNED_BYTE_3_3_2: case GL_UNSIGNED_BYTE_2_3_3_REV: case GL_UNSIGNED_SHORT_5_6_5: case GL_UNSIGNED_SHORT_5_6_5_REV: - return ctx->Extensions.ARB_texture_rgb10_a2ui + return _mesa_has_texture_rgb10_a2ui(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2113,8 +2111,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_INT: case GL_UNSIGNED_INT: /* NOTE: no packed formats w/ BGR format */ - return (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) + return _mesa_has_integer_textures(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2129,8 +2126,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: - return (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) + return _mesa_has_integer_textures(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; case GL_UNSIGNED_SHORT_4_4_4_4: case GL_UNSIGNED_SHORT_4_4_4_4_REV: @@ -2140,7 +2136,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_INT_8_8_8_8_REV: case GL_UNSIGNED_INT_10_10_10_2: case GL_UNSIGNED_INT_2_10_10_10_REV: - return ctx->Extensions.ARB_texture_rgb10_a2ui + return _mesa_has_texture_rgb10_a2ui(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2155,7 +2151,7 @@ _mesa_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_SHORT: case GL_INT: case GL_UNSIGNED_INT: - return ctx->Extensions.EXT_texture_integer + return _mesa_has_integer_textures(ctx) ? GL_NO_ERROR : GL_INVALID_ENUM; default: return GL_INVALID_ENUM; @@ -2183,7 +2179,7 @@ _mesa_es_error_check_format_and_type(const struct gl_context *ctx, switch (format) { case GL_RED: case GL_RG: - if (ctx->API == API_OPENGLES || !ctx->Extensions.ARB_texture_rg) + if (!_mesa_has_rg_textures(ctx)) return GL_INVALID_VALUE; /* fallthrough */ case GL_ALPHA: @@ -2207,7 +2203,7 @@ _mesa_es_error_check_format_and_type(const struct gl_context *ctx, || type == GL_UNSIGNED_SHORT_5_5_5_1 || type == GL_FLOAT || type == GL_HALF_FLOAT_OES - || (ctx->Extensions.EXT_texture_type_2_10_10_10_REV && + || (_mesa_has_texture_type_2_10_10_10_REV(ctx) && type == GL_UNSIGNED_INT_2_10_10_10_REV)); break; @@ -2325,7 +2321,9 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_ES2_compatibility) { + if (_mesa_has_ARB_ES2_compatibility(ctx) || + _mesa_has_OES_framebuffer_object(ctx) || + ctx->API == API_OPENGLES2) { switch (internalFormat) { case GL_RGB565: return GL_RGB; @@ -2334,7 +2332,8 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_depth_texture) { + if (_mesa_has_ARB_depth_texture(ctx) || _mesa_has_OES_depth_texture(ctx) || + ctx->API == API_OPENGL_CORE) { switch (internalFormat) { case GL_DEPTH_COMPONENT: case GL_DEPTH_COMPONENT16: @@ -2349,7 +2348,8 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_texture_stencil8) { + if (_mesa_has_ARB_texture_stencil8(ctx) || + _mesa_has_OES_texture_stencil8(ctx)) { switch (internalFormat) { case GL_STENCIL_INDEX: case GL_STENCIL_INDEX1: @@ -2386,43 +2386,52 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) return base_compressed; } - if ((ctx->Extensions.KHR_texture_compression_astc_ldr && + if ((_mesa_has_KHR_texture_compression_astc_ldr(ctx) && is_astc_2d_format(internalFormat)) || - (ctx->Extensions.OES_texture_compression_astc && + (_mesa_has_OES_texture_compression_astc(ctx) && is_astc_3d_format(internalFormat))) return GL_RGBA; - if (ctx->Extensions.MESA_ycbcr_texture) { + if (_mesa_has_MESA_ycbcr_texture(ctx)) { if (internalFormat == GL_YCBCR_MESA) return GL_YCBCR_MESA; } - if (ctx->Extensions.ARB_texture_float) { + if (_mesa_has_half_float_textures(ctx)) { switch (internalFormat) { case GL_ALPHA16F_ARB: - case GL_ALPHA32F_ARB: return GL_ALPHA; case GL_RGBA16F_ARB: - case GL_RGBA32F_ARB: return GL_RGBA; case GL_RGB16F_ARB: - case GL_RGB32F_ARB: return GL_RGB; case GL_INTENSITY16F_ARB: - case GL_INTENSITY32F_ARB: return GL_INTENSITY; case GL_LUMINANCE16F_ARB: - case GL_LUMINANCE32F_ARB: return GL_LUMINANCE; case GL_LUMINANCE_ALPHA16F_ARB: + return GL_LUMINANCE_ALPHA; + } + } + + if (_mesa_has_float_textures(ctx)) { + switch (internalFormat) { + case GL_ALPHA32F_ARB: + return GL_ALPHA; + case GL_RGBA32F_ARB: + return GL_RGBA; + case GL_RGB32F_ARB: + return GL_RGB; + case GL_INTENSITY32F_ARB: + return GL_INTENSITY; + case GL_LUMINANCE32F_ARB: + return GL_LUMINANCE; case GL_LUMINANCE_ALPHA32F_ARB: return GL_LUMINANCE_ALPHA; - default: - ; /* fallthrough */ } } - if (ctx->Extensions.EXT_texture_snorm) { + if (_mesa_has_EXT_texture_snorm(ctx) || _mesa_is_gles3(ctx)) { switch (internalFormat) { case GL_RED_SNORM: case GL_R8_SNORM: @@ -2461,7 +2470,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.EXT_texture_sRGB) { + if (_mesa_has_EXT_texture_sRGB(ctx) || _mesa_is_gles3(ctx)) { switch (internalFormat) { case GL_SRGB_EXT: case GL_SRGB8_EXT: @@ -2484,7 +2493,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.EXT_texture_sRGB_R8) { + if (_mesa_has_EXT_texture_sRGB_R8(ctx)) { switch (internalFormat) { case GL_SR8_EXT: return GL_RED; @@ -2493,8 +2502,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) { + if (_mesa_has_integer_textures(ctx)) { switch (internalFormat) { case GL_RGBA8UI_EXT: case GL_RGBA16UI_EXT: @@ -2513,14 +2521,14 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_texture_rgb10_a2ui) { + if (_mesa_has_texture_rgb10_a2ui(ctx)) { switch (internalFormat) { case GL_RGB10_A2UI: return GL_RGBA; } } - if (ctx->Extensions.EXT_texture_integer) { + if (_mesa_has_integer_textures(ctx)) { switch (internalFormat) { case GL_ALPHA8UI_EXT: case GL_ALPHA16UI_EXT: @@ -2555,12 +2563,15 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_texture_rg) { + if (_mesa_has_rg_textures(ctx)) { switch (internalFormat) { case GL_R16F: + if (!_mesa_has_half_float_textures(ctx)) + break; + return GL_RED; case GL_R32F: - if (!ctx->Extensions.ARB_texture_float) - break; + if (!_mesa_has_float_textures(ctx)) + break; return GL_RED; case GL_R8I: case GL_R8UI: @@ -2568,9 +2579,9 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) case GL_R16UI: case GL_R32I: case GL_R32UI: - if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer) - break; - /* FALLTHROUGH */ + if (!_mesa_has_integer_textures(ctx)) + break; + /* FALLTHROUGH */ case GL_R8: case GL_R16: case GL_RED: @@ -2578,9 +2589,12 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) return GL_RED; case GL_RG16F: + if (!_mesa_has_half_float_textures(ctx)) + break; + return GL_RG; case GL_RG32F: - if (!ctx->Extensions.ARB_texture_float) - break; + if (!_mesa_has_float_textures(ctx)) + break; return GL_RG; case GL_RG8I: case GL_RG8UI: @@ -2588,9 +2602,9 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) case GL_RG16UI: case GL_RG32I: case GL_RG32UI: - if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer) - break; - /* FALLTHROUGH */ + if (!_mesa_has_integer_textures(ctx)) + break; + /* FALLTHROUGH */ case GL_RG: case GL_RG8: case GL_RG16: @@ -2601,7 +2615,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.EXT_texture_shared_exponent) { + if (_mesa_has_texture_shared_exponent(ctx)) { switch (internalFormat) { case GL_RGB9_E5_EXT: return GL_RGB; @@ -2610,7 +2624,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.EXT_packed_float) { + if (_mesa_has_packed_float(ctx)) { switch (internalFormat) { case GL_R11F_G11F_B10F_EXT: return GL_RGB; @@ -2619,7 +2633,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Extensions.ARB_depth_buffer_float) { + if (_mesa_has_float_depth_buffer(ctx)) { switch (internalFormat) { case GL_DEPTH_COMPONENT32F: return GL_DEPTH_COMPONENT; @@ -2813,7 +2827,7 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, /* The GLES variant of EXT_texture_compression_s3tc is very vague and * doesn't list valid types. Just do exactly what the spec says. */ - if (ctx->Extensions.EXT_texture_compression_s3tc && + if (_mesa_has_EXT_texture_compression_s3tc(ctx) && (internalFormat == GL_COMPRESSED_RGB_S3TC_DXT1_EXT || internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT || internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT3_EXT || @@ -2840,6 +2854,11 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, if (ctx->Version <= 20) return GL_INVALID_OPERATION; break; + case GL_COMPRESSED_RGBA_BPTC_UNORM: + case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM: + if (!_mesa_has_EXT_texture_compression_bptc(ctx)) + return GL_INVALID_OPERATION; + break; default: return GL_INVALID_OPERATION; } @@ -2886,7 +2905,7 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, case GL_RGBA: case GL_RGB10_A2: case GL_RGB5_A1: - if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV) + if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) return GL_INVALID_OPERATION; break; default: @@ -2907,16 +2926,18 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, return GL_INVALID_OPERATION; break; case GL_RGBA: - if (ctx->Extensions.OES_texture_float && internalFormat == format) + if (_mesa_has_OES_texture_float(ctx) && internalFormat == format) break; + /* fallthrough */ default: return GL_INVALID_OPERATION; } break; case GL_HALF_FLOAT_OES: - if (ctx->Extensions.OES_texture_half_float && internalFormat == format) + if (_mesa_has_OES_texture_half_float(ctx) && internalFormat == format) break; + /* fallthrough */ default: return GL_INVALID_OPERATION; } @@ -3041,16 +3062,22 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, if (ctx->Version <= 20) return GL_INVALID_OPERATION; break; + case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT: + case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT: + if (!_mesa_has_EXT_texture_compression_bptc(ctx)) + return GL_INVALID_OPERATION; + break; case GL_RGB: - if (ctx->Extensions.OES_texture_float && internalFormat == format) + if (_mesa_has_OES_texture_float(ctx) && internalFormat == format) break; + /* fallthrough */ default: return GL_INVALID_OPERATION; } break; case GL_HALF_FLOAT_OES: - if (!ctx->Extensions.OES_texture_half_float || internalFormat != format) + if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) return GL_INVALID_OPERATION; break; @@ -3064,7 +3091,7 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, * GLES3 doesn't, and GL_OES_required_internalformat extends that * to allow the sized RGB internalformats as well. */ - if (!ctx->Extensions.EXT_texture_type_2_10_10_10_REV) + if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) return GL_INVALID_OPERATION; break; default: @@ -3117,16 +3144,20 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RG: - if (!ctx->Extensions.ARB_texture_rg) + if (!_mesa_has_rg_textures(ctx)) return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: - if (internalFormat != GL_RG8) + if (internalFormat != GL_RG8 && + (!_mesa_has_EXT_texture_compression_rgtc(ctx) || + internalFormat != GL_COMPRESSED_RED_GREEN_RGTC2_EXT)) return GL_INVALID_OPERATION; break; case GL_BYTE: - if (internalFormat != GL_RG8_SNORM) + if (internalFormat != GL_RG8_SNORM && + (!_mesa_has_EXT_texture_compression_rgtc(ctx) || + internalFormat != GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT)) return GL_INVALID_OPERATION; break; @@ -3149,8 +3180,8 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, return GL_INVALID_OPERATION; break; case GL_RG: - if (ctx->Extensions.ARB_texture_rg && - ctx->Extensions.OES_texture_half_float) + if (_mesa_has_rg_textures(ctx) && + _mesa_has_OES_texture_half_float(ctx)) break; /* fallthrough */ default: @@ -3164,8 +3195,8 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, case GL_RG32F: break; case GL_RG: - if (ctx->Extensions.ARB_texture_rg && - ctx->Extensions.OES_texture_float) + if (_mesa_has_rg_textures(ctx) && + _mesa_has_OES_texture_float(ctx)) break; /* fallthrough */ default: @@ -3218,18 +3249,22 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RED: - if (!ctx->Extensions.ARB_texture_rg) + if (!_mesa_has_rg_textures(ctx)) return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat == GL_R8 || ((internalFormat == GL_SR8_EXT) && - ctx->Extensions.EXT_texture_sRGB_R8)) + _mesa_has_EXT_texture_sRGB_R8(ctx)) || + (internalFormat == GL_COMPRESSED_RED_RGTC1_EXT && + _mesa_has_EXT_texture_compression_rgtc(ctx))) break; return GL_INVALID_OPERATION; case GL_BYTE: - if (internalFormat != GL_R8_SNORM) + if (internalFormat != GL_R8_SNORM && + (!_mesa_has_EXT_texture_compression_rgtc(ctx) || + internalFormat != GL_COMPRESSED_SIGNED_RED_RGTC1_EXT)) return GL_INVALID_OPERATION; break; @@ -3253,8 +3288,8 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RG: case GL_RED: - if (ctx->Extensions.ARB_texture_rg && - ctx->Extensions.OES_texture_half_float) + if (_mesa_has_rg_textures(ctx) && + _mesa_has_OES_texture_half_float(ctx)) break; /* fallthrough */ default: @@ -3268,8 +3303,8 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, case GL_R32F: break; case GL_RED: - if (ctx->Extensions.ARB_texture_rg && - ctx->Extensions.OES_texture_float) + if (_mesa_has_rg_textures(ctx) && + _mesa_has_OES_texture_float(ctx)) break; /* fallthrough */ default: @@ -3381,11 +3416,11 @@ _mesa_gles_error_check_format_and_type(const struct gl_context *ctx, case GL_LUMINANCE_ALPHA: switch (type) { case GL_FLOAT: - if (!ctx->Extensions.OES_texture_float || internalFormat != format) + if (!_mesa_has_OES_texture_float(ctx) || internalFormat != format) return GL_INVALID_OPERATION; break; case GL_HALF_FLOAT_OES: - if (!ctx->Extensions.OES_texture_half_float || internalFormat != format) + if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) return GL_INVALID_OPERATION; break; case GL_UNSIGNED_BYTE: @@ -3470,7 +3505,43 @@ get_swizzle_from_gl_format(GLenum format, uint8_t *swizzle) case GL_INTENSITY: set_swizzle(swizzle, 0, 0, 0, 0); return true; + case GL_DEPTH_COMPONENT: + set_swizzle(swizzle, 0, 6, 6, 6); + return true; + case GL_STENCIL_INDEX: + set_swizzle(swizzle, 6, 0, 6, 6); + return true; + default: + return false; + } +} + +bool +_mesa_swap_bytes_in_type_enum(GLenum *type) +{ + switch (*type) { + case GL_UNSIGNED_INT_8_8_8_8: + *type = GL_UNSIGNED_INT_8_8_8_8_REV; + return true; + case GL_UNSIGNED_INT_8_8_8_8_REV: + *type = GL_UNSIGNED_INT_8_8_8_8; + return true; + case GL_UNSIGNED_SHORT_8_8_MESA: + *type = GL_UNSIGNED_SHORT_8_8_REV_MESA; + return true; + case GL_UNSIGNED_SHORT_8_8_REV_MESA: + *type = GL_UNSIGNED_SHORT_8_8_MESA; + return true; + case GL_BYTE: + case GL_UNSIGNED_BYTE: + /* format/types that are arrays of 8-bit values are unaffected by + * swapBytes. + */ + return true; default: + /* swapping bytes on 4444, 1555, or >8 bit per channel types etc. will + * never match a Mesa format. + */ return false; } } @@ -3499,6 +3570,9 @@ _mesa_format_from_format_and_type(GLenum format, GLenum type) bool normalized = false, is_float = false, is_signed = false; int num_channels = 0, type_size = 0; + if (format == GL_COLOR_INDEX) + return MESA_FORMAT_NONE; + /* Extract array format type information from the OpenGL data type */ switch (type) { case GL_UNSIGNED_BYTE: @@ -3546,10 +3620,24 @@ _mesa_format_from_format_and_type(GLenum format, GLenum type) * create the array format */ if (is_array_format) { - normalized = !_mesa_is_enum_format_integer(format); + enum mesa_array_format_base_format bf; + switch (format) { + case GL_DEPTH_COMPONENT: + bf = MESA_ARRAY_FORMAT_BASE_FORMAT_DEPTH; + break; + case GL_STENCIL_INDEX: + bf = MESA_ARRAY_FORMAT_BASE_FORMAT_STENCIL; + break; + default: + bf = MESA_ARRAY_FORMAT_BASE_FORMAT_RGBA_VARIANTS; + break; + } + + normalized = !(_mesa_is_enum_format_integer(format) || + format == GL_STENCIL_INDEX); num_channels = _mesa_components_in_format(format); - return MESA_ARRAY_FORMAT(type_size, is_signed, is_float, + return MESA_ARRAY_FORMAT(bf, type_size, is_signed, is_float, normalized, num_channels, swizzle[0], swizzle[1], swizzle[2], swizzle[3]); } @@ -3706,7 +3794,9 @@ _mesa_format_from_format_and_type(GLenum format, GLenum type) break; case GL_UNSIGNED_INT_24_8: if (format == GL_DEPTH_STENCIL) - return MESA_FORMAT_Z24_UNORM_S8_UINT; + return MESA_FORMAT_S8_UINT_Z24_UNORM; + else if (format == GL_DEPTH_COMPONENT) + return MESA_FORMAT_X8_UINT_Z24_UNORM; break; case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: if (format == GL_DEPTH_STENCIL) @@ -3716,6 +3806,10 @@ _mesa_format_from_format_and_type(GLenum format, GLenum type) break; } + fprintf(stderr, "Unsupported format/type: %s/%s\n", + _mesa_enum_to_string(format), + _mesa_enum_to_string(type)); + /* If we got here it means that we could not find a Mesa format that * matches the GL format/type provided. We may need to add a new Mesa * format in that case.