aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLingfeng Yang <lfy@google.com>2020-07-09 17:42:33 -0700
committerLingfeng Yang <lfy@google.com>2020-07-15 21:56:19 -0700
commitf89f75d19633196b2341998fa212dbca771d65fa (patch)
treecf56668eea98a0126fbe8eefa3eaf912cc7c450d
parentc42eb49eabdd1e0aef600de7244d6025da63ee68 (diff)
downloaddevice_generic_goldfish-opengl-f89f75d19633196b2341998fa212dbca771d65fa.tar.gz
device_generic_goldfish-opengl-f89f75d19633196b2341998fa212dbca771d65fa.tar.bz2
device_generic_goldfish-opengl-f89f75d19633196b2341998fa212dbca771d65fa.zip
async queue submit (guest)
Bug: 160996822 Change-Id: Ifeabf3de305ce35234cc191b905411f32c19cba7
-rw-r--r--system/OpenglSystemCommon/EmulatorFeatureInfo.h7
-rw-r--r--system/OpenglSystemCommon/HostConnection.cpp8
-rw-r--r--system/OpenglSystemCommon/HostConnection.h1
-rw-r--r--system/vulkan/func_table.cpp113
-rw-r--r--system/vulkan/func_table.h2
-rw-r--r--system/vulkan_enc/ResourceTracker.cpp115
-rw-r--r--system/vulkan_enc/ResourceTracker.h1
-rw-r--r--system/vulkan_enc/VkEncoder.cpp225
-rw-r--r--system/vulkan_enc/VkEncoder.h18
-rw-r--r--system/vulkan_enc/VulkanHandles.h2
-rw-r--r--system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp2
-rw-r--r--system/vulkan_enc/goldfish_vk_deepcopy_guest.h2
-rw-r--r--system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp2
-rw-r--r--system/vulkan_enc/goldfish_vk_extension_structs_guest.h2
-rw-r--r--system/vulkan_enc/goldfish_vk_handlemap_guest.cpp2
-rw-r--r--system/vulkan_enc/goldfish_vk_handlemap_guest.h2
-rw-r--r--system/vulkan_enc/goldfish_vk_marshaling_guest.cpp20
-rw-r--r--system/vulkan_enc/goldfish_vk_marshaling_guest.h6
-rw-r--r--system/vulkan_enc/goldfish_vk_private_defs.h10
-rw-r--r--system/vulkan_enc/goldfish_vk_transform_guest.cpp2
-rw-r--r--system/vulkan_enc/goldfish_vk_transform_guest.h2
21 files changed, 533 insertions, 11 deletions
diff --git a/system/OpenglSystemCommon/EmulatorFeatureInfo.h b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
index e1c414a2..d0ae8530 100644
--- a/system/OpenglSystemCommon/EmulatorFeatureInfo.h
+++ b/system/OpenglSystemCommon/EmulatorFeatureInfo.h
@@ -111,6 +111,9 @@ static const char kVirtioGpuNativeSync[] = "ANDROID_EMU_virtio_gpu_native_sync";
// Vulkan extension that required a protocol update (new marshaling structs)
static const char kVulkanShaderFloat16Int8[] = "ANDROID_EMU_vulkan_shader_float16_int8";
+// Vulkan async queue submit
+static const char kVulkanAsyncQueueSubmit[] = "ANDROID_EMU_vulkan_async_queue_submit";
+
// Struct describing available emulator features
struct EmulatorFeatureInfo {
@@ -131,7 +134,8 @@ struct EmulatorFeatureInfo {
hasSharedSlotsHostMemoryAllocator(false),
hasVulkanFreeMemorySync(false),
hasVirtioGpuNativeSync(false),
- hasVulkanShaderFloat16Int8(false)
+ hasVulkanShaderFloat16Int8(false),
+ hasVulkanAsyncQueueSubmit(false)
{ }
SyncImpl syncImpl;
@@ -151,6 +155,7 @@ struct EmulatorFeatureInfo {
bool hasVulkanFreeMemorySync;
bool hasVirtioGpuNativeSync;
bool hasVulkanShaderFloat16Int8;
+ bool hasVulkanAsyncQueueSubmit;
};
enum HostConnectionType {
diff --git a/system/OpenglSystemCommon/HostConnection.cpp b/system/OpenglSystemCommon/HostConnection.cpp
index d7478d2f..9c6cce37 100644
--- a/system/OpenglSystemCommon/HostConnection.cpp
+++ b/system/OpenglSystemCommon/HostConnection.cpp
@@ -639,6 +639,7 @@ ExtendedRCEncoderContext *HostConnection::rcEncoder()
queryAndSetVulkanFreeMemorySync(rcEnc);
queryAndSetVirtioGpuNativeSync(rcEnc);
queryAndSetVulkanShaderFloat16Int8Support(rcEnc);
+ queryAndSetVulkanAsyncQueueSubmitSupport(m_rcEnc);
if (m_processPipe) {
m_processPipe->processPipeInit(m_connectionType, rcEnc);
}
@@ -894,3 +895,10 @@ void HostConnection::queryAndSetVulkanShaderFloat16Int8Support(ExtendedRCEncoder
rcEnc->featureInfo()->hasVulkanShaderFloat16Int8 = true;
}
}
+
+void HostConnection::queryAndSetVulkanAsyncQueueSubmitSupport(ExtendedRCEncoderContext* rcEnc) {
+ std::string glExtensions = queryGLExtensions(rcEnc);
+ if (glExtensions.find(kVulkanAsyncQueueSubmit) != std::string::npos) {
+ rcEnc->featureInfo()->hasVulkanAsyncQueueSubmit = true;
+ }
+}
diff --git a/system/OpenglSystemCommon/HostConnection.h b/system/OpenglSystemCommon/HostConnection.h
index 4ccd5a77..69d8a16b 100644
--- a/system/OpenglSystemCommon/HostConnection.h
+++ b/system/OpenglSystemCommon/HostConnection.h
@@ -216,6 +216,7 @@ private:
void queryAndSetVulkanFreeMemorySync(ExtendedRCEncoderContext *rcEnc);
void queryAndSetVirtioGpuNativeSync(ExtendedRCEncoderContext *rcEnc);
void queryAndSetVulkanShaderFloat16Int8Support(ExtendedRCEncoderContext *rcEnc);
+ void queryAndSetVulkanAsyncQueueSubmitSupport(ExtendedRCEncoderContext *rcEnc);
private:
HostConnectionType m_connectionType;
diff --git a/system/vulkan/func_table.cpp b/system/vulkan/func_table.cpp
index 50e8a62b..51913e8e 100644
--- a/system/vulkan/func_table.cpp
+++ b/system/vulkan/func_table.cpp
@@ -240,6 +240,7 @@ static VkResult entry_vkQueueSubmit(
{
AEMU_SCOPED_TRACE("vkQueueSubmit");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
VkResult vkQueueSubmit_VkResult_return = (VkResult)0;
auto resources = ResourceTracker::get();
vkQueueSubmit_VkResult_return = resources->on_vkQueueSubmit(vkEnc, VK_SUCCESS, queue, submitCount, pSubmits, fence);
@@ -250,6 +251,7 @@ static VkResult entry_vkQueueWaitIdle(
{
AEMU_SCOPED_TRACE("vkQueueWaitIdle");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
VkResult vkQueueWaitIdle_VkResult_return = (VkResult)0;
auto resources = ResourceTracker::get();
vkQueueWaitIdle_VkResult_return = resources->on_vkQueueWaitIdle(vkEnc, VK_SUCCESS, queue);
@@ -418,6 +420,7 @@ static VkResult entry_vkQueueBindSparse(
{
AEMU_SCOPED_TRACE("vkQueueBindSparse");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
VkResult vkQueueBindSparse_VkResult_return = (VkResult)0;
vkQueueBindSparse_VkResult_return = vkEnc->vkQueueBindSparse(queue, bindInfoCount, pBindInfo, fence);
return vkQueueBindSparse_VkResult_return;
@@ -2258,6 +2261,7 @@ static VkResult entry_vkQueuePresentKHR(
{
AEMU_SCOPED_TRACE("vkQueuePresentKHR");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
VkResult vkQueuePresentKHR_VkResult_return = (VkResult)0;
vkQueuePresentKHR_VkResult_return = vkEnc->vkQueuePresentKHR(queue, pPresentInfo);
return vkQueuePresentKHR_VkResult_return;
@@ -3751,6 +3755,7 @@ static VkResult entry_vkQueueSignalReleaseImageANDROID(
{
AEMU_SCOPED_TRACE("vkQueueSignalReleaseImageANDROID");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
VkResult vkQueueSignalReleaseImageANDROID_VkResult_return = (VkResult)0;
vkQueueSignalReleaseImageANDROID_VkResult_return = vkEnc->vkQueueSignalReleaseImageANDROID(queue, waitSemaphoreCount, pWaitSemaphores, image, pNativeFenceFd);
return vkQueueSignalReleaseImageANDROID_VkResult_return;
@@ -4633,6 +4638,7 @@ static void entry_vkQueueBeginDebugUtilsLabelEXT(
{
AEMU_SCOPED_TRACE("vkQueueBeginDebugUtilsLabelEXT");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
vkEnc->vkQueueBeginDebugUtilsLabelEXT(queue, pLabelInfo);
}
static void entry_vkQueueEndDebugUtilsLabelEXT(
@@ -4640,6 +4646,7 @@ static void entry_vkQueueEndDebugUtilsLabelEXT(
{
AEMU_SCOPED_TRACE("vkQueueEndDebugUtilsLabelEXT");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
vkEnc->vkQueueEndDebugUtilsLabelEXT(queue);
}
static void entry_vkQueueInsertDebugUtilsLabelEXT(
@@ -4648,6 +4655,7 @@ static void entry_vkQueueInsertDebugUtilsLabelEXT(
{
AEMU_SCOPED_TRACE("vkQueueInsertDebugUtilsLabelEXT");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
vkEnc->vkQueueInsertDebugUtilsLabelEXT(queue, pLabelInfo);
}
static void entry_vkCmdBeginDebugUtilsLabelEXT(
@@ -4992,6 +5000,7 @@ static void entry_vkGetQueueCheckpointDataNV(
{
AEMU_SCOPED_TRACE("vkGetQueueCheckpointDataNV");
auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
vkEnc->vkGetQueueCheckpointDataNV(queue, pCheckpointDataCount, pCheckpointData);
}
#endif
@@ -5287,6 +5296,48 @@ static VkResult dynCheck_entry_vkFreeMemorySyncGOOGLE(
return vkFreeMemorySyncGOOGLE_VkResult_return;
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+static void entry_vkQueueHostSyncGOOGLE(
+ VkQueue queue,
+ uint32_t needHostSync,
+ uint32_t sequenceNumber)
+{
+ AEMU_SCOPED_TRACE("vkQueueHostSyncGOOGLE");
+ auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
+ vkEnc->vkQueueHostSyncGOOGLE(queue, needHostSync, sequenceNumber);
+}
+static void entry_vkQueueSubmitAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t submitCount,
+ const VkSubmitInfo* pSubmits,
+ VkFence fence)
+{
+ AEMU_SCOPED_TRACE("vkQueueSubmitAsyncGOOGLE");
+ auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
+ vkEnc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+}
+static void entry_vkQueueWaitIdleAsyncGOOGLE(
+ VkQueue queue)
+{
+ AEMU_SCOPED_TRACE("vkQueueWaitIdleAsyncGOOGLE");
+ auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
+ vkEnc->vkQueueWaitIdleAsyncGOOGLE(queue);
+}
+static void entry_vkQueueBindSparseAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence)
+{
+ AEMU_SCOPED_TRACE("vkQueueBindSparseAsyncGOOGLE");
+ auto vkEnc = HostConnection::get()->vkEncoder();
+ ResourceTracker::get()->syncEncodersForQueue(queue, vkEnc);
+ vkEnc->vkQueueBindSparseAsyncGOOGLE(queue, bindInfoCount, pBindInfo, fence);
+}
+#endif
void* goldfish_vulkan_get_proc_address(const char* name){
#ifdef VK_VERSION_1_0
if (!strcmp(name, "vkCreateInstance"))
@@ -6744,6 +6795,24 @@ void* goldfish_vulkan_get_proc_address(const char* name){
return nullptr;
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+ if (!strcmp(name, "vkQueueHostSyncGOOGLE"))
+ {
+ return nullptr;
+ }
+ if (!strcmp(name, "vkQueueSubmitAsyncGOOGLE"))
+ {
+ return nullptr;
+ }
+ if (!strcmp(name, "vkQueueWaitIdleAsyncGOOGLE"))
+ {
+ return nullptr;
+ }
+ if (!strcmp(name, "vkQueueBindSparseAsyncGOOGLE"))
+ {
+ return nullptr;
+ }
+#endif
return nullptr;
}
void* goldfish_vulkan_get_instance_proc_address(VkInstance instance, const char* name){
@@ -8298,6 +8367,28 @@ void* goldfish_vulkan_get_instance_proc_address(VkInstance instance, const char*
return (void*)dynCheck_entry_vkFreeMemorySyncGOOGLE;
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+ if (!strcmp(name, "vkQueueHostSyncGOOGLE"))
+ {
+ bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueHostSyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueSubmitAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueSubmitAsyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueWaitIdleAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueWaitIdleAsyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueBindSparseAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueBindSparseAsyncGOOGLE : nullptr;
+ }
+#endif
return nullptr;
}
void* goldfish_vulkan_get_device_proc_address(VkDevice device, const char* name){
@@ -9923,6 +10014,28 @@ void* goldfish_vulkan_get_device_proc_address(VkDevice device, const char* name)
return hasExt ? (void*)entry_vkFreeMemorySyncGOOGLE : nullptr;
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+ if (!strcmp(name, "vkQueueHostSyncGOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueHostSyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueSubmitAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueSubmitAsyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueWaitIdleAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueWaitIdleAsyncGOOGLE : nullptr;
+ }
+ if (!strcmp(name, "vkQueueBindSparseAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_async_queue_submit");
+ return hasExt ? (void*)entry_vkQueueBindSparseAsyncGOOGLE : nullptr;
+ }
+#endif
return nullptr;
}
diff --git a/system/vulkan/func_table.h b/system/vulkan/func_table.h
index 3c0e4573..9c2e5beb 100644
--- a/system/vulkan/func_table.h
+++ b/system/vulkan/func_table.h
@@ -292,6 +292,8 @@ namespace goldfish_vk {
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
void* goldfish_vulkan_get_proc_address(const char* name);
void* goldfish_vulkan_get_instance_proc_address(VkInstance instance, const char* name);
void* goldfish_vulkan_get_device_proc_address(VkDevice device, const char* name);
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index e7ff088a..4fd2850f 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -275,6 +275,11 @@ public:
uint32_t sequenceNumber = 0;
};
+ struct VkQueue_Info {
+ VkEncoder** lastUsedEncoderPtr = nullptr;
+ uint32_t sequenceNumber = 0;
+ };
+
// custom guest-side structs for images/buffers because of AHardwareBuffer :((
struct VkImage_Info {
VkDevice device;
@@ -401,6 +406,24 @@ public:
info_VkCommandBuffer.erase(commandBuffer);
}
+ void unregister_VkQueue(VkQueue queue) {
+ AutoLock lock(mLock);
+
+ auto it = info_VkQueue.find(queue);
+ if (it == info_VkQueue.end()) return;
+ auto& info = it->second;
+ auto lastUsedEncoder =
+ info.lastUsedEncoderPtr ?
+ *(info.lastUsedEncoderPtr) : nullptr;
+
+ if (lastUsedEncoder) {
+ lastUsedEncoder->unregisterCleanupCallback(queue);
+ delete info.lastUsedEncoderPtr;
+ }
+
+ info_VkQueue.erase(queue);
+ }
+
void unregister_VkDeviceMemory(VkDeviceMemory mem) {
AutoLock lock(mLock);
@@ -839,6 +862,11 @@ public:
return mFeatureInfo->hasDeferredVulkanCommands;
}
+ bool supportsAsyncQueueSubmit() const {
+ if (!mFeatureInfo) return false;
+ return mFeatureInfo->hasVulkanAsyncQueueSubmit;
+ }
+
bool supportsCreateResourcesWithRequirements() const {
if (!mFeatureInfo) return false;
return mFeatureInfo->hasVulkanCreateResourcesWithRequirements;
@@ -4101,8 +4129,13 @@ public:
lock.unlock();
if (pre_signal_semaphores.empty()) {
- input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
- if (input_result != VK_SUCCESS) return input_result;
+ if (supportsAsyncQueueSubmit()) {
+ enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+ input_result = VK_SUCCESS;
+ } else {
+ input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
+ if (input_result != VK_SUCCESS) return input_result;
+ }
} else {
// Schedule waits on the OS external objects and
// signal the wait semaphores
@@ -4137,10 +4170,20 @@ public:
.pWaitDstStageMask = nullptr,
.signalSemaphoreCount = static_cast<uint32_t>(pre_signal_semaphores.size()),
.pSignalSemaphores = pre_signal_semaphores.data()};
- enc->vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
- input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
- if (input_result != VK_SUCCESS) return input_result;
+ if (supportsAsyncQueueSubmit()) {
+ enc->vkQueueSubmitAsyncGOOGLE(queue, 1, &submit_info, VK_NULL_HANDLE);
+ } else {
+ enc->vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
+ }
+
+ if (supportsAsyncQueueSubmit()) {
+ enc->vkQueueSubmitAsyncGOOGLE(queue, submitCount, pSubmits, fence);
+ input_result = VK_SUCCESS;
+ } else {
+ input_result = enc->vkQueueSubmit(queue, submitCount, pSubmits, fence);
+ if (input_result != VK_SUCCESS) return input_result;
+ }
}
lock.lock();
@@ -4612,11 +4655,13 @@ public:
if (!lastEncoder) return 0;
if (lastEncoder == currentEncoder) return 0;
- info.sequenceNumber++;
- lastEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, false, info.sequenceNumber);
+ auto oldSeq = info.sequenceNumber;
+
+ lock.unlock();
+
+ lastEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, false, oldSeq + 1);
lastEncoder->flush();
- info.sequenceNumber++;
- currentEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, true, info.sequenceNumber);
+ currentEncoder->vkCommandBufferHostSyncGOOGLE(commandBuffer, true, oldSeq + 2);
lastEncoder->unregisterCleanupCallback(commandBuffer);
@@ -4629,6 +4674,54 @@ public:
return 1;
}
+ uint32_t syncEncodersForQueue(VkQueue queue, VkEncoder* currentEncoder) {
+ AutoLock lock(mLock);
+
+ auto it = info_VkQueue.find(queue);
+ if (it == info_VkQueue.end()) return 0;
+
+ auto& info = it->second;
+
+ if (!info.lastUsedEncoderPtr) {
+ info.lastUsedEncoderPtr = new VkEncoder*;
+ *(info.lastUsedEncoderPtr) = currentEncoder;
+ }
+
+ auto lastUsedEncoderPtr = info.lastUsedEncoderPtr;
+
+ auto lastEncoder = *(lastUsedEncoderPtr);
+
+ // We always make lastUsedEncoderPtr track
+ // the current encoder, even if the last encoder
+ // is null.
+ *(lastUsedEncoderPtr) = currentEncoder;
+
+ if (!lastEncoder) return 0;
+ if (lastEncoder == currentEncoder) return 0;
+
+ auto oldSeq = info.sequenceNumber;
+
+ info.sequenceNumber += 2;
+
+ lock.unlock();
+
+ // at this point the seqno for the old thread is determined
+
+ lastEncoder->vkQueueHostSyncGOOGLE(queue, false, oldSeq + 1);
+ lastEncoder->flush();
+ currentEncoder->vkQueueHostSyncGOOGLE(queue, true, oldSeq + 2);
+
+ lastEncoder->unregisterCleanupCallback(queue);
+
+ currentEncoder->registerCleanupCallback(queue, [currentEncoder, lastUsedEncoderPtr]() {
+ if (*(lastUsedEncoderPtr) == currentEncoder) {
+ *(lastUsedEncoderPtr) = nullptr;
+ }
+ });
+
+ return 1;
+ }
+
VkResult on_vkBeginCommandBuffer(
void* context, VkResult input_result,
VkCommandBuffer commandBuffer,
@@ -5560,6 +5653,10 @@ uint32_t ResourceTracker::syncEncodersForCommandBuffer(VkCommandBuffer commandBu
return mImpl->syncEncodersForCommandBuffer(commandBuffer, current);
}
+uint32_t ResourceTracker::syncEncodersForQueue(VkQueue queue, VkEncoder* current) {
+ return mImpl->syncEncodersForQueue(queue, current);
+}
+
VkResult ResourceTracker::on_vkBeginCommandBuffer(
void* context, VkResult input_result,
VkCommandBuffer commandBuffer,
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index db33285d..9a5fae53 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -481,6 +481,7 @@ public:
VkImageFormatProperties2* pImageFormatProperties);
uint32_t syncEncodersForCommandBuffer(VkCommandBuffer commandBuffer, VkEncoder* current);
+ uint32_t syncEncodersForQueue(VkQueue queue, VkEncoder* current);
VkResult on_vkBeginCommandBuffer(
void* context, VkResult input_result,
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 8a76c927..43130085 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -18280,6 +18280,7 @@ VkResult VkEncoder::vkQueueSignalReleaseImageANDROID(
countingStream->clearPool();
stream->clearPool();
pool->freeAll();
+ stream->flush();
mImpl->log("finish vkQueueSignalReleaseImageANDROID");;
return vkQueueSignalReleaseImageANDROID_VkResult_return;
}
@@ -23030,6 +23031,7 @@ void VkEncoder::vkEndCommandBufferAsyncGOOGLE(
stream->write((uint64_t*)&cgen_var_1515, 1 * 8);
AEMU_SCOPED_TRACE("vkEndCommandBufferAsyncGOOGLE readParams");
AEMU_SCOPED_TRACE("vkEndCommandBufferAsyncGOOGLE returnUnmarshal");
+ stream->flush();
mImpl->log("finish vkEndCommandBufferAsyncGOOGLE");;
}
@@ -23520,5 +23522,228 @@ VkResult VkEncoder::vkFreeMemorySyncGOOGLE(
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+void VkEncoder::vkQueueHostSyncGOOGLE(
+ VkQueue queue,
+ uint32_t needHostSync,
+ uint32_t sequenceNumber)
+{
+ AutoLock encoderLock(mImpl->lock);
+ AEMU_SCOPED_TRACE("vkQueueHostSyncGOOGLE encode");
+ mImpl->log("start vkQueueHostSyncGOOGLE");
+ auto stream = mImpl->stream();
+ auto countingStream = mImpl->countingStream();
+ auto resources = mImpl->resources();
+ auto pool = mImpl->pool();
+ stream->setHandleMapping(resources->unwrapMapping());
+ VkQueue local_queue;
+ uint32_t local_needHostSync;
+ uint32_t local_sequenceNumber;
+ local_queue = queue;
+ local_needHostSync = needHostSync;
+ local_sequenceNumber = sequenceNumber;
+ countingStream->rewind();
+ {
+ uint64_t cgen_var_1553;
+ countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1553, 1);
+ countingStream->write((uint64_t*)&cgen_var_1553, 1 * 8);
+ countingStream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
+ countingStream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+ }
+ uint32_t packetSize_vkQueueHostSyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
+ countingStream->rewind();
+ uint32_t opcode_vkQueueHostSyncGOOGLE = OP_vkQueueHostSyncGOOGLE;
+ stream->write(&opcode_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
+ stream->write(&packetSize_vkQueueHostSyncGOOGLE, sizeof(uint32_t));
+ uint64_t cgen_var_1554;
+ stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1554, 1);
+ stream->write((uint64_t*)&cgen_var_1554, 1 * 8);
+ stream->write((uint32_t*)&local_needHostSync, sizeof(uint32_t));
+ stream->write((uint32_t*)&local_sequenceNumber, sizeof(uint32_t));
+ AEMU_SCOPED_TRACE("vkQueueHostSyncGOOGLE readParams");
+ AEMU_SCOPED_TRACE("vkQueueHostSyncGOOGLE returnUnmarshal");
+ mImpl->log("finish vkQueueHostSyncGOOGLE");;
+}
+
+void VkEncoder::vkQueueSubmitAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t submitCount,
+ const VkSubmitInfo* pSubmits,
+ VkFence fence)
+{
+ AutoLock encoderLock(mImpl->lock);
+ AEMU_SCOPED_TRACE("vkQueueSubmitAsyncGOOGLE encode");
+ mImpl->log("start vkQueueSubmitAsyncGOOGLE");
+ auto stream = mImpl->stream();
+ auto countingStream = mImpl->countingStream();
+ auto resources = mImpl->resources();
+ auto pool = mImpl->pool();
+ stream->setHandleMapping(resources->unwrapMapping());
+ VkQueue local_queue;
+ uint32_t local_submitCount;
+ VkSubmitInfo* local_pSubmits;
+ VkFence local_fence;
+ local_queue = queue;
+ local_submitCount = submitCount;
+ local_pSubmits = nullptr;
+ if (pSubmits)
+ {
+ local_pSubmits = (VkSubmitInfo*)pool->alloc(((submitCount)) * sizeof(const VkSubmitInfo));
+ for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
+ {
+ deepcopy_VkSubmitInfo(pool, pSubmits + i, (VkSubmitInfo*)(local_pSubmits + i));
+ }
+ }
+ local_fence = fence;
+ if (local_pSubmits)
+ {
+ for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
+ {
+ transform_tohost_VkSubmitInfo(mImpl->resources(), (VkSubmitInfo*)(local_pSubmits + i));
+ }
+ }
+ countingStream->rewind();
+ {
+ uint64_t cgen_var_1555;
+ countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1555, 1);
+ countingStream->write((uint64_t*)&cgen_var_1555, 1 * 8);
+ countingStream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+ for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
+ {
+ marshal_VkSubmitInfo(countingStream, (VkSubmitInfo*)(local_pSubmits + i));
+ }
+ uint64_t cgen_var_1556;
+ countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1556, 1);
+ countingStream->write((uint64_t*)&cgen_var_1556, 1 * 8);
+ }
+ uint32_t packetSize_vkQueueSubmitAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
+ countingStream->rewind();
+ uint32_t opcode_vkQueueSubmitAsyncGOOGLE = OP_vkQueueSubmitAsyncGOOGLE;
+ stream->write(&opcode_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
+ stream->write(&packetSize_vkQueueSubmitAsyncGOOGLE, sizeof(uint32_t));
+ uint64_t cgen_var_1557;
+ stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1557, 1);
+ stream->write((uint64_t*)&cgen_var_1557, 1 * 8);
+ stream->write((uint32_t*)&local_submitCount, sizeof(uint32_t));
+ for (uint32_t i = 0; i < (uint32_t)((submitCount)); ++i)
+ {
+ marshal_VkSubmitInfo(stream, (VkSubmitInfo*)(local_pSubmits + i));
+ }
+ uint64_t cgen_var_1558;
+ stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1558, 1);
+ stream->write((uint64_t*)&cgen_var_1558, 1 * 8);
+ AEMU_SCOPED_TRACE("vkQueueSubmitAsyncGOOGLE readParams");
+ AEMU_SCOPED_TRACE("vkQueueSubmitAsyncGOOGLE returnUnmarshal");
+ stream->flush();
+ mImpl->log("finish vkQueueSubmitAsyncGOOGLE");;
+}
+
+void VkEncoder::vkQueueWaitIdleAsyncGOOGLE(
+ VkQueue queue)
+{
+ AutoLock encoderLock(mImpl->lock);
+ AEMU_SCOPED_TRACE("vkQueueWaitIdleAsyncGOOGLE encode");
+ mImpl->log("start vkQueueWaitIdleAsyncGOOGLE");
+ auto stream = mImpl->stream();
+ auto countingStream = mImpl->countingStream();
+ auto resources = mImpl->resources();
+ auto pool = mImpl->pool();
+ stream->setHandleMapping(resources->unwrapMapping());
+ VkQueue local_queue;
+ local_queue = queue;
+ countingStream->rewind();
+ {
+ uint64_t cgen_var_1559;
+ countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1559, 1);
+ countingStream->write((uint64_t*)&cgen_var_1559, 1 * 8);
+ }
+ uint32_t packetSize_vkQueueWaitIdleAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
+ countingStream->rewind();
+ uint32_t opcode_vkQueueWaitIdleAsyncGOOGLE = OP_vkQueueWaitIdleAsyncGOOGLE;
+ stream->write(&opcode_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
+ stream->write(&packetSize_vkQueueWaitIdleAsyncGOOGLE, sizeof(uint32_t));
+ uint64_t cgen_var_1560;
+ stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1560, 1);
+ stream->write((uint64_t*)&cgen_var_1560, 1 * 8);
+ AEMU_SCOPED_TRACE("vkQueueWaitIdleAsyncGOOGLE readParams");
+ AEMU_SCOPED_TRACE("vkQueueWaitIdleAsyncGOOGLE returnUnmarshal");
+ stream->flush();
+ mImpl->log("finish vkQueueWaitIdleAsyncGOOGLE");;
+}
+
+void VkEncoder::vkQueueBindSparseAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence)
+{
+ AutoLock encoderLock(mImpl->lock);
+ AEMU_SCOPED_TRACE("vkQueueBindSparseAsyncGOOGLE encode");
+ mImpl->log("start vkQueueBindSparseAsyncGOOGLE");
+ auto stream = mImpl->stream();
+ auto countingStream = mImpl->countingStream();
+ auto resources = mImpl->resources();
+ auto pool = mImpl->pool();
+ stream->setHandleMapping(resources->unwrapMapping());
+ VkQueue local_queue;
+ uint32_t local_bindInfoCount;
+ VkBindSparseInfo* local_pBindInfo;
+ VkFence local_fence;
+ local_queue = queue;
+ local_bindInfoCount = bindInfoCount;
+ local_pBindInfo = nullptr;
+ if (pBindInfo)
+ {
+ local_pBindInfo = (VkBindSparseInfo*)pool->alloc(((bindInfoCount)) * sizeof(const VkBindSparseInfo));
+ for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
+ {
+ deepcopy_VkBindSparseInfo(pool, pBindInfo + i, (VkBindSparseInfo*)(local_pBindInfo + i));
+ }
+ }
+ local_fence = fence;
+ if (local_pBindInfo)
+ {
+ for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
+ {
+ transform_tohost_VkBindSparseInfo(mImpl->resources(), (VkBindSparseInfo*)(local_pBindInfo + i));
+ }
+ }
+ countingStream->rewind();
+ {
+ uint64_t cgen_var_1561;
+ countingStream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1561, 1);
+ countingStream->write((uint64_t*)&cgen_var_1561, 1 * 8);
+ countingStream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+ for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
+ {
+ marshal_VkBindSparseInfo(countingStream, (VkBindSparseInfo*)(local_pBindInfo + i));
+ }
+ uint64_t cgen_var_1562;
+ countingStream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1562, 1);
+ countingStream->write((uint64_t*)&cgen_var_1562, 1 * 8);
+ }
+ uint32_t packetSize_vkQueueBindSparseAsyncGOOGLE = 4 + 4 + (uint32_t)countingStream->bytesWritten();
+ countingStream->rewind();
+ uint32_t opcode_vkQueueBindSparseAsyncGOOGLE = OP_vkQueueBindSparseAsyncGOOGLE;
+ stream->write(&opcode_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
+ stream->write(&packetSize_vkQueueBindSparseAsyncGOOGLE, sizeof(uint32_t));
+ uint64_t cgen_var_1563;
+ stream->handleMapping()->mapHandles_VkQueue_u64(&local_queue, &cgen_var_1563, 1);
+ stream->write((uint64_t*)&cgen_var_1563, 1 * 8);
+ stream->write((uint32_t*)&local_bindInfoCount, sizeof(uint32_t));
+ for (uint32_t i = 0; i < (uint32_t)((bindInfoCount)); ++i)
+ {
+ marshal_VkBindSparseInfo(stream, (VkBindSparseInfo*)(local_pBindInfo + i));
+ }
+ uint64_t cgen_var_1564;
+ stream->handleMapping()->mapHandles_VkFence_u64(&local_fence, &cgen_var_1564, 1);
+ stream->write((uint64_t*)&cgen_var_1564, 1 * 8);
+ AEMU_SCOPED_TRACE("vkQueueBindSparseAsyncGOOGLE readParams");
+ AEMU_SCOPED_TRACE("vkQueueBindSparseAsyncGOOGLE returnUnmarshal");
+ stream->flush();
+ mImpl->log("finish vkQueueBindSparseAsyncGOOGLE");;
+}
+
+#endif
} // namespace goldfish_vk
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 7e2e739c..0dec1b66 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -1823,6 +1823,24 @@ public:
VkDeviceMemory memory,
const VkAllocationCallbacks* pAllocator);
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+ void vkQueueHostSyncGOOGLE(
+ VkQueue queue,
+ uint32_t needHostSync,
+ uint32_t sequenceNumber);
+ void vkQueueSubmitAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t submitCount,
+ const VkSubmitInfo* pSubmits,
+ VkFence fence);
+ void vkQueueWaitIdleAsyncGOOGLE(
+ VkQueue queue);
+ void vkQueueBindSparseAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t bindInfoCount,
+ const VkBindSparseInfo* pBindInfo,
+ VkFence fence);
+#endif
private:
class Impl;
diff --git a/system/vulkan_enc/VulkanHandles.h b/system/vulkan_enc/VulkanHandles.h
index 54699aa1..ca1e5f2a 100644
--- a/system/vulkan_enc/VulkanHandles.h
+++ b/system/vulkan_enc/VulkanHandles.h
@@ -18,12 +18,12 @@
#define GOLDFISH_VK_LIST_TRIVIAL_DISPATCHABLE_HANDLE_TYPES(f) \
f(VkPhysicalDevice) \
- f(VkQueue) \
#define GOLDFISH_VK_LIST_DISPATCHABLE_HANDLE_TYPES(f) \
f(VkInstance) \
f(VkDevice) \
f(VkCommandBuffer) \
+ f(VkQueue) \
GOLDFISH_VK_LIST_TRIVIAL_DISPATCHABLE_HANDLE_TYPES(f)
#ifdef VK_NVX_device_generated_commands
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
index 62fc0f01..4f59d219 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.cpp
@@ -6424,6 +6424,8 @@ void deepcopy_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
void deepcopy_extension_struct(
Pool* pool,
const void* structExtension,
diff --git a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
index 07c2650f..243240a4 100644
--- a/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
+++ b/system/vulkan_enc/goldfish_vk_deepcopy_guest.h
@@ -2044,5 +2044,7 @@ void deepcopy_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
index 9d8253b5..1bc69fa1 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.cpp
@@ -290,6 +290,8 @@ namespace goldfish_vk {
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
uint32_t goldfish_vk_struct_type(
const void* structExtension)
{
diff --git a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
index d615608a..9d91cdc4 100644
--- a/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
+++ b/system/vulkan_enc/goldfish_vk_extension_structs_guest.h
@@ -311,5 +311,7 @@ size_t goldfish_vk_extension_struct_size_with_stream_features(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
index 65af4b3d..2e22fb0c 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.cpp
@@ -4780,6 +4780,8 @@ void handlemap_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
void handlemap_extension_struct(
VulkanHandleMapping* handlemap,
void* structExtension_out)
diff --git a/system/vulkan_enc/goldfish_vk_handlemap_guest.h b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
index 49eafa23..79eeaf66 100644
--- a/system/vulkan_enc/goldfish_vk_handlemap_guest.h
+++ b/system/vulkan_enc/goldfish_vk_handlemap_guest.h
@@ -1695,5 +1695,7 @@ void handlemap_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
} // namespace goldfish_vk
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 706bb916..f857a2a8 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -10368,6 +10368,8 @@ void unmarshal_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
void marshal_extension_struct(
VulkanStreamGuest* vkStream,
const void* structExtension)
@@ -13221,6 +13223,24 @@ const char* api_opcode_to_string(
return "OP_vkFreeMemorySyncGOOGLE";
}
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+ case OP_vkQueueHostSyncGOOGLE:
+ {
+ return "OP_vkQueueHostSyncGOOGLE";
+ }
+ case OP_vkQueueSubmitAsyncGOOGLE:
+ {
+ return "OP_vkQueueSubmitAsyncGOOGLE";
+ }
+ case OP_vkQueueWaitIdleAsyncGOOGLE:
+ {
+ return "OP_vkQueueWaitIdleAsyncGOOGLE";
+ }
+ case OP_vkQueueBindSparseAsyncGOOGLE:
+ {
+ return "OP_vkQueueBindSparseAsyncGOOGLE";
+ }
+#endif
default:
{
return "OP_UNKNOWN_API_CALL";
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 88ae45e4..df07272c 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -3418,6 +3418,12 @@ void unmarshal_VkImportPhysicalAddressGOOGLE(
#ifdef VK_GOOGLE_free_memory_sync
#define OP_vkFreeMemorySyncGOOGLE 20328
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#define OP_vkQueueHostSyncGOOGLE 20329
+#define OP_vkQueueSubmitAsyncGOOGLE 20330
+#define OP_vkQueueWaitIdleAsyncGOOGLE 20331
+#define OP_vkQueueBindSparseAsyncGOOGLE 20332
+#endif
const char* api_opcode_to_string(
const uint32_t opcode);
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index e7b0622a..dc4b7c64 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -608,6 +608,16 @@ typedef VkPhysicalDeviceShaderFloat16Int8Features VkPhysicalDeviceFloat16Int8Fea
#endif
+#define VK_GOOGLE_async_queue_submit 1
+
+typedef void (VKAPI_PTR *PFN_vkQueueHostSyncGOOGLE)(
+ VkQueue queue, uint32_t needHostSync, uint32_t sequenceNumber);
+typedef void (VKAPI_PTR *PFN_vkQueueSubmitAsyncGOOGLE)(
+ VkQueue queue, uint32_t submitCount, const VkSubmitInfo* pSubmits, VkFence fence);
+typedef void (VKAPI_PTR *PFN_vkQueueWaitIdleAsyncGOOGLE)(VkQueue queue);
+typedef void (VKAPI_PTR *PFN_vkQueueBindSparseAsyncGOOGLE)(
+ VkQueue queue, uint32_t bindInfoCount, const VkBindSparseInfo* pBindInfo, VkFence fence);
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.cpp b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
index 4bf4032e..6fc3e46c 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.cpp
@@ -9001,6 +9001,8 @@ void transform_fromhost_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
void transform_tohost_extension_struct(
ResourceTracker* resourceTracker,
void* structExtension_out)
diff --git a/system/vulkan_enc/goldfish_vk_transform_guest.h b/system/vulkan_enc/goldfish_vk_transform_guest.h
index 1779eae4..b9699583 100644
--- a/system/vulkan_enc/goldfish_vk_transform_guest.h
+++ b/system/vulkan_enc/goldfish_vk_transform_guest.h
@@ -3091,5 +3091,7 @@ void transform_fromhost_VkImportPhysicalAddressGOOGLE(
#endif
#ifdef VK_GOOGLE_free_memory_sync
#endif
+#ifdef VK_GOOGLE_async_queue_submit
+#endif
} // namespace goldfish_vk