summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chia-I Wu <olv@google.com> 2016-03-24 16:16:21 +0800
committer Chia-I Wu <olv@google.com> 2016-04-11 07:37:19 +0800
commit01cf305325f3789c573d7eff435e409f04677c66 (patch)
treec7aa635840bffb8096791a2e838cd6cf1e888d42
parent4901db70b12801cf1966937a58eb7566bfdeb4ce (diff)
vulkan: rework EnumerateDeviceExtensionProperties_Bottom
The reworked driver::EnumerateDeviceExtensionProperties will simply return all extensions enumerated by HAL, with VK_ANDROID_native_buffer replaced by VK_KHR_swapchain. This allows extensions unknown to the loader to be enumerated. Change-Id: Iceed8ee3f16a968d005ae3ba42f1bd1839c2ab9f
-rw-r--r--vulkan/libvulkan/code-generator.tmpl10
-rw-r--r--vulkan/libvulkan/driver.cpp31
-rw-r--r--vulkan/libvulkan/driver.h2
-rw-r--r--vulkan/libvulkan/driver_gen.cpp2
-rw-r--r--vulkan/libvulkan/loader.cpp34
-rw-r--r--vulkan/libvulkan/loader.h1
6 files changed, 39 insertions, 41 deletions
diff --git a/vulkan/libvulkan/code-generator.tmpl b/vulkan/libvulkan/code-generator.tmpl
index 3a6f0a97b5..e06ce121ae 100644
--- a/vulkan/libvulkan/code-generator.tmpl
+++ b/vulkan/libvulkan/code-generator.tmpl
@@ -790,12 +790,12 @@ VK_KHR_swapchain
{{else}}
ProcHook::EXTENSION_CORE,
- {{if eq $.Name "vkGetInstanceProcAddr"}}
- reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
- {{else if eq $.Name "vkCreateDevice"}}
- reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
- {{else}}
+ {{if eq $.Name "vkDestroyInstance"}}
reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
+ {{else if eq $.Name "vkEnumeratePhysicalDevices"}}
+ reinterpret_cast<PFN_vkVoidFunction>({{$base}}_Bottom),
+ {{else}}
+ reinterpret_cast<PFN_vkVoidFunction>({{$base}}),
{{end}}
nullptr,
nullptr,
diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp
index 02e60b7f9a..b20962fbeb 100644
--- a/vulkan/libvulkan/driver.cpp
+++ b/vulkan/libvulkan/driver.cpp
@@ -496,6 +496,37 @@ PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName) {
: hook->disabled_proc;
}
+VkResult EnumerateDeviceExtensionProperties(
+ VkPhysicalDevice physicalDevice,
+ const char* pLayerName,
+ uint32_t* pPropertyCount,
+ VkExtensionProperties* pProperties) {
+ const InstanceData& data = GetData(physicalDevice);
+
+ VkResult result = data.driver.EnumerateDeviceExtensionProperties(
+ physicalDevice, pLayerName, pPropertyCount, pProperties);
+ if (result != VK_SUCCESS && result != VK_INCOMPLETE)
+ return result;
+
+ if (!pProperties)
+ return result;
+
+ // map VK_ANDROID_native_buffer to VK_KHR_swapchain
+ for (uint32_t i = 0; i < *pPropertyCount; i++) {
+ auto& prop = pProperties[i];
+
+ if (strcmp(prop.extensionName,
+ VK_ANDROID_NATIVE_BUFFER_EXTENSION_NAME) != 0)
+ continue;
+
+ memcpy(prop.extensionName, VK_KHR_SWAPCHAIN_EXTENSION_NAME,
+ sizeof(VK_KHR_SWAPCHAIN_EXTENSION_NAME));
+ prop.specVersion = VK_KHR_SWAPCHAIN_SPEC_VERSION;
+ }
+
+ return result;
+}
+
VkResult CreateDevice(VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
diff --git a/vulkan/libvulkan/driver.h b/vulkan/libvulkan/driver.h
index b3678dc242..f8daa00a9b 100644
--- a/vulkan/libvulkan/driver.h
+++ b/vulkan/libvulkan/driver.h
@@ -109,6 +109,8 @@ VKAPI_ATTR PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance, const cha
VKAPI_ATTR PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* pName);
VKAPI_ATTR VkResult EnumerateInstanceExtensionProperties(const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+VKAPI_ATTR VkResult EnumerateDeviceExtensionProperties(VkPhysicalDevice physicalDevice, const char* pLayerName, uint32_t* pPropertyCount, VkExtensionProperties* pProperties);
+
VKAPI_ATTR VkResult CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDevice* pDevice);
VKAPI_ATTR void DestroyDevice(VkDevice device, const VkAllocationCallbacks* pAllocator);
diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp
index 81299fc28f..e88299de5e 100644
--- a/vulkan/libvulkan/driver_gen.cpp
+++ b/vulkan/libvulkan/driver_gen.cpp
@@ -236,7 +236,7 @@ const ProcHook g_proc_hooks[] = {
"vkEnumerateDeviceExtensionProperties",
ProcHook::INSTANCE,
ProcHook::EXTENSION_CORE,
- reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties_Bottom),
+ reinterpret_cast<PFN_vkVoidFunction>(EnumerateDeviceExtensionProperties),
nullptr,
nullptr,
},
diff --git a/vulkan/libvulkan/loader.cpp b/vulkan/libvulkan/loader.cpp
index 0313f7e87e..34ec77cd79 100644
--- a/vulkan/libvulkan/loader.cpp
+++ b/vulkan/libvulkan/loader.cpp
@@ -455,40 +455,6 @@ VkResult EnumeratePhysicalDevices_Bottom(VkInstance vkinstance,
return VK_SUCCESS;
}
-VKAPI_ATTR
-VkResult EnumerateDeviceExtensionProperties_Bottom(
- VkPhysicalDevice pdev,
- const char* layer_name,
- uint32_t* properties_count,
- VkExtensionProperties* properties) {
- (void)layer_name;
-
- Instance& instance = GetDispatchParent(pdev);
-
- size_t gpu_idx = 0;
- while (instance.physical_devices[gpu_idx] != pdev)
- gpu_idx++;
- const DeviceExtensionSet driver_extensions =
- instance.physical_device_driver_extensions[gpu_idx];
-
- // We only support VK_KHR_swapchain if the GPU supports
- // VK_ANDROID_native_buffer
- VkExtensionProperties* available = static_cast<VkExtensionProperties*>(
- alloca(kDeviceExtensionCount * sizeof(VkExtensionProperties)));
- uint32_t num_extensions = 0;
- if (driver_extensions[kANDROID_native_buffer]) {
- available[num_extensions++] = VkExtensionProperties{
- VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_KHR_SWAPCHAIN_SPEC_VERSION};
- }
-
- if (!properties || *properties_count > num_extensions)
- *properties_count = num_extensions;
- if (properties)
- std::copy(available, available + *properties_count, properties);
-
- return *properties_count < num_extensions ? VK_INCOMPLETE : VK_SUCCESS;
-}
-
void DestroyInstance_Bottom(VkInstance vkinstance,
const VkAllocationCallbacks* allocator) {
Instance& instance = GetDispatchParent(vkinstance);
diff --git a/vulkan/libvulkan/loader.h b/vulkan/libvulkan/loader.h
index 8c8c8fc0c3..38bdaa415b 100644
--- a/vulkan/libvulkan/loader.h
+++ b/vulkan/libvulkan/loader.h
@@ -49,7 +49,6 @@ bool InitLoader(hwvulkan_device_t* dev);
// clang-format off
VKAPI_ATTR VkResult CreateInstance_Bottom(const VkInstanceCreateInfo* create_info, const VkAllocationCallbacks* allocator, VkInstance* vkinstance);
VKAPI_ATTR VkResult EnumeratePhysicalDevices_Bottom(VkInstance vkinstance, uint32_t* pdev_count, VkPhysicalDevice* pdevs);
-VKAPI_ATTR VkResult EnumerateDeviceExtensionProperties_Bottom(VkPhysicalDevice pdev, const char* layer_name, uint32_t* properties_count, VkExtensionProperties* properties);
VKAPI_ATTR void DestroyInstance_Bottom(VkInstance vkinstance, const VkAllocationCallbacks* allocator);
// clang-format on