X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fglformats.c;h=c450ffc8ed76a5c360cc0de984d62f66635aa9bd;hb=75c601b6cf63c077dbfbb5f2f64f683dcf5524b4;hp=f8fc36e93117927584cc2f07ff5317b3b152d06a;hpb=a09cbaffbfb1dcf0b6ae41bbba21ae9bfdfb8a3b;p=mesa.git diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c index f8fc36e9311..c450ffc8ed7 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: @@ -1352,11 +1355,9 @@ _mesa_is_compressed_format(const struct gl_context *ctx, GLenum format) case GL_RGB4_S3TC: case GL_RGBA_S3TC: case GL_RGBA4_S3TC: - return _mesa_is_desktop_gl(ctx) && - ctx->Extensions.ANGLE_texture_compression_dxt; + 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: @@ -1372,35 +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_is_desktop_gl(ctx) - && ctx->Extensions.EXT_texture_sRGB - && ctx->Extensions.EXT_texture_compression_s3tc; + 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; } @@ -1811,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; @@ -1826,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; @@ -1840,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 && @@ -1860,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) { @@ -1869,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) { @@ -1887,7 +1884,7 @@ _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; default: return GL_INVALID_OPERATION; @@ -1941,8 +1938,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: @@ -1977,10 +1974,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; @@ -2048,7 +2045,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) @@ -2059,7 +2056,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 @@ -2078,8 +2075,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; @@ -2093,14 +2089,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; @@ -2115,8 +2110,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; @@ -2131,8 +2125,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: @@ -2142,7 +2135,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; @@ -2157,7 +2150,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; @@ -2185,7 +2178,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: @@ -2209,7 +2202,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; @@ -2327,7 +2320,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; @@ -2336,7 +2331,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: @@ -2351,7 +2347,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: @@ -2388,43 +2385,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: @@ -2463,7 +2469,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: @@ -2486,8 +2492,16 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) { + if (_mesa_has_EXT_texture_sRGB_R8(ctx)) { + switch (internalFormat) { + case GL_SR8_EXT: + return GL_RED; + default: + ; /* fallthrough */ + } + } + + if (_mesa_has_integer_textures(ctx)) { switch (internalFormat) { case GL_RGBA8UI_EXT: case GL_RGBA16UI_EXT: @@ -2506,14 +2520,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: @@ -2548,12 +2562,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: @@ -2561,9 +2578,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: @@ -2571,9 +2588,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: @@ -2581,9 +2601,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: @@ -2594,7 +2614,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; @@ -2603,7 +2623,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; @@ -2612,7 +2632,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; @@ -2644,8 +2664,8 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) * \param type the texture type */ static GLenum -_mesa_es3_effective_internal_format_for_format_and_type(GLenum format, - GLenum type) +gles_effective_internal_format_for_format_and_type(GLenum format, + GLenum type) { switch (type) { case GL_UNSIGNED_BYTE: @@ -2758,9 +2778,9 @@ _mesa_es3_effective_internal_format_for_format_and_type(GLenum format, * \return error code, or GL_NO_ERROR. */ GLenum -_mesa_es3_error_check_format_and_type(const struct gl_context *ctx, - GLenum format, GLenum type, - GLenum internalFormat) +_mesa_gles_error_check_format_and_type(const struct gl_context *ctx, + GLenum format, GLenum type, + GLenum internalFormat) { /* If internalFormat is an unsized format, then the effective internal * format derived from format and type should be used instead. Page 127, @@ -2778,7 +2798,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, */ if (_mesa_is_enum_format_unsized(internalFormat)) { GLenum effectiveInternalFormat = - _mesa_es3_effective_internal_format_for_format_and_type(format, type); + gles_effective_internal_format_for_format_and_type(format, type); if (effectiveInternalFormat == GL_NONE) return GL_INVALID_OPERATION; @@ -2806,7 +2826,7 @@ _mesa_es3_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 || @@ -2833,6 +2853,11 @@ _mesa_es3_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; } @@ -2879,7 +2904,7 @@ _mesa_es3_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: @@ -2900,7 +2925,7 @@ _mesa_es3_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; default: return GL_INVALID_OPERATION; @@ -2908,7 +2933,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, 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; default: return GL_INVALID_OPERATION; @@ -3035,15 +3060,20 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *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; + 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; 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; @@ -3057,7 +3087,7 @@ _mesa_es3_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: @@ -3110,16 +3140,20 @@ _mesa_es3_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; @@ -3142,8 +3176,8 @@ _mesa_es3_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: @@ -3157,8 +3191,8 @@ _mesa_es3_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: @@ -3211,16 +3245,22 @@ _mesa_es3_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) - return GL_INVALID_OPERATION; - break; + if (internalFormat == GL_R8 || + ((internalFormat == GL_SR8_EXT) && + _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; @@ -3244,8 +3284,8 @@ _mesa_es3_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: @@ -3259,8 +3299,8 @@ _mesa_es3_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: @@ -3372,11 +3412,11 @@ _mesa_es3_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: @@ -3461,7 +3501,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; } } @@ -3537,10 +3613,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]); } @@ -3697,7 +3787,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) @@ -3707,6 +3799,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. @@ -3844,7 +3940,7 @@ _mesa_is_es3_texture_filterable(const struct gl_context *ctx, * internal formats to base internal formats ... and use cases ...'') * for the R32F, RG32F, RGB32F, and RGBA32F formats." */ - return ctx->Extensions.OES_texture_float_linear; + return _mesa_has_OES_texture_float_linear(ctx); default: return false; }