diff --git a/neo/CMakeLists.txt b/neo/CMakeLists.txt index 585dca87..c797b991 100644 --- a/neo/CMakeLists.txt +++ b/neo/CMakeLists.txt @@ -98,9 +98,10 @@ if(UNIX) # SRS - Disable precompiled headers when cross-compiling on OSX, e.g. when creating universal binaries # - Also disable precompiled headers when using the Ninja Multi-Config generator on linux or macOS + # - Also disable precompiled headers when using the Optick profiler on linux or macOS if((CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "x86_64" AND CMAKE_OSX_ARCHITECTURES MATCHES "arm64" ) OR (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") OR - (CMAKE_GENERATOR MATCHES "Ninja Multi-Config")) + (CMAKE_GENERATOR MATCHES "Ninja Multi-Config") OR OPTICK) set(USE_PRECOMPILED_HEADERS OFF) endif() diff --git a/neo/framework/common_frame.cpp b/neo/framework/common_frame.cpp index 7a08fd03..1c46ca55 100644 --- a/neo/framework/common_frame.cpp +++ b/neo/framework/common_frame.cpp @@ -90,7 +90,11 @@ be called directly in the foreground thread for comparison. */ int idGameThread::Run() { - OPTICK_THREAD( "idGameThread" ); + if( com_smp.GetBool() ) + { + // SRS - label thread in smp mode only, otherwise CPU frame number is missing + OPTICK_THREAD( "idGameThread" ); + } commonLocal.frameTiming.startGameTime = Sys_Microseconds(); diff --git a/neo/libs/optick/optick.config.h b/neo/libs/optick/optick.config.h index b2d48edc..c024a9ca 100644 --- a/neo/libs/optick/optick.config.h +++ b/neo/libs/optick/optick.config.h @@ -68,7 +68,7 @@ #if defined(_MSC_VER) #define OPTICK_ENABLE_GPU_VULKAN (OPTICK_ENABLE_GPU /*&& 0*/) #else -#define OPTICK_ENABLE_GPU_VULKAN (0) +#define OPTICK_ENABLE_GPU_VULKAN (OPTICK_ENABLE_GPU /*&& 0*/) #endif #endif diff --git a/neo/renderer/RenderBackend.cpp b/neo/renderer/RenderBackend.cpp index 248767ea..b32622e9 100644 --- a/neo/renderer/RenderBackend.cpp +++ b/neo/renderer/RenderBackend.cpp @@ -792,9 +792,12 @@ void idRenderBackend::FillDepthBufferFast( drawSurf_t** drawSurfs, int numDrawSu { OPTICK_EVENT( "Render_FillDepthBufferFast" ); -#if USE_OPTICK_GPU +#if USE_DX12 && OPTICK_ENABLE_GPU_D3D12 OPTICK_GPU_CONTEXT( ( ID3D12GraphicsCommandList* ) commandList->getNativeObject( nvrhi::ObjectTypes::D3D12_GraphicsCommandList ) ); OPTICK_GPU_EVENT( "Render_FillDepthBufferFast" ); +#elif USE_VK && OPTICK_ENABLE_GPU_VULKAN + OPTICK_GPU_CONTEXT( ( VkCommandBuffer ) commandList->getNativeObject( nvrhi::ObjectTypes::VK_CommandBuffer ) ); + OPTICK_GPU_EVENT( "Render_FillDepthBufferFast" ); #endif if( numDrawSurfs == 0 ) @@ -3357,9 +3360,12 @@ void idRenderBackend::ShadowAtlasPass( const viewDef_t* _viewDef ) OPTICK_EVENT( "Render_ShadowAtlas" ); -#if USE_OPTICK_GPU +#if USE_DX12 && OPTICK_ENABLE_GPU_D3D12 OPTICK_GPU_CONTEXT( ( ID3D12GraphicsCommandList* ) commandList->getNativeObject( nvrhi::ObjectTypes::D3D12_GraphicsCommandList ) ); OPTICK_GPU_EVENT( "Render_ShadowAtlas" ); +#elif USE_VK && OPTICK_ENABLE_GPU_VULKAN + OPTICK_GPU_CONTEXT( ( VkCommandBuffer ) commandList->getNativeObject( nvrhi::ObjectTypes::VK_CommandBuffer ) ); + OPTICK_GPU_EVENT( "Render_ShadowAtlas" ); #endif renderLog.OpenMainBlock( MRB_SHADOW_ATLAS_PASS ); @@ -3670,9 +3676,12 @@ void idRenderBackend::DrawInteractions( const viewDef_t* _viewDef ) OPTICK_EVENT( "Render_Interactions" ); -#if USE_OPTICK_GPU +#if USE_DX12 && OPTICK_ENABLE_GPU_D3D12 OPTICK_GPU_CONTEXT( ( ID3D12GraphicsCommandList* ) commandList->getNativeObject( nvrhi::ObjectTypes::D3D12_GraphicsCommandList ) ); OPTICK_GPU_EVENT( "Render_Interactions" ); +#elif USE_VK && OPTICK_ENABLE_GPU_VULKAN + OPTICK_GPU_CONTEXT( ( VkCommandBuffer ) commandList->getNativeObject( nvrhi::ObjectTypes::VK_CommandBuffer ) ); + OPTICK_GPU_EVENT( "Render_Interactions" ); #endif renderLog.OpenMainBlock( MRB_DRAW_INTERACTIONS ); @@ -5389,12 +5398,15 @@ void idRenderBackend::DrawViewInternal( const viewDef_t* _viewDef, const int ste OPTICK_EVENT( "Backend_DrawViewInternal" ); OPTICK_TAG( "stereoEye", stereoEye ); -#if USE_OPTICK_GPU +#if USE_DX12 && OPTICK_ENABLE_GPU_D3D12 //uint32_t swapIndex = deviceManager->GetCurrentBackBufferIndex(); //idStr eventLabel; //eventLabel.Format( "DrawView( frameIndex = %i, swapIndex = %i ) ", taaPass->GetFrameIndex(), swapIndex ); OPTICK_GPU_CONTEXT( ( ID3D12GraphicsCommandList* ) commandList->getNativeObject( nvrhi::ObjectTypes::D3D12_GraphicsCommandList ) ); OPTICK_GPU_EVENT( "DrawView" ); +#elif USE_VK && OPTICK_ENABLE_GPU_VULKAN + OPTICK_GPU_CONTEXT( ( VkCommandBuffer ) commandList->getNativeObject( nvrhi::ObjectTypes::VK_CommandBuffer ) ); + OPTICK_GPU_EVENT( "DrawView" ); #endif renderLog.OpenBlock( "Render_DrawViewInternal", colorRed ); diff --git a/neo/renderer/RenderBackend.h b/neo/renderer/RenderBackend.h index ffaad47f..4be66a51 100644 --- a/neo/renderer/RenderBackend.h +++ b/neo/renderer/RenderBackend.h @@ -43,13 +43,6 @@ If you have questions concerning this license or the applicable additional terms #include "PipelineCache.h" - -#if USE_OPTICK - #define USE_OPTICK_GPU 0 -#else - #define USE_OPTICK_GPU 0 -#endif - struct tmu_t { unsigned int current2DMap; diff --git a/neo/sys/DeviceManager_DX12.cpp b/neo/sys/DeviceManager_DX12.cpp index f6c228f8..2ec1de86 100644 --- a/neo/sys/DeviceManager_DX12.cpp +++ b/neo/sys/DeviceManager_DX12.cpp @@ -452,13 +452,17 @@ bool DeviceManager_DX12::CreateDeviceAndSwapChain() m_FrameWaitQuery = m_NvrhiDevice->createEventQuery(); m_NvrhiDevice->setEventQuery( m_FrameWaitQuery, nvrhi::CommandQueue::Graphics ); +#if OPTICK_ENABLE_GPU_D3D12 OPTICK_GPU_INIT_D3D12( m_Device12, &m_GraphicsQueue, 1 ); +#endif return true; } void DeviceManager_DX12::DestroyDeviceAndSwapChain() { + OPTICK_SHUTDOWN(); + m_RhiSwapChainBuffers.clear(); m_RendererString.clear(); diff --git a/neo/sys/DeviceManager_VK.cpp b/neo/sys/DeviceManager_VK.cpp index 5d084155..a25bfc4d 100644 --- a/neo/sys/DeviceManager_VK.cpp +++ b/neo/sys/DeviceManager_VK.cpp @@ -826,6 +826,9 @@ bool DeviceManager_VK::createDevice() #if defined(__APPLE__) && defined( VK_KHR_portability_subset ) auto portabilityFeatures = vk::PhysicalDevicePortabilitySubsetFeaturesKHR() +#if USE_OPTICK + .setEvents( true ) +#endif .setImageViewFormatSwizzle( true ); void* pNext = &portabilityFeatures; @@ -863,6 +866,9 @@ bool DeviceManager_VK::createDevice() .setTimelineSemaphore( true ) .setShaderSampledImageArrayNonUniformIndexing( true ) .setBufferDeviceAddress( bufferAddressSupported ) +#if USE_OPTICK + .setHostQueryReset( true ) +#endif .setPNext( pNext ); auto layerVec = stringSetToVector( enabledExtensions.layers ); @@ -1201,11 +1207,17 @@ bool DeviceManager_VK::CreateDeviceAndSwapChain() #undef CHECK +#if OPTICK_ENABLE_GPU_VULKAN + OPTICK_GPU_INIT_VULKAN( ( VkDevice* )&m_VulkanDevice, ( VkPhysicalDevice* )&m_VulkanPhysicalDevice, ( VkQueue* )&m_GraphicsQueue, ( uint32_t* )&m_GraphicsQueueFamily, 1, nullptr ); +#endif + return true; } void DeviceManager_VK::DestroyDeviceAndSwapChain() { + OPTICK_SHUTDOWN(); + m_FrameWaitQuery = nullptr; for( int i = 0; i < m_SwapChainImages.size(); i++ ) @@ -1285,6 +1297,9 @@ void DeviceManager_VK::EndFrame() void DeviceManager_VK::Present() { + OPTICK_GPU_FLIP( ( VkSwapchainKHR )m_SwapChain ); + OPTICK_CATEGORY( "Vulkan_Present", Optick::Category::Wait ); + vk::PresentInfoKHR info = vk::PresentInfoKHR() .setWaitSemaphoreCount( 1 ) .setPWaitSemaphores( &m_PresentSemaphore ) @@ -1313,6 +1328,8 @@ void DeviceManager_VK::Present() { if constexpr( NUM_FRAME_DATA > 2 ) { + OPTICK_CATEGORY( "Vulkan_Sync3", Optick::Category::Wait ); + // SRS - For triple buffering, sync on previous frame's command queue completion m_NvrhiDevice->waitEventQuery( m_FrameWaitQuery ); } @@ -1322,6 +1339,8 @@ void DeviceManager_VK::Present() if constexpr( NUM_FRAME_DATA < 3 ) { + OPTICK_CATEGORY( "Vulkan_Sync2", Optick::Category::Wait ); + // SRS - For double buffering, sync on current frame's command queue completion m_NvrhiDevice->waitEventQuery( m_FrameWaitQuery ); } diff --git a/neo/sys/posix/platform_linux.cpp b/neo/sys/posix/platform_linux.cpp index 6a64df04..daa833cb 100644 --- a/neo/sys/posix/platform_linux.cpp +++ b/neo/sys/posix/platform_linux.cpp @@ -521,6 +521,19 @@ int main( int argc, const char** argv ) Sys_Printf( "memory consistency checking enabled\n" ); #endif + // Setting memory allocators + OPTICK_SET_MEMORY_ALLOCATOR( + []( size_t size ) -> void* { return operator new( size ); }, + []( void* p ) + { + operator delete( p ); + }, + []() + { + /* Do some TLS initialization here if needed */ + } + ); + Posix_EarlyInit(); if( argc > 1 ) @@ -537,6 +550,8 @@ int main( int argc, const char** argv ) while( 1 ) { + OPTICK_FRAME( "MainThread" ); + common->Frame(); } } diff --git a/neo/sys/posix/platform_osx.cpp b/neo/sys/posix/platform_osx.cpp index 814ea783..0ff48f59 100644 --- a/neo/sys/posix/platform_osx.cpp +++ b/neo/sys/posix/platform_osx.cpp @@ -457,6 +457,19 @@ int main( int argc, const char** argv ) cmdargv = argv; // DG end + // Setting memory allocators + OPTICK_SET_MEMORY_ALLOCATOR( + []( size_t size ) -> void* { return operator new( size ); }, + []( void* p ) + { + operator delete( p ); + }, + []() + { + /* Do some TLS initialization here if needed */ + } + ); + Posix_EarlyInit(); if( argc > 1 ) @@ -472,6 +485,8 @@ int main( int argc, const char** argv ) while( 1 ) { + OPTICK_FRAME( "MainThread" ); + common->Frame(); } } diff --git a/neo/sys/win32/win_main.cpp b/neo/sys/win32/win_main.cpp index d2e0c099..1b760eaf 100644 --- a/neo/sys/win32/win_main.cpp +++ b/neo/sys/win32/win_main.cpp @@ -2051,8 +2051,6 @@ int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin common->Frame(); } - OPTICK_SHUTDOWN(); - // never gets here return 0; }