Skip to content

Commit f3369ed

Browse files
committed
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
1 parent 43cacc5 commit f3369ed

5 files changed

Lines changed: 26 additions & 20 deletions

File tree

libs/renderengine/include/renderengine/RenderEngine.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ class RenderEngine {
104104

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

107+
static bool canSupport(GraphicsApi);
108+
107109
virtual ~RenderEngine() = 0;
108110

109111
// ----- BEGIN DEPRECATED INTERFACE -----

libs/renderengine/skia/SkiaVkRenderEngine.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ static GrVkGetProc sGetProc = [](const char* proc_name, VkInstance instance, VkD
287287
CHECK_NONNULL(vk##F)
288288

289289
VulkanInterface initVulkanInterface(bool protectedContent = false) {
290+
const nsecs_t timeBefore = systemTime();
290291
VulkanInterface interface;
291292

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

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

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

660+
bool RenderEngine::canSupport(GraphicsApi graphicsApi) {
661+
switch (graphicsApi) {
662+
case GraphicsApi::GL:
663+
return true;
664+
case GraphicsApi::VK: {
665+
if (!sVulkanInterface.initialized) {
666+
sVulkanInterface = initVulkanInterface(false /* no protected content */);
667+
ALOGD("%s: initialized == %s.", __func__,
668+
sVulkanInterface.initialized ? "true" : "false");
669+
}
670+
return sVulkanInterface.initialized;
671+
}
672+
}
673+
}
674+
657675
namespace skia {
658676

659677
using base::StringAppendF;
660678

661-
bool SkiaVkRenderEngine::canSupportSkiaVkRenderEngine() {
662-
VulkanInterface temp = initVulkanInterface(false /* no protected content */);
663-
ALOGD("SkiaVkRenderEngine::canSupportSkiaVkRenderEngine(): initialized == %s.",
664-
temp.initialized ? "true" : "false");
665-
return temp.initialized;
666-
}
667-
668679
std::unique_ptr<SkiaVkRenderEngine> SkiaVkRenderEngine::create(
669680
const RenderEngineCreationArgs& args) {
670681
std::unique_ptr<SkiaVkRenderEngine> engine(new SkiaVkRenderEngine(args));

libs/renderengine/skia/SkiaVkRenderEngine.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@ namespace skia {
2727

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

libs/renderengine/tests/RenderEngineTest.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class RenderEngineFactory {
107107

108108
virtual std::string name() = 0;
109109
virtual renderengine::RenderEngine::GraphicsApi graphicsApi() = 0;
110-
virtual bool apiSupported() = 0;
110+
bool apiSupported() { return renderengine::RenderEngine::canSupport(graphicsApi()); }
111111
std::unique_ptr<renderengine::RenderEngine> createRenderEngine() {
112112
renderengine::RenderEngineCreationArgs reCreationArgs =
113113
renderengine::RenderEngineCreationArgs::Builder()
@@ -131,10 +131,6 @@ class SkiaVkRenderEngineFactory : public RenderEngineFactory {
131131
renderengine::RenderEngine::GraphicsApi graphicsApi() override {
132132
return renderengine::RenderEngine::GraphicsApi::VK;
133133
}
134-
135-
bool apiSupported() override {
136-
return skia::SkiaVkRenderEngine::canSupportSkiaVkRenderEngine();
137-
}
138134
};
139135

140136
class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
@@ -144,8 +140,6 @@ class SkiaGLESRenderEngineFactory : public RenderEngineFactory {
144140
renderengine::RenderEngine::GraphicsApi graphicsApi() {
145141
return renderengine::RenderEngine::GraphicsApi::GL;
146142
}
147-
148-
bool apiSupported() override { return true; }
149143
};
150144

151145
class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {

services/surfaceflinger/SurfaceFlinger.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -816,9 +816,10 @@ void chooseRenderEngineType(renderengine::RenderEngineCreationArgs::Builder& bui
816816
builder.setThreaded(renderengine::RenderEngine::Threaded::YES)
817817
.setGraphicsApi(renderengine::RenderEngine::GraphicsApi::VK);
818818
} else {
819-
builder.setGraphicsApi(FlagManager::getInstance().vulkan_renderengine()
820-
? renderengine::RenderEngine::GraphicsApi::VK
821-
: renderengine::RenderEngine::GraphicsApi::GL);
819+
const auto kVulkan = renderengine::RenderEngine::GraphicsApi::VK;
820+
const bool useVulkan = FlagManager::getInstance().vulkan_renderengine() &&
821+
renderengine::RenderEngine::canSupport(kVulkan);
822+
builder.setGraphicsApi(useVulkan ? kVulkan : renderengine::RenderEngine::GraphicsApi::GL);
822823
}
823824
}
824825

0 commit comments

Comments
 (0)