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,