diff --git a/src/bgfx.cpp b/src/bgfx.cpp index b90f36151..0263f96d5 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -387,6 +387,7 @@ namespace bgfx bx::AllocatorI* g_allocator = NULL; Caps g_caps; + char g_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; #if BGFX_CONFIG_MULTITHREADED static BX_THREAD_LOCAL uint32_t s_threadIndex(0); @@ -2880,6 +2881,7 @@ namespace bgfx m_submit->m_debugFrameBuffer = m_debugFrameBuffer; m_submit->m_debugTextScale = m_debugTextScale; m_submit->m_perfStats.numViews = 0; + m_submit->reserveViewStats(0 != (m_debug & BGFX_DEBUG_PROFILER) ); bx::memCopy(m_submit->m_viewRemap, m_viewRemap, sizeof(m_viewRemap) ); @@ -3463,6 +3465,12 @@ namespace bgfx Init init; _cmdbuf.read(init); + // Init reserved part of view name. + for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) + { + bx::snprintf(g_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii); + } + m_renderCtx = rendererCreate(init); m_rendererInitialized = NULL != m_renderCtx; @@ -4027,7 +4035,10 @@ namespace bgfx const char* name = (const char*)_cmdbuf.skip(len); - m_renderCtx->updateViewName(id, name); + bx::strCopy(&g_viewName[id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] + , BX_COUNTOF(g_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + , name + ); } break; diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 98ee0e12a..d8e2318a6 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -667,6 +667,7 @@ namespace bgfx extern CallbackI* g_callback; extern bx::AllocatorI* g_allocator; extern Caps g_caps; + extern char g_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; struct ProfilerScope { @@ -3488,6 +3489,7 @@ namespace bgfx , m_peakDepthBias(0) , m_observe(0) , m_numPeakFrames(0) + , m_viewStats(NULL) , m_waitSubmit(0) , m_waitRender(0) , m_frameNum(0) @@ -3545,6 +3547,21 @@ namespace bgfx m_blitKeys[_num] = 0; } + void reserveViewStats(bool _enable) + { + if (!_enable) + { + bx::free(g_allocator, m_viewStats); + m_viewStats = NULL; + } + else if (NULL == m_viewStats) + { + m_viewStats = (ViewStats*)bx::alloc(g_allocator, sizeof(ViewStats)*BGFX_CONFIG_MAX_VIEWS); + } + + m_perfStats.viewStats = m_viewStats; + } + void freeArrays() { bx::free(g_allocator, m_sortKeys); @@ -3555,6 +3572,8 @@ namespace bgfx m_blitKeys = NULL; m_blitKeysCapacity = 0; + reserveViewStats(false); + m_renderItem.destroy(); m_renderBind.destroy(); m_blitItem.destroy(); @@ -3931,7 +3950,7 @@ namespace bgfx TextVideoMem* m_textVideoMem; Stats m_perfStats; - ViewStats m_viewStats[BGFX_CONFIG_MAX_VIEWS]; + ViewStats* m_viewStats; int64_t m_waitSubmit; int64_t m_waitRender; @@ -5197,7 +5216,6 @@ namespace bgfx virtual void destroyFrameBuffer(FrameBufferHandle _handle) = 0; virtual void requestScreenShot(FrameBufferHandle _handle, const char* _filePath) = 0; - virtual void updateViewName(ViewId _id, const char* _name) = 0; virtual void invalidateOcclusionQuery(OcclusionQueryHandle _handle) = 0; virtual void setMarker(const char* _name, uint16_t _len) = 0; virtual void setName(Handle _handle, const char* _name, uint16_t _len) = 0; diff --git a/src/renderer.h b/src/renderer.h index d07e7700a..973fc610d 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -10,6 +10,37 @@ namespace bgfx { + inline void setViewType(ViewId _view, const bx::StringView _str) + { + if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) + { + bx::memCopy(&g_viewName[_view][3], _str.getPtr(), _str.getLength() ); + } + } + + static constexpr uint32_t kTimerQueryBlock = 64; + static constexpr uint32_t kMaxTimerQueries = BGFX_CONFIG_MAX_VIEWS*4; + static constexpr uint32_t kMinTimerQueries = bx::min(kTimerQueryBlock, kMaxTimerQueries); + + inline uint32_t getNumTimerQueries(const Frame* _frame, uint32_t _num) + { + const bool profiler = 0 != (_frame->m_debug & BGFX_DEBUG_PROFILER); + const uint32_t numViews = profiler ? _frame->m_numUsedViews : 0; + const uint32_t spare = profiler ? kTimerQueryBlock : 0; + const uint32_t num = bx::min(bx::alignUp( (numViews+1)*4, kTimerQueryBlock) + spare, kMaxTimerQueries); + + return profiler + ? bx::max(num, _num) + : num + ; + } + + inline void resize(bx::RingBufferControl& _control, uint32_t _size) + { + _control.reset(); + _control.resize(int32_t(_size) - int32_t(_control.getSize() ) ); + } + struct BlitState { BlitState(const Frame* _frame) @@ -826,9 +857,8 @@ namespace bgfx template struct Profiler { - Profiler(Frame* _frame, Ty& _gpuTimer, const char (*_viewName)[BGFX_CONFIG_MAX_VIEW_NAME], bool _enabled = true) - : m_viewName(_viewName) - , m_frame(_frame) + Profiler(Frame* _frame, Ty& _gpuTimer, bool _enabled = true) + : m_frame(_frame) , m_gpuTimer(_gpuTimer) , m_queryIdx(UINT32_MAX) , m_numViews(0) @@ -853,7 +883,7 @@ namespace bgfx viewStats.view = ViewId(_view); bx::strCopy(viewStats.name , BGFX_CONFIG_MAX_VIEW_NAME - , &m_viewName[_view][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] + , &g_viewName[_view][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] ); } } @@ -878,7 +908,6 @@ namespace bgfx } } - const char (*m_viewName)[BGFX_CONFIG_MAX_VIEW_NAME]; Frame* m_frame; Ty& m_gpuTimer; uint32_t m_queryIdx; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index e4e5b4155..8cbd8f7ae 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -12,22 +12,18 @@ namespace bgfx { namespace d3d11 { - static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - static char s_viewName [BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) + inline const wchar_t* toViewNameW(wchar_t* _out, ViewId _view) { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION | BGFX_CONFIG_PROFILER) ) + size_t len = mbstowcs(_out, g_viewName[_view], BGFX_CONFIG_MAX_VIEW_NAME-1); + + if (size_t(-1) == len) { - const uint32_t len = _str.getLength(); - - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), len); - - wchar_t tmpW[16]; - mbstowcs(tmpW, _str.getPtr(), len); - - bx::memCopy(&s_viewNameW[_view][3], tmpW, len*2); + len = mbstowcs(_out, g_viewName[_view], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED); } + + _out[size_t(-1) == len ? 0 : len] = L'\0'; + + return _out; } struct PrimInfo @@ -1605,13 +1601,6 @@ namespace bgfx { namespace d3d11 }); } - // Init reserved part of view name. - for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) - { - bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + 1, "%3d ", ii); - mbstowcs(s_viewNameW[ii], s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED); - } - if (_init.debug && NULL != m_infoQueue) { @@ -2214,22 +2203,6 @@ namespace bgfx { namespace d3d11 DX_RELEASE(backBuffer, 0); } - void updateViewName(ViewId _id, const char* _name) override - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) ) - { - mbstowcs(&s_viewNameW[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , _name - , BX_COUNTOF(s_viewNameW[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - ); - } - - bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -6303,22 +6276,7 @@ namespace bgfx { namespace d3d11 void TimerQueryD3D11::postReset() { - ID3D11Device* device = s_renderD3D11->m_device; - - D3D11_QUERY_DESC qd; - qd.MiscFlags = 0; - for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) - { - Query& query = m_query[ii]; - query.m_ready = false; - - qd.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; - DX_CHECK(device->CreateQuery(&qd, &query.m_disjoint) ); - - qd.Query = D3D11_QUERY_TIMESTAMP; - DX_CHECK(device->CreateQuery(&qd, &query.m_begin) ); - DX_CHECK(device->CreateQuery(&qd, &query.m_end) ); - } + create(0, m_control.getSize() ); for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) { @@ -6331,7 +6289,32 @@ namespace bgfx { namespace d3d11 void TimerQueryD3D11::preReset() { - for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) + destroy(0, m_control.getSize() ); + } + + void TimerQueryD3D11::create(uint32_t _begin, uint32_t _end) + { + ID3D11Device* device = s_renderD3D11->m_device; + + D3D11_QUERY_DESC qd; + qd.MiscFlags = 0; + for (uint32_t ii = _begin; ii < _end; ++ii) + { + Query& query = m_query[ii]; + query.m_ready = false; + + qd.Query = D3D11_QUERY_TIMESTAMP_DISJOINT; + DX_CHECK(device->CreateQuery(&qd, &query.m_disjoint) ); + + qd.Query = D3D11_QUERY_TIMESTAMP; + DX_CHECK(device->CreateQuery(&qd, &query.m_begin) ); + DX_CHECK(device->CreateQuery(&qd, &query.m_end) ); + } + } + + void TimerQueryD3D11::destroy(uint32_t _begin, uint32_t _end) + { + for (uint32_t ii = _begin; ii < _end; ++ii) { Query& query = m_query[ii]; DX_RELEASE(query.m_disjoint, 0); @@ -6340,6 +6323,36 @@ namespace bgfx { namespace d3d11 } } + void TimerQueryD3D11::resize(uint32_t _size) + { + const uint32_t size = m_control.getSize(); + const uint32_t write = m_control.m_write; + + m_control.resize(int32_t(_size) - int32_t(size) ); + + const uint32_t newSize = m_control.getSize(); + + if (newSize > size) + { + const uint32_t num = newSize - size; + + bx::memMove(&m_query[write+num], &m_query[write], (size-write)*sizeof(Query) ); + create(write, write+num); + } + else if (newSize < size) + { + const uint32_t num = size - newSize; + const uint32_t back = bx::min(num, size-write); + const uint32_t front = num - back; + + destroy(write, write+back); + destroy(0, front); + + bx::memMove(&m_query[write], &m_query[write+back], (size-write-back)*sizeof(Query) ); + bx::memMove(&m_query[0], &m_query[front], newSize*sizeof(Query) ); + } + } + uint32_t TimerQueryD3D11::begin(uint32_t _resultIdx, uint32_t _frameNum) { ID3D11DeviceContext* deviceCtx = s_renderD3D11->m_deviceCtx; @@ -6873,6 +6886,7 @@ namespace bgfx { namespace d3d11 if (m_timerQuerySupport) { + m_gpuTimer.resize(getNumTimerQueries(_render, m_gpuTimer.m_control.getSize() ) ); frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS, _render->m_frameNum); } @@ -6941,7 +6955,6 @@ namespace bgfx { namespace d3d11 Profiler profiler( _render , m_gpuTimer - , s_viewName , m_timerQuerySupport ); diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index 48729695c..37354111b 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -55,10 +55,14 @@ BX_PRAGMA_DIAGNOSTIC_POP() | BGFX_STATE_DEPTH_TEST_MASK \ ) -#define BGFX_D3D11_PROFILER_BEGIN(_view, _abgr) \ - BX_MACRO_BLOCK_BEGIN \ - PIX_BEGINEVENT(_abgr, s_viewNameW[_view]); \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ +#define BGFX_D3D11_PROFILER_BEGIN(_view, _abgr) \ + BX_MACRO_BLOCK_BEGIN \ + if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) ) \ + { \ + wchar_t viewNameW[BGFX_CONFIG_MAX_VIEW_NAME]; \ + PIX_BEGINEVENT(_abgr, toViewNameW(viewNameW, _view) ); \ + } \ + BGFX_PROFILER_BEGIN(g_viewName[_view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_D3D11_PROFILER_BEGIN_LITERAL(_name, _abgr) \ @@ -476,12 +480,15 @@ namespace bgfx { namespace d3d11 struct TimerQueryD3D11 { TimerQueryD3D11() - : m_control(BX_COUNTOF(m_query) ) + : m_control(kMinTimerQueries) { } void postReset(); void preReset(); + void create(uint32_t _begin, uint32_t _end); + void destroy(uint32_t _begin, uint32_t _end); + void resize(uint32_t _size); uint32_t begin(uint32_t _resultIdx, uint32_t _frameNum); void end(uint32_t _idx); bool update(); @@ -516,7 +523,7 @@ namespace bgfx { namespace d3d11 Result m_result[BGFX_CONFIG_MAX_VIEWS+1]; - Query m_query[BGFX_CONFIG_MAX_VIEWS*4]; + Query m_query[kMaxTimerQueries]; bx::RingBufferControl m_control; }; diff --git a/src/renderer_d3d12.cpp b/src/renderer_d3d12.cpp index ee3079b9c..ddeadce1c 100644 --- a/src/renderer_d3d12.cpp +++ b/src/renderer_d3d12.cpp @@ -24,16 +24,6 @@ PFN_PIX_EVENTS_REPLACE_BLOCK bgfx_PIXEventsReplaceBlock; namespace bgfx { namespace d3d12 { - static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) - { - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() ); - } - } - struct PrimInfo { D3D_PRIMITIVE_TOPOLOGY m_topology; @@ -2036,12 +2026,6 @@ namespace bgfx { namespace d3d12 }); } - // Init reserved part of view name. - for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) - { - bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED + 1, "%3d ", ii); - } - postReset(); m_batch.create(4<<10); @@ -3034,14 +3018,6 @@ namespace bgfx { namespace d3d12 } } - void updateViewName(ViewId _id, const char* _name) override - { - bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -8528,6 +8504,17 @@ namespace bgfx { namespace d3d12 } void TimerQueryD3D12::init() + { + create(); + + for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) + { + Result& result = m_result[ii]; + result.reset(); + } + } + + void TimerQueryD3D12::create() { ID3D12Device* device = s_renderD3D12->m_device; @@ -8557,12 +8544,6 @@ namespace bgfx { namespace d3d12 D3D12_RANGE range = { .Begin = 0, .End = size }; m_readback->Map(0, &range, (void**)&m_queryResult); - for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) - { - Result& result = m_result[ii]; - result.reset(); - } - m_control.reset(); } @@ -8575,6 +8556,29 @@ namespace bgfx { namespace d3d12 DX_RELEASE(m_readback, 0); } + void TimerQueryD3D12::resize(uint32_t _size) + { + if (_size == m_control.getSize() ) + { + return; + } + + s_renderD3D12->finishAll(true); + + while (update() ) + { + } + + shutdown(); + bgfx::resize(m_control, _size); + create(); + + for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) + { + m_result[ii].m_pending = 0; + } + } + uint32_t TimerQueryD3D12::begin(uint32_t _resultIdx, uint32_t _frameNum) { ID3D12GraphicsCommandList* commandList = s_renderD3D12->m_commandList; @@ -9459,6 +9463,8 @@ namespace bgfx { namespace d3d12 } #endif // BX_PLATFORM_WINDOWS + m_gpuTimer.resize(getNumTimerQueries(_render, m_gpuTimer.m_control.getSize() ) ); + BGFX_D3D12_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorFrame); int64_t timeBegin = bx::getHPCounter(); @@ -9534,7 +9540,6 @@ namespace bgfx { namespace d3d12 Profiler profiler( _render , m_gpuTimer - , s_viewName ); #if BX_PLATFORM_WINDOWS diff --git a/src/renderer_d3d12.h b/src/renderer_d3d12.h index 995ef6f91..6b652f148 100644 --- a/src/renderer_d3d12.h +++ b/src/renderer_d3d12.h @@ -59,8 +59,8 @@ extern "C" uint64_t WINAPI bgfx_PIXEventsReplaceBlock(PIXEven #define BGFX_D3D12_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ - PIX3_BEGINEVENT(m_commandList, _abgr, s_viewName[_view]); \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + PIX3_BEGINEVENT(m_commandList, _abgr, g_viewName[_view]); \ + BGFX_PROFILER_BEGIN(g_viewName[view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_D3D12_PROFILER_BEGIN_LITERAL(_name, _abgr) \ @@ -750,12 +750,14 @@ namespace bgfx { namespace d3d12 struct TimerQueryD3D12 { TimerQueryD3D12() - : m_control(BX_COUNTOF(m_query) ) + : m_control(kMinTimerQueries) { } void init(); void shutdown(); + void create(); + void resize(uint32_t _size); uint32_t begin(uint32_t _resultIdx, uint32_t _frameNum); void end(uint32_t _idx); bool update(); @@ -787,7 +789,7 @@ namespace bgfx { namespace d3d12 uint64_t m_frequency; Result m_result[BGFX_CONFIG_MAX_VIEWS+1]; - Query m_query[BGFX_CONFIG_MAX_VIEWS*4]; + Query m_query[kMaxTimerQueries]; ID3D12Resource* m_readback; ID3D12QueryHeap* m_queryHeap; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5773eeb79..ffdeac717 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -14,16 +14,6 @@ namespace bgfx { namespace gl { - static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) - { - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() ); - } - } - struct PrimInfo { GLenum m_type; @@ -3141,12 +3131,6 @@ namespace bgfx { namespace gl m_occlusionQuery.create(); } - // Init reserved part of view name. - for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) - { - bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii); - } - m_needPresent = false; } @@ -3826,14 +3810,6 @@ namespace bgfx { namespace gl GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_backBufferFbo) ); } - void updateViewName(ViewId _id, const char* _name) override - { - bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -8756,6 +8732,7 @@ namespace bgfx { namespace gl if (m_timerQuerySupport) { + m_gpuTimer.resize(getNumTimerQueries(_render, m_gpuTimer.m_control.getSize() ) ); frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS, _render->m_frameNum); } @@ -8848,7 +8825,6 @@ namespace bgfx { namespace gl Profiler profiler( _render , m_gpuTimer - , s_viewName , m_timerQuerySupport ); diff --git a/src/renderer_gl.h b/src/renderer_gl.h index 98f14417a..c33301803 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -36,8 +36,8 @@ #define BGFX_GL_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ - GL_CHECK(glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, s_viewName[view]) ); \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + GL_CHECK(glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, g_viewName[view]) ); \ + BGFX_PROFILER_BEGIN(g_viewName[view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_GL_PROFILER_BEGIN_LITERAL(_name, _abgr) \ @@ -1659,20 +1659,13 @@ namespace bgfx { namespace gl struct TimerQueryGL { TimerQueryGL() - : m_control(BX_COUNTOF(m_query) ) + : m_control(kMinTimerQueries) { } void create() { - for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) - { - Query& query = m_query[ii]; - query.m_ready = false; - query.m_frameNum = 0; - GL_CHECK(glGenQueries(1, &query.m_begin) ); - GL_CHECK(glGenQueries(1, &query.m_end) ); - } + create(0, m_control.getSize() ); for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) { @@ -1683,7 +1676,24 @@ namespace bgfx { namespace gl void destroy() { - for (uint32_t ii = 0; ii < BX_COUNTOF(m_query); ++ii) + destroy(0, m_control.getSize() ); + } + + void create(uint32_t _begin, uint32_t _end) + { + for (uint32_t ii = _begin; ii < _end; ++ii) + { + Query& query = m_query[ii]; + query.m_ready = false; + query.m_frameNum = 0; + GL_CHECK(glGenQueries(1, &query.m_begin) ); + GL_CHECK(glGenQueries(1, &query.m_end) ); + } + } + + void destroy(uint32_t _begin, uint32_t _end) + { + for (uint32_t ii = _begin; ii < _end; ++ii) { Query& query = m_query[ii]; GL_CHECK(glDeleteQueries(1, &query.m_begin) ); @@ -1691,6 +1701,36 @@ namespace bgfx { namespace gl } } + void resize(uint32_t _size) + { + const uint32_t size = m_control.getSize(); + const uint32_t write = m_control.m_write; + + m_control.resize(int32_t(_size) - int32_t(size) ); + + const uint32_t newSize = m_control.getSize(); + + if (newSize > size) + { + const uint32_t num = newSize - size; + + bx::memMove(&m_query[write+num], &m_query[write], (size-write)*sizeof(Query) ); + create(write, write+num); + } + else if (newSize < size) + { + const uint32_t num = size - newSize; + const uint32_t back = bx::min(num, size-write); + const uint32_t front = num - back; + + destroy(write, write+back); + destroy(0, front); + + bx::memMove(&m_query[write], &m_query[write+back], (size-write-back)*sizeof(Query) ); + bx::memMove(&m_query[0], &m_query[front], newSize*sizeof(Query) ); + } + } + uint32_t begin(uint32_t _resultIdx, uint32_t _frameNum) { while (0 == m_control.reserve(1) ) @@ -1807,7 +1847,7 @@ namespace bgfx { namespace gl Result m_result[BGFX_CONFIG_MAX_VIEWS+1]; - Query m_query[BGFX_CONFIG_MAX_VIEWS*4]; + Query m_query[kMaxTimerQueries]; bx::RingBufferControl m_control; }; diff --git a/src/renderer_mtl.cpp b/src/renderer_mtl.cpp index 8dd802601..aae2f2bfd 100644 --- a/src/renderer_mtl.cpp +++ b/src/renderer_mtl.cpp @@ -24,16 +24,6 @@ namespace bgfx { namespace mtl { - static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) - { - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() ); - } - } - struct PrimInfo { MTL::PrimitiveType m_type; @@ -1161,12 +1151,6 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames } } - // Init reserved part of view name. - for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) - { - bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii); - } - m_renderPipelineDescriptor = newRenderPipelineDescriptor(); m_depthStencilDescriptor = newDepthStencilDescriptor(); m_frontFaceStencilDescriptor = newStencilDescriptor(); @@ -1859,15 +1843,6 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames bx::free(g_allocator, data); } - void updateViewName(ViewId _id, const char* _name) override - { - bx::strCopy( - &s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -6195,7 +6170,6 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames Profiler profiler( _render , m_gpuTimer - , s_viewName ); m_occlusionQuery.resolve(_render); @@ -6457,7 +6431,7 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) ) { - rce->pushDebugGroup(nsstr(s_viewName[view]) ); + rce->pushDebugGroup(nsstr(g_viewName[view]) ); } rce->setTriangleFillMode( (MTL::TriangleFillMode)wireframe ? MTL::TriangleFillModeLines : MTL::TriangleFillModeFill); @@ -6512,9 +6486,9 @@ static_assert(BX_COUNTOF(s_accessNames) == Access::Count, "Invalid s_accessNames if (viewChanged && BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) ) { - s_viewName[view][3] = L'C'; - m_computeCommandEncoder->pushDebugGroup(nsstr(s_viewName[view]) ); - s_viewName[view][3] = L' '; + g_viewName[view][3] = L'C'; + m_computeCommandEncoder->pushDebugGroup(nsstr(g_viewName[view]) ); + g_viewName[view][3] = L' '; } const RenderCompute& compute = renderItem.compute; diff --git a/src/renderer_mtl.h b/src/renderer_mtl.h index 8909ca587..390c15f10 100644 --- a/src/renderer_mtl.h +++ b/src/renderer_mtl.h @@ -17,7 +17,7 @@ #define BGFX_MTL_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + BGFX_PROFILER_BEGIN(g_viewName[view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_MTL_PROFILER_BEGIN_LITERAL(_name, _abgr) \ diff --git a/src/renderer_noop.cpp b/src/renderer_noop.cpp index 70f0f334e..81914c0e6 100644 --- a/src/renderer_noop.cpp +++ b/src/renderer_noop.cpp @@ -202,10 +202,6 @@ namespace bgfx { namespace noop { } - void updateViewName(ViewId /*_id*/, const char* /*_name*/) override - { - } - void invalidateOcclusionQuery(OcclusionQueryHandle /*_handle*/) override { } diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index 6a17fd82c..0828ad4fe 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -19,16 +19,6 @@ namespace bgfx { namespace vk { - static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) - { - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() ); - } - } - struct PrimInfo { VkPrimitiveTopology m_topology; @@ -2429,12 +2419,6 @@ VK_IMPORT_DEVICE vkCmdInsertDebugUtilsLabelEXT = stubCmdInsertDebugUtilsLabelEXT; } - // Init reserved part of view name. - for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii) - { - bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii); - } - if (m_timerQuerySupport) { result = m_gpuTimer.init(); @@ -2963,14 +2947,6 @@ VK_IMPORT_DEVICE recycleMemory(stagingMemory); } - void updateViewName(ViewId _id, const char* _name) override - { - bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -6378,6 +6354,17 @@ VK_DESTROY VkResult TimerQueryVK::init() { BGFX_PROFILER_SCOPE("TimerQueryVK::init", kColorFrame); + + for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) + { + m_result[ii].reset(); + } + + return create(); + } + + VkResult TimerQueryVK::create() + { VkResult result = VK_SUCCESS; const VkDevice device = s_renderVK->m_device; @@ -6421,11 +6408,6 @@ VK_DESTROY m_frequency = uint64_t(1000000000.0 / double(s_renderVK->m_deviceProperties.limits.timestampPeriod) ); - for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) - { - m_result[ii].reset(); - } - m_control.reset(); return result; @@ -6439,6 +6421,27 @@ VK_DESTROY s_renderVK->recycleMemory(m_readbackMemory); } + void TimerQueryVK::resize(uint32_t _size) + { + if (_size == m_control.getSize() ) + { + return; + } + + s_renderVK->release(m_queryPool); + s_renderVK->release(m_readback); + vkUnmapMemory(s_renderVK->m_device, m_readbackMemory.mem); + s_renderVK->recycleMemory(m_readbackMemory); + + bgfx::resize(m_control, _size); + VK_CHECK(create() ); + + for (uint32_t ii = 0; ii < BX_COUNTOF(m_result); ++ii) + { + m_result[ii].m_pending = 0; + } + } + uint32_t TimerQueryVK::begin(uint32_t _resultIdx, uint32_t _frameNum) { BGFX_PROFILER_SCOPE("TimerQueryVK::begin", kColorFrame); @@ -9872,6 +9875,7 @@ VK_DESTROY case VK_OBJECT_TYPE_FRAMEBUFFER: destroy(resource.m_handle); break; case VK_OBJECT_TYPE_PIPELINE_LAYOUT: destroy(resource.m_handle); break; case VK_OBJECT_TYPE_PIPELINE: destroy(resource.m_handle); break; + case VK_OBJECT_TYPE_QUERY_POOL: destroy(resource.m_handle); break; case VK_OBJECT_TYPE_DESCRIPTOR_SET: destroy(resource.m_handle); break; case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT: destroy(resource.m_handle); break; case VK_OBJECT_TYPE_RENDER_PASS: destroy(resource.m_handle); break; @@ -10381,6 +10385,7 @@ VK_DESTROY if (m_timerQuerySupport) { + m_gpuTimer.resize(getNumTimerQueries(_render, m_gpuTimer.m_control.getSize() ) ); frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS, _render->m_frameNum); } @@ -10504,7 +10509,6 @@ VK_DESTROY Profiler profiler( _render , m_gpuTimer - , s_viewName , m_timerQuerySupport ); diff --git a/src/renderer_vk.h b/src/renderer_vk.h index e26c64014..dee108cb3 100644 --- a/src/renderer_vk.h +++ b/src/renderer_vk.h @@ -305,8 +305,8 @@ #define BGFX_VK_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ - BGFX_VK_BEGIN_DEBUG_UTILS_LABEL(s_viewName[view], _abgr); \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + BGFX_VK_BEGIN_DEBUG_UTILS_LABEL(g_viewName[view], _abgr); \ + BGFX_PROFILER_BEGIN(g_viewName[view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_VK_PROFILER_BEGIN_LITERAL(_name, _abgr) \ @@ -605,12 +605,14 @@ VK_DESTROY_FUNC(DescriptorSet); struct TimerQueryVK { TimerQueryVK() - : m_control(BX_COUNTOF(m_query) ) + : m_control(kMinTimerQueries) { } VkResult init(); void shutdown(); + VkResult create(); + void resize(uint32_t _size); uint32_t begin(uint32_t _resultIdx, uint32_t _frameNum); void end(uint32_t _idx); bool update(); @@ -642,7 +644,7 @@ VK_DESTROY_FUNC(DescriptorSet); uint64_t m_frequency; Result m_result[BGFX_CONFIG_MAX_VIEWS+1]; - Query m_query[BGFX_CONFIG_MAX_VIEWS*4]; + Query m_query[kMaxTimerQueries]; VkBuffer m_readback; DeviceMemoryAllocationVK m_readbackMemory; diff --git a/src/renderer_webgpu.cpp b/src/renderer_webgpu.cpp index cc1b76f95..e1e2987ce 100644 --- a/src/renderer_webgpu.cpp +++ b/src/renderer_webgpu.cpp @@ -15,16 +15,6 @@ namespace bgfx { namespace wgpu { - static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; - - inline void setViewType(ViewId _view, const bx::StringView _str) - { - if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) ) - { - bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() ); - } - } - struct PrimInfo { WGPUPrimitiveTopology m_topology; @@ -2328,15 +2318,6 @@ WGPU_IMPORT bx::free(g_allocator, data); } - void updateViewName(ViewId _id, const char* _name) override - { - bx::strCopy( - &s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED] - , BX_COUNTOF(s_viewName[0])-BGFX_CONFIG_MAX_VIEW_NAME_RESERVED - , _name - ); - } - void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override { m_occlusionQuery.invalidate(_handle); @@ -6970,7 +6951,6 @@ WGPU_IMPORT Profiler profiler( _render , m_gpuTimer - , s_viewName , true ); @@ -7209,7 +7189,7 @@ WGPU_IMPORT WGPURenderPassDescriptor renderPassDesc = { .nextInChain = NULL, - .label = toWGPUStringView(s_viewName[view]), + .label = toWGPUStringView(g_viewName[view]), .colorAttachmentCount = numColorAttachments, .colorAttachments = colorAttachment, .depthStencilAttachment = NULL == depthStencilTextureView diff --git a/src/renderer_webgpu.h b/src/renderer_webgpu.h index 82c13b4ed..5d9850c6f 100644 --- a/src/renderer_webgpu.h +++ b/src/renderer_webgpu.h @@ -368,7 +368,7 @@ #define BGFX_WGPU_PROFILER_BEGIN(_view, _abgr) \ BX_MACRO_BLOCK_BEGIN \ - BGFX_PROFILER_BEGIN(s_viewName[view], _abgr); \ + BGFX_PROFILER_BEGIN(g_viewName[view], _abgr); \ BX_MACRO_BLOCK_END #define BGFX_WGPU_PROFILER_BEGIN_LITERAL(_name, _abgr) \