Add Vulkan 1.2 entry points

Vulkan 1.2 added several entry points, and even if SwiftShader doesn't
support the features that introduced them, dEQP requires they be
implemented regardless.

Test: dEQP-VK.api.version_check.entry_points
Bug: b/182287812
Change-Id: I0d90532e8e1508b71abc39c723167d9586d2cb84
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/53468
Commit-Queue: Sean Risser <srisser@google.com>
Tested-by: Sean Risser <srisser@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkGetProcAddress.cpp b/src/Vulkan/VkGetProcAddress.cpp
index 1ed42cb..38b9f8c 100644
--- a/src/Vulkan/VkGetProcAddress.cpp
+++ b/src/Vulkan/VkGetProcAddress.cpp
@@ -319,6 +319,13 @@
 	MAKE_VULKAN_DEVICE_ENTRY(vkGetSemaphoreCounterValue),
 	MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphore),
 	MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphores),
+	// VK_KHR_buffer_device_address
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddress),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddress),
+	MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddress),
+	// VK_KHR_draw_indirect_count
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCount),
+	MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCount),
 };
 
 static const std::vector<std::pair<const char *, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers = {
@@ -389,6 +396,23 @@
 	        MAKE_VULKAN_DEVICE_ENTRY(vkSignalSemaphoreKHR),
 	        MAKE_VULKAN_DEVICE_ENTRY(vkWaitSemaphoresKHR),
 	    } },
+	// VK_KHR_buffer_device_address
+	{
+	    VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME,
+	    {
+
+	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferDeviceAddressKHR),
+	        MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferOpaqueCaptureAddressKHR),
+	        MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceMemoryOpaqueCaptureAddressKHR),
+	    } },
+	// VK_KHR_draw_indirect_count
+	{
+	    VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME,
+	    {
+
+	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndirectCountKHR),
+	        MAKE_VULKAN_DEVICE_ENTRY(vkCmdDrawIndexedIndirectCountKHR),
+	    } },
 	// VK_EXT_line_rasterization
 	{
 	    VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME,
diff --git a/src/Vulkan/VkPromotedExtensions.cpp b/src/Vulkan/VkPromotedExtensions.cpp
index f150221..6ab78b7 100644
--- a/src/Vulkan/VkPromotedExtensions.cpp
+++ b/src/Vulkan/VkPromotedExtensions.cpp
@@ -231,4 +231,29 @@
 {
 	return vkWaitSemaphores(device, pWaitInfo, timeout);
 }
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride)
+{
+	vkCmdDrawIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCountKHR(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride)
+{
+	vkCmdDrawIndexedIndirectCount(commandBuffer, buffer, offset, countBuffer, countBufferOffset, maxDrawCount, stride);
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferDeviceAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo)
+{
+	return vkGetBufferDeviceAddress(device, pInfo);
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddressKHR(VkDevice device, const VkBufferDeviceAddressInfo *pInfo)
+{
+	return vkGetBufferOpaqueCaptureAddress(device, pInfo);
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddressKHR(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo *pInfo)
+{
+	return vkGetDeviceMemoryOpaqueCaptureAddress(device, pInfo);
+}
 }
diff --git a/src/Vulkan/libVulkan.cpp b/src/Vulkan/libVulkan.cpp
index 6fa939d..649f30e 100644
--- a/src/Vulkan/libVulkan.cpp
+++ b/src/Vulkan/libVulkan.cpp
@@ -1693,6 +1693,30 @@
 	vk::destroy(buffer, pAllocator);
 }
 
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferDeviceAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo)
+{
+	TRACE("(VkDevice device = %p, const VkBufferDeviceAddressInfo* pInfo = %p)",
+	      device, pInfo);
+	UNSUPPORTED("VK_KHR_buffer_device_address");
+	return 0;
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetBufferOpaqueCaptureAddress(VkDevice device, const VkBufferDeviceAddressInfo *pInfo)
+{
+	TRACE("(VkDevice device = %p, const VkBufferDeviceAddressInfo* pInfo = %p)",
+	      device, pInfo);
+	UNSUPPORTED("VK_KHR_buffer_device_address");
+	return 0;
+}
+
+VKAPI_ATTR uint64_t VKAPI_CALL vkGetDeviceMemoryOpaqueCaptureAddress(VkDevice device, const VkDeviceMemoryOpaqueCaptureAddressInfo *pInfo)
+{
+	TRACE("(VkDevice device = %p, const VkDeviceMemoryOpaqueCaptureAddressInfo* pInfo = %p)",
+	      device, pInfo);
+	UNSUPPORTED("VK_KHR_buffer_device_address");
+	return 0;
+}
+
 VKAPI_ATTR VkResult VKAPI_CALL vkCreateBufferView(VkDevice device, const VkBufferViewCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator, VkBufferView *pView)
 {
 	TRACE("(VkDevice device = %p, const VkBufferViewCreateInfo* pCreateInfo = %p, const VkAllocationCallbacks* pAllocator = %p, VkBufferView* pView = %p)",
@@ -2534,6 +2558,20 @@
 	vk::Cast(commandBuffer)->drawIndexedIndirect(vk::Cast(buffer), offset, drawCount, stride);
 }
 
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride)
+{
+	TRACE("(VkCommandBuffer commandBuffer = %p, VkBuffer buffer = %p, VkDeviceSize offset = %d, VkBuffer countBuffer = %p, VkDeviceSize countBufferOffset = %d, uint32_t maxDrawCount = %d, uint32_t stride = %d",
+	      commandBuffer, static_cast<void *>(buffer), int(offset), static_cast<void *>(countBuffer), int(countBufferOffset), int(maxDrawCount), int(stride));
+	UNSUPPORTED("VK_KHR_draw_indirect_count");
+}
+
+VKAPI_ATTR void VKAPI_CALL vkCmdDrawIndexedIndirectCount(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride)
+{
+	TRACE("(VkCommandBuffer commandBuffer = %p, VkBuffer buffer = %p, VkDeviceSize offset = %d, VkBuffer countBuffer = %p, VkDeviceSize countBufferOffset = %d, uint32_t maxDrawCount = %d, uint32_t stride = %d",
+	      commandBuffer, static_cast<void *>(buffer), int(offset), static_cast<void *>(countBuffer), int(countBufferOffset), int(maxDrawCount), int(stride));
+	UNSUPPORTED("VK_KHR_draw_indirect_count");
+}
+
 VKAPI_ATTR void VKAPI_CALL vkCmdDispatch(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
 {
 	TRACE("(VkCommandBuffer commandBuffer = %p, uint32_t groupCountX = %d, uint32_t groupCountY = %d, uint32_t groupCountZ = %d)",
diff --git a/src/Vulkan/vk_swiftshader.def b/src/Vulkan/vk_swiftshader.def
index f0c2c9c..f2f7105 100644
--- a/src/Vulkan/vk_swiftshader.def
+++ b/src/Vulkan/vk_swiftshader.def
@@ -240,3 +240,10 @@
 	vkResetQueryPool

 	; VK_EXT_headless_surface

 	vkCreateHeadlessSurfaceEXT

+	; VK_KHR_buffer_device_address

+	vkGetBufferDeviceAddress

+	vkGetBufferOpaqueCaptureAddress

+	vkGetDeviceMemoryOpaqueCaptureAddress

+	; VK_KHR_draw_indirect_count

+	vkCmdDrawIndirectCount

+	vkCmdDrawIndexedIndirectCount

diff --git a/src/Vulkan/vk_swiftshader.lds b/src/Vulkan/vk_swiftshader.lds
index 0268f98..508f786 100644
--- a/src/Vulkan/vk_swiftshader.lds
+++ b/src/Vulkan/vk_swiftshader.lds
@@ -237,6 +237,13 @@
 	vkGetSemaphoreCounterValueKHR;
 	vkSignalSemaphoreKHR;
 	vkWaitSemaphoresKHR;
+	# VK_KHR_buffer_device_address
+	vkGetBufferDeviceAddress;
+	vkGetBufferOpaqueCaptureAddress;
+	vkGetDeviceMemoryOpaqueCaptureAddress;
+	# VK_KHR_draw_indirect_count
+	vkCmdDrawIndirectCount;
+	vkCmdDrawIndexedIndirectCount;
 	# Android HAL module info object
 	HMI;