Revert "Use a constexpr array for es3 copy conversion table."
This reverts commit f30808db86e31b8b301eb9ec07cfe785d60b6a16.
Reason for revert: build/android/gyp/assert_static_initializers.py thinks this adds a static initializer.
See https://ci.chromium.org/p/chromium/builders/try/android-marshmallow-arm64-rel/208664
Need to revert since this is blocking the roll.
Original change's description:
> Use a constexpr array for es3 copy conversion table.
>
> With the relaxed C++14 constexpr rules allowed in Chromium, we can
> use a constexpr sorted array to store our table data. This can lead
> to very fast lookups while being more maintanable than using auto-
> generator scripts for every lookup table.
>
> Note that to be sure this syntax is permitted, we should land this
> through the bots and let it sit for a little while.
>
> Bug: angleproject:1389
> Change-Id: I9395c40276470108ce3e5786d8f1b8d85462c517
> Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/777544
> Commit-Queue: Jamie Madill <jmadill@google.com>
> Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
TBR=ynovikov@chromium.org,jmadill@google.com,syoussefi@chromium.org,jmadill@chromium.org
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: angleproject:1389
Change-Id: I482729b6f16975896b0e5c29999f9a081056e800
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1506238
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/scripts/run_code_generation.py b/scripts/run_code_generation.py
index b7094f7..0f65a4c 100755
--- a/scripts/run_code_generation.py
+++ b/scripts/run_code_generation.py
@@ -93,6 +93,12 @@
auto_script('scripts/generate_loader.py'),
'GL/EGL entry points':
auto_script('scripts/generate_entry_points.py'),
+ 'GL copy conversion table': {
+ 'inputs': [
+ 'src/libANGLE/es3_copy_conversion_formats.json',
+ ],
+ 'script': 'src/libANGLE/gen_copy_conversion_table.py',
+ },
'GL format map': {
'inputs': [
'src/libANGLE/es3_format_type_combinations.json',
diff --git a/scripts/run_code_generation_hashes.json b/scripts/run_code_generation_hashes.json
index 127829b..ed63b87 100644
--- a/scripts/run_code_generation_hashes.json
+++ b/scripts/run_code_generation_hashes.json
@@ -45,6 +45,10 @@
"002ad46d144c51fe98d73478aa554ba7",
"Emulated HLSL functions:src/compiler/translator/gen_emulated_builtin_function_tables.py":
"6a00c1ba22c35a9b700a154efda6f861",
+ "GL copy conversion table:src/libANGLE/es3_copy_conversion_formats.json":
+ "54608f6f7d9aa7c59a8458ccf3ab9935",
+ "GL copy conversion table:src/libANGLE/gen_copy_conversion_table.py":
+ "ac1afe23d9578bd1d2ef74f4a7aa927a",
"GL format map:src/libANGLE/es3_format_type_combinations.json":
"a232823cd6430f14e28793ccabb968ee",
"GL format map:src/libANGLE/format_map_data.json":
diff --git a/src/common/constexpr_array.h b/src/common/constexpr_array.h
deleted file mode 100644
index c8d6154..0000000
--- a/src/common/constexpr_array.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//
-// Copyright 2019 The ANGLE Project Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// constexpr_array:
-// C++14 relaxes constexpr requirements enough that we can support sorting
-// a constexpr std::array at compile-time. This is useful for defining fast
-// lookup tables and other data at compile-time.
-// The code is adapted from https://stackoverflow.com/a/40030044.
-
-#ifndef COMMON_CONSTEXPR_ARRAY_H_
-#define COMMON_CONSTEXPR_ARRAY_H_
-
-#include <algorithm>
-
-namespace angle
-{
-template <class T>
-constexpr void constexpr_swap(T &l, T &r)
-{
- T tmp = std::move(l);
- l = std::move(r);
- r = std::move(tmp);
-}
-
-template <typename T, size_t N>
-struct constexpr_array
-{
- constexpr T &operator[](size_t i) { return arr[i]; }
-
- constexpr const T &operator[](size_t i) const { return arr[i]; }
-
- constexpr const T *begin() const { return arr; }
- constexpr const T *end() const { return arr + N; }
-
- T arr[N];
-};
-
-namespace priv
-{
-template <typename T, size_t N>
-size_t hoare_partition(constexpr_array<T, N> &arr, size_t left, size_t right)
-{
- const T pivot = arr[(left + right) >> 1];
- size_t i = left - 1;
- size_t j = right + 1;
-
- for (;;)
- {
- do
- {
- i++;
- } while (arr[i] < pivot);
-
- do
- {
- j--;
- } while (arr[j] > pivot);
-
- if (i >= j)
- {
- return j;
- }
-
- constexpr_swap(arr[i], arr[j]);
- }
-
- return 0;
-}
-
-template <typename T, size_t N>
-void constexpr_sort_impl(constexpr_array<T, N> &arr, size_t left, size_t right)
-{
- if (left < right)
- {
- size_t p = priv::hoare_partition(arr, left, right);
- constexpr_sort_impl(arr, left, p);
- constexpr_sort_impl(arr, p + 1, right);
- }
-}
-} // namespace priv
-
-// Note that std::sort in constexpr in c++20. So this implementation can be
-// removed given sufficient STL support.
-template <typename T, size_t N>
-constexpr_array<T, N> constexpr_sort(constexpr_array<T, N> arr)
-{
- auto sorted = arr;
- priv::constexpr_sort_impl(sorted, 0, N - 1);
- return sorted;
-}
-
-template <typename T, size_t N>
-bool constexpr_array_contains(const constexpr_array<T, N> &haystack, const T &needle)
-{
- const T *found = std::lower_bound(haystack.begin(), haystack.end(), needle);
- return (found && *found == needle);
-}
-} // namespace angle
-
-#endif // COMMON_CONSTEXPR_ARRAY_H_
diff --git a/src/libANGLE/es3_copy_conversion_formats.json b/src/libANGLE/es3_copy_conversion_formats.json
new file mode 100644
index 0000000..39b71fd
--- /dev/null
+++ b/src/libANGLE/es3_copy_conversion_formats.json
@@ -0,0 +1,44 @@
+{
+ "From ES 3.0.1 spec, table 3.15":
+ [
+ [ "GL_ALPHA", "GL_RGBA" ],
+ [ "GL_LUMINANCE", "GL_RED" ],
+ [ "GL_LUMINANCE", "GL_RG" ],
+ [ "GL_LUMINANCE", "GL_RGB" ],
+ [ "GL_LUMINANCE", "GL_RGBA" ],
+ [ "GL_LUMINANCE_ALPHA", "GL_RGBA" ],
+ [ "GL_RED", "GL_RED" ],
+ [ "GL_RED", "GL_RG" ],
+ [ "GL_RED", "GL_RGB" ],
+ [ "GL_RED", "GL_RGBA" ],
+ [ "GL_RG", "GL_RG" ],
+ [ "GL_RG", "GL_RGB" ],
+ [ "GL_RG", "GL_RGBA" ],
+ [ "GL_RGB", "GL_RGB" ],
+ [ "GL_RGB", "GL_RGBA" ],
+ [ "GL_RGBA", "GL_RGBA" ]
+ ],
+
+ "Necessary for ANGLE back-buffers":
+ [
+ [ "GL_ALPHA", "GL_BGRA_EXT" ],
+ [ "GL_LUMINANCE", "GL_BGRA_EXT" ],
+ [ "GL_LUMINANCE_ALPHA", "GL_BGRA_EXT" ],
+ [ "GL_RED", "GL_BGRA_EXT" ],
+ [ "GL_RG", "GL_BGRA_EXT" ],
+ [ "GL_RGB", "GL_BGRA_EXT" ],
+ [ "GL_RGBA", "GL_BGRA_EXT" ],
+ [ "GL_BGRA_EXT", "GL_BGRA_EXT" ],
+
+ [ "GL_RED_INTEGER", "GL_RED_INTEGER" ],
+ [ "GL_RED_INTEGER", "GL_RG_INTEGER" ],
+ [ "GL_RED_INTEGER", "GL_RGB_INTEGER" ],
+ [ "GL_RED_INTEGER", "GL_RGBA_INTEGER" ],
+ [ "GL_RG_INTEGER", "GL_RG_INTEGER" ],
+ [ "GL_RG_INTEGER", "GL_RGB_INTEGER" ],
+ [ "GL_RG_INTEGER", "GL_RGBA_INTEGER" ],
+ [ "GL_RGB_INTEGER", "GL_RGB_INTEGER" ],
+ [ "GL_RGB_INTEGER", "GL_RGBA_INTEGER" ],
+ [ "GL_RGBA_INTEGER", "GL_RGBA_INTEGER" ]
+ ]
+}
diff --git a/src/libANGLE/es3_copy_conversion_table_autogen.cpp b/src/libANGLE/es3_copy_conversion_table_autogen.cpp
new file mode 100644
index 0000000..d530dbd
--- /dev/null
+++ b/src/libANGLE/es3_copy_conversion_table_autogen.cpp
@@ -0,0 +1,171 @@
+// GENERATED FILE - DO NOT EDIT.
+// Generated by gen_copy_conversion_table.py using data from es3_copy_conversion_formats.json.
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// format_map:
+// Determining the sized internal format from a (format,type) pair.
+// Also check es3 format combinations for validity.
+
+#include "angle_gl.h"
+#include "common/debug.h"
+
+namespace gl
+{
+
+bool ValidES3CopyConversion(GLenum textureFormat, GLenum framebufferFormat)
+{
+ switch (textureFormat)
+ {
+ case GL_ALPHA:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_BGRA_EXT:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_LUMINANCE:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RED:
+ case GL_RG:
+ case GL_RGB:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_LUMINANCE_ALPHA:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RED:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RED:
+ case GL_RG:
+ case GL_RGB:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RED_INTEGER:
+ switch (framebufferFormat)
+ {
+ case GL_RED_INTEGER:
+ case GL_RGBA_INTEGER:
+ case GL_RGB_INTEGER:
+ case GL_RG_INTEGER:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RG:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RG:
+ case GL_RGB:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RGB:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RGB:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RGBA:
+ switch (framebufferFormat)
+ {
+ case GL_BGRA_EXT:
+ case GL_RGBA:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RGBA_INTEGER:
+ switch (framebufferFormat)
+ {
+ case GL_RGBA_INTEGER:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RGB_INTEGER:
+ switch (framebufferFormat)
+ {
+ case GL_RGBA_INTEGER:
+ case GL_RGB_INTEGER:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ case GL_RG_INTEGER:
+ switch (framebufferFormat)
+ {
+ case GL_RGBA_INTEGER:
+ case GL_RGB_INTEGER:
+ case GL_RG_INTEGER:
+ return true;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+} // namespace gl
diff --git a/src/libANGLE/formatutils.h b/src/libANGLE/formatutils.h
index 20e74a1..60eb67f 100644
--- a/src/libANGLE/formatutils.h
+++ b/src/libANGLE/formatutils.h
@@ -269,6 +269,10 @@
bool ValidES3Format(GLenum format);
bool ValidES3Type(GLenum type);
bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat);
+
+// Implemented in es3_copy_conversion_table_autogen.cpp
+bool ValidES3CopyConversion(GLenum textureFormat, GLenum framebufferFormat);
+
} // namespace gl
#endif // LIBANGLE_FORMATUTILS_H_
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp
index 20cc3ba..a5750f2 100644
--- a/src/libANGLE/validationES3.cpp
+++ b/src/libANGLE/validationES3.cpp
@@ -9,7 +9,6 @@
#include "libANGLE/validationES3_autogen.h"
#include "anglebase/numerics/safe_conversions.h"
-#include "common/constexpr_array.h"
#include "common/mathutil.h"
#include "common/utilities.h"
#include "libANGLE/Context.h"
@@ -257,55 +256,6 @@
return true;
}
-
-// Since the unsorted array is only referenced in construction, it should be optimized out.
-using CopyDesc = std::pair<GLenum, GLenum>;
-constexpr angle::constexpr_array<CopyDesc, 34> kUnsortedCopyConversionTable{
- {// From ES 3.0.1 spec, table 3.15
- {GL_ALPHA, GL_RGBA},
- {GL_LUMINANCE, GL_RED},
- {GL_LUMINANCE, GL_RG},
- {GL_LUMINANCE, GL_RGB},
- {GL_LUMINANCE, GL_RGBA},
- {GL_LUMINANCE_ALPHA, GL_RGBA},
- {GL_RED, GL_RED},
- {GL_RED, GL_RG},
- {GL_RED, GL_RGB},
- {GL_RED, GL_RGBA},
- {GL_RG, GL_RG},
- {GL_RG, GL_RGB},
- {GL_RG, GL_RGBA},
- {GL_RGB, GL_RGB},
- {GL_RGB, GL_RGBA},
- {GL_RGBA, GL_RGBA},
-
- // Necessary for ANGLE back-buffers
- {GL_ALPHA, GL_BGRA_EXT},
- {GL_LUMINANCE, GL_BGRA_EXT},
- {GL_LUMINANCE_ALPHA, GL_BGRA_EXT},
- {GL_RED, GL_BGRA_EXT},
- {GL_RG, GL_BGRA_EXT},
- {GL_RGB, GL_BGRA_EXT},
- {GL_RGBA, GL_BGRA_EXT},
- {GL_BGRA_EXT, GL_BGRA_EXT},
-
- {GL_RED_INTEGER, GL_RED_INTEGER},
- {GL_RED_INTEGER, GL_RG_INTEGER},
- {GL_RED_INTEGER, GL_RGB_INTEGER},
- {GL_RED_INTEGER, GL_RGBA_INTEGER},
- {GL_RG_INTEGER, GL_RG_INTEGER},
- {GL_RG_INTEGER, GL_RGB_INTEGER},
- {GL_RG_INTEGER, GL_RGBA_INTEGER},
- {GL_RGB_INTEGER, GL_RGB_INTEGER},
- {GL_RGB_INTEGER, GL_RGBA_INTEGER},
- {GL_RGBA_INTEGER, GL_RGBA_INTEGER}}};
-
-auto kSortedCopyConversionTable = angle::constexpr_sort(kUnsortedCopyConversionTable);
-
-bool ValidES3CopyConversion(GLenum textureFormat, GLenum framebufferFormat)
-{
- return constexpr_array_contains(kSortedCopyConversionTable, {textureFormat, framebufferFormat});
-}
} // anonymous namespace
static bool ValidateTexImageFormatCombination(gl::Context *context,
diff --git a/src/libGLESv2.gni b/src/libGLESv2.gni
index 713f3c4..dd4be32 100644
--- a/src/libGLESv2.gni
+++ b/src/libGLESv2.gni
@@ -24,7 +24,6 @@
"src/common/angleutils.cpp",
"src/common/angleutils.h",
"src/common/bitset_utils.h",
- "src/common/constexpr_array.h",
"src/common/debug.cpp",
"src/common/debug.h",
"src/common/hash_utils.h",
@@ -269,6 +268,7 @@
"src/libANGLE/angletypes.cpp",
"src/libANGLE/angletypes.h",
"src/libANGLE/angletypes.inl",
+ "src/libANGLE/es3_copy_conversion_table_autogen.cpp",
"src/libANGLE/features.h",
"src/libANGLE/format_map_autogen.cpp",
"src/libANGLE/formatutils.cpp",