From 2f161c31e3ec179dae8a9662b4fa921b10ef2941 Mon Sep 17 00:00:00 2001 From: Gurchetan Singh Date: Mon, 5 Aug 2024 14:23:31 -0700 Subject: [PATCH] gfxstream: guest: nuke Android HealthMonitor The HealthMonitor is hang detection at the API Vulkan encoder level. It's actually not used in CF/AAOS/Emualtor. The plan for AOSP is actually to increase the amount of Android CTS that are run against gfxstream to increase health/stability, for example (b/347288539). So if we consistently pass CTS on main with gfxstream (as is the plan), HealthMonitoring would be somewhat redundant. Also, AndroidHealthMonitor is somewhat duplicated with libaemu's HealthMonitor as well. Also, nuke EncoderAutoLock while we're at it. It also is unused code. Reviewed-by: Aaron Ruby Acked-by: Yonggang Luo Acked-by: Adam Jackson Part-of: --- .../codegen/scripts/cereal/encoder.py | 39 +--------- .../codegen/scripts/cerealgenerator.py | 2 - .../AddressSpaceStream.cpp | 76 ++++++++----------- .../GoldfishAddressSpaceStream.cpp | 11 +-- .../VirtioGpuAddressSpaceStream.cpp | 7 +- .../include/AddressSpaceStream.h | 39 ++++------ .../include/GoldfishAddressSpaceStream.h | 2 +- .../include/VirtioGpuAddressSpaceStream.h | 3 +- .../guest/vulkan_enc/VkEncoder.cpp.inl | 12 +-- ...eueFlushCommandsGOOGLE_encode_impl.cpp.inl | 9 --- 10 files changed, 57 insertions(+), 143 deletions(-) diff --git a/src/gfxstream/codegen/scripts/cereal/encoder.py b/src/gfxstream/codegen/scripts/cereal/encoder.py index bd88391126c..dadac946688 100644 --- a/src/gfxstream/codegen/scripts/cereal/encoder.py +++ b/src/gfxstream/codegen/scripts/cereal/encoder.py @@ -21,7 +21,7 @@ encoder_decl_preamble = """ class VkEncoder { public: - VkEncoder(gfxstream::guest::IOStream* stream, gfxstream::guest::HealthMonitor<>* healthMonitor = nullptr); + VkEncoder(gfxstream::guest::IOStream* stream); ~VkEncoder(); #include "VkEncoder.h.inl" @@ -31,7 +31,6 @@ encoder_decl_postamble = """ private: class Impl; std::unique_ptr mImpl; - gfxstream::guest::HealthMonitor<>* mHealthMonitor; }; """ @@ -39,8 +38,6 @@ encoder_impl_preamble =""" using namespace gfxstream::vk; -using gfxstream::guest::AutoLock; -using gfxstream::guest::Lock; using gfxstream::guest::BumpPool; #include "VkEncoder.cpp.inl" @@ -363,7 +360,6 @@ def emit_parameter_encode_write_packet_info(typeInfo, api, cgen): cgen.stmt("uint32_t packetSize_%s = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count" % (api.name)) else: cgen.stmt("uint32_t packetSize_%s = 4 + 4 + count" % (api.name)) - cgen.stmt("healthMonitorAnnotation_packetSize = std::make_optional(packetSize_%s)" % (api.name)) if not doDispatchSerialize: cgen.stmt("if (queueSubmitWithCommandsEnabled) packetSize_%s -= 8" % api.name) @@ -375,7 +371,6 @@ def emit_parameter_encode_write_packet_info(typeInfo, api, cgen): if doSeqno: cgen.stmt("uint32_t seqno; if (queueSubmitWithCommandsEnabled) seqno = ResourceTracker::nextSeqno()") - cgen.stmt("healthMonitorAnnotation_seqno = std::make_optional(seqno)") cgen.stmt("memcpy(streamPtr, &opcode_%s, sizeof(uint32_t)); streamPtr += sizeof(uint32_t)" % api.name) cgen.stmt("memcpy(streamPtr, &packetSize_%s, sizeof(uint32_t)); streamPtr += sizeof(uint32_t)" % api.name) @@ -398,12 +393,6 @@ def emit_parameter_encode_do_parameter_write(typeInfo, api, cgen): dispatchDone = True - cgen.beginIf("watchdog") - cgen.stmt("size_t watchdogBufSize = std::min(static_cast(packetSize_%s), kWatchdogBufferMax)" % (api.name)) - cgen.stmt("healthMonitorAnnotation_packetContents.resize(watchdogBufSize)") - cgen.stmt("memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize)") - cgen.endIf() - def emit_parameter_encode_read(typeInfo, api, cgen): encodingParams = EncodingParameters(api) @@ -495,31 +484,6 @@ def emit_debug_log(typeInfo, api, cgen): cgen.stmt("ENCODER_DEBUG_LOG(\"%s(%s)\", %s)" % (api.name, logFormatStr, logVargsStr)) -def emit_health_watchdog(api, cgen): - cgen.stmt("std::optional healthMonitorAnnotation_seqno = std::nullopt") - cgen.stmt("std::optional healthMonitorAnnotation_packetSize = std::nullopt") - cgen.stmt("std::vector healthMonitorAnnotation_packetContents") - cgen.line(""" - auto watchdog = WATCHDOG_BUILDER(mHealthMonitor, \"%s in VkEncoder\") - .setOnHangCallback([&]() { - auto annotations = std::make_unique(); - if (healthMonitorAnnotation_seqno) { - annotations->insert({{"seqno", std::to_string(healthMonitorAnnotation_seqno.value())}}); - } - if (healthMonitorAnnotation_packetSize) { - annotations->insert({{"packetSize", std::to_string(healthMonitorAnnotation_packetSize.value())}}); - } - if (!healthMonitorAnnotation_packetContents.empty()) { - annotations->insert( - {{"packetContents", getPacketContents( - &healthMonitorAnnotation_packetContents[0], healthMonitorAnnotation_packetContents.size())}}); - } - return std::move(annotations); - }) - .build(); - """% (api.name) - ) - def emit_default_encoding(typeInfo, api, cgen): emit_debug_log(typeInfo, api, cgen) emit_lock(cgen) @@ -710,7 +674,6 @@ class VulkanEncoder(VulkanWrapperGenerator): self.module.appendHeader(self.cgenHeader.swapCode()) def emit_function_impl(cgen): - emit_health_watchdog(api, cgen) if api.name in custom_encodes.keys(): custom_encodes[api.name](self.typeInfo, api, cgen) else: diff --git a/src/gfxstream/codegen/scripts/cerealgenerator.py b/src/gfxstream/codegen/scripts/cerealgenerator.py index a1abc232137..6e1323145ea 100644 --- a/src/gfxstream/codegen/scripts/cerealgenerator.py +++ b/src/gfxstream/codegen/scripts/cerealgenerator.py @@ -310,7 +310,6 @@ class CerealGenerator(OutputGenerator): self.hostCommonExtraVulkanHeaders = '#include "vk_android_native_buffer_gfxstream.h"' encoderInclude = f""" -#include "{self.guestBaseLibDirPrefix}/AndroidHealthMonitor.h" #include "goldfish_vk_private_defs.h" #include @@ -330,7 +329,6 @@ class IOStream; #include "{self.guestBaseLibDirPrefix}/AlignedBuf.h" #include "{self.guestBaseLibDirPrefix}/BumpPool.h" -#include "{self.guestBaseLibDirPrefix}/synchronization/AndroidLock.h" #include diff --git a/src/gfxstream/guest/GoldfishAddressSpace/AddressSpaceStream.cpp b/src/gfxstream/guest/GoldfishAddressSpace/AddressSpaceStream.cpp index d7262a84a2d..5be329ce657 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/AddressSpaceStream.cpp +++ b/src/gfxstream/guest/GoldfishAddressSpace/AddressSpaceStream.cpp @@ -34,39 +34,33 @@ static const size_t kReadSize = 512 * 1024; static const size_t kWriteOffset = kReadSize; -AddressSpaceStream::AddressSpaceStream( - address_space_handle_t handle, - uint32_t version, - struct asg_context context, - uint64_t ringOffset, - uint64_t writeBufferOffset, - struct address_space_ops ops, - HealthMonitor<>* healthMonitor) : - IOStream(context.ring_config->flush_interval), - m_ops(ops), - m_tmpBuf(0), - m_tmpBufSize(0), - m_tmpBufXferSize(0), - m_usingTmpBuf(0), - m_readBuf(0), - m_read(0), - m_readLeft(0), - m_handle(handle), - m_version(version), - m_context(context), - m_ringOffset(ringOffset), - m_writeBufferOffset(writeBufferOffset), - m_writeBufferSize(context.ring_config->buffer_size), - m_writeBufferMask(m_writeBufferSize - 1), - m_buf((unsigned char*)context.buffer), - m_writeStart(m_buf), - m_writeStep(context.ring_config->flush_interval), - m_notifs(0), - m_written(0), - m_backoffIters(0), - m_backoffFactor(1), - m_ringStorageSize(sizeof(struct asg_ring_storage) + m_writeBufferSize), - m_healthMonitor(healthMonitor) { +AddressSpaceStream::AddressSpaceStream(address_space_handle_t handle, uint32_t version, + struct asg_context context, uint64_t ringOffset, + uint64_t writeBufferOffset, struct address_space_ops ops) + : IOStream(context.ring_config->flush_interval), + m_ops(ops), + m_tmpBuf(0), + m_tmpBufSize(0), + m_tmpBufXferSize(0), + m_usingTmpBuf(0), + m_readBuf(0), + m_read(0), + m_readLeft(0), + m_handle(handle), + m_version(version), + m_context(context), + m_ringOffset(ringOffset), + m_writeBufferOffset(writeBufferOffset), + m_writeBufferSize(context.ring_config->buffer_size), + m_writeBufferMask(m_writeBufferSize - 1), + m_buf((unsigned char*)context.buffer), + m_writeStart(m_buf), + m_writeStep(context.ring_config->flush_interval), + m_notifs(0), + m_written(0), + m_backoffIters(0), + m_backoffFactor(1), + m_ringStorageSize(sizeof(struct asg_ring_storage) + m_writeBufferSize) { // We'll use this in the future, but at the moment, // it's a potential compile Werror. (void)m_ringStorageSize; @@ -95,8 +89,7 @@ size_t AddressSpaceStream::idealAllocSize(size_t len) { return m_writeStep; } -void *AddressSpaceStream::allocBuffer(size_t minSize) { - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); +void* AddressSpaceStream::allocBuffer(size_t minSize) { AEMU_SCOPED_TRACE("allocBuffer"); ensureType3Finished(); @@ -242,9 +235,7 @@ const unsigned char *AddressSpaceStream::read(void *buf, size_t *inout_len) { return (const unsigned char*)dst; } -int AddressSpaceStream::writeFully(const void *buf, size_t size) -{ - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); +int AddressSpaceStream::writeFully(const void* buf, size_t size) { AEMU_SCOPED_TRACE("writeFully"); ensureType3Finished(); ensureType1Finished(); @@ -308,9 +299,7 @@ int AddressSpaceStream::writeFully(const void *buf, size_t size) return 0; } -int AddressSpaceStream::writeFullyAsync(const void *buf, size_t size) -{ - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); +int AddressSpaceStream::writeFullyAsync(const void* buf, size_t size) { AEMU_SCOPED_TRACE("writeFullyAsync"); ensureType3Finished(); ensureType1Finished(); @@ -432,7 +421,6 @@ ssize_t AddressSpaceStream::speculativeRead(unsigned char* readBuffer, size_t tr } void AddressSpaceStream::notifyAvailable() { - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); AEMU_SCOPED_TRACE("PING"); struct address_space_ping request; request.metadata = ASG_NOTIFY_AVAILABLE; @@ -475,7 +463,6 @@ void AddressSpaceStream::ensureConsumerFinishing() { } void AddressSpaceStream::ensureType1Finished() { - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); AEMU_SCOPED_TRACE("ensureType1Finished"); uint32_t currAvailRead = @@ -492,7 +479,6 @@ void AddressSpaceStream::ensureType1Finished() { } void AddressSpaceStream::ensureType3Finished() { - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); AEMU_SCOPED_TRACE("ensureType3Finished"); uint32_t availReadLarge = ring_buffer_available_read( @@ -516,8 +502,6 @@ void AddressSpaceStream::ensureType3Finished() { } int AddressSpaceStream::type1Write(uint32_t bufferOffset, size_t size) { - - auto watchdog = WATCHDOG_BUILDER(m_healthMonitor, "ASG watchdog").build(); AEMU_SCOPED_TRACE("type1Write"); ensureType3Finished(); diff --git a/src/gfxstream/guest/GoldfishAddressSpace/GoldfishAddressSpaceStream.cpp b/src/gfxstream/guest/GoldfishAddressSpace/GoldfishAddressSpaceStream.cpp index 03157446be9..f1c8330e8e6 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/GoldfishAddressSpaceStream.cpp +++ b/src/gfxstream/guest/GoldfishAddressSpace/GoldfishAddressSpaceStream.cpp @@ -16,8 +16,7 @@ #include "goldfish_address_space.h" -AddressSpaceStream* createGoldfishAddressSpaceStream(size_t ignored_bufSize, - HealthMonitor<>* healthMonitor) { +AddressSpaceStream* createGoldfishAddressSpaceStream(size_t ignored_bufSize) { // Ignore incoming ignored_bufSize (void)ignored_bufSize; @@ -122,10 +121,8 @@ AddressSpaceStream* createGoldfishAddressSpaceStream(size_t ignored_bufSize, .ping = goldfish_address_space_ping, }; - AddressSpaceStream* res = - new AddressSpaceStream( - child_device_handle, version, context, - ringOffset, bufferOffset, ops, healthMonitor); + AddressSpaceStream* res = new AddressSpaceStream(child_device_handle, version, context, + ringOffset, bufferOffset, ops); return res; -} \ No newline at end of file +} diff --git a/src/gfxstream/guest/GoldfishAddressSpace/VirtioGpuAddressSpaceStream.cpp b/src/gfxstream/guest/GoldfishAddressSpace/VirtioGpuAddressSpaceStream.cpp index 03acca88759..7bd61097891 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/VirtioGpuAddressSpaceStream.cpp +++ b/src/gfxstream/guest/GoldfishAddressSpace/VirtioGpuAddressSpaceStream.cpp @@ -14,6 +14,8 @@ #include "VirtioGpuAddressSpaceStream.h" +#include + #include "util.h" static bool GetRingParamsFromCapset(enum VirtGpuCapset capset, const VirtGpuCaps& caps, @@ -74,8 +76,7 @@ bool virtgpu_address_space_ping(address_space_handle_t, struct address_space_pin return true; } -AddressSpaceStream* createVirtioGpuAddressSpaceStream(enum VirtGpuCapset capset, - HealthMonitor<>* healthMonitor) { +AddressSpaceStream* createVirtioGpuAddressSpaceStream(enum VirtGpuCapset capset) { VirtGpuResourcePtr pipe, blob; VirtGpuResourceMappingPtr pipeMapping, blobMapping; struct VirtGpuExecBuffer exec = {}; @@ -141,7 +142,7 @@ AddressSpaceStream* createVirtioGpuAddressSpaceStream(enum VirtGpuCapset capset, }; AddressSpaceStream* res = - new AddressSpaceStream((address_space_handle_t)(-1), 1, context, 0, 0, ops, healthMonitor); + new AddressSpaceStream((address_space_handle_t)(-1), 1, context, 0, 0, ops); res->setMapping(blobMapping); res->setResourceId(contextCreate.resourceId); diff --git a/src/gfxstream/guest/GoldfishAddressSpace/include/AddressSpaceStream.h b/src/gfxstream/guest/GoldfishAddressSpace/include/AddressSpaceStream.h index d6025983479..cda1b093a27 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/include/AddressSpaceStream.h +++ b/src/gfxstream/guest/GoldfishAddressSpace/include/AddressSpaceStream.h @@ -19,38 +19,29 @@ #include "VirtGpu.h" #include "address_space.h" #include "address_space_graphics_types.h" -#include "aemu/base/AndroidHealthMonitor.h" #include "gfxstream/guest/IOStream.h" -using gfxstream::guest::HealthMonitor; using gfxstream::guest::IOStream; class AddressSpaceStream : public IOStream { public: - explicit AddressSpaceStream( - address_space_handle_t handle, - uint32_t version, - struct asg_context context, - uint64_t ringOffset, - uint64_t writeBufferOffset, - struct address_space_ops ops, - HealthMonitor<>* healthMonitor); - ~AddressSpaceStream(); + explicit AddressSpaceStream(address_space_handle_t handle, uint32_t version, + struct asg_context context, uint64_t ringOffset, + uint64_t writeBufferOffset, struct address_space_ops ops); + ~AddressSpaceStream(); - virtual size_t idealAllocSize(size_t len); - virtual void *allocBuffer(size_t minSize); - virtual int commitBuffer(size_t size); - virtual const unsigned char *readFully( void *buf, size_t len); - virtual const unsigned char *read( void *buf, size_t *inout_len); - virtual int writeFully(const void *buf, size_t len); - virtual int writeFullyAsync(const void *buf, size_t len); - virtual const unsigned char *commitBufferAndReadFully(size_t size, void *buf, size_t len); + virtual size_t idealAllocSize(size_t len); + virtual void* allocBuffer(size_t minSize); + virtual int commitBuffer(size_t size); + virtual const unsigned char* readFully(void* buf, size_t len); + virtual const unsigned char* read(void* buf, size_t* inout_len); + virtual int writeFully(const void* buf, size_t len); + virtual int writeFullyAsync(const void* buf, size_t len); + virtual const unsigned char* commitBufferAndReadFully(size_t size, void* buf, size_t len); - void setMapping(VirtGpuResourceMappingPtr mapping) { m_mapping = mapping; } + void setMapping(VirtGpuResourceMappingPtr mapping) { m_mapping = mapping; } - void setResourceId(uint32_t id) { - m_resourceId = id; - } + void setResourceId(uint32_t id) { m_resourceId = id; } private: bool isInError() const; @@ -99,8 +90,6 @@ private: size_t m_ringStorageSize; uint32_t m_resourceId = 0; - - HealthMonitor<>* m_healthMonitor; }; #endif diff --git a/src/gfxstream/guest/GoldfishAddressSpace/include/GoldfishAddressSpaceStream.h b/src/gfxstream/guest/GoldfishAddressSpace/include/GoldfishAddressSpaceStream.h index b4a5be3bf7c..252f023b8b6 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/include/GoldfishAddressSpaceStream.h +++ b/src/gfxstream/guest/GoldfishAddressSpace/include/GoldfishAddressSpaceStream.h @@ -16,4 +16,4 @@ #include "AddressSpaceStream.h" -AddressSpaceStream* createGoldfishAddressSpaceStream(size_t bufSize, gfxstream::guest::HealthMonitor<>* healthMonitor); +AddressSpaceStream* createGoldfishAddressSpaceStream(size_t bufSize); diff --git a/src/gfxstream/guest/GoldfishAddressSpace/include/VirtioGpuAddressSpaceStream.h b/src/gfxstream/guest/GoldfishAddressSpace/include/VirtioGpuAddressSpaceStream.h index 4e7b0da760a..c3a62417f8e 100644 --- a/src/gfxstream/guest/GoldfishAddressSpace/include/VirtioGpuAddressSpaceStream.h +++ b/src/gfxstream/guest/GoldfishAddressSpace/include/VirtioGpuAddressSpaceStream.h @@ -16,5 +16,4 @@ #include "AddressSpaceStream.h" -AddressSpaceStream* createVirtioGpuAddressSpaceStream( - enum VirtGpuCapset capset, gfxstream::guest::HealthMonitor<>* healthMonitor); +AddressSpaceStream* createVirtioGpuAddressSpaceStream(enum VirtGpuCapset capset); diff --git a/src/gfxstream/guest/vulkan_enc/VkEncoder.cpp.inl b/src/gfxstream/guest/vulkan_enc/VkEncoder.cpp.inl index a6490d98fc9..178ed4e520c 100644 --- a/src/gfxstream/guest/vulkan_enc/VkEncoder.cpp.inl +++ b/src/gfxstream/guest/vulkan_enc/VkEncoder.cpp.inl @@ -25,7 +25,6 @@ class VkEncoder::Impl { void log(const char* text) { if (!m_logEncodes) return; - ALOGD("encoder log: %s", text); } void flush() { @@ -54,15 +53,8 @@ class VkEncoder::Impl { VkEncoder::~VkEncoder() {} -struct EncoderAutoLock { - EncoderAutoLock(VkEncoder* enc) : mEnc(enc) { mEnc->lock(); } - ~EncoderAutoLock() { mEnc->unlock(); } - VkEncoder* mEnc; -}; - -VkEncoder::VkEncoder(gfxstream::guest::IOStream* stream, - gfxstream::guest::HealthMonitor<>* healthMonitor) - : mImpl(new VkEncoder::Impl(stream)), mHealthMonitor(healthMonitor) {} +VkEncoder::VkEncoder(gfxstream::guest::IOStream* stream) + : mImpl(new VkEncoder::Impl(stream)) {} void VkEncoder::flush() { mImpl->flush(); } diff --git a/src/gfxstream/guest/vulkan_enc/vkQueueFlushCommandsGOOGLE_encode_impl.cpp.inl b/src/gfxstream/guest/vulkan_enc/vkQueueFlushCommandsGOOGLE_encode_impl.cpp.inl index 8e27e9c06a6..75fb7a8ad2c 100644 --- a/src/gfxstream/guest/vulkan_enc/vkQueueFlushCommandsGOOGLE_encode_impl.cpp.inl +++ b/src/gfxstream/guest/vulkan_enc/vkQueueFlushCommandsGOOGLE_encode_impl.cpp.inl @@ -27,14 +27,11 @@ size_t* countPtr = &count; } bool queueSubmitWithCommandsEnabled = sFeatureBits & VULKAN_STREAM_FEATURE_QUEUE_SUBMIT_WITH_COMMANDS_BIT; uint32_t packetSize_vkQueueFlushCommandsGOOGLE = 4 + 4 + (queueSubmitWithCommandsEnabled ? 4 : 0) + count; -healthMonitorAnnotation_packetSize = - std::make_optional(packetSize_vkQueueFlushCommandsGOOGLE); uint8_t* streamPtr = stream->reserve(packetSize_vkQueueFlushCommandsGOOGLE - local_dataSize); uint8_t* packetBeginPtr = streamPtr; uint8_t** streamPtrPtr = &streamPtr; uint32_t opcode_vkQueueFlushCommandsGOOGLE = OP_vkQueueFlushCommandsGOOGLE; uint32_t seqno = ResourceTracker::nextSeqno(); -healthMonitorAnnotation_seqno = std::make_optional(seqno); memcpy(streamPtr, &opcode_vkQueueFlushCommandsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); memcpy(streamPtr, &packetSize_vkQueueFlushCommandsGOOGLE, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); memcpy(streamPtr, &seqno, sizeof(uint32_t)); streamPtr += sizeof(uint32_t); @@ -48,12 +45,6 @@ memcpy(*streamPtrPtr, (uint64_t*)&cgen_var_1408, 1 * 8); *streamPtrPtr += 1 * 8; memcpy(*streamPtrPtr, (VkDeviceSize*)&local_dataSize, sizeof(VkDeviceSize)); *streamPtrPtr += sizeof(VkDeviceSize); -if (watchdog) { - size_t watchdogBufSize = std::min( - static_cast(packetSize_vkQueueFlushCommandsGOOGLE), kWatchdogBufferMax); - healthMonitorAnnotation_packetContents.resize(watchdogBufSize); - memcpy(&healthMonitorAnnotation_packetContents[0], packetBeginPtr, watchdogBufSize); -} MESA_TRACE_SCOPE("vkQueueFlush large xfer"); stream->flush();