From fa97a50df0168eeef68b172c02916aac3f9672e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Mon, 19 Oct 2020 19:30:39 -0700 Subject: [PATCH] VK: GPU timer stub. --- src/renderer_vk.cpp | 104 +++++++++++++++++++++++++++++++------------- src/renderer_vk.h | 61 ++++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 30 deletions(-) diff --git a/src/renderer_vk.cpp b/src/renderer_vk.cpp index c52f0926e..f663b2db8 100644 --- a/src/renderer_vk.cpp +++ b/src/renderer_vk.cpp @@ -2338,6 +2338,8 @@ VK_IMPORT_DEVICE bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii); } + m_gpuTimer.init(); + g_internalData.context = m_device; return true; @@ -2410,6 +2412,8 @@ VK_IMPORT_DEVICE VK_CHECK(vkQueueWaitIdle(m_queueGraphics) ); VK_CHECK(vkDeviceWaitIdle(m_device) ); + m_gpuTimer.shutdown(); + m_pipelineStateCache.invalidate(); m_descriptorSetLayoutCache.invalidate(); m_renderPassCache.invalidate(); @@ -4694,6 +4698,8 @@ VK_IMPORT_DEVICE VkPipelineCache m_pipelineCache; VkCommandPool m_commandPool; + TimerQueryVK m_gpuTimer; + void* m_renderDocDll; void* m_vulkan1Dll; @@ -6434,7 +6440,9 @@ VK_DESTROY BX_UNUSED(_render, _clearQuad, _textVideoMemBlitter); m_commandBuffer = beginNewCommand(); + BGFX_VK_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorView); + submitCommandAndWait(m_commandBuffer); m_commandBuffer = VK_NULL_HANDLE; @@ -6449,7 +6457,7 @@ VK_DESTROY int64_t timeBegin = bx::getHPCounter(); int64_t captureElapsed = 0; -// m_gpuTimer.begin(m_commandList); + uint32_t frameQueryIdx = m_gpuTimer.begin(BGFX_CONFIG_MAX_VIEWS); if (0 < _render->m_iboffset) { @@ -6513,20 +6521,23 @@ VK_DESTROY uint32_t statsKeyType[2] = {}; VkSemaphore renderWait = m_presentDone[m_backBufferColorIdx]; - VkResult result = vkAcquireNextImageKHR( - m_device - , m_swapchain - , UINT64_MAX - , renderWait - , VK_NULL_HANDLE - , &m_backBufferColorIdx - ); - if (VK_ERROR_OUT_OF_DATE_KHR == result - || VK_ERROR_VALIDATION_FAILED_EXT == result) { - m_needToRefreshSwapchain = true; - return; + VkResult result = vkAcquireNextImageKHR( + m_device + , m_swapchain + , UINT64_MAX + , renderWait + , VK_NULL_HANDLE + , &m_backBufferColorIdx + ); + + if (VK_ERROR_OUT_OF_DATE_KHR == result + || VK_ERROR_VALIDATION_FAILED_EXT == result) + { + m_needToRefreshSwapchain = true; + return; + } } const uint64_t f0 = BGFX_STATE_BLEND_FACTOR; @@ -6568,6 +6579,12 @@ VK_DESTROY bool beginRenderPass = false; + Profiler profiler( + _render + , m_gpuTimer + , s_viewName + ); + if (0 == (_render->m_debug&BGFX_DEBUG_IFH) ) { viewState.m_rect = _render->m_view[0].m_rect; @@ -6620,17 +6637,30 @@ VK_DESTROY viewHasScissor = !scissorRect.isZero(); viewScissorRect = viewHasScissor ? scissorRect : rect; - rpbi.framebuffer = isValid(m_fbh) ? m_frameBuffers[m_fbh.idx].m_framebuffer : m_backBufferColor[m_backBufferColorIdx]; - rpbi.renderPass = isValid(m_fbh) ? m_frameBuffers[m_fbh.idx].m_renderPass : m_renderPass; + rpbi.framebuffer = isValid(m_fbh) + ? m_frameBuffers[m_fbh.idx].m_framebuffer + : m_backBufferColor[m_backBufferColorIdx] + ; + rpbi.renderPass = isValid(m_fbh) + ? m_frameBuffers[m_fbh.idx].m_renderPass + : m_renderPass + ; rpbi.renderArea.offset.x = rect.m_x; rpbi.renderArea.offset.y = rect.m_y; rpbi.renderArea.extent.width = rect.m_width; rpbi.renderArea.extent.height = rect.m_height; + if (item > 1) + { + profiler.end(); + } + BGFX_VK_PROFILER_END(); setViewType(view, " "); BGFX_VK_PROFILER_BEGIN(view, kColorView); + profiler.begin(view); + if (!isCompute && !beginRenderPass) { vkCmdBeginRenderPass(m_commandBuffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE); @@ -7159,6 +7189,15 @@ VK_DESTROY } submitBlit(bs, BGFX_CONFIG_MAX_VIEWS); + + if (0 < _render->m_numRenderItems) + { + captureElapsed = -bx::getHPCounter(); +// capture(); + captureElapsed += bx::getHPCounter(); + + profiler.end(); + } } BGFX_VK_PROFILER_END(); @@ -7182,15 +7221,19 @@ BX_UNUSED(presentMin, presentMax); // presentMin = bx::min(presentMin, m_presentElapsed); // presentMax = bx::max(presentMax, m_presentElapsed); -// m_gpuTimer.end(m_commandList); + if (UINT32_MAX != frameQueryIdx) + { + m_gpuTimer.end(frameQueryIdx); -// while (m_gpuTimer.get() ) -// { -// double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency); -// elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs; -// maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed; -// } -// maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1); + const TimerQueryVK::Result& result = m_gpuTimer.m_result[BGFX_CONFIG_MAX_VIEWS]; + double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency); + elapsedGpuMs = (result.m_end - result.m_begin) * toGpuMs; + maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed; + + maxGpuLatency = bx::uint32_imax(maxGpuLatency, result.m_pending-1); + } + + maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1); const int64_t timerFreq = bx::getHPFrequency(); @@ -7198,13 +7241,14 @@ BX_UNUSED(presentMin, presentMax); perfStats.cpuTimeBegin = timeBegin; perfStats.cpuTimeEnd = timeEnd; perfStats.cpuTimerFreq = timerFreq; -// perfStats.gpuTimeBegin = m_gpuTimer.m_begin; -// perfStats.gpuTimeEnd = m_gpuTimer.m_end; -// perfStats.gpuTimerFreq = m_gpuTimer.m_frequency; -// perfStats.numDraw = statsKeyType[0]; -// perfStats.numCompute = statsKeyType[1]; + const TimerQueryVK::Result& result = m_gpuTimer.m_result[BGFX_CONFIG_MAX_VIEWS]; + perfStats.gpuTimeBegin = result.m_begin; + perfStats.gpuTimeEnd = result.m_end; + perfStats.gpuTimerFreq = m_gpuTimer.m_frequency; + perfStats.numDraw = statsKeyType[0]; + perfStats.numCompute = statsKeyType[1]; perfStats.numBlit = _render->m_numBlitItems; -// perfStats.maxGpuLatency = maxGpuLatency; + perfStats.maxGpuLatency = maxGpuLatency; bx::memCopy(perfStats.numPrims, statsNumPrimsRendered, sizeof(perfStats.numPrims) ); perfStats.gpuMemoryMax = -INT64_MAX; perfStats.gpuMemoryUsed = -INT64_MAX; @@ -7393,7 +7437,7 @@ BX_UNUSED(presentMin, presentMax); VK_CHECK(vkEndCommandBuffer(m_commandBuffer) ); - kick(renderWait); //, m_presentDone[m_backBufferColorIdx]); + kick(renderWait); finishAll(); VK_CHECK(vkResetCommandPool(m_device, m_commandPool, 0) ); diff --git a/src/renderer_vk.h b/src/renderer_vk.h index ca9145683..b97a0d14f 100644 --- a/src/renderer_vk.h +++ b/src/renderer_vk.h @@ -521,6 +521,67 @@ VK_DESTROY VkPipelineLayout m_pipelineLayout; }; + struct TimerQueryVK + { + TimerQueryVK() + : m_control(BX_COUNTOF(m_query) ) + { + } + + void init() + { + } + + void shutdown() + { + } + + uint32_t begin(uint32_t _resultIdx) + { + BX_UNUSED(_resultIdx); + return 0; + } + + void end(uint32_t _idx) + { + BX_UNUSED(_idx); + } + + bool update() + { + return false; + } + + struct Result + { + void reset() + { + m_begin = 0; + m_end = 0; + m_pending = 0; + } + + uint64_t m_begin; + uint64_t m_end; + uint32_t m_pending; + }; + + struct Query + { + uint32_t m_begin; + uint32_t m_end; + uint32_t m_resultIdx; + bool m_ready; + }; + + uint64_t m_frequency; + + Result m_result[BGFX_CONFIG_MAX_VIEWS+1]; + + Query m_query[BGFX_CONFIG_MAX_VIEWS*4]; + bx::RingBufferControl m_control; + }; + struct TextureVK { TextureVK()