This commit is contained in:
dave-juicelabs 2022-07-26 22:23:02 +03:00 committed by GitHub
commit bffe23cd53
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 191 additions and 2 deletions

View File

@ -25,6 +25,39 @@
#ifdef VKD3D_ENABLE_PROFILING
#ifdef TRACY_ENABLE
#include <TracyC.h>
void tracy_set_thread_name( const char* name );
void tracy_emit_frame_mark();
TracyCZoneCtx tracy_emit_zone_begin( const struct ___tracy_source_location_data* srcloc, int active );
void tracy_emit_zone_end( TracyCZoneCtx ctx );
#define VKD3D_PROFILE_THREAD_NAME(name) tracy_set_thread_name((name))
#define VKD3D_PROFILE_FRAME() tracy_emit_frame_mark()
void vkd3d_init_profiling(void);
bool vkd3d_uses_profiling(void);
#define VKD3D_STRINGIZE1(x) #x
#define VKD3D_STRINGIZE(x) VKD3D_STRINGIZE1(x)
#define VKD3D_REGION_DECL(name) TracyCZoneCtx _vkd3d_tracy_##name
/* Copied from definition of TracyCZoneN. In this implementation, _vkd3d_tracy_##name is expected
* to be defined by VKD3D_REGION_DECL. */
#define VKD3D_REGION_BEGIN(name) static const struct ___tracy_source_location_data TracyConcat(__tracy_source_location,__LINE__) = { VKD3D_STRINGIZE(name), __func__, __FILE__, (uint32_t)__LINE__, 0 }; _vkd3d_tracy_##name = tracy_emit_zone_begin( &TracyConcat(__tracy_source_location,__LINE__), 1 )
#define VKD3D_REGION_END_ITERATIONS(name, iter) tracy_emit_zone_end(_vkd3d_tracy_##name)
#else
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#else
#include <time.h>
#endif
void vkd3d_init_profiling(void);
bool vkd3d_uses_profiling(void);
unsigned int vkd3d_profiling_register_region(const char *name, spinlock_t *lock, uint32_t *latch);
@ -50,6 +83,12 @@ void vkd3d_profiling_notify_work(unsigned int index, uint64_t start_ticks, uint6
vkd3d_profiling_notify_work(_vkd3d_region_index_##name, _vkd3d_region_begin_tick_##name, _vkd3d_region_end_tick_##name, iter); \
} while(0)
#define VKD3D_PROFILE_THREAD_NAME(name) ((void)0)
#define VKD3D_PROFILE_FRAME() ((void)0)
#endif /* TRACY_ENABLE */
#else
static inline void vkd3d_init_profiling(void)
{
@ -57,6 +96,8 @@ static inline void vkd3d_init_profiling(void)
#define VKD3D_REGION_DECL(name) ((void)0)
#define VKD3D_REGION_BEGIN(name) ((void)0)
#define VKD3D_REGION_END_ITERATIONS(name, iter) ((void)0)
#define VKD3D_PROFILE_THREAD_NAME(name) ((void)0)
#define VKD3D_PROFILE_FRAME() ((void)0)
#endif /* VKD3D_ENABLE_PROFILING */
#define VKD3D_REGION_END(name) VKD3D_REGION_END_ITERATIONS(name, 1)

View File

@ -217,6 +217,7 @@ static inline int condvar_reltime_wait_timeout_seconds(condvar_reltime_t *cond,
static inline void vkd3d_set_thread_name(const char *name)
{
VKD3D_PROFILE_THREAD_NAME(name);
(void)name;
}

View File

@ -8,10 +8,18 @@ vkd3d_common_src = [
'platform.c',
]
vkd3d_common_dependencies = []
if enable_tracy
vkd3d_common_dependencies += [ tracy_dep ]
endif
vkd3d_common_lib = static_library('vkd3d_common', vkd3d_common_src, vkd3d_header_files,
dependencies : vkd3d_common_dependencies,
include_directories : vkd3d_private_includes,
override_options : [ 'c_std='+vkd3d_c_std ])
vkd3d_common_dep = declare_dependency(
link_with : vkd3d_common_lib,
dependencies : vkd3d_common_dependencies,
include_directories : [ vkd3d_public_includes, vkd3d_common_lib.private_dir_include() ])

View File

@ -123,6 +123,7 @@ static void vkd3d_init_profiling_path(const char *path)
}
#endif
#ifndef TRACY_ENABLE
static void vkd3d_init_profiling_once(void)
{
char path[VKD3D_PATH_MAX];
@ -131,16 +132,57 @@ static void vkd3d_init_profiling_once(void)
if (strlen(path) > 0)
vkd3d_init_profiling_path(path);
}
#else
#include "vkd3d_platform.h"
#ifdef DYNAMIC_TRACY
static void (*pfn_tracy_set_thread_name)( const char* name );
static void (*pfn_tracy_emit_frame_mark)( const char* name );
static TracyCZoneCtx (*pfn_tracy_emit_zone_begin)( const struct ___tracy_source_location_data* srcloc, int active );
static void (*pfn_tracy_emit_zone_end)( TracyCZoneCtx ctx );
static void vkd3d_init_profiling_once(void)
{
#if defined(_WIN32)
#define SONAME_TRACY "tracy.dll"
#else
#error "Unrecognized platform."
#endif
vkd3d_module_t tracy = vkd3d_dlopen(SONAME_TRACY);
if(tracy)
{
pfn_tracy_set_thread_name = vkd3d_dlsym(tracy, "___tracy_set_thread_name");
pfn_tracy_emit_frame_mark = vkd3d_dlsym(tracy, "___tracy_emit_frame_mark");
pfn_tracy_emit_zone_begin = vkd3d_dlsym(tracy, "___tracy_emit_zone_begin");
pfn_tracy_emit_zone_end = vkd3d_dlsym(tracy, "___tracy_emit_zone_end");
}
}
#else
static void vkd3d_init_profiling_once(void)
{
}
#endif /* DYNAMIC_TRACY */
#endif /* TRACY_ENABLE */
void vkd3d_init_profiling(void)
{
pthread_once(&profiling_block_once, vkd3d_init_profiling_once);
}
#ifndef TRACY_ENABLE
bool vkd3d_uses_profiling(void)
{
return mapped_blocks != NULL;
}
#else
bool vkd3d_uses_profiling(void)
{
return true;
}
#endif /* TRACY_ENABLE */
unsigned int vkd3d_profiling_register_region(const char *name, spinlock_t *lock, uint32_t *latch)
{
@ -195,4 +237,60 @@ void vkd3d_profiling_notify_work(unsigned int index,
spinlock_release(lock);
}
#ifdef TRACY_ENABLE
#ifdef DYNAMIC_TRACY
void tracy_set_thread_name(const char *name)
{
if(pfn_tracy_set_thread_name)
pfn_tracy_set_thread_name(name);
}
void tracy_emit_frame_mark()
{
if(pfn_tracy_emit_frame_mark)
pfn_tracy_emit_frame_mark(0);
}
TracyCZoneCtx tracy_emit_zone_begin(const struct ___tracy_source_location_data *srcloc, int active)
{
TracyCZoneCtx ctx;
if(pfn_tracy_emit_zone_begin)
ctx = pfn_tracy_emit_zone_begin(srcloc, active);
return ctx;
}
void tracy_emit_zone_end(TracyCZoneCtx ctx)
{
if(pfn_tracy_emit_zone_end)
pfn_tracy_emit_zone_end(ctx);
}
#else
void tracy_set_thread_name(const char *name)
{
___tracy_set_thread_name(name);
}
void tracy_emit_frame_mark()
{
___tracy_emit_frame_mark(0);
}
TracyCZoneCtx tracy_emit_zone_begin(const struct ___tracy_source_location_data *srcloc, int active)
{
return ___tracy_emit_zone_begin(srcloc, active);
}
void tracy_emit_zone_end(TracyCZoneCtx ctx)
{
___tracy_emit_zone_end(ctx);
}
#endif /* DYNAMIC_TRACY */
#endif /* TRACY_ENABLE */
#endif /* VKD3D_ENABLE_PROFILING */

View File

@ -1903,7 +1903,9 @@ static VkResult d3d12_swapchain_queue_present(struct d3d12_swapchain *swapchain,
present_info.waitSemaphoreCount = 1;
present_info.pWaitSemaphores = &swapchain->vk_present_semaphores[swapchain->vk_image_index];
if ((vr = VK_CALL(vkQueuePresentKHR(vk_queue, &present_info))) >= 0)
vr = VK_CALL(vkQueuePresentKHR(vk_queue, &present_info));
VKD3D_PROFILE_FRAME();
if (vr >= 0)
{
swapchain->frame_id = (swapchain->frame_id + 1) % swapchain->buffer_count;
swapchain->vk_image_index = INVALID_VK_IMAGE_INDEX;

View File

@ -20,6 +20,8 @@ enable_profiling = get_option('enable_profiling')
enable_renderdoc = get_option('enable_renderdoc')
enable_descriptor_qa = get_option('enable_descriptor_qa')
enable_trace = get_option('enable_trace')
enable_tracy = get_option('enable_tracy')
dynamic_tracy = get_option('dynamic_tracy')
if enable_d3d12 == 'auto'
enable_d3d12 = vkd3d_platform == 'windows'
@ -33,6 +35,12 @@ else
enable_trace = enable_trace == 'true'
endif
# Please see https://github.com/wolfpld/tracy/pull/428.
# Wine probably does not support the required features for Tracy.
if host_machine.system() != 'windows' and enable_tracy
error('Tracy is supported only when building on Windows.')
endif
if vkd3d_platform != 'windows' and enable_d3d12
error('Standalone D3D12 is only supported on Windows.')
endif
@ -48,7 +56,7 @@ if enable_d3d12
add_project_arguments('-DVKD3D_BUILD_STANDALONE_D3D12', language : 'c')
endif
if enable_profiling
if enable_profiling or enable_tracy
add_project_arguments('-DVKD3D_ENABLE_PROFILING', language : 'c')
endif
@ -69,6 +77,14 @@ if enable_breadcrumbs
add_project_arguments('-DVKD3D_ENABLE_BREADCRUMBS', language : 'c')
endif
if enable_tracy
add_project_arguments('-DTRACY_ENABLE', language : 'c')
if dynamic_tracy
add_project_arguments('-DDYNAMIC_TRACY', language : 'c')
endif
endif
vkd3d_external_includes = [ './subprojects/Vulkan-Headers/include', './subprojects/SPIRV-Headers/include' ]
vkd3d_public_includes = [ './include' ] + vkd3d_external_includes
vkd3d_private_includes = [ './include/private' ] + vkd3d_public_includes
@ -158,6 +174,24 @@ vkd3d_version = vcs_tag(
dxil_spirv = subproject('dxil-spirv')
dxil_spirv_dep = dxil_spirv.get_variable('dxil_spirv_dep')
if enable_tracy
tracy_options = [
'tracy_on_demand=true',
'tracy_no_callstack=true',
'tracy_delayed_init=true',
'tracy_no_sys_trace=true'
]
if dynamic_tracy
tracy_options += [
'tracy_shared_libs=true'
]
endif
tracy = subproject('tracy', default_options : tracy_options)
tracy_dep = tracy.get_variable('tracy_dep')
endif
subdir('include')
subdir('libs')

View File

@ -5,3 +5,5 @@ option('enable_profiling', type : 'boolean', value : false)
option('enable_renderdoc', type : 'boolean', value : false)
option('enable_descriptor_qa', type : 'boolean', value : false)
option('enable_trace', type : 'combo', value : 'auto', choices : ['false', 'true', 'auto'])
option('enable_tracy', type : 'boolean', value : false)
option('dynamic_tracy', type : 'boolean', value : false)

3
subprojects/tracy.wrap Normal file
View File

@ -0,0 +1,3 @@
[wrap-git]
url = https://github.com/wolfpld/tracy.git
revision = ccf35eb24a9468d03c1725caf1c843ae89dbede4