vulkan: take vkQueueSignalReleaseImageANDROIDAsyncGOOGLE encoder codegen
Bug: 193809913
Change-Id: I00b2cdb099797be87297f62311fd247c27fd0c61
diff --git a/system/vulkan_enc/VkEncoder.cpp b/system/vulkan_enc/VkEncoder.cpp
index 5660460..b0d2bd1 100644
--- a/system/vulkan_enc/VkEncoder.cpp
+++ b/system/vulkan_enc/VkEncoder.cpp
@@ -1629,8 +1629,7 @@
stream->read((uint64_t*)&cgen_var_2, 8);
stream->handleMapping()->mapHandles_u64_VkQueue(&cgen_var_2, (VkQueue*)pQueue, 1);
stream->unsetHandleMapping();
- sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex,
- queueIndex, pQueue);
+ sResourceTracker->on_vkGetDeviceQueue(this, device, queueFamilyIndex, queueIndex, pQueue);
++encodeCount;;
if (0 == encodeCount % POOL_CLEAR_INTERVAL)
{
@@ -34514,6 +34513,91 @@
if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
}
+void VkEncoder::vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t waitSemaphoreCount,
+ const VkSemaphore* pWaitSemaphores,
+ VkImage image,
+ uint32_t doLock)
+{
+ (void)doLock;
+ bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT;
+ if (!queueSubmitWithCommandsEnabled && doLock) this->lock();
+ auto stream = mImpl->stream();
+ auto pool = mImpl->pool();
+ VkQueue local_queue;
+ uint32_t local_waitSemaphoreCount;
+ VkSemaphore* local_pWaitSemaphores;
+ VkImage local_image;
+ local_queue = queue;
+ local_waitSemaphoreCount = waitSemaphoreCount;
+ // Avoiding deepcopy for pWaitSemaphores
+ local_pWaitSemaphores = (VkSemaphore*)pWaitSemaphores;
+ local_image = image;
+ size_t count = 0;
+ size_t* countPtr = &count;
+ {
+ uint64_t cgen_var_0;
+ *countPtr += 1 * 8;
+ *countPtr += sizeof(uint32_t);
+ // WARNING PTR CHECK
+ *countPtr += 8;
+ if (local_pWaitSemaphores)
+ {
+ if (((waitSemaphoreCount)))
+ {
+ *countPtr += ((waitSemaphoreCount)) * 8;
+ }
+ }
+ uint64_t cgen_var_1;
+ *countPtr += 1 * 8;
+ }
+ uint32_t packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count;
+ uint8_t* streamPtr = stream->reserve(packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE);
+ uint8_t** streamPtrPtr = &streamPtr;
+ uint32_t opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE = OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE;
+ uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno();
+ memcpy(streamPtr, &opcode_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+ memcpy(streamPtr, &packetSize_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t);
+ if (queueSubmitWithCommandsEnabled) { memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); }
+ uint64_t cgen_var_0;
+ *&cgen_var_0 = get_host_u64_VkQueue((*&local_queue));
+ memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_0, 1 * 8);
+ *streamPtrPtr += 1 * 8;
+ memcpy(*streamPtrPtr, (uint32_t*)&local_waitSemaphoreCount, sizeof(uint32_t));
+ *streamPtrPtr += sizeof(uint32_t);
+ // WARNING PTR CHECK
+ uint64_t cgen_var_1 = (uint64_t)(uintptr_t)local_pWaitSemaphores;
+ memcpy((*streamPtrPtr), &cgen_var_1, 8);
+ android::base::Stream::toBe64((uint8_t*)(*streamPtrPtr));
+ *streamPtrPtr += 8;
+ if (local_pWaitSemaphores)
+ {
+ if (((waitSemaphoreCount)))
+ {
+ uint8_t* cgen_var_1_0_ptr = (uint8_t*)(*streamPtrPtr);
+ for (uint32_t k = 0; k < ((waitSemaphoreCount)); ++k)
+ {
+ uint64_t tmpval = get_host_u64_VkSemaphore(local_pWaitSemaphores[k]);
+ memcpy(cgen_var_1_0_ptr + k * 8, &tmpval, sizeof(uint64_t));
+ }
+ *streamPtrPtr += 8 * ((waitSemaphoreCount));
+ }
+ }
+ uint64_t cgen_var_2;
+ *&cgen_var_2 = get_host_u64_VkImage((*&local_image));
+ memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_2, 1 * 8);
+ *streamPtrPtr += 1 * 8;
+ stream->flush();
+ ++encodeCount;;
+ if (0 == encodeCount % POOL_CLEAR_INTERVAL)
+ {
+ pool->freeAll();
+ stream->clearPool();
+ }
+ if (!queueSubmitWithCommandsEnabled && doLock) this->unlock();
+}
+
#endif
#ifdef VK_KHR_acceleration_structure
VkResult VkEncoder::vkCreateAccelerationStructureKHR(
diff --git a/system/vulkan_enc/VkEncoder.h b/system/vulkan_enc/VkEncoder.h
index 160632a..91554c2 100644
--- a/system/vulkan_enc/VkEncoder.h
+++ b/system/vulkan_enc/VkEncoder.h
@@ -2994,6 +2994,12 @@
uint32_t* pPoolIdCount,
uint64_t* pPoolIds,
uint32_t doLock);
+ void vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t waitSemaphoreCount,
+ const VkSemaphore* pWaitSemaphores,
+ VkImage image,
+ uint32_t doLock);
#endif
#ifdef VK_KHR_acceleration_structure
VkResult vkCreateAccelerationStructureKHR(
diff --git a/system/vulkan_enc/func_table.cpp b/system/vulkan_enc/func_table.cpp
index dc3f66d..bf63470 100644
--- a/system/vulkan_enc/func_table.cpp
+++ b/system/vulkan_enc/func_table.cpp
@@ -7456,6 +7456,16 @@
auto vkEnc = ResourceTracker::getThreadLocalEncoder();
vkEnc->vkCollectDescriptorPoolIdsGOOGLE(device, descriptorPool, pPoolIdCount, pPoolIds, true /* do lock */);
}
+static void entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(
+ VkQueue queue,
+ uint32_t waitSemaphoreCount,
+ const VkSemaphore* pWaitSemaphores,
+ VkImage image)
+{
+ AEMU_SCOPED_TRACE("vkQueueSignalReleaseImageANDROIDAsyncGOOGLE");
+ auto vkEnc = ResourceTracker::getQueueEncoder(queue);
+ vkEnc->vkQueueSignalReleaseImageANDROIDAsyncGOOGLE(queue, waitSemaphoreCount, pWaitSemaphores, image, true /* do lock */);
+}
#endif
#ifdef VK_KHR_acceleration_structure
static VkResult entry_vkCreateAccelerationStructureKHR(
@@ -9924,6 +9934,10 @@
{
return nullptr;
}
+ if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+ {
+ return nullptr;
+ }
#endif
#ifdef VK_KHR_acceleration_structure
if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
@@ -12183,6 +12197,11 @@
{
return (void*)dynCheck_entry_vkCollectDescriptorPoolIdsGOOGLE;
}
+ if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasInstanceExtension(instance, "VK_GOOGLE_gfxstream");
+ return hasExt ? (void*)entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE : nullptr;
+ }
#endif
#ifdef VK_KHR_acceleration_structure
if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
@@ -14573,6 +14592,11 @@
bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
return hasExt ? (void*)entry_vkCollectDescriptorPoolIdsGOOGLE : nullptr;
}
+ if (!strcmp(name, "vkQueueSignalReleaseImageANDROIDAsyncGOOGLE"))
+ {
+ bool hasExt = resources->hasDeviceExtension(device, "VK_GOOGLE_gfxstream");
+ return hasExt ? (void*)entry_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE : nullptr;
+ }
#endif
#ifdef VK_KHR_acceleration_structure
if (!strcmp(name, "vkCreateAccelerationStructureKHR"))
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
index 5b1e964..5b5f3a3 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.cpp
@@ -28291,6 +28291,12 @@
return "OP_vkCmdBindVertexBuffers2EXT";
}
#endif
+#ifdef VK_GOOGLE_gfxstream
+ case OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE:
+ {
+ return "OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE";
+ }
+#endif
#ifdef VK_VERSION_1_2
case OP_vkCmdNextSubpass2:
{
diff --git a/system/vulkan_enc/goldfish_vk_marshaling_guest.h b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
index 86c6b4e..540749c 100644
--- a/system/vulkan_enc/goldfish_vk_marshaling_guest.h
+++ b/system/vulkan_enc/goldfish_vk_marshaling_guest.h
@@ -7007,6 +7007,7 @@
#define OP_vkQueueFlushCommandsGOOGLE 20340
#define OP_vkQueueCommitDescriptorSetUpdatesGOOGLE 267932433
#define OP_vkCollectDescriptorPoolIdsGOOGLE 213659202
+#define OP_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE 243985229
#endif
#ifdef VK_KHR_acceleration_structure
void marshal_VkDeviceOrHostAddressKHR(
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index dfeb3c5..b48151d 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -809,6 +809,8 @@
typedef void (VKAPI_PTR *PFN_vkQueueFlushCommandsGOOGLE)(VkQueue queue, VkDeviceSize dataSize, const void* pData);
typedef void (VKAPI_PTR *PFN_vkQueueCommitDescriptorSetUpdatesGOOGLE)(VkQueue queue, uint32_t descriptorPoolCount, const VkDescriptorPool* pDescriptorPools, uint32_t descriptorSetCount, const VkDescriptorSetLayout* pDescriptorSetLayouts, const uint64_t* pDescriptorSetPoolIds, const uint32_t* pDescriptorSetWhichPool, const uint32_t* pDescriptorSetPendingAllocation, const uint32_t* pDescriptorWriteStartingIndices, uint32_t pendingDescriptorWriteCount, const VkWriteDescriptorSet* pPendingDescriptorWrites);
+typedef void (VKAPI_PTR *PFN_vkCollectDescriptorPoolIdsGOOGLE)(VkDevice device, VkDescriptorPool descriptorPool, uint32_t* pPoolIdCount, uint64_t* pPoolIds);
+typedef void (VKAPI_PTR *PFN_vkQueueSignalReleaseImageANDROIDAsyncGOOGLE)(VkQueue queue, uint32_t waitSemaphoreCount, const VkSemaphore* pWaitSemaphores, VkImage image);
#ifdef __cplusplus
} // extern "C"