nv2a: Log exact method addr and name+offset if available

This commit is contained in:
Matt Borgerson 2022-01-11 13:29:52 -07:00 committed by mborgerson
parent 13be29690a
commit 7d101d5193
1 changed files with 32 additions and 12 deletions

View File

@ -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; }