From ef65edf2f2e58cfe02c371c7a73745de8afa8a18 Mon Sep 17 00:00:00 2001 From: Tim Van Patten Date: Mon, 22 Nov 2021 14:23:35 -0700 Subject: [PATCH] Add extension: ANGLE_rgbx_internal_format Add the extension ANGLE_rgbx_internal_format, which exposes the ANGLE internal format GL_RGBX8_ANGLE. The format GL_RGBX8_ANGLE enables emulating RGB8 formats with RGBA8 within ANGLE. This also renames the format GL_RGBX8_ANGLEX to GL_RGBX8_ANGLE, since it's being exposed. Bug: angleproject:6690 Test: Texture2DTestES3.TextureRGBXImplicitAlpha1 Change-Id: I5548a3578a14e2f2a4006bbf59983b01f694b7f3 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3296625 Commit-Queue: Tim Van Patten Reviewed-by: Shahbaz Youssefi Reviewed-by: Jamie Madill --- doc/ExtensionSupport.md | 1 + extensions/ANGLE_rbgx_internal_format.txt | 63 +++++++++++++++++++ include/GLES2/gl2ext_angle.h | 7 +++ .../code_generation_hashes/ANGLE_format.json | 4 +- .../ANGLE_load_functions_table.json | 4 +- .../code_generation_hashes/D3D11_format.json | 4 +- .../code_generation_hashes/DXGI_format.json | 2 +- .../Extension_files.json | 8 +-- .../GL_EGL_WGL_loader.json | 2 +- .../GL_EGL_entry_points.json | 4 +- .../code_generation_hashes/GL_format_map.json | 4 +- .../GLenum_value_to_string_map.json | 2 +- .../Metal_default_shaders.json | 4 +- .../Metal_format_table.json | 2 +- .../code_generation_hashes/Vulkan_format.json | 4 +- .../code_generation_hashes/proc_table.json | 2 +- scripts/registry_xml.py | 1 + src/common/angleutils.h | 1 - src/libANGLE/Context_gles_ext_autogen.h | 1 + .../es3_format_type_combinations.json | 4 ++ src/libANGLE/format_map_autogen.cpp | 1 + src/libANGLE/formatutils.cpp | 4 +- src/libANGLE/formatutils.h | 4 +- src/libANGLE/gles_extensions_autogen.cpp | 1 + src/libANGLE/gles_extensions_autogen.h | 3 + .../renderer/Format_table_autogen.cpp | 2 +- src/libANGLE/renderer/angle_format_map.json | 2 +- .../d3d/d3d11/texture_format_data.json | 2 +- .../d3d11/texture_format_table_autogen.cpp | 8 +-- .../renderer/load_functions_data.json | 2 +- .../renderer/load_functions_table_autogen.cpp | 10 +-- .../mtl_default_shaders_src_autogen.inc | 2 +- .../vulkan/mac/IOSurfaceSurfaceVkMac.mm | 2 +- .../renderer/vulkan/vk_caps_utils.cpp | 3 + .../vulkan/vk_format_table_autogen.cpp | 2 +- src/libANGLE/validationES2.cpp | 2 +- src/tests/gl_tests/TextureTest.cpp | 18 ++++++ 37 files changed, 148 insertions(+), 44 deletions(-) create mode 100644 extensions/ANGLE_rbgx_internal_format.txt diff --git a/doc/ExtensionSupport.md b/doc/ExtensionSupport.md index 8ddc85982..b0c3d95f1 100644 --- a/doc/ExtensionSupport.md +++ b/doc/ExtensionSupport.md @@ -208,6 +208,7 @@ using data from registry_xml.py and gl.xml. | [GL_ANGLE_provoking_vertex](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_provoking_vertex.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | [GL_ANGLE_relaxed_vertex_attribute_type](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_relaxed_vertex_attribute_type.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | [GL_ANGLE_request_extension](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_request_extension.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | +| [GL_ANGLE_rgbx_internal_format](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_rgbx_internal_format.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | [GL_ANGLE_robust_client_memory](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_client_memory.txt) | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | | [GL_ANGLE_robust_fragment_shader_output](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_fragment_shader_output.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | | [GL_ANGLE_robust_resource_initialization](https://chromium.googlesource.com/angle/angle/+/refs/heads/main/extensions/ANGLE_robust_resource_initialization.txt) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | diff --git a/extensions/ANGLE_rbgx_internal_format.txt b/extensions/ANGLE_rbgx_internal_format.txt new file mode 100644 index 000000000..a1d7b0c75 --- /dev/null +++ b/extensions/ANGLE_rbgx_internal_format.txt @@ -0,0 +1,63 @@ +Name + + ANGLE_rgbx_internal_format + +Name Strings + + GL_ANGLE_rgbx_internal_format + +Contributors + + Tim Van Patten, Google + +Contacts + + Tim Van Patten, Google (timvp 'at' google 'dot' com) + +Notice + + Copyright (c) 2021 The Khronos Group Inc. Copyright terms at + http://www.khronos.org/registry/speccopyright.html + +Status + + Draft. + +Version + + Version 1, November 22, 2021 + +Number + + OpenGL ES Extension ### + +Dependencies + + OpenGL ES 2.0 is required. + +Overview + + This extension introduces a sized internal RGBX format. This is a 32-bit representation of the + 24-bit RGB format, with the Alpha channel ignored. + +New Types + + None. + +New Procedures and Functions + + None. + +New Tokens + + // 32-bit RGBX format + GL_RGBX8_ANGLE 0x96BA + +Issues + + None. + +Revision History + + #1 - (November 22, 2021) Tim Van Patten + Original draft diff --git a/include/GLES2/gl2ext_angle.h b/include/GLES2/gl2ext_angle.h index 7f671a25a..ade52b6d8 100644 --- a/include/GLES2/gl2ext_angle.h +++ b/include/GLES2/gl2ext_angle.h @@ -606,4 +606,11 @@ GL_APICALL void GL_APIENTRY glReleaseTexturesANGLE(GLuint numTexture, const GLui #endif /* GL_ANGLE_yuv_internal_format */ +#ifndef GL_ANGLE_rgbx_internal_format +#define GL_ANGLE_rgbx_internal_format + +#define GL_RGBX8_ANGLE 0x96BA + +#endif /* GL_ANGLE_rgbx_internal_format */ + #endif // INCLUDE_GLES2_GL2EXT_ANGLE_H_ diff --git a/scripts/code_generation_hashes/ANGLE_format.json b/scripts/code_generation_hashes/ANGLE_format.json index c0cf91dd9..e3b828f68 100644 --- a/scripts/code_generation_hashes/ANGLE_format.json +++ b/scripts/code_generation_hashes/ANGLE_format.json @@ -2,13 +2,13 @@ "src/libANGLE/renderer/FormatID_autogen.h": "40f92bcbd9100ebcbac0fa77db1a23be", "src/libANGLE/renderer/Format_table_autogen.cpp": - "95b4b1156dbc17c4d6be58c1a5337e16", + "afe82012cba43b1bab4b40f890b1eb89", "src/libANGLE/renderer/angle_format.py": "74d6c9842128293118ccf128aeae896a", "src/libANGLE/renderer/angle_format_data.json": "bad90135a5d792928071aacdf80219c9", "src/libANGLE/renderer/angle_format_map.json": - "947527a1b07dd14da6179eb98d7883c0", + "951e1bceaba86eecb5c23173e897d092", "src/libANGLE/renderer/gen_angle_format_table.py": "70bdbceee30506d4b14bf52f2bbd8f2b" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/ANGLE_load_functions_table.json b/scripts/code_generation_hashes/ANGLE_load_functions_table.json index 5a14c8d3b..f599b3bc1 100644 --- a/scripts/code_generation_hashes/ANGLE_load_functions_table.json +++ b/scripts/code_generation_hashes/ANGLE_load_functions_table.json @@ -4,7 +4,7 @@ "src/libANGLE/renderer/gen_load_functions_table.py": "c131c494e7e0b35b65a8a097b4b8e5ce", "src/libANGLE/renderer/load_functions_data.json": - "31f065e8280e8735d933af01ff0c72bb", + "1a100e50618ced033cc5f1089835bbb5", "src/libANGLE/renderer/load_functions_table_autogen.cpp": - "3590083272e85a45ef80163da81f166b" + "aabdd7134aafe9ea4ee51a900c89e7bc" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/D3D11_format.json b/scripts/code_generation_hashes/D3D11_format.json index 41c8ef203..093e745cb 100644 --- a/scripts/code_generation_hashes/D3D11_format.json +++ b/scripts/code_generation_hashes/D3D11_format.json @@ -4,9 +4,9 @@ "src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py": "2b34c48ecd50e81b4938e0788407a6ce", "src/libANGLE/renderer/d3d/d3d11/texture_format_data.json": - "3d560a14ce94fb917a252b5d1d3c4c2a", + "b63df647200779a7cafab16f6662d196", "src/libANGLE/renderer/d3d/d3d11/texture_format_map.json": "c2019facd60d49228232b0e0b5e5048b", "src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp": - "098babca7c076e01e66def8148bd2085" + "2479ac57d25ded7eec0fa4aecd300f91" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/DXGI_format.json b/scripts/code_generation_hashes/DXGI_format.json index c0fe0690f..4f5be57d1 100644 --- a/scripts/code_generation_hashes/DXGI_format.json +++ b/scripts/code_generation_hashes/DXGI_format.json @@ -2,7 +2,7 @@ "src/libANGLE/renderer/angle_format.py": "74d6c9842128293118ccf128aeae896a", "src/libANGLE/renderer/angle_format_map.json": - "947527a1b07dd14da6179eb98d7883c0", + "951e1bceaba86eecb5c23173e897d092", "src/libANGLE/renderer/dxgi_format_data.json": "3428e4761ccd05f960adffd6ccbd86c5", "src/libANGLE/renderer/dxgi_format_map_autogen.cpp": diff --git a/scripts/code_generation_hashes/Extension_files.json b/scripts/code_generation_hashes/Extension_files.json index f9d9268f4..944c92d0a 100644 --- a/scripts/code_generation_hashes/Extension_files.json +++ b/scripts/code_generation_hashes/Extension_files.json @@ -1,6 +1,6 @@ { "doc/ExtensionSupport.md": - "2a53ce49310225eb876d324c00807af3", + "2780ba4f99ed42d86db6c48dd2b71894", "scripts/cl.xml": "f923201d4ea3e1130763b19fa7faa7a2", "scripts/egl.xml": @@ -26,13 +26,13 @@ "scripts/gl_angle_ext.xml": "474989440f980a079935dff3ab4d7b24", "scripts/registry_xml.py": - "a0080b9d53c3d86399782d5e479f13eb", + "b7aba2b35bc12a88d2b2b1efd2efc096", "scripts/wgl.xml": "c36001431919e1c435f1215a85f7e1db", "src/libANGLE/gen_extensions.py": "db7ed1c2245bba536e074a1cf2bb2590", "src/libANGLE/gles_extensions_autogen.cpp": - "0f966aee7d8303f7aefdc55a32283e7c", + "3c8b8918337a054e28c7078f7a4f609a", "src/libANGLE/gles_extensions_autogen.h": - "4d5e494139b3ddbd7aecf6d36110d563" + "b4c0a303b26639a8956131ee19d2d431" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json index 6bc55bf38..f9f9a2610 100644 --- a/scripts/code_generation_hashes/GL_EGL_WGL_loader.json +++ b/scripts/code_generation_hashes/GL_EGL_WGL_loader.json @@ -12,7 +12,7 @@ "scripts/gl_angle_ext.xml": "474989440f980a079935dff3ab4d7b24", "scripts/registry_xml.py": - "a0080b9d53c3d86399782d5e479f13eb", + "b7aba2b35bc12a88d2b2b1efd2efc096", "scripts/wgl.xml": "c36001431919e1c435f1215a85f7e1db", "src/libEGL/egl_loader_autogen.cpp": diff --git a/scripts/code_generation_hashes/GL_EGL_entry_points.json b/scripts/code_generation_hashes/GL_EGL_entry_points.json index 7bc21eafd..6f7c808a5 100644 --- a/scripts/code_generation_hashes/GL_EGL_entry_points.json +++ b/scripts/code_generation_hashes/GL_EGL_entry_points.json @@ -16,7 +16,7 @@ "scripts/gl_angle_ext.xml": "474989440f980a079935dff3ab4d7b24", "scripts/registry_xml.py": - "a0080b9d53c3d86399782d5e479f13eb", + "b7aba2b35bc12a88d2b2b1efd2efc096", "scripts/wgl.xml": "c36001431919e1c435f1215a85f7e1db", "src/common/entry_points_enum_autogen.cpp": @@ -42,7 +42,7 @@ "src/libANGLE/Context_gles_3_2_autogen.h": "48567dca16fd881dfe6d61fee0e3106f", "src/libANGLE/Context_gles_ext_autogen.h": - "3672bddcabc00cbb34fb011bdc9f0f27", + "658aaa61c874cf9fda0e9b420a1ce703", "src/libANGLE/capture/capture_gles_1_0_autogen.cpp": "7ec7ef8f779b809a45d74b97502c419b", "src/libANGLE/capture/capture_gles_1_0_autogen.h": diff --git a/scripts/code_generation_hashes/GL_format_map.json b/scripts/code_generation_hashes/GL_format_map.json index f57bb0f52..37cf547a1 100644 --- a/scripts/code_generation_hashes/GL_format_map.json +++ b/scripts/code_generation_hashes/GL_format_map.json @@ -1,8 +1,8 @@ { "src/libANGLE/es3_format_type_combinations.json": - "30346b958cd180089e137daf69b21ab5", + "d053493ebea62e9baa5a9db40c1d90cf", "src/libANGLE/format_map_autogen.cpp": - "fe6dd8e61e9b7b77f8b10266a2d8115f", + "af8d493c27036b11878a343f09c75235", "src/libANGLE/format_map_data.json": "2e5db33b6d6b142b569123f614f3ddb7", "src/libANGLE/gen_format_map.py": diff --git a/scripts/code_generation_hashes/GLenum_value_to_string_map.json b/scripts/code_generation_hashes/GLenum_value_to_string_map.json index 3bee786e1..497b77634 100644 --- a/scripts/code_generation_hashes/GLenum_value_to_string_map.json +++ b/scripts/code_generation_hashes/GLenum_value_to_string_map.json @@ -6,7 +6,7 @@ "scripts/gl_angle_ext.xml": "474989440f980a079935dff3ab4d7b24", "scripts/registry_xml.py": - "a0080b9d53c3d86399782d5e479f13eb", + "b7aba2b35bc12a88d2b2b1efd2efc096", "src/libANGLE/capture/gl_enum_utils_autogen.cpp": "2ea097051161668c1cef088043707735", "src/libANGLE/capture/gl_enum_utils_autogen.h": diff --git a/scripts/code_generation_hashes/Metal_default_shaders.json b/scripts/code_generation_hashes/Metal_default_shaders.json index de9fca0af..810c10294 100644 --- a/scripts/code_generation_hashes/Metal_default_shaders.json +++ b/scripts/code_generation_hashes/Metal_default_shaders.json @@ -2,7 +2,7 @@ "src/libANGLE/renderer/angle_format.py": "74d6c9842128293118ccf128aeae896a", "src/libANGLE/renderer/angle_format_map.json": - "947527a1b07dd14da6179eb98d7883c0", + "951e1bceaba86eecb5c23173e897d092", "src/libANGLE/renderer/gen_angle_format_table.py": "70bdbceee30506d4b14bf52f2bbd8f2b", "src/libANGLE/renderer/metal/shaders/blit.metal": @@ -24,7 +24,7 @@ "src/libANGLE/renderer/metal/shaders/gen_mtl_internal_shaders.py": "783e31d342cfc50aa41fad1cfdb53de4", "src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc": - "ca7a7ecfab09e017f40dd8b51d95ecb8", + "7e0d087f2c65fe78cd5b3e43ffdcd067", "src/libANGLE/renderer/metal/shaders/rewrite_indices.metal": "f8998cc5c4b078e3f7a995edf7026f13", "src/libANGLE/renderer/metal/shaders/visibility.metal": diff --git a/scripts/code_generation_hashes/Metal_format_table.json b/scripts/code_generation_hashes/Metal_format_table.json index e3f5363f4..389ec9b32 100644 --- a/scripts/code_generation_hashes/Metal_format_table.json +++ b/scripts/code_generation_hashes/Metal_format_table.json @@ -2,7 +2,7 @@ "src/libANGLE/renderer/angle_format.py": "74d6c9842128293118ccf128aeae896a", "src/libANGLE/renderer/angle_format_map.json": - "947527a1b07dd14da6179eb98d7883c0", + "951e1bceaba86eecb5c23173e897d092", "src/libANGLE/renderer/metal/gen_mtl_format_table.py": "53a6031892c837248553609f48c4c538", "src/libANGLE/renderer/metal/mtl_format_map.json": diff --git a/scripts/code_generation_hashes/Vulkan_format.json b/scripts/code_generation_hashes/Vulkan_format.json index d0bd21707..39a476918 100644 --- a/scripts/code_generation_hashes/Vulkan_format.json +++ b/scripts/code_generation_hashes/Vulkan_format.json @@ -2,11 +2,11 @@ "src/libANGLE/renderer/angle_format.py": "74d6c9842128293118ccf128aeae896a", "src/libANGLE/renderer/angle_format_map.json": - "947527a1b07dd14da6179eb98d7883c0", + "951e1bceaba86eecb5c23173e897d092", "src/libANGLE/renderer/vulkan/gen_vk_format_table.py": "6e4c403c145549c0baa69d65b5e73152", "src/libANGLE/renderer/vulkan/vk_format_map.json": "7a376275a743f535839d92bfe7b23ee0", "src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": - "bd9cc885298af7d021cbffd42b7f12b5" + "6b08957da13a3277addb46cb690b8313" } \ No newline at end of file diff --git a/scripts/code_generation_hashes/proc_table.json b/scripts/code_generation_hashes/proc_table.json index 8c7c1668a..e7592222a 100644 --- a/scripts/code_generation_hashes/proc_table.json +++ b/scripts/code_generation_hashes/proc_table.json @@ -12,7 +12,7 @@ "scripts/gl_angle_ext.xml": "474989440f980a079935dff3ab4d7b24", "scripts/registry_xml.py": - "a0080b9d53c3d86399782d5e479f13eb", + "b7aba2b35bc12a88d2b2b1efd2efc096", "scripts/wgl.xml": "c36001431919e1c435f1215a85f7e1db", "src/libGL/proc_table_wgl_autogen.cpp": diff --git a/scripts/registry_xml.py b/scripts/registry_xml.py index f80101b70..92bdfd6ae 100644 --- a/scripts/registry_xml.py +++ b/scripts/registry_xml.py @@ -205,6 +205,7 @@ angle_es_only_extensions = [ "GL_ANGLE_program_cache_control", "GL_ANGLE_relaxed_vertex_attribute_type", "GL_ANGLE_request_extension", + "GL_ANGLE_rgbx_internal_format", "GL_ANGLE_robust_client_memory", "GL_ANGLE_robust_resource_initialization", "GL_ANGLE_webgl_compatibility", diff --git a/src/common/angleutils.h b/src/common/angleutils.h index fed3e9390..d33a4d23f 100644 --- a/src/common/angleutils.h +++ b/src/common/angleutils.h @@ -245,7 +245,6 @@ inline bool IsLittleEndian() #define GL_A1RGB5_ANGLEX 0x6AC5 #define GL_BGRX8_ANGLEX 0x6ABA -#define GL_RGBX8_ANGLEX 0x6AFA #define GL_BGR565_ANGLEX 0x6ABB #define GL_BGRA4_ANGLEX 0x6ABC #define GL_BGR5_A1_ANGLEX 0x6ABD diff --git a/src/libANGLE/Context_gles_ext_autogen.h b/src/libANGLE/Context_gles_ext_autogen.h index 48a654b0d..a6daace46 100644 --- a/src/libANGLE/Context_gles_ext_autogen.h +++ b/src/libANGLE/Context_gles_ext_autogen.h @@ -377,6 +377,7 @@ /* GL_ANGLE_request_extension */ \ void requestExtension(const GLchar *name); \ void disableExtension(const GLchar *name); \ + /* GL_ANGLE_rgbx_internal_format */ \ /* GL_ANGLE_robust_client_memory */ \ void getBooleanvRobust(GLenum pname, GLsizei bufSize, GLsizei *length, GLboolean *params); \ void getBufferParameterivRobust(BufferBinding targetPacked, GLenum pname, GLsizei bufSize, \ diff --git a/src/libANGLE/es3_format_type_combinations.json b/src/libANGLE/es3_format_type_combinations.json index 992d95e51..cc82f50dc 100644 --- a/src/libANGLE/es3_format_type_combinations.json +++ b/src/libANGLE/es3_format_type_combinations.json @@ -184,5 +184,9 @@ "From GL_OES_texture_stencil8": [ [ "GL_STENCIL_INDEX8", "GL_STENCIL_INDEX", "GL_UNSIGNED_BYTE" ] + ], + "From GL_ANGLE_rgbx_internal_format": + [ + [ "GL_RGBX8_ANGLE", "GL_RGB", "GL_UNSIGNED_BYTE" ] ] } diff --git a/src/libANGLE/format_map_autogen.cpp b/src/libANGLE/format_map_autogen.cpp index 4c37f963e..4685bb893 100644 --- a/src/libANGLE/format_map_autogen.cpp +++ b/src/libANGLE/format_map_autogen.cpp @@ -1281,6 +1281,7 @@ bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat case GL_RGB565: case GL_SRGB8: case GL_RGB: + case GL_RGBX8_ANGLE: return true; default: break; diff --git a/src/libANGLE/formatutils.cpp b/src/libANGLE/formatutils.cpp index 697e0c323..abf2deec8 100644 --- a/src/libANGLE/formatutils.cpp +++ b/src/libANGLE/formatutils.cpp @@ -1071,10 +1071,12 @@ static InternalFormatInfoMap BuildInternalFormatInfoMap() // Special format which is not really supported, so always false for all supports. AddRGBAFormat(&map, GL_BGRX8_ANGLEX, true, 8, 8, 8, 0, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported); - AddRGBAFormat(&map, GL_RGBX8_ANGLEX, true, 8, 8, 8, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported); AddRGBAFormat(&map, GL_BGR565_ANGLEX, true, 5, 6, 5, 0, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported); AddRGBAFormat(&map, GL_BGR10_A2_ANGLEX, true, 10, 10, 10, 2, 0, GL_BGRA_EXT, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported, NeverSupported, NeverSupported); + // Special format to emulate RGB8 with RGBA8 within ANGLE. + AddRGBAFormat(&map, GL_RGBX8_ANGLE, true, 8, 8, 8, 0, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, AlwaysSupported, NeverSupported, AlwaysSupported, AlwaysSupported, NeverSupported); + // This format is supported on ES 2.0 with two extensions, so keep it out-of-line to not widen the table above even more. // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Filterable | Texture attachment | Renderbuffer | Blend AddRGBAFormat(&map, GL_RGB10_A2, true, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireESOrExtAndExt<3, 0, &Extensions::textureStorageEXT, &Extensions::textureType2101010REVEXT>, AlwaysSupported, RequireES<3, 0>, RequireES<3, 0>, RequireES<3, 0>); diff --git a/src/libANGLE/formatutils.h b/src/libANGLE/formatutils.h index 9a499fbb3..c53a25151 100644 --- a/src/libANGLE/formatutils.h +++ b/src/libANGLE/formatutils.h @@ -67,7 +67,7 @@ ANGLE_INLINE GLenum GetNonLinearFormat(const GLenum format) return GL_SRGB8_ALPHA8; case GL_RGB8: case GL_BGRX8_ANGLEX: - case GL_RGBX8_ANGLEX: + case GL_RGBX8_ANGLE: return GL_SRGB8; case GL_RGBA16F: return GL_RGBA16F; @@ -485,7 +485,7 @@ ANGLE_INLINE bool IsBGRAFormat(const GLenum internalFormat) case GL_BGR5_A1_ANGLEX: case GL_BGRA8_SRGB_ANGLEX: case GL_BGRX8_ANGLEX: - case GL_RGBX8_ANGLEX: + case GL_RGBX8_ANGLE: case GL_BGR565_ANGLEX: case GL_BGR10_A2_ANGLEX: return true; diff --git a/src/libANGLE/gles_extensions_autogen.cpp b/src/libANGLE/gles_extensions_autogen.cpp index d998dc7b7..617e275ef 100644 --- a/src/libANGLE/gles_extensions_autogen.cpp +++ b/src/libANGLE/gles_extensions_autogen.cpp @@ -220,6 +220,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() map["GL_ANGLE_provoking_vertex"] = enableableExtension(&Extensions::provokingVertexANGLE); map["GL_ANGLE_relaxed_vertex_attribute_type"] = esOnlyExtension(&Extensions::relaxedVertexAttributeTypeANGLE); map["GL_ANGLE_request_extension"] = esOnlyExtension(&Extensions::requestExtensionANGLE); + map["GL_ANGLE_rgbx_internal_format"] = esOnlyExtension(&Extensions::rgbxInternalFormatANGLE); map["GL_ANGLE_robust_client_memory"] = esOnlyExtension(&Extensions::robustClientMemoryANGLE); map["GL_ANGLE_robust_fragment_shader_output"] = enableableExtension(&Extensions::robustFragmentShaderOutputANGLE); map["GL_ANGLE_robust_resource_initialization"] = esOnlyExtension(&Extensions::robustResourceInitializationANGLE); diff --git a/src/libANGLE/gles_extensions_autogen.h b/src/libANGLE/gles_extensions_autogen.h index ea6b66f10..fbefcb66a 100644 --- a/src/libANGLE/gles_extensions_autogen.h +++ b/src/libANGLE/gles_extensions_autogen.h @@ -607,6 +607,9 @@ struct Extensions // GL_ANGLE_request_extension bool requestExtensionANGLE = false; + // GL_ANGLE_rgbx_internal_format + bool rgbxInternalFormatANGLE = false; + // GL_ANGLE_robust_client_memory bool robustClientMemoryANGLE = false; diff --git a/src/libANGLE/renderer/Format_table_autogen.cpp b/src/libANGLE/renderer/Format_table_autogen.cpp index 966dee358..4953bb95a 100644 --- a/src/libANGLE/renderer/Format_table_autogen.cpp +++ b/src/libANGLE/renderer/Format_table_autogen.cpp @@ -694,7 +694,7 @@ FormatID Format::InternalFormatToID(GLenum internalFormat) return FormatID::R8G8B8A8_TYPELESS_SRGB; case GL_RGBA8_USCALED_ANGLEX: return FormatID::R8G8B8A8_USCALED; - case GL_RGBX8_ANGLEX: + case GL_RGBX8_ANGLE: return FormatID::R8G8B8X8_UNORM; case GL_SR8_EXT: return FormatID::R8_UNORM_SRGB; diff --git a/src/libANGLE/renderer/angle_format_map.json b/src/libANGLE/renderer/angle_format_map.json index 773424861..f989bcfd6 100644 --- a/src/libANGLE/renderer/angle_format_map.json +++ b/src/libANGLE/renderer/angle_format_map.json @@ -8,7 +8,7 @@ [ "GL_BGRA8_EXT", "B8G8R8A8_UNORM" ], [ "GL_BGRA8_SRGB_ANGLEX", "B8G8R8A8_UNORM_SRGB"], [ "GL_BGRX8_ANGLEX", "B8G8R8X8_UNORM" ], - [ "GL_RGBX8_ANGLEX", "R8G8B8X8_UNORM" ], + [ "GL_RGBX8_ANGLE", "R8G8B8X8_UNORM" ], [ "GL_BGR10_A2_ANGLEX", "B10G10R10A2_UNORM" ], [ "GL_COMPRESSED_R11_EAC", "EAC_R11_UNORM_BLOCK" ], [ "GL_COMPRESSED_RG11_EAC", "EAC_R11G11_UNORM_BLOCK" ], diff --git a/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json b/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json index 6db3ada13..a2678be8f 100644 --- a/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json +++ b/src/libANGLE/renderer/d3d/d3d11/texture_format_data.json @@ -184,7 +184,7 @@ }, "supportTest": "OnlyFL11_1Plus(deviceCaps)", "fallbackFormat": "R8G8B8A8_UNORM", - "glInternalFormat": "GL_RGBX8_ANGLEX" + "glInternalFormat": "GL_RGBX8_ANGLE" }, "B10G10R10A2_UNORM": { "texFormat": "DXGI_FORMAT_R10G10B10A2_UNORM", diff --git a/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp b/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp index 76be6731d..f7343b1f6 100644 --- a/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp +++ b/src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp @@ -2597,11 +2597,11 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev nullptr); return info; } - case GL_RGBX8_ANGLEX: + case GL_RGBX8_ANGLE: { if (OnlyFL11_1Plus(deviceCaps)) { - static constexpr Format info(GL_RGBX8_ANGLEX, + static constexpr Format info(GL_RGBX8_ANGLE, angle::FormatID::R8G8B8X8_UNORM, DXGI_FORMAT_B8G8R8X8_UNORM, DXGI_FORMAT_B8G8R8X8_UNORM, @@ -2609,13 +2609,13 @@ const Format &Format::Get(GLenum internalFormat, const Renderer11DeviceCaps &dev DXGI_FORMAT_B8G8R8X8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_B8G8R8X8_UNORM, - GL_RGBX8_ANGLEX, + GL_RGBX8_ANGLE, nullptr); return info; } else { - static constexpr Format info(GL_RGBX8_ANGLEX, + static constexpr Format info(GL_RGBX8_ANGLE, angle::FormatID::R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, diff --git a/src/libANGLE/renderer/load_functions_data.json b/src/libANGLE/renderer/load_functions_data.json index 660e3c127..4ce0851ea 100644 --- a/src/libANGLE/renderer/load_functions_data.json +++ b/src/libANGLE/renderer/load_functions_data.json @@ -415,7 +415,7 @@ "GL_UNSIGNED_BYTE": "LoadToNative" } }, - "GL_RGBX8_ANGLEX" : { + "GL_RGBX8_ANGLE" : { "R8G8B8X8_UNORM": { "GL_UNSIGNED_BYTE": "LoadToNative" }, diff --git a/src/libANGLE/renderer/load_functions_table_autogen.cpp b/src/libANGLE/renderer/load_functions_table_autogen.cpp index b19d494dc..7a5b22f74 100644 --- a/src/libANGLE/renderer/load_functions_table_autogen.cpp +++ b/src/libANGLE/renderer/load_functions_table_autogen.cpp @@ -3140,7 +3140,7 @@ LoadImageFunctionInfo RGBA8_USCALED_ANGLEX_to_default(GLenum type) } } -LoadImageFunctionInfo RGBX8_ANGLEX_to_R8G8B8A8_UNORM(GLenum type) +LoadImageFunctionInfo RGBX8_ANGLE_to_R8G8B8A8_UNORM(GLenum type) { switch (type) { @@ -3152,7 +3152,7 @@ LoadImageFunctionInfo RGBX8_ANGLEX_to_R8G8B8A8_UNORM(GLenum type) } } -LoadImageFunctionInfo RGBX8_ANGLEX_to_R8G8B8X8_UNORM(GLenum type) +LoadImageFunctionInfo RGBX8_ANGLE_to_R8G8B8X8_UNORM(GLenum type) { switch (type) { @@ -4592,14 +4592,14 @@ LoadFunctionMap GetLoadFunctionsMap(GLenum internalFormat, FormatID angleFormat) return RGBA8_SSCALED_ANGLEX_to_default; case GL_RGBA8_USCALED_ANGLEX: return RGBA8_USCALED_ANGLEX_to_default; - case GL_RGBX8_ANGLEX: + case GL_RGBX8_ANGLE: { switch (angleFormat) { case FormatID::R8G8B8A8_UNORM: - return RGBX8_ANGLEX_to_R8G8B8A8_UNORM; + return RGBX8_ANGLE_to_R8G8B8A8_UNORM; case FormatID::R8G8B8X8_UNORM: - return RGBX8_ANGLEX_to_R8G8B8X8_UNORM; + return RGBX8_ANGLE_to_R8G8B8X8_UNORM; default: break; } diff --git a/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc b/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc index 373b21243..9b40f202b 100644 --- a/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc +++ b/src/libANGLE/renderer/metal/shaders/mtl_default_shaders_src_autogen.inc @@ -14,7 +14,7 @@ static char gDefaultMetallibSrc[] = R"( # 1 "temp_master_source.metal" # 1 "" 1 # 1 "" 3 -# 396 "" 3 +# 386 "" 3 # 1 "" 1 # 1 "" 2 # 1 "temp_master_source.metal" 2 diff --git a/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm b/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm index c7fd58c07..5b7d75df7 100644 --- a/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm +++ b/src/libANGLE/renderer/vulkan/mac/IOSurfaceSurfaceVkMac.mm @@ -44,7 +44,7 @@ constexpr std::array kIOSurfaceFormats = {{ {GL_R16UI, GL_UNSIGNED_SHORT, 2, GL_R16UI, GL_R16UI }, {GL_RG, GL_UNSIGNED_BYTE, 2, GL_RG8, GL_RG8 }, {GL_RG, GL_UNSIGNED_SHORT, 4, GL_RG16_EXT, GL_RG16_EXT }, - {GL_RGB, GL_UNSIGNED_BYTE, 4, GL_RGBX8_ANGLEX, GL_BGRA8_EXT }, + {GL_RGB, GL_UNSIGNED_BYTE, 4, GL_RGBX8_ANGLE, GL_BGRA8_EXT }, {GL_BGRA_EXT, GL_UNSIGNED_BYTE, 4, GL_BGRA8_EXT, GL_BGRA8_EXT }, {GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV, 4, GL_BGR10_A2_ANGLEX, GL_BGR10_A2_ANGLEX }, {GL_RGBA, GL_HALF_FLOAT, 8, GL_RGBA16F, GL_RGBA16F }, diff --git a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp index 4e851336a..36e050df7 100644 --- a/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp +++ b/src/libANGLE/renderer/vulkan/vk_caps_utils.cpp @@ -563,6 +563,9 @@ void RendererVk::ensureCapsInitialized() const // https://gitlab.khronos.org/opengl/API/-/issues/149 mNativeExtensions.shaderMultisampleInterpolationOES = mNativeExtensions.sampleVariablesOES; + // Always enable ANGLE_rgbx_internal_format to expose GL_RGBX8_ANGLE. + mNativeExtensions.rgbxInternalFormatANGLE = true; + // https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch31s02.html mNativeCaps.maxElementIndex = std::numeric_limits::max() - 1; mNativeCaps.max3DTextureSize = LimitToInt(limitsVk.maxImageDimension3D); diff --git a/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp b/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp index 490be6239..e4264dd6a 100644 --- a/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp +++ b/src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp @@ -1998,7 +1998,7 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) break; case angle::FormatID::R8G8B8X8_UNORM: - mIntendedGLFormat = GL_RGBX8_ANGLEX; + mIntendedGLFormat = GL_RGBX8_ANGLE; mActualSampleOnlyImageFormatID = angle::FormatID::R8G8B8A8_UNORM; mImageInitializerFunction = nullptr; mActualBufferFormatID = angle::FormatID::NONE; diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp index 0c31f4c73..947bed25c 100644 --- a/src/libANGLE/validationES2.cpp +++ b/src/libANGLE/validationES2.cpp @@ -463,7 +463,7 @@ bool ValidateES2CopyTexImageParameters(const Context *context, colorbufferFormat != GL_RGBA8_OES && colorbufferFormat != GL_RGB32F && colorbufferFormat != GL_RGBA32F && colorbufferFormat != GL_BGRA8_EXT && colorbufferFormat != GL_BGR5_A1_ANGLEX && - colorbufferFormat != GL_BGRX8_ANGLEX && colorbufferFormat != GL_RGBX8_ANGLEX && + colorbufferFormat != GL_BGRX8_ANGLEX && colorbufferFormat != GL_RGBX8_ANGLE && !Valid3to4ComponentFloatColorBufferFormat(context, colorbufferFormat)) { context->validationError(entryPoint, GL_INVALID_OPERATION, kInvalidFormat); diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp index 28102d9af..f755d8589 100644 --- a/src/tests/gl_tests/TextureTest.cpp +++ b/src/tests/gl_tests/TextureTest.cpp @@ -5645,6 +5645,24 @@ TEST_P(Texture2DTestES3, TextureRGBImplicitAlpha1) EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); } +// When sampling a texture without an alpha channel, "1" is returned as the alpha value. +// ES 3.0.4 table 3.24 +TEST_P(Texture2DTestES3, TextureRGBXImplicitAlpha1) +{ + ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format")); + + GLuint texture2D; + glGenTextures(1, &texture2D); + glBindTexture(GL_TEXTURE_2D, texture2D); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBX8_ANGLE, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr); + glActiveTexture(GL_TEXTURE0); + EXPECT_GL_NO_ERROR(); + + drawQuad(mProgram, "position", 0.5f); + + EXPECT_PIXEL_ALPHA_EQ(0, 0, 255); +} + // When sampling a texture without an alpha channel, "1" is returned as the alpha value. // ES 3.0.4 table 3.24 TEST_P(Texture2DTest, TextureLuminanceImplicitAlpha1)