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
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py
index 5363f63..a41fe7e 100644
--- a/registry/vulkan/scripts/cereal/decoder.py
+++ b/registry/vulkan/scripts/cereal/decoder.py
@@ -26,6 +26,7 @@
decoder_decl_preamble = """
+class ProcessResources;
class IOStream;
class VkDecoder {
@@ -33,8 +34,8 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
/* 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 29d7321..ad5aab7 100644
--- a/registry/vulkan/scripts/cerealgenerator.py
+++ b/registry/vulkan/scripts/cerealgenerator.py
@@ -411,6 +411,7 @@
#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"