X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fglformats.c;h=79d7e881b317b22c9986e0cf29b1dfb1b5f6bb26;hb=3629ee025c8e88692118272f270e948750820c47;hp=4f240206ff45d221e94ca867976f8b669c23c1a9;hpb=a283a4ee2fba6c8efa4f4e4eeea6b3d7b21df4d0;p=mesa.git diff --git a/src/mesa/main/glformats.c b/src/mesa/main/glformats.c index 4f240206ff4..79d7e881b31 100644 --- a/src/mesa/main/glformats.c +++ b/src/mesa/main/glformats.c @@ -563,6 +563,8 @@ _mesa_bytes_per_vertex_attrib(GLint comps, GLenum type) return sizeof(GLuint); else return -1; + case GL_UNSIGNED_INT64_ARB: + return comps * 8; default: return -1; } @@ -1350,11 +1352,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: @@ -1371,34 +1371,25 @@ _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; + 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(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); 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); case MESA_FORMAT_LAYOUT_ASTC: - return ctx->Extensions.KHR_texture_compression_astc_ldr; + return _mesa_has_KHR_texture_compression_astc_ldr(ctx); default: return GL_FALSE; } @@ -1628,33 +1619,6 @@ _mesa_base_format_has_channel(GLenum base_format, GLenum pname) } -/** - * Returns the number of channels/components for a base format. - */ -GLint -_mesa_base_format_component_count(GLenum base_format) -{ - switch (base_format) { - case GL_LUMINANCE: - case GL_RED: - case GL_ALPHA: - case GL_INTENSITY: - case GL_DEPTH_COMPONENT: - return 1; - case GL_RG: - case GL_LUMINANCE_ALPHA: - case GL_DEPTH_STENCIL: - return 2; - case GL_RGB: - return 3; - case GL_RGBA: - return 4; - default: - return -1; - } -} - - /** * If format is a generic compressed format, return the corresponding * non-compressed format. For other formats, return the format as-is. @@ -1836,7 +1800,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; @@ -1851,7 +1815,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; @@ -1865,7 +1829,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 && @@ -1885,7 +1849,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) { @@ -1894,7 +1858,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) { @@ -1912,7 +1876,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; @@ -1966,8 +1930,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: @@ -2002,10 +1966,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; @@ -2073,7 +2037,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) @@ -2084,7 +2048,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 @@ -2103,8 +2067,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; @@ -2118,14 +2081,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; @@ -2140,8 +2102,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; @@ -2156,8 +2117,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: @@ -2167,7 +2127,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; @@ -2182,7 +2142,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; @@ -2210,7 +2170,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: @@ -2234,7 +2194,8 @@ _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 - || type == GL_UNSIGNED_INT_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; case GL_DEPTH_COMPONENT: @@ -2351,7 +2312,7 @@ _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_is_gles(ctx)) { switch (internalFormat) { case GL_RGB565: return GL_RGB; @@ -2360,7 +2321,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: @@ -2375,7 +2337,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: @@ -2412,13 +2375,13 @@ _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; } @@ -2448,7 +2411,7 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - 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: @@ -2510,8 +2473,16 @@ _mesa_base_tex_format(const struct gl_context *ctx, GLint internalFormat) } } - if (ctx->Version >= 30 || - ctx->Extensions.EXT_texture_integer) { + if (ctx->Extensions.EXT_texture_sRGB_R8) { + 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: @@ -2530,14 +2501,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: @@ -2572,7 +2543,7 @@ _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: case GL_R32F: @@ -2585,9 +2556,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: @@ -2605,9 +2576,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: @@ -2618,7 +2589,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; @@ -2627,7 +2598,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; @@ -2636,7 +2607,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; @@ -2668,8 +2639,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: @@ -2778,13 +2749,13 @@ _mesa_es3_effective_internal_format_for_format_and_type(GLenum format, /** * Do error checking of format/type combinations for OpenGL ES 3 - * glTex[Sub]Image. + * glTex[Sub]Image, or ES1/ES2 with GL_OES_required_internalformat. * \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, @@ -2802,7 +2773,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; @@ -2827,6 +2798,17 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, internalFormat = effectiveInternalFormat; } + /* 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 (_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 || + internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT5_EXT)) + return format == GL_RGB || format == GL_RGBA ? GL_NO_ERROR : + GL_INVALID_OPERATION; + switch (format) { case GL_BGRA_EXT: if (type != GL_UNSIGNED_BYTE || internalFormat != GL_BGRA) @@ -2841,7 +2823,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, case GL_RGBA8: case GL_RGB5_A1: case GL_RGBA4: + break; case GL_SRGB8_ALPHA8_EXT: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; break; default: return GL_INVALID_OPERATION; @@ -2849,7 +2834,18 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_BYTE: - if (internalFormat != GL_RGBA8_SNORM) + if (ctx->Version <= 20 || internalFormat != GL_RGBA8_SNORM) + return GL_INVALID_OPERATION; + break; + + case GL_UNSIGNED_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGBA16) + return GL_INVALID_OPERATION; + break; + + case GL_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || + internalFormat != GL_RGBA16_SNORM) return GL_INVALID_OPERATION; break; @@ -2875,9 +2871,11 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, case GL_UNSIGNED_INT_2_10_10_10_REV: switch (internalFormat) { - case GL_RGBA: /* GL_EXT_texture_type_2_10_10_10_REV */ + case GL_RGBA: case GL_RGB10_A2: case GL_RGB5_A1: + if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) + return GL_INVALID_OPERATION; break; default: return GL_INVALID_OPERATION; @@ -2885,7 +2883,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_HALF_FLOAT: - if (internalFormat != GL_RGBA16F) + if (ctx->Version <= 20 || internalFormat != GL_RGBA16F) return GL_INVALID_OPERATION; break; @@ -2893,9 +2891,11 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, switch (internalFormat) { case GL_RGBA16F: case GL_RGBA32F: + if (ctx->Version <= 20) + 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; @@ -2903,7 +2903,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; @@ -2911,6 +2911,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RGBA_INTEGER: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat != GL_RGBA8UI) @@ -2959,7 +2961,10 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, case GL_RGB: case GL_RGB8: case GL_RGB565: + break; case GL_SRGB8: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; break; default: return GL_INVALID_OPERATION; @@ -2967,7 +2972,18 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_BYTE: - if (internalFormat != GL_RGB8_SNORM) + if (ctx->Version <= 20 || internalFormat != GL_RGB8_SNORM) + return GL_INVALID_OPERATION; + break; + + case GL_UNSIGNED_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RGB16) + return GL_INVALID_OPERATION; + break; + + case GL_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || + internalFormat != GL_RGB16_SNORM) return GL_INVALID_OPERATION; break; @@ -2982,16 +2998,18 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_UNSIGNED_INT_10F_11F_11F_REV: - if (internalFormat != GL_R11F_G11F_B10F) + if (ctx->Version <= 20 || internalFormat != GL_R11F_G11F_B10F) return GL_INVALID_OPERATION; break; case GL_UNSIGNED_INT_5_9_9_9_REV: - if (internalFormat != GL_RGB9_E5) + if (ctx->Version <= 20 || internalFormat != GL_RGB9_E5) return GL_INVALID_OPERATION; break; case GL_HALF_FLOAT: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; switch (internalFormat) { case GL_RGB16F: case GL_R11F_G11F_B10F: @@ -3008,9 +3026,11 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, case GL_RGB32F: case GL_R11F_G11F_B10F: case GL_RGB9_E5: + if (ctx->Version <= 20) + 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; default: return GL_INVALID_OPERATION; @@ -3018,13 +3038,22 @@ _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) return GL_INVALID_OPERATION; break; case GL_UNSIGNED_INT_2_10_10_10_REV: switch (internalFormat) { - case GL_RGB: /* GL_EXT_texture_type_2_10_10_10_REV */ + case GL_RGB: + case GL_RGB10: + case GL_RGB8: + case GL_RGB565: + /* GL_EXT_texture_type_2_10_10_10_REV allows GL_RGB even though + * GLES3 doesn't, and GL_OES_required_internalformat extends that + * to allow the sized RGB internalformats as well. + */ + if (!_mesa_has_texture_type_2_10_10_10_REV(ctx)) + return GL_INVALID_OPERATION; break; default: return GL_INVALID_OPERATION; @@ -3037,6 +3066,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RGB_INTEGER: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat != GL_RGB8UI) @@ -3074,6 +3105,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RG: + if (!_mesa_has_rg_textures(ctx)) + return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat != GL_RG8) @@ -3085,14 +3118,27 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, return GL_INVALID_OPERATION; break; + case GL_UNSIGNED_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_RG16) + return GL_INVALID_OPERATION; + break; + + case GL_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || + internalFormat != GL_RG16_SNORM) + return GL_INVALID_OPERATION; + break; + case GL_HALF_FLOAT: case GL_HALF_FLOAT_OES: switch (internalFormat) { case GL_RG16F: + if (ctx->Version <= 20) + 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: @@ -3106,8 +3152,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: @@ -3121,6 +3167,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RG_INTEGER: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat != GL_RG8UI) @@ -3158,26 +3206,43 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RED: + 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) && + ctx->Extensions.EXT_texture_sRGB_R8)) + break; + return GL_INVALID_OPERATION; case GL_BYTE: if (internalFormat != GL_R8_SNORM) return GL_INVALID_OPERATION; break; + case GL_UNSIGNED_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || internalFormat != GL_R16) + return GL_INVALID_OPERATION; + break; + + case GL_SHORT: + if (!_mesa_has_EXT_texture_norm16(ctx) || + internalFormat != GL_R16_SNORM) + return GL_INVALID_OPERATION; + break; + case GL_HALF_FLOAT: case GL_HALF_FLOAT_OES: switch (internalFormat) { case GL_R16F: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; 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: @@ -3191,8 +3256,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: @@ -3206,6 +3271,8 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_RED_INTEGER: + if (ctx->Version <= 20) + return GL_INVALID_OPERATION; switch (type) { case GL_UNSIGNED_BYTE: if (internalFormat != GL_R8UI) @@ -3262,7 +3329,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_FLOAT: - if (internalFormat != GL_DEPTH_COMPONENT32F) + if (ctx->Version <= 20 || internalFormat != GL_DEPTH_COMPONENT32F) return GL_INVALID_OPERATION; break; @@ -3280,7 +3347,7 @@ _mesa_es3_error_check_format_and_type(const struct gl_context *ctx, break; case GL_FLOAT_32_UNSIGNED_INT_24_8_REV: - if (internalFormat != GL_DEPTH32F_STENCIL8) + if (ctx->Version <= 20 || internalFormat != GL_DEPTH32F_STENCIL8) return GL_INVALID_OPERATION; break; @@ -3302,15 +3369,27 @@ _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) - break; + 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) - break; - default: - if (type != GL_UNSIGNED_BYTE || format != internalFormat) + if (!_mesa_has_OES_texture_half_float(ctx) || internalFormat != format) + return GL_INVALID_OPERATION; + break; + case GL_UNSIGNED_BYTE: + if (!(format == internalFormat || + (format == GL_ALPHA && internalFormat == GL_ALPHA8) || + (format == GL_LUMINANCE && internalFormat == GL_LUMINANCE8) || + (format == GL_LUMINANCE_ALPHA && + ((internalFormat == GL_LUMINANCE8_ALPHA8) || + (internalFormat == GL_LUMINANCE4_ALPHA4))))) { return GL_INVALID_OPERATION; + } + break; + default: + return GL_INVALID_OPERATION; } + break; } return GL_NO_ERROR; @@ -3652,7 +3731,8 @@ _mesa_tex_format_from_format_and_type(const struct gl_context *ctx, * is marked "Color Renderable" in Table 8.10 of the ES 3.2 specification. */ bool -_mesa_is_es3_color_renderable(GLenum internal_format) +_mesa_is_es3_color_renderable(const struct gl_context *ctx, + GLenum internal_format) { switch (internal_format) { case GL_R8: @@ -3691,6 +3771,19 @@ _mesa_is_es3_color_renderable(GLenum internal_format) case GL_RGBA32I: case GL_RGBA32UI: return true; + case GL_R16: + case GL_RG16: + case GL_RGBA16: + return _mesa_has_EXT_texture_norm16(ctx); + case GL_R8_SNORM: + case GL_RG8_SNORM: + case GL_RGBA8_SNORM: + return _mesa_has_EXT_render_snorm(ctx); + case GL_R16_SNORM: + case GL_RG16_SNORM: + case GL_RGBA16_SNORM: + return _mesa_has_EXT_texture_norm16(ctx) && + _mesa_has_EXT_render_snorm(ctx); default: return false; } @@ -3726,6 +3819,15 @@ _mesa_is_es3_texture_filterable(const struct gl_context *ctx, case GL_R11F_G11F_B10F: case GL_RGB9_E5: return true; + case GL_R16: + case GL_R16_SNORM: + case GL_RG16: + case GL_RG16_SNORM: + case GL_RGB16: + case GL_RGB16_SNORM: + case GL_RGBA16: + case GL_RGBA16_SNORM: + return _mesa_has_EXT_texture_norm16(ctx); case GL_R32F: case GL_RG32F: case GL_RGB32F: @@ -3739,7 +3841,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; }