Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25700b45 authored by Chia-I Wu's avatar Chia-I Wu
Browse files

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
parent 6cfb89c0
Loading
Loading
Loading
Loading
+35 −8
Original line number Diff line number Diff line
@@ -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;
    }

    return *pPropertyCount < count ? VK_INCOMPLETE : 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 (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;
    }

    return *pPropertyCount < count ? VK_INCOMPLETE : 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 (copied == count) ? VK_SUCCESS : VK_INCOMPLETE;
}

VkResult EnumerateDeviceExtensionProperties(
+10 −18
Original line number Diff line number Diff line
@@ -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,
+8 −2
Original line number Diff line number Diff line
@@ -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);