diff options
author | Jason Macnak <natsu@google.com> | 2023-03-08 09:31:54 -0800 |
---|---|---|
committer | Jason Macnak <natsu@google.com> | 2023-03-08 09:31:54 -0800 |
commit | 92140cdbdaf6c53105285e5e2cf86dc5b09e411f (patch) | |
tree | 4e55c55ba276984237668bbd95743c6d56b8ad47 | |
parent | 54f04fcd299900313e7ee73b64884c27c6832131 (diff) | |
download | gfxstream-protocols-92140cdbdaf6c53105285e5e2cf86dc5b09e411f.tar.gz |
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
-rw-r--r-- | registry/vulkan/scripts/cereal/decoder.py | 27 | ||||
-rw-r--r-- | 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<Impl> 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<uint32_t>* 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<EventHangMetadata::HangAnnotations>(); - 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" |