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

Commit 6a00e8f5 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "[Vulkan] Expose instance extensions from implicit layers." into rvc-dev am: f39ccb53

Change-Id: Ib660c9dc8a5ca17c668b43af72a01d45f28b593f
parents ed4b9623 f39ccb53
Loading
Loading
Loading
Loading
+62 −3
Original line number Original line Diff line number Diff line
@@ -29,6 +29,8 @@
#include <algorithm>
#include <algorithm>
#include <mutex>
#include <mutex>
#include <new>
#include <new>
#include <string>
#include <unordered_set>
#include <utility>
#include <utility>


#include <android-base/strings.h>
#include <android-base/strings.h>
@@ -1280,9 +1282,66 @@ VkResult EnumerateInstanceExtensionProperties(
        return *pPropertyCount < count ? VK_INCOMPLETE : VK_SUCCESS;
        return *pPropertyCount < count ? VK_INCOMPLETE : VK_SUCCESS;
    }
    }


    // TODO(b/143293104): expose extensions from implicitly enabled layers
    // If the pLayerName is nullptr, we must advertise all instance extensions
    return vulkan::driver::EnumerateInstanceExtensionProperties(
    // from all implicitly enabled layers and the driver implementation. If
        nullptr, pPropertyCount, pProperties);
    // there are duplicates among layers and the driver implementation, always
    // only preserve the top layer closest to the application regardless of the
    // spec version.
    std::vector<VkExtensionProperties> properties;
    std::unordered_set<std::string> extensionNames;

    // Expose extensions from implicitly enabled layers.
    const std::string layersSetting =
        android::GraphicsEnv::getInstance().getDebugLayers();
    if (!layersSetting.empty()) {
        std::vector<std::string> layers =
            android::base::Split(layersSetting, ":");
        for (uint32_t i = 0; i < layers.size(); i++) {
            const Layer* layer = FindLayer(layers[i].c_str());
            if (!layer) {
                continue;
            }
            uint32_t count = 0;
            const VkExtensionProperties* props =
                GetLayerInstanceExtensions(*layer, count);
            if (count > 0) {
                for (uint32_t i = 0; i < count; ++i) {
                    if (extensionNames.emplace(props[i].extensionName).second) {
                        properties.push_back(props[i]);
                    }
                }
            }
        }
    }

    // TODO(b/143293104): Parse debug.vulkan.layers properties

    // Expose extensions from driver implementation.
    {
        uint32_t count = 0;
        VkResult result = vulkan::driver::EnumerateInstanceExtensionProperties(
            nullptr, &count, nullptr);
        if (result == VK_SUCCESS && count > 0) {
            std::vector<VkExtensionProperties> props(count);
            result = vulkan::driver::EnumerateInstanceExtensionProperties(
                nullptr, &count, props.data());
            for (auto prop : props) {
                if (extensionNames.emplace(prop.extensionName).second) {
                    properties.push_back(prop);
                }
            }
        }
    }

    uint32_t totalCount = properties.size();
    if (!pProperties || *pPropertyCount > totalCount) {
        *pPropertyCount = totalCount;
    }
    if (pProperties) {
        std::copy(properties.data(), properties.data() + *pPropertyCount,
                  pProperties);
    }
    return *pPropertyCount < totalCount ? VK_INCOMPLETE : VK_SUCCESS;
}
}


VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,
VkResult EnumerateDeviceLayerProperties(VkPhysicalDevice physicalDevice,