[vulkan] expose only appropriate function pointers
bug: 111137294
Change-Id: I552f1034c91d4c687d763b8cd14d4223c6eefcc4
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index a1b8c14..5769776 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -29,6 +29,7 @@
#include <string>
#include <unordered_map>
+#include <set>
#include <log/log.h>
#include <stdlib.h>
@@ -113,11 +114,18 @@
GOLDFISH_VK_LIST_TRIVIAL_HANDLE_TYPES(HANDLE_DEFINE_TRIVIAL_INFO_STRUCT)
+ struct VkInstance_Info {
+ uint32_t highestApiVersion;
+ std::set<std::string> enabledExtensions;
+ };
+
struct VkDevice_Info {
VkPhysicalDevice physdev;
VkPhysicalDeviceProperties props;
VkPhysicalDeviceMemoryProperties memProps;
HostMemAlloc hostMemAllocs[VK_MAX_MEMORY_TYPES] = {};
+ uint32_t apiVersion;
+ std::set<std::string> enabledExtensions;
};
struct VkDeviceMemory_Info {
@@ -148,6 +156,16 @@
GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_IMPL_IMPL)
GOLDFISH_VK_LIST_TRIVIAL_HANDLE_TYPES(HANDLE_UNREGISTER_IMPL_IMPL)
+ void unregister_VkInstance(VkInstance instance) {
+ AutoLock lock(mLock);
+
+ auto it = info_VkInstance.find(instance);
+ if (it == info_VkInstance.end()) return;
+ auto info = it->second;
+ info_VkInstance.erase(instance);
+ lock.unlock();
+ }
+
void unregister_VkDevice(VkDevice device) {
AutoLock lock(mLock);
@@ -181,10 +199,30 @@
info_VkDeviceMemory.erase(mem);
}
+ // TODO: Upgrade to 1.1
+ static constexpr uint32_t kMaxApiVersion = VK_MAKE_VERSION(1, 0, 65);
+ static constexpr uint32_t kMinApiVersion = VK_MAKE_VERSION(1, 0, 0);
+
+ void setInstanceInfo(VkInstance instance,
+ uint32_t enabledExtensionCount,
+ const char* const* ppEnabledExtensionNames) {
+ AutoLock lock(mLock);
+ auto& info = info_VkInstance[instance];
+ info.highestApiVersion = kMaxApiVersion;
+
+ if (!ppEnabledExtensionNames) return;
+
+ for (uint32_t i = 0; i < enabledExtensionCount; ++i) {
+ info.enabledExtensions.insert(ppEnabledExtensionNames[i]);
+ }
+ }
+
void setDeviceInfo(VkDevice device,
VkPhysicalDevice physdev,
VkPhysicalDeviceProperties props,
- VkPhysicalDeviceMemoryProperties memProps) {
+ VkPhysicalDeviceMemoryProperties memProps,
+ uint32_t enabledExtensionCount,
+ const char* const* ppEnabledExtensionNames) {
AutoLock lock(mLock);
auto& info = info_VkDevice[device];
info.physdev = physdev;
@@ -194,6 +232,13 @@
physdev, &memProps,
mFeatureInfo->hasDirectMem,
&mHostVisibleMemoryVirtInfo);
+ info.apiVersion = props.apiVersion;
+
+ if (!ppEnabledExtensionNames) return;
+
+ for (uint32_t i = 0; i < enabledExtensionCount; ++i) {
+ info.enabledExtensions.insert(ppEnabledExtensionNames[i]);
+ }
}
void setDeviceMemoryInfo(VkDevice device,
@@ -425,7 +470,7 @@
VkResult,
uint32_t* apiVersion) {
if (apiVersion) {
- *apiVersion = VK_MAKE_VERSION(1, 0, 0);
+ *apiVersion = kMaxApiVersion;
}
return VK_SUCCESS;
}
@@ -580,12 +625,28 @@
}
}
+ VkResult on_vkCreateInstance(
+ void*,
+ VkResult input_result,
+ const VkInstanceCreateInfo* createInfo,
+ const VkAllocationCallbacks*,
+ VkInstance* pInstance) {
+
+ if (input_result != VK_SUCCESS) return input_result;
+
+ setInstanceInfo(
+ *pInstance,
+ createInfo->enabledExtensionCount,
+ createInfo->ppEnabledExtensionNames);
+
+ return input_result;
+ }
VkResult on_vkCreateDevice(
void* context,
VkResult input_result,
VkPhysicalDevice physicalDevice,
- const VkDeviceCreateInfo*,
+ const VkDeviceCreateInfo* pCreateInfo,
const VkAllocationCallbacks*,
VkDevice* pDevice) {
@@ -598,7 +659,9 @@
enc->vkGetPhysicalDeviceProperties(physicalDevice, &props);
enc->vkGetPhysicalDeviceMemoryProperties(physicalDevice, &memProps);
- setDeviceInfo(*pDevice, physicalDevice, props, memProps);
+ setDeviceInfo(
+ *pDevice, physicalDevice, props, memProps,
+ pCreateInfo->enabledExtensionCount, pCreateInfo->ppEnabledExtensionNames);
return input_result;
}
@@ -958,6 +1021,51 @@
return input_result;
}
+ uint32_t getApiVersionFromInstance(VkInstance instance) const {
+ AutoLock lock(mLock);
+ uint32_t api = kMinApiVersion;
+
+ auto it = info_VkInstance.find(instance);
+ if (it == info_VkInstance.end()) return api;
+
+ api = it->second.highestApiVersion;
+
+ return api;
+ }
+
+ uint32_t getApiVersionFromDevice(VkDevice device) const {
+ AutoLock lock(mLock);
+
+ uint32_t api = kMinApiVersion;
+
+ auto it = info_VkDevice.find(device);
+ if (it == info_VkDevice.end()) return api;
+
+ api = it->second.apiVersion;
+
+ return api;
+ }
+
+ bool hasInstanceExtension(VkInstance instance, const std::string& name) const {
+ AutoLock lock(mLock);
+
+ auto it = info_VkInstance.find(instance);
+ if (it == info_VkInstance.end()) return false;
+
+ return it->second.enabledExtensions.find(name) !=
+ it->second.enabledExtensions.end();
+ }
+
+ bool hasDeviceExtension(VkDevice device, const std::string& name) const {
+ AutoLock lock(mLock);
+
+ auto it = info_VkDevice.find(device);
+ if (it == info_VkDevice.end()) return false;
+
+ return it->second.enabledExtensions.find(name) !=
+ it->second.enabledExtensions.end();
+ }
+
private:
mutable Lock mLock;
HostVisibleMemoryVirtualizationInfo mHostVisibleMemoryVirtInfo;
@@ -1002,14 +1110,6 @@
GOLDFISH_VK_LIST_HANDLE_TYPES(HANDLE_REGISTER_IMPL)
-void ResourceTracker::setDeviceInfo(
- VkDevice device,
- VkPhysicalDevice physdev,
- VkPhysicalDeviceProperties props,
- VkPhysicalDeviceMemoryProperties memProps) {
- mImpl->setDeviceInfo(device, physdev, props, memProps);
-}
-
bool ResourceTracker::isMemoryTypeHostVisible(
VkDevice device, uint32_t typeIndex) const {
return mImpl->isMemoryTypeHostVisible(device, typeIndex);
@@ -1067,6 +1167,20 @@
typeBits, typeBitsCount);
}
+uint32_t ResourceTracker::getApiVersionFromInstance(VkInstance instance) const {
+ return mImpl->getApiVersionFromInstance(instance);
+}
+
+uint32_t ResourceTracker::getApiVersionFromDevice(VkDevice device) const {
+ return mImpl->getApiVersionFromDevice(device);
+}
+bool ResourceTracker::hasInstanceExtension(VkInstance instance, const std::string &name) const {
+ return mImpl->hasInstanceExtension(instance, name);
+}
+bool ResourceTracker::hasDeviceExtension(VkDevice device, const std::string &name) const {
+ return mImpl->hasDeviceExtension(device, name);
+}
+
VkResult ResourceTracker::on_vkEnumerateInstanceVersion(
void* context,
VkResult input_result,
@@ -1119,6 +1233,16 @@
context, physicalDevice, pMemoryProperties);
}
+VkResult ResourceTracker::on_vkCreateInstance(
+ void* context,
+ VkResult input_result,
+ const VkInstanceCreateInfo* pCreateInfo,
+ const VkAllocationCallbacks* pAllocator,
+ VkInstance* pInstance) {
+ return mImpl->on_vkCreateInstance(
+ context, input_result, pCreateInfo, pAllocator, pInstance);
+}
+
VkResult ResourceTracker::on_vkCreateDevice(
void* context,
VkResult input_result,