summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJob Noorman <jnoorman@igalia.com>2024-04-03 10:51:51 +0200
committerMarge Bot <emma+marge@anholt.net>2024-04-04 02:59:10 +0000
commit22f64a1fe31f64f08e4ce48f66bb8408d16df2f3 (patch)
tree72908f708038b54e73dabb445f78ed774cdbae0f
parent57209a0c7ab79f333cb42c0e7fe21dfe9a719cec (diff)
zink: print shaderdb info via debug message callback
shaderdb expects to receive shader info via a glDebugMessageCallback callback. This patch updates print_pipeline_stats to use the zink_context::dbg callback. The format of the shader info is also updated to match what the shaderdb report.py script expects. In particular, we use what report.py calls "nv_format" since that is the closest to the current format. Signed-off-by: Job Noorman <jnoorman@igalia.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28542>
-rw-r--r--src/gallium/drivers/zink/zink_program.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/src/gallium/drivers/zink/zink_program.c b/src/gallium/drivers/zink/zink_program.c
index b5533d90bad..4106181d49d 100644
--- a/src/gallium/drivers/zink/zink_program.c
+++ b/src/gallium/drivers/zink/zink_program.c
@@ -34,6 +34,7 @@
#include "zink_state.h"
#include "zink_inlines.h"
+#include "util/memstream.h"
#include "util/u_debug.h"
#include "util/u_memory.h"
#include "util/u_prim.h"
@@ -2024,7 +2025,7 @@ print_exe_stages(VkShaderStageFlags stages)
}
static void
-print_pipeline_stats(struct zink_screen *screen, VkPipeline pipeline)
+print_pipeline_stats(struct zink_screen *screen, VkPipeline pipeline, struct util_debug_callback *debug)
{
VkPipelineInfoKHR pinfo = {
VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR,
@@ -2039,7 +2040,6 @@ print_pipeline_stats(struct zink_screen *screen, VkPipeline pipeline)
}
VKSCR(GetPipelineExecutablePropertiesKHR)(screen->dev, &pinfo, &exe_count, NULL);
VKSCR(GetPipelineExecutablePropertiesKHR)(screen->dev, &pinfo, &exe_count, props);
- printf("PIPELINE STATISTICS:");
for (unsigned e = 0; e < exe_count; e++) {
VkPipelineExecutableInfoKHR info = {
VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR,
@@ -2048,7 +2048,18 @@ print_pipeline_stats(struct zink_screen *screen, VkPipeline pipeline)
e
};
unsigned count = 0;
- printf("\n\t%s (%s): ", print_exe_stages(props[e].stages), props[e].name);
+
+ struct u_memstream stream;
+ char *print_buf;
+ size_t print_buf_sz;
+
+ if (!u_memstream_open(&stream, &print_buf, &print_buf_sz)) {
+ mesa_loge("ZINK: failed to open memstream!");
+ return;
+ }
+
+ FILE *f = u_memstream_get(&stream);
+ fprintf(f, "type: %s", props[e].name);
VkPipelineExecutableStatisticKHR *stats = NULL;
VKSCR(GetPipelineExecutableStatisticsKHR)(screen->dev, &info, &count, NULL);
stats = calloc(count, sizeof(VkPipelineExecutableStatisticKHR));
@@ -2062,27 +2073,32 @@ print_pipeline_stats(struct zink_screen *screen, VkPipeline pipeline)
VKSCR(GetPipelineExecutableStatisticsKHR)(screen->dev, &info, &count, stats);
for (unsigned i = 0; i < count; i++) {
- if (i)
- printf(", ");
+ fprintf(f, ", ");
switch (stats[i].format) {
case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR:
- printf("%s: %u", stats[i].name, stats[i].value.b32);
+ fprintf(f, "%s: %u", stats[i].name, stats[i].value.b32);
break;
case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR:
- printf("%s: %" PRIi64, stats[i].name, stats[i].value.i64);
+ fprintf(f, "%s: %" PRIi64, stats[i].name, stats[i].value.i64);
break;
case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR:
- printf("%s: %" PRIu64, stats[i].name, stats[i].value.u64);
+ fprintf(f, "%s: %" PRIu64, stats[i].name, stats[i].value.u64);
break;
case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR:
- printf("%s: %g", stats[i].name, stats[i].value.f64);
+ fprintf(f, "%s: %g", stats[i].name, stats[i].value.f64);
break;
default:
unreachable("unknown statistic");
}
}
+
+ /* print_buf is only valid after flushing. */
+ fflush(f);
+ util_debug_message(debug, SHADER_INFO, "%s\n", print_buf);
+
+ u_memstream_close(&stream);
+ free(print_buf);
}
- printf("\n");
}
static void
@@ -2169,7 +2185,7 @@ zink_link_gfx_shader(struct pipe_context *pctx, void **shaders)
VkPipeline pipeline = zink_create_gfx_pipeline(screen, prog, prog->objs, &ctx->gfx_pipeline_state,
ctx->gfx_pipeline_state.element_state->binding_map,
shaders[MESA_SHADER_TESS_EVAL] ? VK_PRIMITIVE_TOPOLOGY_PATCH_LIST : VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, true, NULL);
- print_pipeline_stats(screen, pipeline);
+ print_pipeline_stats(screen, pipeline, &ctx->dbg);
} else {
if (zink_screen(pctx->screen)->info.have_EXT_shader_object)
prog->base.uses_shobj = !BITSET_TEST(zshaders[MESA_SHADER_FRAGMENT]->info.system_values_read, SYSTEM_VALUE_SAMPLE_MASK_IN);