Provide packed VkFormat to uint8_t mapping
There are only 241 unique format enums at this moment, so they can fit
in an 8-bit variable instead of the 32-bit enum.
Bug: b/148016460
Change-Id: I00d47a87ac0d053aee44a5d18f3c96d78c0f7cb0
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/42528
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Vulkan/VkFormat.cpp b/src/Vulkan/VkFormat.cpp
index 2638439..c3cc876 100644
--- a/src/Vulkan/VkFormat.cpp
+++ b/src/Vulkan/VkFormat.cpp
@@ -2567,4 +2567,55 @@
return false;
}
+static constexpr uint8_t pack(VkFormat format)
+{
+ if(format > VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM)
+ {
+ return 0;
+ }
+
+ // 0 - 184 direct mapping
+ if(format >= 0 && format <= VK_FORMAT_ASTC_12x12_SRGB_BLOCK)
+ {
+ return uint8_t(format);
+ }
+
+ // 10001560xx -> 185 - 218
+ if(format >= VK_FORMAT_G8B8G8R8_422_UNORM && format <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM)
+ {
+ return uint8_t(format - VK_FORMAT_G8B8G8R8_422_UNORM + 185);
+ }
+
+ // 100005400x -> 219 - 226
+ if(format >= VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG && format <= VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG)
+ {
+ return uint8_t(format - VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG + 219);
+ }
+
+ // 10000660xx -> 227 - 240
+ if(format >= VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT && format <= VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT)
+ {
+ return uint8_t(format - VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT + 227);
+ }
+
+ return 0;
+}
+
+static_assert(VK_HEADER_VERSION == 128, "Update VkFormat to uint8_t mapping if needed");
+static_assert(pack(VK_FORMAT_UNDEFINED) == 0, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_ASTC_12x12_SRGB_BLOCK) == 184, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_G8B8G8R8_422_UNORM) == 185, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM) == 218, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG) == 219, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG) == 226, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT) == 227, "Incorrect VkFormat packed value");
+static_assert(pack(VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT) == 240, "Incorrect VkFormat packed value");
+
+uint8_t Format::mapTo8bit(VkFormat format)
+{
+ ASSERT(format <= VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM);
+
+ return pack(format);
+}
+
} // namespace vk
diff --git a/src/Vulkan/VkFormat.h b/src/Vulkan/VkFormat.h
index 9e4b1f8..06752e1 100644
--- a/src/Vulkan/VkFormat.h
+++ b/src/Vulkan/VkFormat.h
@@ -12,8 +12,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-#ifndef VK_FORMAT_UTILS_HPP_
-#define VK_FORMAT_UTILS_HPP_
+#ifndef VK_FORMAT_HPP_
+#define VK_FORMAT_HPP_
#include "System/Types.hpp"
@@ -25,7 +25,9 @@
{
public:
Format() {}
- Format(VkFormat format) : format(format) {}
+ Format(VkFormat format)
+ : format(format)
+ {}
inline operator VkFormat() const { return format; }
bool isUnsignedNormalized() const;
@@ -42,7 +44,7 @@
bool isFloatFormat() const;
bool isYcbcrFormat() const;
- bool isCompatible(const Format& other) const;
+ bool isCompatible(const Format &other) const;
bool isCompressed() const;
VkFormat getDecompressedFormat() const;
int blockWidth() const;
@@ -65,6 +67,8 @@
bool has32bitIntegerTextureComponents() const;
bool isRGBComponent(int component) const;
+ static uint8_t mapTo8bit(VkFormat format);
+
private:
VkFormat compatibleFormat() const;
int sliceBUnpadded(int width, int height, int border, bool target) const;
@@ -74,4 +78,4 @@
} // namespace vk
-#endif // VK_FORMAT_UTILS_HPP_
\ No newline at end of file
+#endif // VK_FORMAT_HPP_
\ No newline at end of file