gfxstream: guest: remove EmulatorFeatureInfo dependency in libgfxstream_vulkan.so
EmulatorFeatureInfo likes to bundle all the features
into one giant struct. Newer variants like virtio-gpu
tend to separate feature versioning into separate
capabilites.
This provides a compat layer for the older style,
as we move towards the newer style of versioning.
BUG=311486792
TEST=compile
Change-Id: I3017edf29e4c256321abf01c8e6ce43d7bf042e6
diff --git a/guest/OpenglSystemCommon/EmulatorFeatureInfo.h b/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
index 90b989e..a69c341 100644
--- a/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/guest/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -206,6 +206,26 @@
bool hasVulkanAuxCommandMemory; // This feature tracks if vulkan command buffers should be stored in an auxiliary shared memory
};
+// This should be ABI identical with the variant in ResourceTracker.h
+struct EmulatorGfxStreamVkFeatureInfo {
+ bool hasDirectMem;
+ bool hasVulkan;
+ bool hasDeferredVulkanCommands;
+ bool hasVulkanNullOptionalStrings;
+ bool hasVulkanCreateResourcesWithRequirements;
+ bool hasVulkanIgnoredHandles;
+ bool hasVirtioGpuNext;
+ bool hasVulkanFreeMemorySync;
+ bool hasVirtioGpuNativeSync;
+ bool hasVulkanShaderFloat16Int8;
+ bool hasVulkanAsyncQueueSubmit;
+ bool hasVulkanQueueSubmitWithCommands;
+ bool hasVulkanBatchedDescriptorSetUpdate;
+ bool hasVulkanAsyncQsri;
+ bool hasVulkanAuxCommandMemory;
+ bool setupComplete;
+};
+
enum GrallocType {
GRALLOC_TYPE_RANCHU = 0,
GRALLOC_TYPE_MINIGBM = 1,
diff --git a/guest/OpenglSystemCommon/HostConnection.cpp b/guest/OpenglSystemCommon/HostConnection.cpp
index 037834b..86fad3e 100644
--- a/guest/OpenglSystemCommon/HostConnection.cpp
+++ b/guest/OpenglSystemCommon/HostConnection.cpp
@@ -673,3 +673,28 @@
GLint version = m_rcEnc->rcGetRendererVersion(m_rcEnc.get());
return version;
}
+
+void HostConnection::setVulkanFeatureInfo(void* info) {
+ struct EmulatorGfxStreamVkFeatureInfo* featureInfo =
+ (struct EmulatorGfxStreamVkFeatureInfo*)info;
+
+ featureInfo->hasDirectMem = m_rcEnc->featureInfo()->hasDirectMem;
+ featureInfo->hasVulkan = m_rcEnc->featureInfo()->hasVulkan;
+ featureInfo->hasDeferredVulkanCommands = m_rcEnc->featureInfo()->hasDeferredVulkanCommands;
+ featureInfo->hasVulkanNullOptionalStrings =
+ m_rcEnc->featureInfo()->hasVulkanNullOptionalStrings;
+ featureInfo->hasVulkanCreateResourcesWithRequirements =
+ m_rcEnc->featureInfo()->hasVulkanCreateResourcesWithRequirements;
+ featureInfo->hasVulkanIgnoredHandles = m_rcEnc->featureInfo()->hasVulkanIgnoredHandles;
+ featureInfo->hasVirtioGpuNext = m_rcEnc->featureInfo()->hasVirtioGpuNext;
+ featureInfo->hasVulkanFreeMemorySync = m_rcEnc->featureInfo()->hasVulkanFreeMemorySync;
+ featureInfo->hasVirtioGpuNativeSync = m_rcEnc->featureInfo()->hasVirtioGpuNativeSync;
+ featureInfo->hasVulkanShaderFloat16Int8 = m_rcEnc->featureInfo()->hasVulkanShaderFloat16Int8;
+ featureInfo->hasVulkanAsyncQueueSubmit = m_rcEnc->featureInfo()->hasVulkanAsyncQueueSubmit;
+ featureInfo->hasVulkanQueueSubmitWithCommands =
+ m_rcEnc->featureInfo()->hasVulkanQueueSubmitWithCommands;
+ featureInfo->hasVulkanBatchedDescriptorSetUpdate =
+ m_rcEnc->featureInfo()->hasVulkanBatchedDescriptorSetUpdate;
+ featureInfo->hasVulkanAsyncQsri = m_rcEnc->featureInfo()->hasVulkanAsyncQsri;
+ featureInfo->hasVulkanAuxCommandMemory = m_rcEnc->featureInfo()->hasVulkanAuxCommandMemory;
+}
diff --git a/guest/OpenglSystemCommon/HostConnection.h b/guest/OpenglSystemCommon/HostConnection.h
index b7fa122..43ac5a9 100644
--- a/guest/OpenglSystemCommon/HostConnection.h
+++ b/guest/OpenglSystemCommon/HostConnection.h
@@ -158,7 +158,9 @@
#pragma clang diagnostic pop
#endif
-private:
+ void setVulkanFeatureInfo(void* info);
+
+ private:
// If the connection failed, |conn| is deleted.
// Returns NULL if connection failed.
static std::unique_ptr<HostConnection> connect(enum VirtGpuCapset capset);
diff --git a/guest/vulkan/gfxstream_vk_device.cpp b/guest/vulkan/gfxstream_vk_device.cpp
index 4c022e8..3b41bc9 100644
--- a/guest/vulkan/gfxstream_vk_device.cpp
+++ b/guest/vulkan/gfxstream_vk_device.cpp
@@ -82,7 +82,9 @@
return VK_ERROR_DEVICE_LOST;
}
- gfxstream::vk::ResourceTracker::get()->setupFeatures(rcEnc->featureInfo_const());
+ struct GfxStreamVkFeatureInfo features = {};
+ hostCon->setVulkanFeatureInfo(&features);
+ gfxstream::vk::ResourceTracker::get()->setupFeatures(&features);
}
gfxstream::vk::ResourceTracker::get()->setThreadingCallbacks({
diff --git a/guest/vulkan_enc/ResourceTracker.cpp b/guest/vulkan_enc/ResourceTracker.cpp
index 048650a..9aada82 100644
--- a/guest/vulkan_enc/ResourceTracker.cpp
+++ b/guest/vulkan_enc/ResourceTracker.cpp
@@ -15,7 +15,6 @@
#include "ResourceTracker.h"
-#include "../OpenglSystemCommon/EmulatorFeatureInfo.h"
#include "../OpenglSystemCommon/HostConnection.h"
#include "CommandBufferStagingStream.h"
#include "DescriptorSetVirtualization.h"
@@ -1243,10 +1242,10 @@
void ResourceTracker::clearDescriptorPoolAndUnregisterDescriptorSets(void* context, VkDevice device,
VkDescriptorPool pool) {
std::vector<VkDescriptorSet> toClear =
- clearDescriptorPool(pool, mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate);
+ clearDescriptorPool(pool, mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate);
for (auto set : toClear) {
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
VkDescriptorSetLayout setLayout = as_goldfish_VkDescriptorSet(set)->reified->setLayout;
decDescriptorSetLayoutRef(context, device, setLayout, nullptr);
}
@@ -1426,20 +1425,17 @@
// capabilities provide versioning. Set features to be unconditionally true, since
// using virtio-gpu encompasses all prior goldfish features. mFeatureInfo should be
// deprecated in favor of caps.
-
- mFeatureInfo.reset(new EmulatorFeatureInfo);
-
- mFeatureInfo->hasVulkanNullOptionalStrings = true;
- mFeatureInfo->hasVulkanIgnoredHandles = true;
- mFeatureInfo->hasVulkanShaderFloat16Int8 = true;
- mFeatureInfo->hasVulkanQueueSubmitWithCommands = true;
- mFeatureInfo->hasDeferredVulkanCommands = true;
- mFeatureInfo->hasVulkanAsyncQueueSubmit = true;
- mFeatureInfo->hasVulkanCreateResourcesWithRequirements = true;
- mFeatureInfo->hasVirtioGpuNext = true;
- mFeatureInfo->hasVirtioGpuNativeSync = true;
- mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate = true;
- mFeatureInfo->hasVulkanAsyncQsri = true;
+ mFeatureInfo.hasVulkanNullOptionalStrings = true;
+ mFeatureInfo.hasVulkanIgnoredHandles = true;
+ mFeatureInfo.hasVulkanShaderFloat16Int8 = true;
+ mFeatureInfo.hasVulkanQueueSubmitWithCommands = true;
+ mFeatureInfo.hasDeferredVulkanCommands = true;
+ mFeatureInfo.hasVulkanAsyncQueueSubmit = true;
+ mFeatureInfo.hasVulkanCreateResourcesWithRequirements = true;
+ mFeatureInfo.hasVirtioGpuNext = true;
+ mFeatureInfo.hasVirtioGpuNativeSync = true;
+ mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate = true;
+ mFeatureInfo.hasVulkanAsyncQsri = true;
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT;
@@ -1450,20 +1446,21 @@
noRenderControlEnc = mCaps.vulkanCapset.noRenderControlEnc;
}
-void ResourceTracker::setupFeatures(const EmulatorFeatureInfo* features) {
- if (!features || mFeatureInfo) return;
- mFeatureInfo.reset(new EmulatorFeatureInfo);
- *mFeatureInfo = *features;
+void ResourceTracker::setupFeatures(const struct GfxStreamVkFeatureInfo* features) {
+ if (mFeatureInfo.setupComplete) {
+ return;
+ }
+ mFeatureInfo = *features;
#if defined(__ANDROID__)
- if (mFeatureInfo->hasDirectMem) {
+ if (mFeatureInfo.hasDirectMem) {
mGoldfishAddressSpaceBlockProvider.reset(
new GoldfishAddressSpaceBlockProvider(GoldfishAddressSpaceSubdeviceType::NoSubdevice));
}
#endif // defined(__ANDROID__)
#ifdef VK_USE_PLATFORM_FUCHSIA
- if (mFeatureInfo->hasVulkan) {
+ if (mFeatureInfo.hasVulkan) {
fidl::ClientEnd<fuchsia_hardware_goldfish::ControlDevice> channel{zx::channel(
GetConnectToServiceFunction()("/loader-gpu-devices/class/goldfish-control/000"))};
if (!channel) {
@@ -1492,47 +1489,40 @@
}
#endif
- if (mFeatureInfo->hasVulkanNullOptionalStrings) {
+ if (mFeatureInfo.hasVulkanNullOptionalStrings) {
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_NULL_OPTIONAL_STRINGS_BIT;
}
- if (mFeatureInfo->hasVulkanIgnoredHandles) {
+ if (mFeatureInfo.hasVulkanIgnoredHandles) {
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_IGNORED_HANDLES_BIT;
}
- if (mFeatureInfo->hasVulkanShaderFloat16Int8) {
+ if (mFeatureInfo.hasVulkanShaderFloat16Int8) {
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_SHADER_FLOAT16_INT8_BIT;
}
- if (mFeatureInfo->hasVulkanQueueSubmitWithCommands) {
+ if (mFeatureInfo.hasVulkanQueueSubmitWithCommands) {
ResourceTracker::streamFeatureBits |= VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
}
+
+ mFeatureInfo.setupComplete = true;
}
void ResourceTracker::setThreadingCallbacks(const ResourceTracker::ThreadingCallbacks& callbacks) {
ResourceTracker::threadingCallbacks = callbacks;
}
-bool ResourceTracker::hostSupportsVulkan() const {
- if (!mFeatureInfo) return false;
-
- return mFeatureInfo->hasVulkan;
-}
-
bool ResourceTracker::usingDirectMapping() const { return true; }
uint32_t ResourceTracker::getStreamFeatures() const { return ResourceTracker::streamFeatureBits; }
bool ResourceTracker::supportsDeferredCommands() const {
- if (!mFeatureInfo) return false;
- return mFeatureInfo->hasDeferredVulkanCommands;
+ return mFeatureInfo.hasDeferredVulkanCommands;
}
bool ResourceTracker::supportsAsyncQueueSubmit() const {
- if (!mFeatureInfo) return false;
- return mFeatureInfo->hasVulkanAsyncQueueSubmit;
+ return mFeatureInfo.hasVulkanAsyncQueueSubmit;
}
bool ResourceTracker::supportsCreateResourcesWithRequirements() const {
- if (!mFeatureInfo) return false;
- return mFeatureInfo->hasVulkanCreateResourcesWithRequirements;
+ return mFeatureInfo.hasVulkanCreateResourcesWithRequirements;
}
int ResourceTracker::getHostInstanceExtensionIndex(const std::string& extName) const {
@@ -2935,7 +2925,7 @@
CoherentMemoryPtr coherentMemory = nullptr;
#if defined(__ANDROID__)
- if (mFeatureInfo->hasDirectMem) {
+ if (mFeatureInfo.hasDirectMem) {
uint64_t gpuAddr = 0;
GoldfishAddressSpaceBlockPtr block = nullptr;
res = enc->vkMapMemoryIntoAddressSpaceGOOGLE(device, mem, &gpuAddr, true);
@@ -2963,7 +2953,7 @@
}
} else
#endif // defined(__ANDROID__)
- if (mFeatureInfo->hasVirtioGpuNext) {
+ if (mFeatureInfo.hasVirtioGpuNext) {
struct VirtGpuCreateBlob createBlob = {0};
uint64_t hvaSizeId[3];
res = enc->vkGetMemoryHostAddressInfoGOOGLE(device, mem, &hvaSizeId[0], &hvaSizeId[1],
@@ -4689,7 +4679,7 @@
#if defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(__linux__)
if (exportSyncFd) {
- if (!mFeatureInfo->hasVirtioGpuNativeSync) {
+ if (!mFeatureInfo.hasVirtioGpuNativeSync) {
mesa_logd("%s: ensure sync device\n", __func__);
ensureSyncDeviceFd();
}
@@ -4865,7 +4855,7 @@
return VK_ERROR_OUT_OF_HOST_MEMORY;
}
- if (mFeatureInfo->hasVirtioGpuNativeSync) {
+ if (mFeatureInfo.hasVirtioGpuNativeSync) {
VkResult result;
int64_t osHandle;
uint64_t hostFenceHandle = get_host_u64_VkFence(pGetFdInfo->fence);
@@ -5003,7 +4993,7 @@
});
}
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
std::vector<uint64_t> poolIds(pCreateInfo->maxSets);
uint32_t count = pCreateInfo->maxSets;
@@ -5049,7 +5039,7 @@
VkEncoder* enc = (VkEncoder*)context;
auto ci = pAllocateInfo;
auto sets = pDescriptorSets;
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
// Using the pool ID's we collected earlier from the host
VkResult poolAllocResult = validateAndApplyVirtualDescriptorSetAllocation(ci, sets);
@@ -5128,7 +5118,7 @@
for (auto set : existingDescriptorSets) {
if (removeDescriptorSetFromPool(set,
- mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate)) {
+ mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate)) {
toActuallyFree.push_back(set);
}
}
@@ -5136,7 +5126,7 @@
if (toActuallyFree.empty()) return VK_SUCCESS;
}
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
// In the batched set update case, decrement refcount on the set layout
// and only free on host if we satisfied a pending allocation on the
// host.
@@ -5233,7 +5223,7 @@
}
}
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate) {
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate) {
for (uint32_t i = 0; i < descriptorWriteCount; ++i) {
VkDescriptorSet set = transformedWrites[i].dstSet;
doEmulatedDescriptorWrite(&transformedWrites[i],
@@ -5667,7 +5657,7 @@
#if defined(VK_USE_PLATFORM_ANDROID_KHR) || defined(__linux__)
if (exportSyncFd) {
- if (mFeatureInfo->hasVirtioGpuNativeSync &&
+ if (mFeatureInfo.hasVirtioGpuNativeSync &&
!(mCaps.params[kParamFencePassing] && mCaps.vulkanCapset.externalSync)) {
VkResult result;
int64_t osHandle;
@@ -5935,7 +5925,7 @@
VkEncoder* enc = (VkEncoder*)context;
VkDeviceMemory deviceMemory = cmdBufStream->getDeviceMemory();
VkDeviceSize dataOffset = 0;
- if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+ if (mFeatureInfo.hasVulkanAuxCommandMemory) {
// for suballocations, deviceMemory is an alias VkDeviceMemory
// get underling VkDeviceMemory for given alias
deviceMemoryTransform_tohost(&deviceMemory, 1 /*memoryCount*/, &dataOffset,
@@ -6591,7 +6581,7 @@
struct goldfish_VkDescriptorSet* ds = as_goldfish_VkDescriptorSet(descriptorSet);
ReifiedDescriptorSet* reified = ds->reified;
- bool batched = mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate;
+ bool batched = mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate;
for (uint32_t i = 0; i < templateEntryCount; ++i) {
const auto& entry = templateEntries[i];
@@ -7004,7 +6994,7 @@
}
CommandBufferStagingStream::Alloc ResourceTracker::getAlloc() {
- if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+ if (mFeatureInfo.hasVulkanAuxCommandMemory) {
return [this](size_t size) -> CommandBufferStagingStream::Memory {
VkMemoryAllocateInfo info{
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
@@ -7043,7 +7033,7 @@
}
CommandBufferStagingStream::Free ResourceTracker::getFree() {
- if (mFeatureInfo->hasVulkanAuxCommandMemory) {
+ if (mFeatureInfo.hasVulkanAuxCommandMemory) {
return [this](const CommandBufferStagingStream::Memory& memory) {
// deviceMemory may not be the actual backing auxiliary VkDeviceMemory
// for suballocations, deviceMemory is a alias VkDeviceMemory hand;
@@ -7169,7 +7159,7 @@
const VkCommandBuffer* pCommandBuffers) {
VkEncoder* enc = (VkEncoder*)context;
- if (!mFeatureInfo->hasVulkanQueueSubmitWithCommands) {
+ if (!mFeatureInfo.hasVulkanQueueSubmitWithCommands) {
enc->vkCmdExecuteCommands(commandBuffer, commandBufferCount, pCommandBuffers,
true /* do lock */);
return;
@@ -7196,7 +7186,7 @@
const uint32_t* pDynamicOffsets) {
VkEncoder* enc = (VkEncoder*)context;
- if (mFeatureInfo->hasVulkanBatchedDescriptorSetUpdate)
+ if (mFeatureInfo.hasVulkanBatchedDescriptorSetUpdate)
addPendingDescriptorSets(commandBuffer, descriptorSetCount, pDescriptorSets);
enc->vkCmdBindDescriptorSets(commandBuffer, pipelineBindPoint, layout, firstSet,
@@ -7278,7 +7268,7 @@
mesa_logd("%s: call for image %p hos timage handle 0x%llx\n", __func__, (void*)image,
(unsigned long long)get_host_u64_VkImage(image));
- if (mFeatureInfo->hasVirtioGpuNativeSync) {
+ if (mFeatureInfo.hasVirtioGpuNativeSync) {
struct VirtGpuExecBuffer exec = {};
struct gfxstreamCreateQSRIExportVK exportQSRI = {};
VirtGpuDevice* instance = VirtGpuDevice::getInstance();
@@ -7351,7 +7341,7 @@
VkEncoder* enc = (VkEncoder*)context;
- if (!mFeatureInfo->hasVulkanAsyncQsri) {
+ if (!mFeatureInfo.hasVulkanAsyncQsri) {
return enc->vkQueueSignalReleaseImageANDROID(queue, waitSemaphoreCount, pWaitSemaphores,
image, pNativeFenceFd, true /* lock */);
}
diff --git a/guest/vulkan_enc/ResourceTracker.h b/guest/vulkan_enc/ResourceTracker.h
index fc4d9b0..ac810d2 100644
--- a/guest/vulkan_enc/ResourceTracker.h
+++ b/guest/vulkan_enc/ResourceTracker.h
@@ -92,7 +92,25 @@
#include "../egl/goldfish_sync.h"
#endif
-struct EmulatorFeatureInfo;
+// This should be ABI identical with the variant in ResourceTracker.h
+struct GfxStreamVkFeatureInfo {
+ bool hasDirectMem;
+ bool hasVulkan;
+ bool hasDeferredVulkanCommands;
+ bool hasVulkanNullOptionalStrings;
+ bool hasVulkanCreateResourcesWithRequirements;
+ bool hasVulkanIgnoredHandles;
+ bool hasVirtioGpuNext;
+ bool hasVulkanFreeMemorySync;
+ bool hasVirtioGpuNativeSync;
+ bool hasVulkanShaderFloat16Int8;
+ bool hasVulkanAsyncQueueSubmit;
+ bool hasVulkanQueueSubmitWithCommands;
+ bool hasVulkanBatchedDescriptorSetUpdate;
+ bool hasVulkanAsyncQsri;
+ bool hasVulkanAuxCommandMemory;
+ bool setupComplete;
+};
class HostConnection;
@@ -530,7 +548,7 @@
VkDeviceSize getNonCoherentExtendedSize(VkDevice device, VkDeviceSize basicSize) const;
bool isValidMemoryRange(const VkMappedMemoryRange& range);
- void setupFeatures(const EmulatorFeatureInfo* features);
+ void setupFeatures(const struct GfxStreamVkFeatureInfo* features);
void setupCaps(uint32_t& noRenderControlEnc);
void setThreadingCallbacks(const ThreadingCallbacks& callbacks);
@@ -877,7 +895,9 @@
std::recursive_mutex mLock;
std::optional<const VkPhysicalDeviceMemoryProperties> mCachedPhysicalDeviceMemoryProps;
- std::unique_ptr<EmulatorFeatureInfo> mFeatureInfo;
+
+ struct GfxStreamVkFeatureInfo mFeatureInfo = {};
+
#if defined(__ANDROID__)
std::unique_ptr<GoldfishAddressSpaceBlockProvider> mGoldfishAddressSpaceBlockProvider;
#endif // defined(__ANDROID__)