Skip to content

Commit

Permalink
vkd3d: Move common debug parsing code to new file.
Browse files Browse the repository at this point in the history
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
  • Loading branch information
HansKristian-Work committed Sep 24, 2024
1 parent cd3404b commit 3657d00
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 84 deletions.
80 changes: 3 additions & 77 deletions libs/vkd3d/breadcrumbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -841,12 +841,8 @@ void vkd3d_breadcrumb_tracer_end_command_list(struct d3d12_command_list *list)

void vkd3d_breadcrumb_tracer_update_barrier_hashes(struct vkd3d_breadcrumb_tracer *tracer)
{
vkd3d_shader_hash_t lo_hash;
vkd3d_shader_hash_t hi_hash;
char env[VKD3D_PATH_MAX];
uint32_t new_count;
char line[64];
char *end_ptr;
size_t new_count;
FILE *file;

if (vkd3d_get_env_var("VKD3D_BARRIER_HASHES", env, sizeof(env)))
Expand All @@ -855,78 +851,8 @@ void vkd3d_breadcrumb_tracer_update_barrier_hashes(struct vkd3d_breadcrumb_trace
if (file)
{
pthread_mutex_lock(&tracer->barrier_hash_lock);
new_count = 0;
while (fgets(line, sizeof(line), file))
{
/* Look for either a single number, or lohash-hihash format. */
if (!isalnum(*line))
continue;

lo_hash = strtoull(line, &end_ptr, 16);

while (*end_ptr != '\0' && !isalnum(*end_ptr))
end_ptr++;

hi_hash = strtoull(end_ptr, &end_ptr, 16);

while (*end_ptr != '\0' && !isalpha(*end_ptr))
end_ptr++;

if (!hi_hash)
hi_hash = lo_hash;

if (lo_hash || hi_hash)
{
vkd3d_array_reserve((void **)&tracer->barrier_hashes, &tracer->barrier_hashes_size,
new_count + 1, sizeof(*tracer->barrier_hashes));

tracer->barrier_hashes[new_count].lo = lo_hash;
tracer->barrier_hashes[new_count].hi = hi_hash;

if (*end_ptr != '\0')
{
char *stray_newline = end_ptr + (strlen(end_ptr) - 1);
if (*stray_newline == '\n')
*stray_newline = '\0';
}

if (*end_ptr == '\0')
{
tracer->barrier_hashes[new_count].flags =
VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_BEFORE_DISPATCH;
end_ptr = "post-compute (default)";
}
else if (strcmp(end_ptr, "pre-compute") == 0)
{
tracer->barrier_hashes[new_count].flags =
VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_BEFORE_DISPATCH;
}
else if (strcmp(end_ptr, "post-compute") == 0)
{
tracer->barrier_hashes[new_count].flags =
VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH;
}
else if (strcmp(end_ptr, "pre-raster") == 0)
{
tracer->barrier_hashes[new_count].flags =
VKD3D_SHADER_META_FLAG_FORCE_PRE_RASTERIZATION_BEFORE_DISPATCH;
}
else if (strcmp(end_ptr, "graphics") == 0)
{
tracer->barrier_hashes[new_count].flags =
VKD3D_SHADER_META_FLAG_FORCE_GRAPHICS_BEFORE_DISPATCH;
}
else
end_ptr = "N/A";

INFO("Inserting %s barrier for %016"PRIx64" - %016"PRIx64".\n",
end_ptr,
tracer->barrier_hashes[new_count].lo,
tracer->barrier_hashes[new_count].hi);

new_count++;
}
}
vkd3d_shader_hash_range_parse(file, &tracer->barrier_hashes, &tracer->barrier_hashes_size,
&new_count, VKD3D_SHADER_HASH_RANGE_KIND_BARRIERS);
vkd3d_atomic_uint32_store_explicit(&tracer->barrier_hashes_count, new_count, vkd3d_memory_order_relaxed);
pthread_mutex_unlock(&tracer->barrier_hash_lock);
fclose(file);
Expand Down
99 changes: 99 additions & 0 deletions libs/vkd3d/debug_common.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
/*
* Copyright 2024 Hans-Kristian Arntzen for Valve Corporation
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#define VKD3D_DBG_CHANNEL VKD3D_DBG_CHANNEL_API

#include "vkd3d_private.h"
#include "vkd3d_debug.h"
#include "vkd3d_common.h"
#include <assert.h>
#include <stdio.h>

void vkd3d_shader_hash_range_parse(FILE *file, struct vkd3d_shader_hash_range **ranges,
size_t *range_size, size_t *range_count, enum vkd3d_shader_hash_range_kind kind)
{
vkd3d_shader_hash_t lo_hash;
vkd3d_shader_hash_t hi_hash;
size_t new_count = 0;
char line[64];
char *end_ptr;

while (fgets(line, sizeof(line), file))
{
/* Look for either a single number, or lohash-hihash format. */
if (!isalnum(*line))
continue;

lo_hash = strtoull(line, &end_ptr, 16);

while (*end_ptr != '\0' && !isalnum(*end_ptr))
end_ptr++;

hi_hash = strtoull(end_ptr, &end_ptr, 16);

while (*end_ptr != '\0' && !isalpha(*end_ptr))
end_ptr++;

if (!hi_hash)
hi_hash = lo_hash;

if (lo_hash || hi_hash)
{
vkd3d_array_reserve((void **)ranges, range_size,
new_count + 1, sizeof(struct vkd3d_shader_hash_range));

(*ranges)[new_count].lo = lo_hash;
(*ranges)[new_count].hi = hi_hash;

if (*end_ptr != '\0')
{
char *stray_newline = end_ptr + (strlen(end_ptr) - 1);
if (*stray_newline == '\n')
*stray_newline = '\0';
}

if (kind == VKD3D_SHADER_HASH_RANGE_KIND_BARRIERS)
{
if (*end_ptr == '\0')
{
(*ranges)[new_count].flags = VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_BEFORE_DISPATCH;
end_ptr = "post-compute (default)";
}
else if (strcmp(end_ptr, "pre-compute") == 0)
(*ranges)[new_count].flags = VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_BEFORE_DISPATCH;
else if (strcmp(end_ptr, "post-compute") == 0)
(*ranges)[new_count].flags = VKD3D_SHADER_META_FLAG_FORCE_COMPUTE_BARRIER_AFTER_DISPATCH;
else if (strcmp(end_ptr, "pre-raster") == 0)
(*ranges)[new_count].flags = VKD3D_SHADER_META_FLAG_FORCE_PRE_RASTERIZATION_BEFORE_DISPATCH;
else if (strcmp(end_ptr, "graphics") == 0)
(*ranges)[new_count].flags = VKD3D_SHADER_META_FLAG_FORCE_GRAPHICS_BEFORE_DISPATCH;
else
end_ptr = "N/A";

INFO("Inserting %s barrier for %016"PRIx64" - %016"PRIx64".\n",
end_ptr,
(*ranges)[new_count].lo,
(*ranges)[new_count].hi);
}

new_count++;
}
}

*range_count = new_count;
}
4 changes: 4 additions & 0 deletions libs/vkd3d/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,10 @@ if enable_breadcrumbs
vkd3d_src += ['breadcrumbs.c']
endif

if enable_descriptor_qa or enable_breadcrumbs
vkd3d_src += ['debug_common.c']
endif

if vkd3d_platform == 'windows'
vkd3d_src += ['shared_metadata.c']
endif
Expand Down
24 changes: 17 additions & 7 deletions libs/vkd3d/vkd3d_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -3454,6 +3454,23 @@ enum vkd3d_breadcrumb_command_type
VKD3D_BREADCRUMB_COMMAND_DSTORAGE,
};

#if defined(VKD3D_ENABLE_BREADCRUMBS) || defined(VKD3D_ENABLE_DESCRIPTOR_QA)
struct vkd3d_shader_hash_range
{
vkd3d_shader_hash_t lo;
vkd3d_shader_hash_t hi;
uint32_t flags;
};

enum vkd3d_shader_hash_range_kind
{
VKD3D_SHADER_HASH_RANGE_KIND_BARRIERS = 0
};

void vkd3d_shader_hash_range_parse(FILE *file, struct vkd3d_shader_hash_range **ranges,
size_t *range_size, size_t *range_count, enum vkd3d_shader_hash_range_kind kind);
#endif

#ifdef VKD3D_ENABLE_BREADCRUMBS
struct vkd3d_breadcrumb_counter
{
Expand Down Expand Up @@ -3491,13 +3508,6 @@ struct vkd3d_breadcrumb_command_list_trace_context
uint32_t next;
};

struct vkd3d_shader_hash_range
{
vkd3d_shader_hash_t lo;
vkd3d_shader_hash_t hi;
uint32_t flags;
};

struct vkd3d_breadcrumb_tracer
{
/* There is room for N live command lists in this system.
Expand Down

0 comments on commit 3657d00

Please sign in to comment.