Merge changes Ic7af82de,I461327ce into main
* changes:
Add VkFence snapshot
Add guest ANGLE to allowlist for vulkan snapshot
diff --git a/common/end2end/GfxstreamEnd2EndVkSnapshotPipelineTests.cpp b/common/end2end/GfxstreamEnd2EndVkSnapshotPipelineTests.cpp
index f7a612c..7bd14a9 100644
--- a/common/end2end/GfxstreamEnd2EndVkSnapshotPipelineTests.cpp
+++ b/common/end2end/GfxstreamEnd2EndVkSnapshotPipelineTests.cpp
@@ -526,6 +526,7 @@
commandBuffer->reset();
SnapshotSaveAndLoad();
+ ASSERT_THAT(device->getFenceStatus(*fence), IsVkSuccess());
// TODO(b/332763326): fix validation layer complain about unreleased pipeline layout
// Try to draw something.
diff --git a/host/vulkan/VkDecoderGlobalState.cpp b/host/vulkan/VkDecoderGlobalState.cpp
index 0c887f3..81fb1e1 100644
--- a/host/vulkan/VkDecoderGlobalState.cpp
+++ b/host/vulkan/VkDecoderGlobalState.cpp
@@ -194,6 +194,7 @@
static uint32_t kTemporaryContextIdForSnapshotLoading = 1;
static std::unordered_set<std::string> kSnapshotAppAllowList = {"Chromium"};
+static std::unordered_set<std::string> kSnapshotEngineAllowList = {"ANGLE"};
#define DEFINE_BOXED_HANDLE_TYPE_TAG(type) Tag_##type,
@@ -676,6 +677,22 @@
}
}
}
+
+ // Fences
+ std::vector<VkFence> unsignaledFencesBoxed;
+ for (const auto& fence : mFenceInfo) {
+ if (!fence.second.boxed) {
+ continue;
+ }
+ const auto& device = fence.second.device;
+ const auto& deviceInfo = android::base::find(mDeviceInfo, device);
+ VulkanDispatch* dvk = dispatch_VkDevice(deviceInfo->boxed);
+ if (VK_NOT_READY == dvk->vkGetFenceStatus(device, fence.first)) {
+ unsignaledFencesBoxed.push_back(fence.second.boxed);
+ }
+ }
+ stream->putBe64(unsignaledFencesBoxed.size());
+ stream->write(unsignaledFencesBoxed.data(), unsignaledFencesBoxed.size() * sizeof(VkFence));
mSnapshotState = SnapshotState::Normal;
}
@@ -857,7 +874,22 @@
poolIds.data(), whichPool.data(), pendingAlloc.data(), writeStartingIndices.data(),
writeDescriptorSets.size(), writeDescriptorSets.data());
}
-
+ // Fences
+ uint64_t fenceCount = stream->getBe64();
+ std::vector<VkFence> unsignaledFencesBoxed(fenceCount);
+ stream->read(unsignaledFencesBoxed.data(), fenceCount * sizeof(VkFence));
+ for (VkFence boxedFence : unsignaledFencesBoxed) {
+ VkFence unboxedFence = unbox_VkFence(boxedFence);
+ auto it = mFenceInfo.find(unboxedFence);
+ if (it == mFenceInfo.end()) {
+ GFXSTREAM_ABORT(FatalError(ABORT_REASON_OTHER))
+ << "Snapshot load failure: unrecognized VkFence";
+ }
+ const auto& device = it->second.device;
+ const auto& deviceInfo = android::base::find(mDeviceInfo, device);
+ VulkanDispatch* dvk = dispatch_VkDevice(deviceInfo->boxed);
+ dvk->vkResetFences(device, 1, &unboxedFence);
+ }
#ifdef GFXSTREAM_ENABLE_HOST_VK_SNAPSHOT
if (!mInstanceInfo.empty()) {
get_emugl_vm_operations().setStatSnapshotUseVulkan();
@@ -1009,9 +1041,9 @@
#ifdef GFXSTREAM_ENABLE_HOST_VK_SNAPSHOT
// TODO: bug 129484301
- if (!m_emu->features.VulkanSnapshots.enabled
- || kSnapshotAppAllowList.find(info.applicationName)
- == kSnapshotAppAllowList.end()) {
+ if (!m_emu->features.VulkanSnapshots.enabled ||
+ (kSnapshotAppAllowList.find(info.applicationName) == kSnapshotAppAllowList.end() &&
+ kSnapshotEngineAllowList.find(info.engineName) == kSnapshotEngineAllowList.end())) {
get_emugl_vm_operations().setSkipSnapshotSave(true);
get_emugl_vm_operations().setSkipSnapshotSaveReason(SNAPSHOT_SKIP_UNSUPPORTED_VK_APP);
}
@@ -2681,6 +2713,13 @@
VkResult on_vkCreateFence(android::base::BumpPool* pool, VkDevice boxed_device,
const VkFenceCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator, VkFence* pFence) {
+ VkFenceCreateInfo localCreateInfo;
+ if (mSnapshotState == SnapshotState::Loading) {
+ // On snapshot load we create all fences as signaled then reset those that are not.
+ localCreateInfo = *pCreateInfo;
+ pCreateInfo = &localCreateInfo;
+ localCreateInfo.flags |= VK_FENCE_CREATE_SIGNALED_BIT;
+ }
auto device = unbox_VkDevice(boxed_device);
auto vk = dispatch_VkDevice(boxed_device);