Do not initialize Vulkan objects when Vulkan is not enabled
Test: run with Vulkan feature disabled
Bug: b/226572716
Change-Id: I0538989ae9c5a354b328bc928175185b63cafc38
diff --git a/stream-servers/FrameBuffer.cpp b/stream-servers/FrameBuffer.cpp
index 3564553..0289b2c 100644
--- a/stream-servers/FrameBuffer.cpp
+++ b/stream-servers/FrameBuffer.cpp
@@ -402,6 +402,7 @@
}
}
if (vkEmu) {
+ fb->m_vulkanEnabled = true;
if (feature_is_enabled(kFeature_VulkanNativeSwapchain)) {
fb->m_vkInstance = vkEmu->instance;
}
diff --git a/stream-servers/FrameBuffer.h b/stream-servers/FrameBuffer.h
index 79e2e80..b048eb1 100644
--- a/stream-servers/FrameBuffer.h
+++ b/stream-servers/FrameBuffer.h
@@ -516,6 +516,7 @@
bool isFastBlitSupported() const { return m_fastBlitSupported; }
bool isVulkanInteropSupported() const { return m_vulkanInteropSupported; }
+ bool isVulkanEnabled() const { return m_vulkanEnabled; }
bool importMemoryToColorBuffer(
#ifdef _WIN32
void* handle,
@@ -780,6 +781,7 @@
bool m_fastBlitSupported = false;
bool m_vulkanInteropSupported = false;
+ bool m_vulkanEnabled = false;
bool m_guestUsesAngle = false;
// Whether the guest manages ColorBuffer lifetime
// so we don't need refcounting on the host side.
diff --git a/stream-servers/RenderControl.cpp b/stream-servers/RenderControl.cpp
index 09dbf9c..4a75964 100644
--- a/stream-servers/RenderControl.cpp
+++ b/stream-servers/RenderControl.cpp
@@ -315,14 +315,9 @@
}
static bool shouldEnableVulkan() {
- auto supportInfo =
- goldfish_vk::VkDecoderGlobalState::get()->
- getHostFeatureSupport();
- bool flagEnabled =
- feature_is_enabled(kFeature_Vulkan);
// TODO: Restrict further to devices supporting external memory.
- return supportInfo.supportsVulkan &&
- flagEnabled;
+ return feature_is_enabled(kFeature_Vulkan) &&
+ goldfish_vk::VkDecoderGlobalState::get()->getHostFeatureSupport().supportsVulkan;
}
static bool shouldEnableDeferredVulkanCommands() {
diff --git a/stream-servers/RenderThread.cpp b/stream-servers/RenderThread.cpp
index a0a3585..32ca095 100644
--- a/stream-servers/RenderThread.cpp
+++ b/stream-servers/RenderThread.cpp
@@ -16,25 +16,24 @@
#include "RenderThread.h"
#include "ChannelStream.h"
-#include "RingStream.h"
#include "FrameBuffer.h"
-#include "ReadBuffer.h"
-#include "RenderControl.h"
-#include "RendererImpl.h"
-#include "RenderChannelImpl.h"
-#include "RenderThreadInfo.h"
-
#include "OpenGLESDispatch/EGLDispatch.h"
-#include "OpenGLESDispatch/GLESv2Dispatch.h"
#include "OpenGLESDispatch/GLESv1Dispatch.h"
+#include "OpenGLESDispatch/GLESv2Dispatch.h"
+#include "ReadBuffer.h"
+#include "RenderChannelImpl.h"
+#include "RenderControl.h"
+#include "RenderThreadInfo.h"
+#include "RendererImpl.h"
+#include "RingStream.h"
#include "apigen-codec-common/ChecksumCalculatorThreadInfo.h"
-
-#include "base/System.h"
-#include "base/Tracing.h"
-#include "base/StreamSerializing.h"
#include "base/Lock.h"
#include "base/MessageChannel.h"
+#include "base/StreamSerializing.h"
+#include "base/System.h"
+#include "base/Tracing.h"
#include "host-common/logging.h"
+#include "vulkan/VkCommonOperations.h"
#define EMUGL_DEBUG_LEVEL 0
#include "host-common/crash_reporter.h"
@@ -286,6 +285,9 @@
// Framebuffer initialization is asynchronous, so we need to make sure
// it's completely initialized before running any GL commands.
FrameBuffer::waitUntilInitialized();
+ if (goldfish_vk::getGlobalVkEmulation()) {
+ tInfo.m_vkDec = std::make_unique<VkDecoder>();
+ }
// This is the only place where we try loading from snapshot.
// But the context bind / restoration will be delayed after receiving
@@ -428,9 +430,9 @@
//
// Note: It's risky to limit Vulkan decoding to one thread,
// so we do it outside the limiter
- {
- last = tInfo.m_vkDec.decode(readBuf.buf(), readBuf.validData(),
- ioStream, seqnoPtr);
+ if (tInfo.m_vkDec) {
+ last =
+ tInfo.m_vkDec->decode(readBuf.buf(), readBuf.validData(), ioStream, seqnoPtr);
if (last > 0) {
readBuf.consume(last);
progress = true;
diff --git a/stream-servers/RenderThreadInfo.h b/stream-servers/RenderThreadInfo.h
index 46e7f99..ecf4c7d 100644
--- a/stream-servers/RenderThreadInfo.h
+++ b/stream-servers/RenderThreadInfo.h
@@ -16,18 +16,19 @@
#ifndef _LIB_OPENGL_RENDER_THREAD_INFO_H
#define _LIB_OPENGL_RENDER_THREAD_INFO_H
-#include "base/Stream.h"
+#include <functional>
+#include <memory>
+#include <unordered_set>
+
#include "RenderContext.h"
+#include "StalePtrRegistry.h"
+#include "SyncThread.h"
+#include "VkDecoder.h"
#include "WindowSurface.h"
+#include "base/Stream.h"
#include "gles1_dec/GLESv1Decoder.h"
#include "gles2_dec/GLESv2Decoder.h"
#include "renderControl_dec/renderControl_dec.h"
-#include "VkDecoder.h"
-#include "StalePtrRegistry.h"
-#include "SyncThread.h"
-
-#include <functional>
-#include <unordered_set>
typedef uint32_t HandleType;
typedef std::unordered_set<HandleType> ThreadContextSet;
@@ -62,7 +63,7 @@
GLESv1Decoder m_glDec;
GLESv2Decoder m_gl2Dec;
renderControl_decoder_context_t m_rcDec;
- VkDecoder m_vkDec;
+ std::unique_ptr<VkDecoder> m_vkDec;
// All the contexts that are created by this render thread.
// New emulator manages contexts in guest process level,