diff options
author | William Ho <willho@google.com> | 2022-09-02 18:17:03 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-09-02 18:17:03 +0000 |
commit | 804e495289ccaecfd594e04042f48205bbd09f8d (patch) | |
tree | 3c4db2e1ed9143075bc31802f44aeb788c77be74 | |
parent | 3b1953b1026ffc28f9ff9f915d13cb5e0a7f581a (diff) | |
parent | acc74ab628a9762f12ba983a7c81f0a7a0f6122b (diff) | |
download | gfxstream-protocols-804e495289ccaecfd594e04042f48205bbd09f8d.tar.gz |
Merge "Add monitor to seqno loop"
-rw-r--r-- | registry/vulkan/scripts/cereal/decoder.py | 51 | ||||
-rw-r--r-- | registry/vulkan/scripts/cereal/decodersnapshot.py | 14 | ||||
-rw-r--r-- | registry/vulkan/scripts/cerealgenerator.py | 19 |
3 files changed, 60 insertions, 24 deletions
diff --git a/registry/vulkan/scripts/cereal/decoder.py b/registry/vulkan/scripts/cereal/decoder.py index 0a998ad7..720db6c0 100644 --- a/registry/vulkan/scripts/cereal/decoder.py +++ b/registry/vulkan/scripts/cereal/decoder.py @@ -32,7 +32,8 @@ public: VkDecoder(); ~VkDecoder(); void setForSnapshotLoad(bool forSnapshotLoad); - size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, emugl::GfxApiLogger& gfx_logger); + size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, + emugl::GfxApiLogger& gfx_logger, emugl::HealthMonitor<>& healthMonitor); private: class Impl; std::unique_ptr<Impl> mImpl; @@ -42,6 +43,8 @@ private: decoder_impl_preamble =""" using emugl::vkDispatch; using emugl::GfxApiLogger; +using emugl::HealthMonitor; +using emugl::HealthWatchdog; using namespace goldfish_vk; @@ -62,7 +65,8 @@ public: m_forSnapshotLoad = forSnapshotLoad; } - size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger); + size_t decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, + GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor); private: bool m_logCalls; @@ -88,8 +92,9 @@ void VkDecoder::setForSnapshotLoad(bool forSnapshotLoad) { mImpl->setForSnapshotLoad(forSnapshotLoad); } -size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger) { - return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger); +size_t VkDecoder::decode(void* buf, size_t bufsize, IOStream* stream, uint32_t* seqnoPtr, + GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor) { + return mImpl->decode(buf, bufsize, stream, seqnoPtr, gfx_logger, healthMonitor); } // VkDecoder::Impl::decode to follow @@ -719,7 +724,10 @@ class VulkanDecoder(VulkanWrapperGenerator): self.module.appendImpl(decoder_impl_preamble) self.module.appendImpl( - "size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, GfxApiLogger& gfx_logger)\n") + """ +size_t VkDecoder::Impl::decode(void* buf, size_t len, IOStream* ioStream, uint32_t* seqnoPtr, + GfxApiLogger& gfx_logger, HealthMonitor<>& healthMonitor) +""") self.cgen.beginBlock() # function body @@ -751,12 +759,33 @@ class VulkanDecoder(VulkanWrapperGenerator): 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); if (seqnoPtr && !m_forSnapshotLoad) { - while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) { - #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) - _mm_pause(); - #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) - __asm__ __volatile__("pause;"); - #endif + { + HealthWatchdog watchdog( + healthMonitor, + WATCHDOG_DATA("RenderThread seqno loop - 3 second timeout", + EventHangMetadata::HangType::kRenderThread, nullptr), + /* Data gathered if this hangs*/ + std::function<std::unique_ptr<EventHangMetadata::HangAnnotations>()>([=](){ + std::unique_ptr<EventHangMetadata::HangAnnotations> annotations = + std::make_unique<EventHangMetadata::HangAnnotations>(); + annotations->insert( + { + {"seqno", std::to_string(seqno)}, + {"seqnoPtr", std::to_string(__atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST))}, + {"opcode", std::to_string(opcode)}, + {"buffer_length", std::to_string(len)} + } + ); + return std::move(annotations); + }), + 3000 /* 3 seconds. Should be plenty*/); + while ((seqno - __atomic_load_n(seqnoPtr, __ATOMIC_SEQ_CST) != 1)) { + #if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) + _mm_pause(); + #elif (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) + __asm__ __volatile__("pause;"); + #endif + } } } } diff --git a/registry/vulkan/scripts/cereal/decodersnapshot.py b/registry/vulkan/scripts/cereal/decodersnapshot.py index 308c1cd6..551719c9 100644 --- a/registry/vulkan/scripts/cereal/decodersnapshot.py +++ b/registry/vulkan/scripts/cereal/decodersnapshot.py @@ -25,7 +25,8 @@ public: ~VkDecoderSnapshot(); void save(android::base::Stream* stream); - void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger); + void load(android::base::Stream* stream, emugl::GfxApiLogger& gfx_logger, + emugl::HealthMonitor<>& healthMonitor); """ decoder_snapshot_decl_postamble = """ @@ -40,6 +41,7 @@ decoder_snapshot_impl_preamble =""" using namespace goldfish_vk; using emugl::GfxApiLogger; +using emugl::HealthMonitor; class VkDecoderSnapshot::Impl { public: @@ -49,8 +51,9 @@ public: mReconstruction.save(stream); } - void load(android::base::Stream* stream, GfxApiLogger& gfx_logger) { - mReconstruction.load(stream, gfx_logger); + void load(android::base::Stream* stream, GfxApiLogger& gfx_logger, + HealthMonitor<>& healthMonitor) { + mReconstruction.load(stream, gfx_logger, healthMonitor); } """ @@ -68,8 +71,9 @@ void VkDecoderSnapshot::save(android::base::Stream* stream) { mImpl->save(stream); } -void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger) { - mImpl->load(stream, gfx_logger); +void VkDecoderSnapshot::load(android::base::Stream* stream, GfxApiLogger& gfx_logger, + HealthMonitor<>& healthMonitor) { + mImpl->load(stream, gfx_logger, healthMonitor); } VkDecoderSnapshot::~VkDecoderSnapshot() = default; diff --git a/registry/vulkan/scripts/cerealgenerator.py b/registry/vulkan/scripts/cerealgenerator.py index 1b33d72f..e9f89c2f 100644 --- a/registry/vulkan/scripts/cerealgenerator.py +++ b/registry/vulkan/scripts/cerealgenerator.py @@ -351,9 +351,10 @@ using DlSymFunc = void* (void*, const char*); #include <string.h> """ - decoderSnapshotHeaderIncludes = """ + decoderSnapshotHeaderIncludes = f""" #include <memory> -#include "base/GfxApiLogger.h" +#include "{self.baseLibDirPrefix}/GfxApiLogger.h" +#include "{self.baseLibDirPrefix}/HealthMonitor.h" #include "common/goldfish_vk_private_defs.h" """ decoderSnapshotImplIncludes = f""" @@ -364,16 +365,17 @@ using DlSymFunc = void* (void*, const char*); #include "{self.baseLibDirPrefix}/Lock.h" """ - decoderHeaderIncludes = """ -#include "base/GfxApiLogger.h" + decoderHeaderIncludes = f""" +#include "{self.baseLibDirPrefix}/GfxApiLogger.h" +#include "{self.baseLibDirPrefix}/HealthMonitor.h" #include <memory> -namespace android { -namespace base { +namespace android {{ +namespace base {{ class BumpPool; -} // namespace android -} // namespace base +}} // namespace android +}} // namespace base """ @@ -398,6 +400,7 @@ class BumpPool; #include "%s.h" #include <unordered_map> +#include <functional> """ % VULKAN_STREAM_TYPE gfxstreamstructuretypePreamble = """ |