Revert "Use SPSC queue for frame images."

This reverts commit 02e76faff7.

Let's not limit frame image reporting to just one thread.
This commit is contained in:
Bartosz Taudul 2021-10-20 23:18:03 +02:00
parent ebb64540bb
commit 6d490ffd28
No known key found for this signature in database
GPG Key ID: B7FE2008B7575DF3
2 changed files with 61 additions and 28 deletions

View File

@ -1146,7 +1146,8 @@ Profiler::Profiler()
, m_serialQueue( 1024*1024 ) , m_serialQueue( 1024*1024 )
, m_serialDequeue( 1024*1024 ) , m_serialDequeue( 1024*1024 )
#ifndef TRACY_NO_FRAME_IMAGE #ifndef TRACY_NO_FRAME_IMAGE
, m_fiQueue( 64 ) , m_fiQueue( 16 )
, m_fiDequeue( 16 )
#endif #endif
, m_frameCount( 0 ) , m_frameCount( 0 )
, m_isConnected( false ) , m_isConnected( false )
@ -1784,30 +1785,60 @@ void Profiler::CompressWorker()
for(;;) for(;;)
{ {
const auto shouldExit = ShouldExit(); const auto shouldExit = ShouldExit();
FrameImageQueueItem fi;
if( m_fiQueue.try_dequeue( fi ) )
{ {
const auto w = fi.w; bool lockHeld = true;
const auto h = fi.h; while( !m_fiLock.try_lock() )
{
if( m_shutdownManual.load( std::memory_order_relaxed ) )
{
lockHeld = false;
break;
}
}
if( !m_fiQueue.empty() ) m_fiQueue.swap( m_fiDequeue );
if( lockHeld )
{
m_fiLock.unlock();
}
}
const auto sz = m_fiDequeue.size();
if( sz > 0 )
{
auto fi = m_fiDequeue.data();
auto end = fi + sz;
while( fi != end )
{
const auto w = fi->w;
const auto h = fi->h;
const auto csz = size_t( w * h / 2 ); const auto csz = size_t( w * h / 2 );
auto etc1buf = (char*)tracy_malloc( csz ); auto etc1buf = (char*)tracy_malloc( csz );
CompressImageDxt1( (const char*)fi.image, etc1buf, w, h ); CompressImageDxt1( (const char*)fi->image, etc1buf, w, h );
tracy_free( fi.image ); tracy_free( fi->image );
TracyLfqPrepare( QueueType::FrameImage ); TracyLfqPrepare( QueueType::FrameImage );
MemWrite( &item->frameImageFat.image, (uint64_t)etc1buf ); MemWrite( &item->frameImageFat.image, (uint64_t)etc1buf );
MemWrite( &item->frameImageFat.frame, fi.frame ); MemWrite( &item->frameImageFat.frame, fi->frame );
MemWrite( &item->frameImageFat.w, w ); MemWrite( &item->frameImageFat.w, w );
MemWrite( &item->frameImageFat.h, h ); MemWrite( &item->frameImageFat.h, h );
uint8_t flip = fi.flip; uint8_t flip = fi->flip;
MemWrite( &item->frameImageFat.flip, flip ); MemWrite( &item->frameImageFat.flip, flip );
TracyLfqCommit; TracyLfqCommit;
fi++;
}
m_fiDequeue.clear();
} }
else else
{ {
if( shouldExit ) return;
std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) ); std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );
} }
if( shouldExit )
{
return;
}
} }
} }
#endif #endif

View File

@ -8,7 +8,6 @@
#include <time.h> #include <time.h>
#include "tracy_concurrentqueue.h" #include "tracy_concurrentqueue.h"
#include "tracy_readerwriterqueue.h"
#include "TracyCallstack.hpp" #include "TracyCallstack.hpp"
#include "TracySysTime.hpp" #include "TracySysTime.hpp"
#include "TracyFastVector.hpp" #include "TracyFastVector.hpp"
@ -243,13 +242,15 @@ public:
auto ptr = (char*)tracy_malloc( sz ); auto ptr = (char*)tracy_malloc( sz );
memcpy( ptr, image, sz ); memcpy( ptr, image, sz );
profiler.m_fiQueue.emplace( FrameImageQueueItem { profiler.m_fiLock.lock();
ptr, auto fi = profiler.m_fiQueue.prepare_next();
uint32_t( profiler.m_frameCount.load( std::memory_order_relaxed ) - offset ), fi->image = ptr;
w, fi->frame = uint32_t( profiler.m_frameCount.load( std::memory_order_relaxed ) - offset );
h, fi->w = w;
flip fi->h = h;
} ); fi->flip = flip;
profiler.m_fiQueue.commit_next();
profiler.m_fiLock.unlock();
#endif #endif
} }
@ -808,7 +809,8 @@ private:
TracyMutex m_serialLock; TracyMutex m_serialLock;
#ifndef TRACY_NO_FRAME_IMAGE #ifndef TRACY_NO_FRAME_IMAGE
ReaderWriterQueue<FrameImageQueueItem> m_fiQueue; FastVector<FrameImageQueueItem> m_fiQueue, m_fiDequeue;
TracyMutex m_fiLock;
#endif #endif
std::atomic<uint64_t> m_frameCount; std::atomic<uint64_t> m_frameCount;