renderdoc: Add global capture support.
Useful for test suite since a test can be comprised of several smaller submissions, and it's easier to debug if we have one trace. Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
19e6d1502c
commit
768ccee59e
|
@ -203,6 +203,9 @@ pass `-Denable_renderdoc=true` to Meson.
|
|||
vkd3d-proton will automatically make a capture when a specific shader is encountered.
|
||||
- `VKD3D_AUTO_CAPTURE_COUNTS` - A comma-separated list of indices. This can be used to control which queue submissions to capture.
|
||||
E.g., use `VKD3D_AUTO_CAPTURE_COUNTS=0,4,10` to capture the 0th (first submission), 4th and 10th submissions which are candidates for capturing.
|
||||
If `VKD3D_AUTO_CAPTURE_COUNTS` is `-1`, the entire app runtime can be turned into one big capture.
|
||||
This is only intended to be used when capturing something like the test suite,
|
||||
or tiny applications with a finite runtime to make it easier to debug cross submission work.
|
||||
|
||||
If only `VKD3D_AUTO_CAPTURE_COUNTS` is set, any queue submission is considered for capturing.
|
||||
If only `VKD3D_AUTO_CAPTURE_SHADER` is set, `VKD3D_AUTO_CAPTURE_COUNTS` is considered to be equal to `"0"`, i.e. a capture is only
|
||||
|
|
|
@ -2538,6 +2538,12 @@ static void d3d12_device_destroy(struct d3d12_device *device)
|
|||
vkd3d_memory_allocator_cleanup(&device->memory_allocator, device);
|
||||
/* Tear down descriptor global info late, so we catch last minute faults after we drain the queues. */
|
||||
vkd3d_descriptor_debug_free_global_info(device->descriptor_qa_global_info, device);
|
||||
|
||||
#ifdef VKD3D_ENABLE_RENDERDOC
|
||||
if (vkd3d_renderdoc_active() && vkd3d_renderdoc_global_capture_enabled())
|
||||
vkd3d_renderdoc_end_capture(device->vkd3d_instance->vk_instance);
|
||||
#endif
|
||||
|
||||
VK_CALL(vkDestroyDevice(device->vk_device, NULL));
|
||||
pthread_mutex_destroy(&device->mutex);
|
||||
if (device->parent)
|
||||
|
@ -5242,6 +5248,12 @@ static HRESULT d3d12_device_init(struct d3d12_device *device,
|
|||
IUnknown_AddRef(device->parent);
|
||||
|
||||
d3d12_device_caps_init(device);
|
||||
|
||||
#ifdef VKD3D_ENABLE_RENDERDOC
|
||||
if (vkd3d_renderdoc_active() && vkd3d_renderdoc_global_capture_enabled())
|
||||
vkd3d_renderdoc_begin_capture(device->vkd3d_instance->vk_instance);
|
||||
#endif
|
||||
|
||||
return S_OK;
|
||||
|
||||
out_cleanup_global_pipeline_cache:
|
||||
|
|
|
@ -42,6 +42,7 @@ static vkd3d_shader_hash_t renderdoc_capture_shader_hash;
|
|||
static uint32_t *renderdoc_capture_counts;
|
||||
static size_t renderdoc_capture_counts_count;
|
||||
static bool vkd3d_renderdoc_is_active;
|
||||
static bool vkd3d_renderdoc_global_capture;
|
||||
|
||||
static void vkd3d_renderdoc_init_capture_count_list(const char *env)
|
||||
{
|
||||
|
@ -49,6 +50,13 @@ static void vkd3d_renderdoc_init_capture_count_list(const char *env)
|
|||
uint32_t count;
|
||||
char *endp;
|
||||
|
||||
if (strcmp(env, "-1") == 0)
|
||||
{
|
||||
INFO("Doing one big capture of the entire lifetime of a device.\n");
|
||||
vkd3d_renderdoc_global_capture = true;
|
||||
return;
|
||||
}
|
||||
|
||||
while (*env != '\0')
|
||||
{
|
||||
errno = 0;
|
||||
|
@ -180,6 +188,11 @@ bool vkd3d_renderdoc_active(void)
|
|||
return vkd3d_renderdoc_is_active;
|
||||
}
|
||||
|
||||
bool vkd3d_renderdoc_global_capture_enabled(void)
|
||||
{
|
||||
return vkd3d_renderdoc_global_capture;
|
||||
}
|
||||
|
||||
bool vkd3d_renderdoc_should_capture_shader_hash(vkd3d_shader_hash_t hash)
|
||||
{
|
||||
return (renderdoc_capture_shader_hash == hash) || (renderdoc_capture_shader_hash == 0);
|
||||
|
@ -190,9 +203,12 @@ bool vkd3d_renderdoc_begin_capture(void *instance)
|
|||
static uint32_t overall_counter;
|
||||
uint32_t counter;
|
||||
|
||||
counter = vkd3d_atomic_uint32_increment(&overall_counter, vkd3d_memory_order_relaxed) - 1;
|
||||
if (!vkd3d_renderdoc_enable_submit_counter(counter))
|
||||
return false;
|
||||
if (!vkd3d_renderdoc_global_capture)
|
||||
{
|
||||
counter = vkd3d_atomic_uint32_increment(&overall_counter, vkd3d_memory_order_relaxed) - 1;
|
||||
if (!vkd3d_renderdoc_enable_submit_counter(counter))
|
||||
return false;
|
||||
}
|
||||
|
||||
if (renderdoc_api)
|
||||
renderdoc_api->StartFrameCapture(RENDERDOC_DEVICEPOINTER_FROM_VKINSTANCE(instance), NULL);
|
||||
|
@ -215,6 +231,9 @@ void vkd3d_renderdoc_command_list_check_capture(struct d3d12_command_list *list,
|
|||
{
|
||||
unsigned int i;
|
||||
|
||||
if (vkd3d_renderdoc_global_capture_enabled())
|
||||
return;
|
||||
|
||||
if (vkd3d_renderdoc_active() && state)
|
||||
{
|
||||
if (state->vk_bind_point == VK_PIPELINE_BIND_POINT_COMPUTE)
|
||||
|
@ -246,6 +265,9 @@ bool vkd3d_renderdoc_command_queue_begin_capture(struct d3d12_command_queue *com
|
|||
VkDebugUtilsLabelEXT capture_label;
|
||||
bool debug_capture;
|
||||
|
||||
if (vkd3d_renderdoc_global_capture_enabled())
|
||||
return false;
|
||||
|
||||
debug_capture = vkd3d_renderdoc_begin_capture(command_queue->device->vkd3d_instance->vk_instance);
|
||||
if (debug_capture && !vkd3d_renderdoc_loaded_api())
|
||||
{
|
||||
|
@ -273,6 +295,9 @@ void vkd3d_renderdoc_command_queue_end_capture(struct d3d12_command_queue *comma
|
|||
const struct vkd3d_vk_device_procs *vk_procs = &command_queue->device->vk_procs;
|
||||
VkDebugUtilsLabelEXT capture_label;
|
||||
|
||||
if (vkd3d_renderdoc_global_capture_enabled())
|
||||
return;
|
||||
|
||||
if (!vkd3d_renderdoc_loaded_api())
|
||||
{
|
||||
/* Magic fallback which lets us bridge the Wine barrier over to Linux RenderDoc. */
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
bool vkd3d_renderdoc_active(void);
|
||||
bool vkd3d_renderdoc_loaded_api(void);
|
||||
bool vkd3d_renderdoc_should_capture_shader_hash(vkd3d_shader_hash_t hash);
|
||||
bool vkd3d_renderdoc_global_capture_enabled(void);
|
||||
|
||||
bool vkd3d_renderdoc_begin_capture(void *instance);
|
||||
void vkd3d_renderdoc_end_capture(void *instance);
|
||||
|
|
Loading…
Reference in New Issue