From 07c232e3b359e36dc0819d0a288a64c808bcd6c4 Mon Sep 17 00:00:00 2001 From: Aaron Ruby Date: Tue, 23 Apr 2024 16:34:54 -0400 Subject: [PATCH] gfxstream: Add "transformList" method for VkFences, in addition to VkSemaphores Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../codegen/scripts/cereal/functable.py | 27 ++++++++++++------- .../guest/vulkan_enc/gfxstream_vk_private.cpp | 26 ++++++++++++++---- .../guest/vulkan_enc/gfxstream_vk_private.h | 2 ++ 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/gfxstream/codegen/scripts/cereal/functable.py b/src/gfxstream/codegen/scripts/cereal/functable.py index 2d3415059eb..9fc0aef9f1a 100644 --- a/src/gfxstream/codegen/scripts/cereal/functable.py +++ b/src/gfxstream/codegen/scripts/cereal/functable.py @@ -165,6 +165,7 @@ HANDLES_MESA_VK = { # Types that have a corresponding method for transforming # an input list to its internal counterpart TYPES_TRANSFORM_LIST_METHOD = { + "VkFence", "VkSemaphore", "VkSemaphoreSubmitInfo", } @@ -488,17 +489,23 @@ class VulkanFuncTable(VulkanWrapperGenerator): cgen.endIf() def genInternalArray(param, countParamName, outArrayName, inArrayName, loopVar): - cgen.beginFor("uint32_t %s = 0" % loopVar, "%s < %s" % (loopVar, countParamName), "++%s" % loopVar) - if param.isOptional: - cgen.beginIf(inArrayName) - if isCompoundType(param.typeName): - genInternalCompoundType(param, ("%s[%s]" % (outArrayName, loopVar)), "%s[%s]" % (inArrayName, loopVar), loopVar) + if param.typeName in TYPES_TRANSFORM_LIST_METHOD: + # Use the corresponding transformList call + cgen.funcCall(outArrayName, transformListFuncName(param.typeName), [inArrayName, countParamName]) + cgen.stmt("%s = %s.data()" % (inArrayName, outArrayName)) + cgen.stmt("%s = %s.size()" % (countParamName, outArrayName)) else: - gfxstreamObject = genVkFromHandle(param, "%s[%s]" % (inArrayName, loopVar)) - cgen.stmt("%s[%s] = %s->%s" % (outArrayName, loopVar, gfxstreamObject, INTERNAL_OBJECT_NAME)) - if param.isOptional: - cgen.endIf() - cgen.endFor() + cgen.beginFor("uint32_t %s = 0" % loopVar, "%s < %s" % (loopVar, countParamName), "++%s" % loopVar) + if param.isOptional: + cgen.beginIf(inArrayName) + if isCompoundType(param.typeName): + genInternalCompoundType(param, ("%s[%s]" % (outArrayName, loopVar)), "%s[%s]" % (inArrayName, loopVar), loopVar) + else: + gfxstreamObject = genVkFromHandle(param, "%s[%s]" % (inArrayName, loopVar)) + cgen.stmt("%s[%s] = %s->%s" % (outArrayName, loopVar, gfxstreamObject, INTERNAL_OBJECT_NAME)) + if param.isOptional: + cgen.endIf() + cgen.endFor() return "%s.data()" % outArrayName # Translate params into params needed for gfxstream-internal diff --git a/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.cpp b/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.cpp index ba552ea0adc..f6c7cf6a671 100644 --- a/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.cpp +++ b/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.cpp @@ -16,16 +16,32 @@ #include "vk_sync_dummy.h" +/* Under the assumption that Mesa VK runtime queue submission is used, WSI flow + * sets this temporary state to a dummy sync type (when no explicit dma-buf + * synchronization is available). For gfxstream, ignore this sync object when + * this is the case. Synchronization will be done on the host. + */ + +static bool isNoopFence(gfxstream_vk_fence* fence) { + return (fence && fence->vk.temporary && vk_sync_type_is_dummy(fence->vk.temporary->type)); +} + static bool isNoopSemaphore(gfxstream_vk_semaphore* semaphore) { - /* Under the assumption that Mesa VK runtime queue submission is used, WSI flow - * sets this temporary state to a dummy sync type (when no explicit dma-buf - * synchronization is available). For gfxstream case, ignore this semaphore - * when this is the case. Synchronization will be done on the host. - */ return (semaphore && semaphore->vk.temporary && vk_sync_type_is_dummy(semaphore->vk.temporary->type)); } +std::vector transformVkFenceList(const VkFence* pFences, uint32_t fenceCount) { + std::vector outFences; + for (uint32_t j = 0; j < fenceCount; ++j) { + VK_FROM_HANDLE(gfxstream_vk_fence, gfxstream_fence, pFences[j]); + if (!isNoopFence(gfxstream_fence)) { + outFences.push_back(gfxstream_fence->internal_object); + } + } + return outFences; +} + std::vector transformVkSemaphoreList(const VkSemaphore* pSemaphores, uint32_t semaphoreCount) { std::vector outSemaphores; diff --git a/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.h b/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.h index 50628543f9b..2775fdc6f5d 100644 --- a/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.h +++ b/src/gfxstream/guest/vulkan_enc/gfxstream_vk_private.h @@ -240,6 +240,8 @@ void gfxstream_vk_wsi_finish(struct gfxstream_vk_physical_device* physical_devic std::vector transformVkSemaphoreList(const VkSemaphore* pSemaphores, uint32_t semaphoreCount); +std::vector transformVkFenceList(const VkFence* pFences, uint32_t fenceCount); + std::vector transformVkSemaphoreSubmitInfoList( const VkSemaphoreSubmitInfo* pSemaphoreSubmitInfos, uint32_t semaphoreSubmitInfoCount);