[vulkan] Set the features on first connection

bug: 111137294
bug: 121377497

This CL introduces a mechanism for Vulkan ResourceTracker to become
aware of what host-side features are available. On the first connection,
we father the feature strings and set feature fields, and this should be
communicated to Vulkan as well.

Change-Id: I90e4e31477d201271a47163491dc239ea5c26678
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 537c966..9f17f75 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -65,6 +65,7 @@
         ALOGE("vulkan: Failed to get Vulkan encoder\n"); \
         return VK_ERROR_DEVICE_LOST; \
     } \
+    goldfish_vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const()); \
 
 VKAPI_ATTR
 VkResult EnumerateInstanceExtensionProperties(
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 5ac4d7b..916a817 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -15,6 +15,7 @@
 
 #include "ResourceTracker.h"
 
+#include "../OpenglSystemCommon/EmulatorFeatureInfo.h"
 #include "Resources.h"
 #include "VkEncoder.h"
 
@@ -237,6 +238,12 @@
         return offset + size <= info.mappedSize;
     }
 
+    void setupFeatures(const EmulatorFeatureInfo* features) {
+        if (!features || mFeatureInfo) return;
+        mFeatureInfo.reset(new EmulatorFeatureInfo);
+        *mFeatureInfo = *features;
+    }
+
     VkResult on_vkEnumerateInstanceVersion(
         void*,
         VkResult,
@@ -392,7 +399,7 @@
 
 private:
     mutable Lock mLock;
-
+    std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
 };
 ResourceTracker::ResourceTracker() : mImpl(new ResourceTracker::Impl()) { }
 ResourceTracker::~ResourceTracker() { }
@@ -457,6 +464,10 @@
     return mImpl->isValidMemoryRange(range);
 }
 
+void ResourceTracker::setupFeatures(const EmulatorFeatureInfo* features) {
+    mImpl->setupFeatures(features);
+}
+
 VkResult ResourceTracker::on_vkEnumerateInstanceVersion(
     void* context,
     VkResult input_result,
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 9be37c8..c385e19 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -21,6 +21,8 @@
 #include "VkEventHandler.h"
 #include <memory>
 
+struct EmulatorFeatureInfo;
+
 namespace goldfish_vk {
 
 class ResourceTracker : public VkEventHandler {
@@ -97,6 +99,7 @@
     VkDeviceSize getMappedSize(VkDeviceMemory memory);
     VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const;
     bool isValidMemoryRange(const VkMappedMemoryRange& range) const;
+    void setupFeatures(const EmulatorFeatureInfo* features);
 
   private:
     class Impl;