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

Commit f3369eda authored by Leon Scroggins III's avatar Leon Scroggins III
Browse files

vulkan_renderengine: Check for support first

The vulkan_renderengine flag allows us to switch some users to using
Vulkan as part of the trunk stable process. But not all devices support
Vulkan.

Move canSupportSkiaVkRenderEngine into the RenderEngine header, so it
can be used by SurfaceFlinger. When the vulkan_renderengine flag is set,
check for support before choosing Vulkan. Do *not* log an error, since
this is specified broadly, so it is expected that the flag will be set
for devices that do not have support.

This introduces an extra call to initVulkanInterface, so log the amount
of time it takes. On my device, the first call is only ~17ms, so this
seems fine. The next call is much faster, ~4ms. The next call is not
interestingly different, possibly because the first call was already
made.

Bug: 293371537
Bug: 325619183
Test: atest librenderengine_test
Test: manual
Change-Id: Iba66e67347c69b95dc9c05ca838fa1391ef4ab81
parent 43cacc58
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ public:

    static std::unique_ptr<RenderEngine> create(const RenderEngineCreationArgs& args);

    static bool canSupport(GraphicsApi);

    virtual ~RenderEngine() = 0;

    // ----- BEGIN DEPRECATED INTERFACE -----
+19 −8
Original line number Diff line number Diff line
@@ -287,6 +287,7 @@ static GrVkGetProc sGetProc = [](const char* proc_name, VkInstance instance, VkD
    CHECK_NONNULL(vk##F)

VulkanInterface initVulkanInterface(bool protectedContent = false) {
    const nsecs_t timeBefore = systemTime();
    VulkanInterface interface;

    VK_GET_PROC(EnumerateInstanceVersion);
@@ -598,7 +599,9 @@ VulkanInterface initVulkanInterface(bool protectedContent = false) {
    interface.isProtected = protectedContent;
    // funcs already initialized

    ALOGD("%s: Success init Vulkan interface", __func__);
    const nsecs_t timeAfter = systemTime();
    const float initTimeMs = static_cast<float>(timeAfter - timeBefore) / 1.0E6;
    ALOGD("%s: Success init Vulkan interface in %f ms", __func__, initTimeMs);
    return interface;
}

@@ -654,17 +657,25 @@ static void sSetupVulkanInterface() {
    }
}

bool RenderEngine::canSupport(GraphicsApi graphicsApi) {
    switch (graphicsApi) {
        case GraphicsApi::GL:
            return true;
        case GraphicsApi::VK: {
            if (!sVulkanInterface.initialized) {
                sVulkanInterface = initVulkanInterface(false /* no protected content */);
                ALOGD("%s: initialized == %s.", __func__,
                      sVulkanInterface.initialized ? "true" : "false");
            }
            return sVulkanInterface.initialized;
        }
    }
}

namespace skia {

using base::StringAppendF;

bool SkiaVkRenderEngine::canSupportSkiaVkRenderEngine() {
    VulkanInterface temp = initVulkanInterface(false /* no protected content */);
    ALOGD("SkiaVkRenderEngine::canSupportSkiaVkRenderEngine(): initialized == %s.",
          temp.initialized ? "true" : "false");
    return temp.initialized;
}

std::unique_ptr<SkiaVkRenderEngine> SkiaVkRenderEngine::create(
        const RenderEngineCreationArgs& args) {
    std::unique_ptr<SkiaVkRenderEngine> engine(new SkiaVkRenderEngine(args));
+0 −2
Original line number Diff line number Diff line
@@ -27,8 +27,6 @@ namespace skia {

class SkiaVkRenderEngine : public SkiaRenderEngine {
public:
    // Returns false if Vulkan implementation can't support SkiaVkRenderEngine.
    static bool canSupportSkiaVkRenderEngine();
    static std::unique_ptr<SkiaVkRenderEngine> create(const RenderEngineCreationArgs& args);
    ~SkiaVkRenderEngine() override;

+1 −7
Original line number Diff line number Diff line
@@ -107,7 +107,7 @@ public:

    virtual std::string name() = 0;
    virtual renderengine::RenderEngine::GraphicsApi graphicsApi() = 0;
    virtual bool apiSupported() = 0;
    bool apiSupported() { return renderengine::RenderEngine::canSupport(graphicsApi()); }
    std::unique_ptr<renderengine::RenderEngine> createRenderEngine() {
        renderengine::RenderEngineCreationArgs reCreationArgs =
                renderengine::RenderEngineCreationArgs::Builder()
@@ -131,10 +131,6 @@ public:
    renderengine::RenderEngine::GraphicsApi graphicsApi() override {
        return renderengine::RenderEngine::GraphicsApi::VK;
    }

    bool apiSupported() override {
        return skia::SkiaVkRenderEngine::canSupportSkiaVkRenderEngine();
    }
};

class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
@@ -144,8 +140,6 @@ public:
    renderengine::RenderEngine::GraphicsApi graphicsApi() {
        return renderengine::RenderEngine::GraphicsApi::GL;
    }

    bool apiSupported() override { return true; }
};

class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
+4 −3
Original line number Diff line number Diff line
@@ -816,9 +816,10 @@ void chooseRenderEngineType(renderengine::RenderEngineCreationArgs::Builder& bui
        builder.setThreaded(renderengine::RenderEngine::Threaded::YES)
                .setGraphicsApi(renderengine::RenderEngine::GraphicsApi::VK);
    } else {
        builder.setGraphicsApi(FlagManager::getInstance().vulkan_renderengine()
                                       ? renderengine::RenderEngine::GraphicsApi::VK
                                       : renderengine::RenderEngine::GraphicsApi::GL);
        const auto kVulkan = renderengine::RenderEngine::GraphicsApi::VK;
        const bool useVulkan = FlagManager::getInstance().vulkan_renderengine() &&
                renderengine::RenderEngine::canSupport(kVulkan);
        builder.setGraphicsApi(useVulkan ? kVulkan : renderengine::RenderEngine::GraphicsApi::GL);
    }
}