Eliminate use of Vulkan header BEGIN_RANGE/END_RANGE/RANGE_SIZE enums
As per Khronos, these enums will no longer be available in future Vulkan headers:
https://www.khronos.org/news/permalink/khronos-group-asking-for-feedback-on-removing-begin-range-end-range-range-size-tokens-from-headers
This change now asserts that our Vulkan driver is built using a known
version of the Vulkan headers (vk::SwiftShaderVulkanHeaderVersion), and
when we update, the static assert will trip, reminding us to validate
the range constants that we use, and must manually maintain.
Bug: b/153337629
Bug: b/154215163
Change-Id: I319978e3979893a8a0cc44caf6cc79a584e518fb
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/44388
Tested-by: Antonio Maiorano <amaiorano@google.com>
Kokoro-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp
index 03d04c1..d46620d 100644
--- a/src/Vulkan/VkCommandBuffer.cpp
+++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -1111,7 +1111,7 @@
void play(vk::CommandBuffer::ExecutionState &executionState) override
{
- ASSERT(pipelineBindPoint < VK_PIPELINE_BIND_POINT_RANGE_SIZE);
+ ASSERT(pipelineBindPoint < vk::VK_PIPELINE_BIND_POINT_RANGE_SIZE);
ASSERT(firstSet + descriptorSetCount <= vk::MAX_BOUND_DESCRIPTOR_SETS);
ASSERT(firstDynamicOffset + dynamicOffsetCount <= vk::MAX_DESCRIPTOR_SET_COMBINED_BUFFERS_DYNAMIC);
diff --git a/src/Vulkan/VkCommandBuffer.hpp b/src/Vulkan/VkCommandBuffer.hpp
index 00efb1d..f209102 100644
--- a/src/Vulkan/VkCommandBuffer.hpp
+++ b/src/Vulkan/VkCommandBuffer.hpp
@@ -147,7 +147,7 @@
sw::TaskEvents *events = nullptr;
RenderPass *renderPass = nullptr;
Framebuffer *renderPassFramebuffer = nullptr;
- std::array<PipelineState, VK_PIPELINE_BIND_POINT_RANGE_SIZE> pipelineState;
+ std::array<PipelineState, vk::VK_PIPELINE_BIND_POINT_RANGE_SIZE> pipelineState;
struct DynamicState
{
diff --git a/src/Vulkan/VkImageView.cpp b/src/Vulkan/VkImageView.cpp
index c88fd71..4b8880d 100644
--- a/src/Vulkan/VkImageView.cpp
+++ b/src/Vulkan/VkImageView.cpp
@@ -74,7 +74,7 @@
Identifier::Identifier(VkFormat fmt)
{
- static_assert(VK_IMAGE_VIEW_TYPE_END_RANGE == 6, "VkImageViewType does not allow using 7 to indicate buffer view");
+ static_assert(vk::VK_IMAGE_VIEW_TYPE_END_RANGE == 6, "VkImageViewType does not allow using 7 to indicate buffer view");
imageViewType = 7; // Still fits in 3-bit field
format = Format::mapTo8bit(fmt);
}
diff --git a/src/Vulkan/VkStringify.cpp b/src/Vulkan/VkStringify.cpp
index 9e660fd..a8247f3 100644
--- a/src/Vulkan/VkStringify.cpp
+++ b/src/Vulkan/VkStringify.cpp
@@ -453,9 +453,6 @@
INSERT_ELEMENT(VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_PROVOKING_VERTEX_STATE_CREATE_INFO_EXT),
INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_PROPERTIES_EXT),
INSERT_ELEMENT(VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT),
- INSERT_ELEMENT(VK_STRUCTURE_TYPE_BEGIN_RANGE),
- INSERT_ELEMENT(VK_STRUCTURE_TYPE_END_RANGE),
- INSERT_ELEMENT(VK_STRUCTURE_TYPE_RANGE_SIZE),
INSERT_ELEMENT(VK_STRUCTURE_TYPE_MAX_ENUM)
# undef INSERT_ELEMENT
};
diff --git a/src/Vulkan/VulkanPlatform.hpp b/src/Vulkan/VulkanPlatform.hpp
index b5f8630..a220865 100644
--- a/src/Vulkan/VulkanPlatform.hpp
+++ b/src/Vulkan/VulkanPlatform.hpp
@@ -57,4 +57,18 @@
# undef None
#endif
+namespace vk {
+// Here we define constants that used to be in the Vulkan headers, but are not part of the spec.
+// See: https://github.com/KhronosGroup/Vulkan-Docs/issues/1230
+
+// When updating the Vulkan Headers we use, go through each constant below and make sure they are valid.
+// Once that's done, update SwiftShaderVulkanHeaderVersion.
+constexpr int SwiftShaderVulkanHeaderVersion = 128;
+static_assert(SwiftShaderVulkanHeaderVersion == VK_HEADER_VERSION, "Please validate/update constants below upon upgrading Vulkan headers");
+
+constexpr auto VK_PIPELINE_BIND_POINT_RANGE_SIZE = (VK_PIPELINE_BIND_POINT_COMPUTE - VK_PIPELINE_BIND_POINT_GRAPHICS + 1);
+constexpr auto VK_IMAGE_VIEW_TYPE_END_RANGE = VK_IMAGE_VIEW_TYPE_CUBE_ARRAY;
+
+} // namespace vk
+
#endif // VULKAN_PLATFORM