From 7d101d5193cdb6bcacc6462c2dd30c1c01767c67 Mon Sep 17 00:00:00 2001 From: Matt Borgerson Date: Tue, 11 Jan 2022 13:29:52 -0700 Subject: [PATCH] nv2a: Log exact method addr and name+offset if available --- hw/xbox/nv2a/pgraph.c | 44 +++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/hw/xbox/nv2a/pgraph.c b/hw/xbox/nv2a/pgraph.c index be2befd96c..5a879e6690 100644 --- a/hw/xbox/nv2a/pgraph.c +++ b/hw/xbox/nv2a/pgraph.c @@ -678,42 +678,49 @@ void pgraph_flush(NV2AState *d) typedef void (*MethodFunc)(METHOD_HANDLER_ARGS); static const struct { - MethodFunc handler; + uint32_t base; const char *name; + MethodFunc handler; } pgraph_kelvin_methods[0x800] = { #define DEF_METHOD(gclass, name) \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name))] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, #define DEF_METHOD_RANGE(gclass, name, range) \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name)) \ ... METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name) + range)] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, #define DEF_METHOD_CASE_4_OFFSET(gclass, name, offset, stride) \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name) + offset)] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name) + offset + stride)] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name) + offset + stride * 2)] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, \ [METHOD_ADDR_TO_INDEX(METHOD_ADDR(gclass, name) + offset + stride * 3)] = \ { \ + METHOD_ADDR(gclass, name), \ + METHOD_NAME_STR(gclass, name), \ METHOD_FUNC_NAME(gclass, name), \ - METHOD_NAME_STR(gclass, name) \ }, #define DEF_METHOD_CASE_4(gclass, name, stride) \ DEF_METHOD_CASE_4_OFFSET(gclass, name, 0, stride) @@ -3480,6 +3487,7 @@ static void pgraph_method_log(unsigned int subchannel, } if (method != 0x1800) { const char* method_name = NULL; + uint32_t base = method; // unsigned int nmethod = 0; switch (graphics_class) { case NV_KELVIN_PRIMITIVE: { @@ -3487,6 +3495,7 @@ static void pgraph_method_log(unsigned int subchannel, int idx = METHOD_ADDR_TO_INDEX(method); if (idx < ARRAY_SIZE(pgraph_kelvin_methods)) { method_name = pgraph_kelvin_methods[idx].name; + base = pgraph_kelvin_methods[idx].base; } break; } @@ -3499,13 +3508,24 @@ static void pgraph_method_log(unsigned int subchannel, default: break; } + + char buf[256]; + char *ptr = buf; + char *end = ptr + sizeof(buf); + + ptr += snprintf(ptr, end - ptr, "pgraph method (%d): 0x%x -> 0x%04x", + subchannel, graphics_class, method); + if (method_name) { - NV2A_DPRINTF("pgraph method (%d): %s (0x%x)\n", - subchannel, method_name, parameter); - } else { - NV2A_DPRINTF("pgraph method (%d): 0x%x -> 0x%04x (0x%x)\n", - subchannel, graphics_class, method, parameter); + ptr += snprintf(ptr, end - ptr, " %s", method_name); + uint32_t o = method - base; + if (o) { + ptr += snprintf(ptr, end - ptr, "+0x%02x", o); + } } + + ptr += snprintf(ptr, end - ptr, " (0x%x)", parameter); + NV2A_GL_DPRINTF(true, "%s", buf); } if (method == last) { count++; } else {count = 0; }