vulkan: remove g_device_layers
All device layers are now instance layers. We do not need to maintain two
vectors.
Change-Id: I97efd6c92395f00ac41aae6862e5607dfa678156
diff --git a/vulkan/libvulkan/layers_extensions.cpp b/vulkan/libvulkan/layers_extensions.cpp
index be0a3ee..4cf1c2a 100644
--- a/vulkan/libvulkan/layers_extensions.cpp
+++ b/vulkan/libvulkan/layers_extensions.cpp
@@ -43,17 +43,17 @@
// probably want to intern strings, etc., and will need some custom/manual data
// structures.
-// TODO(jessehall): Currently we have separate lists for instance and device
-// layers. Most layers are both; we should use one entry for each layer name,
-// with a mask saying what kind(s) it is.
-
namespace vulkan {
namespace api {
struct Layer {
VkLayerProperties properties;
size_t library_idx;
- std::vector<VkExtensionProperties> extensions;
+
+ bool is_global;
+
+ std::vector<VkExtensionProperties> instance_extensions;
+ std::vector<VkExtensionProperties> device_extensions;
};
namespace {
@@ -79,8 +79,7 @@
void Close();
bool EnumerateLayers(size_t library_idx,
- std::vector<Layer>& instance_layers,
- std::vector<Layer>& device_layers) const;
+ std::vector<Layer>& instance_layers) const;
void* GetGPA(const Layer& layer,
const char* gpa_name,
@@ -123,8 +122,7 @@
}
bool LayerLibrary::EnumerateLayers(size_t library_idx,
- std::vector<Layer>& instance_layers,
- std::vector<Layer>& device_layers) const {
+ std::vector<Layer>& instance_layers) const {
PFN_vkEnumerateInstanceLayerProperties enumerate_instance_layers =
reinterpret_cast<PFN_vkEnumerateInstanceLayerProperties>(
dlsym(dlhandle_, "vkEnumerateInstanceLayerProperties"));
@@ -189,17 +187,16 @@
}
}
- // append layers to instance_layers/device_layers
+ // append layers to instance_layers
size_t prev_num_instance_layers = instance_layers.size();
- size_t prev_num_device_layers = device_layers.size();
instance_layers.reserve(prev_num_instance_layers + num_instance_layers);
- device_layers.reserve(prev_num_device_layers + num_device_layers);
for (size_t i = 0; i < num_instance_layers; i++) {
const VkLayerProperties& props = properties[i];
Layer layer;
layer.properties = props;
layer.library_idx = library_idx;
+ layer.is_global = false;
uint32_t count = 0;
result =
@@ -212,9 +209,9 @@
instance_layers.resize(prev_num_instance_layers);
return false;
}
- layer.extensions.resize(count);
- result = enumerate_instance_extensions(props.layerName, &count,
- layer.extensions.data());
+ layer.instance_extensions.resize(count);
+ result = enumerate_instance_extensions(
+ props.layerName, &count, layer.instance_extensions.data());
if (result != VK_SUCCESS) {
ALOGW(
"vkEnumerateInstanceExtensionProperties(%s) failed for library "
@@ -224,23 +221,15 @@
return false;
}
- instance_layers.push_back(layer);
- ALOGV(" added instance layer '%s'", props.layerName);
-
- bool is_global = false;
for (size_t j = 0; j < num_device_layers; j++) {
const auto& dev_props = properties[num_instance_layers + j];
if (memcmp(&props, &dev_props, sizeof(props)) == 0) {
- is_global = true;
+ layer.is_global = true;
break;
}
}
- if (!is_global)
- continue;
-
- layer.extensions.clear();
- if (enumerate_device_extensions) {
+ if (layer.is_global && enumerate_device_extensions) {
result = enumerate_device_extensions(
VK_NULL_HANDLE, props.layerName, &count, nullptr);
if (result != VK_SUCCESS) {
@@ -249,26 +238,25 @@
"library '%s': %d",
props.layerName, path_.c_str(), result);
instance_layers.resize(prev_num_instance_layers);
- device_layers.resize(prev_num_device_layers);
return false;
}
- layer.extensions.resize(count);
- result =
- enumerate_device_extensions(VK_NULL_HANDLE, props.layerName,
- &count, layer.extensions.data());
+ layer.device_extensions.resize(count);
+ result = enumerate_device_extensions(
+ VK_NULL_HANDLE, props.layerName, &count,
+ layer.device_extensions.data());
if (result != VK_SUCCESS) {
ALOGW(
"vkEnumerateDeviceExtensionProperties(%s) failed for "
"library '%s': %d",
props.layerName, path_.c_str(), result);
instance_layers.resize(prev_num_instance_layers);
- device_layers.resize(prev_num_device_layers);
return false;
}
}
- device_layers.push_back(layer);
- ALOGV(" added device layer '%s'", props.layerName);
+ instance_layers.push_back(layer);
+ ALOGV(" added %s layer '%s'",
+ (layer.is_global) ? "global" : "instance", props.layerName);
}
return true;
@@ -293,7 +281,6 @@
std::vector<LayerLibrary> g_layer_libraries;
std::vector<Layer> g_instance_layers;
-std::vector<Layer> g_device_layers;
void AddLayerLibrary(const std::string& path) {
ALOGV("examining layer library '%s'", path.c_str());
@@ -302,8 +289,7 @@
if (!library.Open())
return;
- if (!library.EnumerateLayers(g_layer_libraries.size(), g_instance_layers,
- g_device_layers)) {
+ if (!library.EnumerateLayers(g_layer_libraries.size(), g_instance_layers)) {
library.Close();
return;
}
@@ -343,12 +329,18 @@
closedir(directory);
}
-const Layer* FindLayer(const std::vector<Layer>& layers, const char* name) {
+const Layer* FindInstanceLayer(const char* name) {
auto layer =
- std::find_if(layers.cbegin(), layers.cend(), [=](const Layer& entry) {
- return strcmp(entry.properties.layerName, name) == 0;
- });
- return (layer != layers.cend()) ? &*layer : nullptr;
+ std::find_if(g_instance_layers.cbegin(), g_instance_layers.cend(),
+ [=](const Layer& entry) {
+ return strcmp(entry.properties.layerName, name) == 0;
+ });
+ return (layer != g_instance_layers.cend()) ? &*layer : nullptr;
+}
+
+const Layer* FindDeviceLayer(const char* name) {
+ const Layer* layer = FindInstanceLayer(name);
+ return (layer && layer->is_global) ? layer : nullptr;
}
void* GetLayerGetProcAddr(const Layer& layer,
@@ -358,41 +350,6 @@
return library.GetGPA(layer, gpa_name, gpa_name_len);
}
-uint32_t EnumerateLayers(const std::vector<Layer>& layers,
- uint32_t count,
- VkLayerProperties* properties) {
- uint32_t n = std::min(count, static_cast<uint32_t>(layers.size()));
- for (uint32_t i = 0; i < n; i++) {
- properties[i] = layers[i].properties;
- }
- return static_cast<uint32_t>(layers.size());
-}
-
-void GetLayerExtensions(const std::vector<Layer>& layers,
- const char* name,
- const VkExtensionProperties** properties,
- uint32_t* count) {
- const Layer* layer = FindLayer(layers, name);
- if (layer) {
- *properties = layer->extensions.data();
- *count = static_cast<uint32_t>(layer->extensions.size());
- } else {
- *properties = nullptr;
- *count = 0;
- }
-}
-
-LayerRef GetLayerRef(std::vector<Layer>& layers, const char* name) {
- const Layer* layer = FindLayer(layers, name);
- if (layer) {
- LayerLibrary& library = g_layer_libraries[layer->library_idx];
- if (!library.Open())
- layer = nullptr;
- }
-
- return LayerRef(layer);
-}
-
} // anonymous namespace
void DiscoverLayers() {
@@ -404,34 +361,79 @@
uint32_t EnumerateInstanceLayers(uint32_t count,
VkLayerProperties* properties) {
- return EnumerateLayers(g_instance_layers, count, 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;
+
+ return static_cast<uint32_t>(g_instance_layers.size());
}
uint32_t EnumerateDeviceLayers(uint32_t count, VkLayerProperties* properties) {
- return EnumerateLayers(g_device_layers, count, properties);
+ uint32_t n = 0;
+ for (const auto& layer : g_instance_layers) {
+ // ignore non-global layers
+ if (!layer.is_global)
+ continue;
+
+ if (n < count)
+ properties[n] = layer.properties;
+ n++;
+ }
+
+ return n;
}
void GetInstanceLayerExtensions(const char* name,
const VkExtensionProperties** properties,
uint32_t* count) {
- GetLayerExtensions(g_instance_layers, name, properties, count);
+ const Layer* layer = FindInstanceLayer(name);
+ if (layer) {
+ *properties = layer->instance_extensions.data();
+ *count = static_cast<uint32_t>(layer->instance_extensions.size());
+ } else {
+ *properties = nullptr;
+ *count = 0;
+ }
}
void GetDeviceLayerExtensions(const char* name,
const VkExtensionProperties** properties,
uint32_t* count) {
- GetLayerExtensions(g_device_layers, name, properties, count);
+ const Layer* layer = FindDeviceLayer(name);
+ if (layer) {
+ *properties = layer->device_extensions.data();
+ *count = static_cast<uint32_t>(layer->device_extensions.size());
+ } else {
+ *properties = nullptr;
+ *count = 0;
+ }
}
LayerRef GetInstanceLayerRef(const char* name) {
- return GetLayerRef(g_instance_layers, name);
+ const Layer* layer = FindInstanceLayer(name);
+ if (layer) {
+ LayerLibrary& library = g_layer_libraries[layer->library_idx];
+ if (!library.Open())
+ layer = nullptr;
+ }
+
+ return LayerRef(layer, true);
}
LayerRef GetDeviceLayerRef(const char* name) {
- return GetLayerRef(g_device_layers, name);
+ const Layer* layer = FindDeviceLayer(name);
+ if (layer) {
+ LayerLibrary& library = g_layer_libraries[layer->library_idx];
+ if (!library.Open())
+ layer = nullptr;
+ }
+
+ return LayerRef(layer, false);
}
-LayerRef::LayerRef(const Layer* layer) : layer_(layer) {}
+LayerRef::LayerRef(const Layer* layer, bool is_instance)
+ : layer_(layer), is_instance_(is_instance) {}
LayerRef::~LayerRef() {
if (layer_) {
@@ -448,7 +450,8 @@
return layer_->properties.specVersion;
}
-LayerRef::LayerRef(LayerRef&& other) : layer_(std::move(other.layer_)) {
+LayerRef::LayerRef(LayerRef&& other)
+ : layer_(other.layer_), is_instance_(other.is_instance_) {
other.layer_ = nullptr;
}
@@ -465,10 +468,12 @@
}
bool LayerRef::SupportsExtension(const char* name) const {
- return std::find_if(layer_->extensions.cbegin(), layer_->extensions.cend(),
+ const auto& extensions = (is_instance_) ? layer_->instance_extensions
+ : layer_->device_extensions;
+ return std::find_if(extensions.cbegin(), extensions.cend(),
[=](const VkExtensionProperties& ext) {
return strcmp(ext.extensionName, name) == 0;
- }) != layer_->extensions.cend();
+ }) != extensions.cend();
}
} // namespace api