mirror of
https://github.com/wolfpld/tracy.git
synced 2024-11-27 00:04:35 +00:00
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:
parent
ebb64540bb
commit
6d490ffd28
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user