summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chia-I Wu <olv@google.com> 2016-04-28 06:36:09 +0800
committer Chia-I Wu <olv@google.com> 2016-04-28 08:52:40 +0800
commit25700b452535ce7ae838bfe832392b46ed555ed2 (patch)
tree0971ec44d2461cc073186422e7a3aab9a06a1c69
parent6cfb89c0bfe11c2ee513fe4df339ad753d4ad4ff (diff)
vulkan: refactor layer enumeration
Replace Enumerate*Layers by a set of new functions that do not distinguish instance and device layers. The new functions are also careful not to pollute the rest of the loader with std containers. There should be no user-visible change. Bug: 27911856 Change-Id: I4790fadc1aa2ea934a4628bce55dd45892f15e0b
-rw-r--r--vulkan/libvulkan/api.cpp43
-rw-r--r--vulkan/libvulkan/layers_extensions.cpp28
-rw-r--r--vulkan/libvulkan/layers_extensions.h10
3 files changed, 53 insertions, 28 deletions
diff --git a/vulkan/libvulkan/api.cpp b/vulkan/libvulkan/api.cpp
index e7f10b351b..e3f69fea82 100644
--- a/vulkan/libvulkan/api.cpp
+++ b/vulkan/libvulkan/api.cpp
@@ -1098,13 +1098,19 @@ VkResult EnumerateInstanceLayerProperties(uint32_t* pPropertyCount,
if (!EnsureInitialized())
return VK_ERROR_INITIALIZATION_FAILED;
- uint32_t count =
- EnumerateInstanceLayers(pProperties ? *pPropertyCount : 0, pProperties);
+ uint32_t count = GetLayerCount();
- if (!pProperties || *pPropertyCount > count)
+ if (!pProperties) {
*pPropertyCount = count;
+ return VK_SUCCESS;
+ }
+
+ uint32_t copied = std::min(*pPropertyCount, count);
+ for (uint32_t i = 0; i < copied; i++)
+ pProperties[i] = GetLayerProperties(GetLayer(i));
+ *pPropertyCount = copied;
- return *pPropertyCount < count ? VK_INCOMPLETE : VK_SUCCESS;
+ return (copied == count) ? VK_SUCCESS : VK_INCOMPLETE;
}
VkResult EnumerateInstanceExtensionProperties(
@@ -1137,13 +1143,34 @@ VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
VkLayerProperties* pProperties) {
(void)physicalDevice;
- uint32_t count =
- EnumerateDeviceLayers(pProperties ? *pPropertyCount : 0, pProperties);
+ uint32_t total_count = GetLayerCount();
+
+ if (!pProperties) {
+ uint32_t count = 0;
+ for (uint32_t i = 0; i < total_count; i++) {
+ if (IsLayerGlobal(GetLayer(i)))
+ count++;
+ }
- if (!pProperties || *pPropertyCount > count)
*pPropertyCount = count;
+ return VK_SUCCESS;
+ }
+
+ uint32_t count = 0;
+ uint32_t copied = 0;
+ for (uint32_t i = 0; i < total_count; i++) {
+ const Layer& layer = GetLayer(i);
+ if (!IsLayerGlobal(layer))
+ continue;
+
+ count++;
+ if (copied < *pPropertyCount)
+ pProperties[copied++] = GetLayerProperties(layer);
+ }
+
+ *pPropertyCount = copied;
- return *pPropertyCount < count ? VK_INCOMPLETE : VK_SUCCESS;
+ return (copied == count) ? VK_SUCCESS : VK_INCOMPLETE;
}
VkResult EnumerateDeviceExtensionProperties(
diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp
index 4cf1c2a688..4363dd8fa8 100644
--- a/vulkan/libvulkan/layers_extensions.cpp
+++ b/vulkan/libvulkan/layers_extensions.cpp
@@ -50,6 +50,7 @@ struct Layer {
VkLayerProperties properties;
size_t library_idx;
+ // true if the layer intercepts vkCreateDevice and device commands
bool is_global;
std::vector<VkExtensionProperties> instance_extensions;
@@ -359,29 +360,20 @@ void DiscoverLayers() {
DiscoverLayersInDirectory(LoaderData::GetInstance().layer_path.c_str());
}
-uint32_t EnumerateInstanceLayers(uint32_t count,
- VkLayerProperties* properties) {
- uint32_t n =
- std::min(count, static_cast<uint32_t>(g_instance_layers.size()));
- for (uint32_t i = 0; i < n; i++)
- properties[i] = g_instance_layers[i].properties;
-
+uint32_t GetLayerCount() {
return static_cast<uint32_t>(g_instance_layers.size());
}
-uint32_t EnumerateDeviceLayers(uint32_t count, VkLayerProperties* properties) {
- uint32_t n = 0;
- for (const auto& layer : g_instance_layers) {
- // ignore non-global layers
- if (!layer.is_global)
- continue;
+const Layer& GetLayer(uint32_t index) {
+ return g_instance_layers[index];
+}
- if (n < count)
- properties[n] = layer.properties;
- n++;
- }
+const VkLayerProperties& GetLayerProperties(const Layer& layer) {
+ return layer.properties;
+}
- return n;
+bool IsLayerGlobal(const Layer& layer) {
+ return layer.is_global;
}
void GetInstanceLayerExtensions(const char* name,
diff --git a/vulkan/libvulkan/layers_extensions.h b/vulkan/libvulkan/layers_extensions.h
index e2eb32bb2a..ee85f00227 100644
--- a/vulkan/libvulkan/layers_extensions.h
+++ b/vulkan/libvulkan/layers_extensions.h
@@ -23,6 +23,7 @@ namespace vulkan {
namespace api {
struct Layer;
+
class LayerRef {
public:
LayerRef(const Layer* layer, bool is_instance);
@@ -48,8 +49,13 @@ class LayerRef {
};
void DiscoverLayers();
-uint32_t EnumerateInstanceLayers(uint32_t count, VkLayerProperties* properties);
-uint32_t EnumerateDeviceLayers(uint32_t count, VkLayerProperties* properties);
+
+uint32_t GetLayerCount();
+const Layer& GetLayer(uint32_t index);
+
+const VkLayerProperties& GetLayerProperties(const Layer& layer);
+bool IsLayerGlobal(const Layer& layer);
+
void GetInstanceLayerExtensions(const char* name,
const VkExtensionProperties** properties,
uint32_t* count);