Commit 352791e3 by Alexis Hetu Committed by Alexis Hétu

Only expose device extension functions that are enabled

If a device extension isn't enabled, then the associated extension functions shouldn't be exposed through vkGetDeviceProcAddr(). Bug b/117974925 Change-Id: I828cf9ff9d8aaf22c15a5379cfb9d93612d23360 Tests: dEQP-VK.api.version_check.entry_points Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31696 Presubmit-Ready: Alexis Hétu <sugoi@google.com> Reviewed-by: 's avatarChris Forbes <chrisforbes@google.com> Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
parent be02e2f4
...@@ -37,7 +37,9 @@ namespace vk ...@@ -37,7 +37,9 @@ namespace vk
{ {
Device::Device(const Device::CreateInfo* info, void* mem) Device::Device(const Device::CreateInfo* info, void* mem)
: physicalDevice(info->pPhysicalDevice), queues(reinterpret_cast<Queue*>(mem)) : physicalDevice(info->pPhysicalDevice),
queues(reinterpret_cast<Queue*>(mem)),
enabledExtensionCount(info->pCreateInfo->enabledExtensionCount)
{ {
const auto* pCreateInfo = info->pCreateInfo; const auto* pCreateInfo = info->pCreateInfo;
for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++) for(uint32_t i = 0; i < pCreateInfo->queueCreateInfoCount; i++)
...@@ -57,6 +59,12 @@ Device::Device(const Device::CreateInfo* info, void* mem) ...@@ -57,6 +59,12 @@ Device::Device(const Device::CreateInfo* info, void* mem)
} }
} }
extensions = reinterpret_cast<ExtensionName*>(static_cast<uint8_t*>(mem) + (sizeof(Queue) * queueCount));
for(uint32_t i = 0; i < enabledExtensionCount; i++)
{
strncpy(extensions[i], pCreateInfo->ppEnabledExtensionNames[i], VK_MAX_EXTENSION_NAME_SIZE);
}
if(pCreateInfo->enabledLayerCount) if(pCreateInfo->enabledLayerCount)
{ {
// "The ppEnabledLayerNames and enabledLayerCount members of VkDeviceCreateInfo are deprecated and their values must be ignored by implementations." // "The ppEnabledLayerNames and enabledLayerCount members of VkDeviceCreateInfo are deprecated and their values must be ignored by implementations."
...@@ -87,7 +95,19 @@ size_t Device::ComputeRequiredAllocationSize(const Device::CreateInfo* info) ...@@ -87,7 +95,19 @@ size_t Device::ComputeRequiredAllocationSize(const Device::CreateInfo* info)
queueCount += info->pCreateInfo->pQueueCreateInfos[i].queueCount; queueCount += info->pCreateInfo->pQueueCreateInfos[i].queueCount;
} }
return sizeof(Queue) * queueCount; return (sizeof(Queue) * queueCount) + (info->pCreateInfo->enabledExtensionCount * sizeof(ExtensionName));
}
bool Device::hasExtension(const char* extensionName) const
{
for(uint32_t i = 0; i < enabledExtensionCount; i++)
{
if(strncmp(extensions[i], extensionName, VK_MAX_EXTENSION_NAME_SIZE) == 0)
{
return true;
}
}
return false;
} }
VkQueue Device::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const VkQueue Device::getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const
......
...@@ -43,6 +43,7 @@ public: ...@@ -43,6 +43,7 @@ public:
static size_t ComputeRequiredAllocationSize(const CreateInfo* info); static size_t ComputeRequiredAllocationSize(const CreateInfo* info);
bool hasExtension(const char* extensionName) const;
VkQueue getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const; VkQueue getQueue(uint32_t queueFamilyIndex, uint32_t queueIndex) const;
VkResult waitForFences(uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout); VkResult waitForFences(uint32_t fenceCount, const VkFence* pFences, VkBool32 waitAll, uint64_t timeout);
VkResult waitIdle(); VkResult waitIdle();
...@@ -58,6 +59,9 @@ private: ...@@ -58,6 +59,9 @@ private:
Queue* queues = nullptr; Queue* queues = nullptr;
uint32_t queueCount = 0; uint32_t queueCount = 0;
sw::Blitter* blitter = nullptr; sw::Blitter* blitter = nullptr;
uint32_t enabledExtensionCount = 0;
typedef char ExtensionName[VK_MAX_EXTENSION_NAME_SIZE];
ExtensionName* extensions = nullptr;
}; };
using DispatchableDevice = DispatchableObject<Device, VkDevice>; using DispatchableDevice = DispatchableObject<Device, VkDevice>;
......
...@@ -13,9 +13,11 @@ ...@@ -13,9 +13,11 @@
// limitations under the License. // limitations under the License.
#include "VkGetProcAddress.h" #include "VkGetProcAddress.h"
#include "VkDevice.hpp"
#include <unordered_map> #include <unordered_map>
#include <string> #include <string>
#include <vector>
#ifdef __ANDROID__ #ifdef __ANDROID__
#include <cerrno> #include <cerrno>
...@@ -234,44 +236,90 @@ static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionP ...@@ -234,44 +236,90 @@ static const std::unordered_map<std::string, PFN_vkVoidFunction> deviceFunctionP
MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate), MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplate),
MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate), MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplate),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport), MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupport),
#ifdef __ANDROID__
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID),
MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID),
#endif
};
static const std::vector<std::pair<const char*, std::unordered_map<std::string, PFN_vkVoidFunction>>> deviceExtensionFunctionPointers =
{
// VK_KHR_descriptor_update_template // VK_KHR_descriptor_update_template
MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR), VK_KHR_DESCRIPTOR_UPDATE_TEMPLATE_EXTENSION_NAME,
MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkCreateDescriptorUpdateTemplateKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroyDescriptorUpdateTemplateKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkUpdateDescriptorSetWithTemplateKHR),
}
},
// VK_KHR_device_group // VK_KHR_device_group
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR), VK_KHR_DEVICE_GROUP_EXTENSION_NAME,
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPeerMemoryFeaturesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdSetDeviceMaskKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkCmdDispatchBaseKHR),
}
},
// VK_KHR_maintenance1 // VK_KHR_maintenance1
MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR), {
VK_KHR_MAINTENANCE1_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkTrimCommandPoolKHR),
}
},
// VK_KHR_sampler_ycbcr_conversion // VK_KHR_sampler_ycbcr_conversion
MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR), VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkCreateSamplerYcbcrConversionKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkDestroySamplerYcbcrConversionKHR),
}
},
// VK_KHR_bind_memory2 // VK_KHR_bind_memory2
MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR), VK_KHR_BIND_MEMORY_2_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkBindBufferMemory2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkBindImageMemory2KHR),
}
},
// VK_KHR_get_memory_requirements2 // VK_KHR_get_memory_requirements2
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR), VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageMemoryRequirements2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetBufferMemoryRequirements2KHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetImageSparseMemoryRequirements2KHR),
}
},
// VK_KHR_maintenance3 // VK_KHR_maintenance3
MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR), {
VK_KHR_MAINTENANCE3_EXTENSION_NAME,
{
MAKE_VULKAN_DEVICE_ENTRY(vkGetDescriptorSetLayoutSupportKHR),
}
},
#ifndef __ANDROID__ #ifndef __ANDROID__
// VK_KHR_swapchain // VK_KHR_swapchain
MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR), VK_KHR_SWAPCHAIN_EXTENSION_NAME,
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR), {
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR), MAKE_VULKAN_DEVICE_ENTRY(vkCreateSwapchainKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR), MAKE_VULKAN_DEVICE_ENTRY(vkDestroySwapchainKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR), MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainImagesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR), MAKE_VULKAN_DEVICE_ENTRY(vkAcquireNextImageKHR),
#else MAKE_VULKAN_DEVICE_ENTRY(vkQueuePresentKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsageANDROID), MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupPresentCapabilitiesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkGetSwapchainGrallocUsage2ANDROID), MAKE_VULKAN_DEVICE_ENTRY(vkGetDeviceGroupSurfacePresentModesKHR),
MAKE_VULKAN_DEVICE_ENTRY(vkAcquireImageANDROID), }
MAKE_VULKAN_DEVICE_ENTRY(vkQueueSignalReleaseImageANDROID), },
#endif #endif
}; };
#undef MAKE_VULKAN_DEVICE_ENTRY #undef MAKE_VULKAN_DEVICE_ENTRY
PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName) PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const char* pName)
...@@ -308,6 +356,19 @@ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName) ...@@ -308,6 +356,19 @@ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName)
return deviceFunction->second; return deviceFunction->second;
} }
vk::Device* myDevice = Cast(device);
for(const auto& deviceExtensionFunctions : deviceExtensionFunctionPointers)
{
if(myDevice->hasExtension(deviceExtensionFunctions.first))
{
deviceFunction = deviceExtensionFunctions.second.find(std::string(pName));
if(deviceFunction != deviceExtensionFunctions.second.end())
{
return deviceFunction->second;
}
}
}
return nullptr; return nullptr;
} }
......
...@@ -1290,8 +1290,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device, cons ...@@ -1290,8 +1290,7 @@ VKAPI_ATTR VkResult VKAPI_CALL vkCreateDescriptorSetLayout(VkDevice device, cons
switch(extensionCreateInfo->sType) switch(extensionCreateInfo->sType)
{ {
case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT: case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT:
ASSERT(!HasExtensionProperty(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME, deviceExtensionProperties, ASSERT(!vk::Cast(device)->hasExtension(VK_EXT_DESCRIPTOR_INDEXING_EXTENSION_NAME));
sizeof(deviceExtensionProperties) / sizeof(deviceExtensionProperties[0])));
break; break;
default: default:
UNIMPLEMENTED("extensionCreateInfo->sType"); UNIMPLEMENTED("extensionCreateInfo->sType");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment