summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Macnak <natsu@google.com>2023-03-08 09:31:54 -0800
committerJason Macnak <natsu@google.com>2023-03-08 09:31:54 -0800
commit92140cdbdaf6c53105285e5e2cf86dc5b09e411f (patch)
tree4e55c55ba276984237668bbd95743c6d56b8ad47
parent54f04fcd299900313e7ee73b64884c27c6832131 (diff)
downloadgfxstream-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.py27
-rw-r--r--registry/vulkan/scripts/cerealgenerator.py1
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"