From 92140cdbdaf6c53105285e5e2cf86dc5b09e411f Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Wed, 8 Mar 2023 09:31:54 -0800 Subject: vulkan: Use std::atomic for seqno Cherry-picks aosp/2444542 to gfxstream-protocols Bug: b/272079201 Test: ./scripts/generate-vulkan-sources.sh && m Change-Id: I08beaae9c7b206b69b75862cb638b6d08a2a5109 --- registry/vulkan/scripts/cereal/decoder.py | 27 ++++++++++++++++----------- registry/vulkan/scripts/cerealgenerator.py | 1 + 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py index 5363f635..a41fe7ef 100644 --- a/registry/vulkan/scripts/cereal/decoder.py +++ b/registry/vulkan/scripts/cereal/decoder.py @@ -26,6 +26,7 @@ global_state_prefix = "m_state->on_" decoder_decl_preamble = """ +class ProcessResources; class IOStream; class VkDecoder { @@ -33,8 +34,8 @@ public: VkDecoder(); ~VkDecoder(); void setForSnapshotLoad(bool forSnapshotLoad); - size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, - const VkDecoderContext&); + size_t decode(void* buf, size_t bufsize, IOStream* stream, + const ProcessResources* processResources, const VkDecoderContext&); private: class Impl; std::unique_ptr mImpl; @@ -66,8 +67,8 @@ public: m_forSnapshotLoad = forSnapshotLoad; } - size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, - const VkDecoderContext&); + size_t decode(void* buf, size_t bufsize, IOStream* stream, + const ProcessResources* processResources, const VkDecoderContext&); private: bool m_logCalls; @@ -94,9 +95,10 @@ void VkDecoder::setForSnapshotLoad(bool forSnapshotLoad) { mImpl->setForSnapshotLoad(forSnapshotLoad); } -size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, +size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, + const ProcessResources* processResources, const VkDecoderContext& context) { - return mImpl->decode(buf, bufsize, stream, seqnoPtr, context); + return mImpl->decode(buf, bufsize, stream, processResources, context); } // VkDecoder::Impl::decode to follow @@ -423,7 +425,7 @@ def emit_pool_free(cgen): cgen.stmt("%s->clearPool()" % READ_STREAM) def emit_seqno_incr(api, cgen): - cgen.stmt("if (queueSubmitWithCommandsEnabled) __atomic_fetch_add(seqnoPtr, 1, __ATOMIC_SEQ_CST)") + cgen.stmt("if (queueSubmitWithCommandsEnabled) seqnoPtr->fetch_add(1, std::memory_order_seq_cst)") def emit_snapshot(typeInfo, api, cgen): @@ -741,7 +743,8 @@ class VulkanDecoder(VulkanWrapperGenerator): self.module.appendImpl( """ -size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, +size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, + const ProcessResources* processResources, const VkDecoderContext& context) """) @@ -796,6 +799,9 @@ size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32 executionData->insert({{"previous_seqno", std::to_string(m_prevSeqno.value())}}); } } + + std::atomic* seqnoPtr = processResources->getSequenceNumberPtr(); + if (queueSubmitWithCommandsEnabled && ((opcode >= OP_vkFirst && opcode < OP_vkLast) || (opcode >= OP_vkFirst_old && opcode < OP_vkLast_old))) { uint32_t seqno; memcpy(&seqno, *readStreamPtrPtr, sizeof(uint32_t)); *readStreamPtrPtr += sizeof(uint32_t); @@ -817,12 +823,11 @@ size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32 /* Data gathered if this hangs*/ .setOnHangCallback([=]() { auto annotations = std::make_unique(); - annotations->insert({{"seqnoPtr", std::to_string(__atomic_load_n( - seqnoPtr, __ATOMIC_SEQ_CST))}}); + annotations->insert({{"seqnoPtr", std::to_string(seqnoPtr->load(std::memory_order_seq_cst))}}); return annotations; }) .build(); - while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) { + while ((seqno - seqnoPtr->load(std::memory_order_seq_cst) != 1)) { #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) _mm_pause(); #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py index 29d73219..ad5aab71 100644 --- a/registry/vulkan/scripts/cerealgenerator.py +++ b/registry/vulkan/scripts/cerealgenerator.py @@ -411,6 +411,7 @@ class BumpPool; #include "{self.baseLibDirPrefix}/system/System.h" #include "{self.baseLibDirPrefix}/Tracing.h" #include "{self.baseLibDirPrefix}/Metrics.h" +#include "stream-servers/FrameBuffer.h" #include "stream-servers/IOStream.h" #include "host-common/feature_control.h" #include "host-common/GfxstreamFatalError.h" -- cgit v1.2.3