xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/scripts/sanity-a6xx.lua (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker-- Parse cmdstream dump and check for common errors
2*61046927SAndroid Build Coastguard Worker--  1) Check for overflowing HLSQ_xS_CNTL.CONSTLEN
3*61046927SAndroid Build Coastguard Worker--  2) Check for constant uploades that overwrite each other.  The
4*61046927SAndroid Build Coastguard Worker--     range checking is reset on  each draw, since it is a valid
5*61046927SAndroid Build Coastguard Worker--     use-case to do partial constant upload.  But if we see two
6*61046927SAndroid Build Coastguard Worker--     CP_LOAD_STATE* that overwrite the same range of constants
7*61046927SAndroid Build Coastguard Worker--     within the same draw, that is almost certainly unintentional.
8*61046927SAndroid Build Coastguard Worker--
9*61046927SAndroid Build Coastguard Worker-- TODO add more checks
10*61046927SAndroid Build Coastguard Worker-- TODO maybe some parts could be shared across
11*61046927SAndroid Build Coastguard Worker--      different generations
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker--local posix = require "posix"
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Workerfunction printf(fmt, ...)
16*61046927SAndroid Build Coastguard Worker	return io.write(string.format(fmt, ...))
17*61046927SAndroid Build Coastguard Workerend
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Workerfunction dbg(fmt, ...)
20*61046927SAndroid Build Coastguard Worker	--printf(fmt, ...)
21*61046927SAndroid Build Coastguard Workerend
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Workerstages = {
24*61046927SAndroid Build Coastguard Worker	"SB6_VS_SHADER",
25*61046927SAndroid Build Coastguard Worker	"SB6_HS_SHADER",
26*61046927SAndroid Build Coastguard Worker	"SB6_DS_SHADER",
27*61046927SAndroid Build Coastguard Worker	"SB6_GS_SHADER",
28*61046927SAndroid Build Coastguard Worker	"SB6_FS_SHADER",
29*61046927SAndroid Build Coastguard Worker	"SB6_CS_SHADER",
30*61046927SAndroid Build Coastguard Worker}
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker-- maps shader stage to HLSQ_xS_CNTL register name:
33*61046927SAndroid Build Coastguard Workercntl_regs = {
34*61046927SAndroid Build Coastguard Worker	["SB6_VS_SHADER"] = "HLSQ_VS_CNTL",
35*61046927SAndroid Build Coastguard Worker	["SB6_HS_SHADER"] = "HLSQ_HS_CNTL",
36*61046927SAndroid Build Coastguard Worker	["SB6_DS_SHADER"] = "HLSQ_DS_CNTL",
37*61046927SAndroid Build Coastguard Worker	["SB6_GS_SHADER"] = "HLSQ_GS_CNTL",
38*61046927SAndroid Build Coastguard Worker	["SB6_FS_SHADER"] = "HLSQ_FS_CNTL",
39*61046927SAndroid Build Coastguard Worker	["SB6_CS_SHADER"] = "HLSQ_CS_CNTL",
40*61046927SAndroid Build Coastguard Worker}
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker-- initialize constant updated ranges:
43*61046927SAndroid Build Coastguard Worker--   constranges[stagename] -> table of offsets that have been uploaded
44*61046927SAndroid Build Coastguard Workerconstranges = {}
45*61046927SAndroid Build Coastguard Workerfunction reset_constranges()
46*61046927SAndroid Build Coastguard Worker	for i,stage in ipairs(stages) do
47*61046927SAndroid Build Coastguard Worker		constranges[stage] = {}
48*61046927SAndroid Build Coastguard Worker	end
49*61046927SAndroid Build Coastguard Workerend
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Workerreset_constranges()
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Workerprintf("Checking cmdstream...\n")
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Workerlocal r = rnn.init("a630")
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Workerfunction draw(primtype, nindx)
58*61046927SAndroid Build Coastguard Worker	printf("draw!\n")
59*61046927SAndroid Build Coastguard Worker	-- reset ranges of uploaded consts on each draw:
60*61046927SAndroid Build Coastguard Worker	reset_constranges()
61*61046927SAndroid Build Coastguard Workerend
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Workerfunction CP_LOAD_STATE6(pkt, size)
64*61046927SAndroid Build Coastguard Worker	if tostring(pkt[0].STATE_TYPE) ~= "ST6_CONSTANTS" then
65*61046927SAndroid Build Coastguard Worker		return
66*61046927SAndroid Build Coastguard Worker	end
67*61046927SAndroid Build Coastguard Worker	dbg("got CP_LOAD_STATE6\n")
68*61046927SAndroid Build Coastguard Worker	stage = tostring(pkt[0].STATE_BLOCK)
69*61046927SAndroid Build Coastguard Worker	max = pkt[0].DST_OFF + pkt[0].NUM_UNIT
70*61046927SAndroid Build Coastguard Worker	cntl_reg = cntl_regs[stage]
71*61046927SAndroid Build Coastguard Worker	dbg("looking for %s.. max=%d vs %d\n", cntl_reg, max, r[cntl_reg].CONSTLEN)
72*61046927SAndroid Build Coastguard Worker	if max > r[cntl_reg].CONSTLEN then
73*61046927SAndroid Build Coastguard Worker		printf("ERROR: invalid max constant offset for stage %s: %d vs %d\n", stage, max, r[cntl_reg].CONSTLEN)
74*61046927SAndroid Build Coastguard Worker	end
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Workerend
77