xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/scripts/parse-submits.lua (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker-- Parse cmdstream dump and analyse blits and batches
2*61046927SAndroid Build Coastguard Worker
3*61046927SAndroid Build Coastguard Worker--local posix = require "posix"
4*61046927SAndroid Build Coastguard Worker
5*61046927SAndroid Build Coastguard Workerfunction printf(fmt, ...)
6*61046927SAndroid Build Coastguard Worker	return io.write(string.format(fmt, ...))
7*61046927SAndroid Build Coastguard Workerend
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Workerfunction dbg(fmt, ...)
10*61046927SAndroid Build Coastguard Worker	--printf(fmt, ...)
11*61046927SAndroid Build Coastguard Workerend
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Workerprintf("Analyzing Data...\n")
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Workerlocal r = rnn.init("a630")
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker-- Each submit, all draws will target the same N MRTs:
18*61046927SAndroid Build Coastguard Workerlocal mrts = {}
19*61046927SAndroid Build Coastguard Workerlocal allmrts = {}  -- includes historical render targets
20*61046927SAndroid Build Coastguard Workerfunction push_mrt(fmt, w, h, samples, base, flag, gmem)
21*61046927SAndroid Build Coastguard Worker	dbg("MRT: %s %ux%u 0x%x\n", fmt, w, h, base)
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker	local mrt = {}
24*61046927SAndroid Build Coastguard Worker	mrt.format = fmt
25*61046927SAndroid Build Coastguard Worker	mrt.w = w
26*61046927SAndroid Build Coastguard Worker	mrt.h = h
27*61046927SAndroid Build Coastguard Worker	mrt.samples = samples
28*61046927SAndroid Build Coastguard Worker	mrt.base = base
29*61046927SAndroid Build Coastguard Worker	mrt.flag = flag
30*61046927SAndroid Build Coastguard Worker	mrt.gmem = gmem
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker	mrts[base] = mrt
33*61046927SAndroid Build Coastguard Worker	allmrts[base] = mrt
34*61046927SAndroid Build Coastguard Workerend
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker-- And each each draw will read from M sources/textures:
37*61046927SAndroid Build Coastguard Workerlocal sources = {}
38*61046927SAndroid Build Coastguard Workerfunction push_source(fmt, w, h, samples, base, flag)
39*61046927SAndroid Build Coastguard Worker	dbg("SRC: %s %ux%u 0x%x\n", fmt, w, h, base)
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker	local source = {}
42*61046927SAndroid Build Coastguard Worker	source.format = fmt
43*61046927SAndroid Build Coastguard Worker	source.w = w
44*61046927SAndroid Build Coastguard Worker	source.h = h
45*61046927SAndroid Build Coastguard Worker	source.samples = samples
46*61046927SAndroid Build Coastguard Worker	source.base = base
47*61046927SAndroid Build Coastguard Worker	source.flag = flag
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Worker	sources[base] = source
50*61046927SAndroid Build Coastguard Workerend
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Workerlocal binw
53*61046927SAndroid Build Coastguard Workerlocal binh
54*61046927SAndroid Build Coastguard Workerlocal nbins
55*61046927SAndroid Build Coastguard Workerlocal blits = 0
56*61046927SAndroid Build Coastguard Workerlocal draws = 0
57*61046927SAndroid Build Coastguard Workerlocal drawmode
58*61046927SAndroid Build Coastguard Workerlocal cleared
59*61046927SAndroid Build Coastguard Workerlocal restored
60*61046927SAndroid Build Coastguard Workerlocal resolved
61*61046927SAndroid Build Coastguard Workerlocal nullbatch
62*61046927SAndroid Build Coastguard Workerlocal depthtest
63*61046927SAndroid Build Coastguard Workerlocal depthwrite
64*61046927SAndroid Build Coastguard Workerlocal stenciltest
65*61046927SAndroid Build Coastguard Workerlocal stencilwrite
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Workerfunction reset()
68*61046927SAndroid Build Coastguard Worker	dbg("reset\n")
69*61046927SAndroid Build Coastguard Worker	mrts = {}
70*61046927SAndroid Build Coastguard Worker	sources = {}
71*61046927SAndroid Build Coastguard Worker	draws = 0
72*61046927SAndroid Build Coastguard Worker	blits = 0
73*61046927SAndroid Build Coastguard Worker	cleared = {}
74*61046927SAndroid Build Coastguard Worker	restored = {}
75*61046927SAndroid Build Coastguard Worker	resolved = {}
76*61046927SAndroid Build Coastguard Worker	depthtest = false
77*61046927SAndroid Build Coastguard Worker	depthwrite = false
78*61046927SAndroid Build Coastguard Worker	stenciltest = false
79*61046927SAndroid Build Coastguard Worker	stencilwrite = false
80*61046927SAndroid Build Coastguard Worker	drawmode = Nil
81*61046927SAndroid Build Coastguard Workerend
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Workerfunction start_submit()
84*61046927SAndroid Build Coastguard Worker	dbg("start_submit\n")
85*61046927SAndroid Build Coastguard Worker	reset()
86*61046927SAndroid Build Coastguard Worker	nullbatch = true
87*61046927SAndroid Build Coastguard Workerend
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Workerfunction finish()
90*61046927SAndroid Build Coastguard Worker	dbg("finish\n")
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker	printf("\n")
93*61046927SAndroid Build Coastguard Worker
94*61046927SAndroid Build Coastguard Worker	-- TODO we get false-positives for 'NULL BATCH!' because we don't have
95*61046927SAndroid Build Coastguard Worker	-- a really good way to differentiate between submits and cmds.  Ie.
96*61046927SAndroid Build Coastguard Worker	-- with growable cmdstream, and a large # of tiles, IB1 can get split
97*61046927SAndroid Build Coastguard Worker	-- across multiple buffers.  Since we ignore GMEM draws for window-
98*61046927SAndroid Build Coastguard Worker	-- offset != 0,0, the later cmds will appear as null batches
99*61046927SAndroid Build Coastguard Worker	if draws == 0 and blits == 0 then
100*61046927SAndroid Build Coastguard Worker		if nullbatch then
101*61046927SAndroid Build Coastguard Worker			printf("NULL BATCH!\n");
102*61046927SAndroid Build Coastguard Worker		end
103*61046927SAndroid Build Coastguard Worker		return
104*61046927SAndroid Build Coastguard Worker	end
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard Worker	if draws > 0 then
107*61046927SAndroid Build Coastguard Worker		printf("Batch:\n")
108*61046927SAndroid Build Coastguard Worker		printf("-------\n")
109*61046927SAndroid Build Coastguard Worker		printf("  # of draws: %u\n", draws)
110*61046927SAndroid Build Coastguard Worker		printf("  mode: %s\n", drawmode)
111*61046927SAndroid Build Coastguard Worker		if drawmode == "RM6_GMEM" then
112*61046927SAndroid Build Coastguard Worker			printf("  bin size: %ux%u (%u bins)\n", binw, binh, nbins)
113*61046927SAndroid Build Coastguard Worker		end
114*61046927SAndroid Build Coastguard Worker		if depthtest or depthwrite then
115*61046927SAndroid Build Coastguard Worker			printf("  ")
116*61046927SAndroid Build Coastguard Worker			if depthtest then
117*61046927SAndroid Build Coastguard Worker				printf("DEPTHTEST ")
118*61046927SAndroid Build Coastguard Worker			end
119*61046927SAndroid Build Coastguard Worker			if depthwrite then
120*61046927SAndroid Build Coastguard Worker				printf("DEPTHWRITE")
121*61046927SAndroid Build Coastguard Worker			end
122*61046927SAndroid Build Coastguard Worker			printf("\n")
123*61046927SAndroid Build Coastguard Worker		end
124*61046927SAndroid Build Coastguard Worker		if stenciltest or stencilwrite then
125*61046927SAndroid Build Coastguard Worker			printf("  ")
126*61046927SAndroid Build Coastguard Worker			if stenciltest then
127*61046927SAndroid Build Coastguard Worker				printf("STENCILTEST ")
128*61046927SAndroid Build Coastguard Worker			end
129*61046927SAndroid Build Coastguard Worker			if stencilwrite then
130*61046927SAndroid Build Coastguard Worker				printf("STENCILWRITE")
131*61046927SAndroid Build Coastguard Worker			end
132*61046927SAndroid Build Coastguard Worker			printf("\n")
133*61046927SAndroid Build Coastguard Worker		end
134*61046927SAndroid Build Coastguard Worker	else
135*61046927SAndroid Build Coastguard Worker		printf("Blit:\n")
136*61046927SAndroid Build Coastguard Worker		printf("-----\n")
137*61046927SAndroid Build Coastguard Worker	end
138*61046927SAndroid Build Coastguard Worker
139*61046927SAndroid Build Coastguard Worker	for base,mrt in pairs(mrts) do
140*61046927SAndroid Build Coastguard Worker		printf("  MRT[0x%x:0x%x]:\t%ux%u\t\t%s (%s)", base, mrt.flag, mrt.w, mrt.h, mrt.format, mrt.samples)
141*61046927SAndroid Build Coastguard Worker		if drawmode == "RM6_GMEM" then
142*61046927SAndroid Build Coastguard Worker			if cleared[mrt.gmem] then
143*61046927SAndroid Build Coastguard Worker				printf("\tCLEARED")
144*61046927SAndroid Build Coastguard Worker			end
145*61046927SAndroid Build Coastguard Worker			if restored[mrt.gmem] then
146*61046927SAndroid Build Coastguard Worker				printf("\tRESTORED")
147*61046927SAndroid Build Coastguard Worker			end
148*61046927SAndroid Build Coastguard Worker			if resolved[mrt.gmem] then
149*61046927SAndroid Build Coastguard Worker				printf("\tRESOLVED")
150*61046927SAndroid Build Coastguard Worker			end
151*61046927SAndroid Build Coastguard Worker		else
152*61046927SAndroid Build Coastguard Worker			if cleared[mrt.base] then
153*61046927SAndroid Build Coastguard Worker				printf("\tCLEARED")
154*61046927SAndroid Build Coastguard Worker			end
155*61046927SAndroid Build Coastguard Worker		end
156*61046927SAndroid Build Coastguard Worker		printf("\n")
157*61046927SAndroid Build Coastguard Worker	end
158*61046927SAndroid Build Coastguard Worker
159*61046927SAndroid Build Coastguard Worker	function print_source(source)
160*61046927SAndroid Build Coastguard Worker		printf("  SRC[0x%x:0x%x]:\t%ux%u\t\t%s (%s)\n", source.base, source.flag, source.w, source.h, source.format, source.samples)
161*61046927SAndroid Build Coastguard Worker	end
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker	for base,source in pairs(sources) do
164*61046927SAndroid Build Coastguard Worker		-- only show sources that have been previously rendered to, other
165*61046927SAndroid Build Coastguard Worker		-- textures are less interesting.  Possibly this should be an
166*61046927SAndroid Build Coastguard Worker		-- option somehow
167*61046927SAndroid Build Coastguard Worker		if draws < 10 then
168*61046927SAndroid Build Coastguard Worker			print_source(source)
169*61046927SAndroid Build Coastguard Worker		elseif allmrts[base] or draws == 0 then
170*61046927SAndroid Build Coastguard Worker			print_source(source)
171*61046927SAndroid Build Coastguard Worker		elseif source.flag and allmrts[source.flag] then
172*61046927SAndroid Build Coastguard Worker			print_source(source)
173*61046927SAndroid Build Coastguard Worker		end
174*61046927SAndroid Build Coastguard Worker	end
175*61046927SAndroid Build Coastguard Worker	reset()
176*61046927SAndroid Build Coastguard Workerend
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Workerfunction end_submit()
179*61046927SAndroid Build Coastguard Worker	dbg("end_submit\n")
180*61046927SAndroid Build Coastguard Worker	finish()
181*61046927SAndroid Build Coastguard Workerend
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker-- Track the current mode:
184*61046927SAndroid Build Coastguard Workerlocal mode = ""
185*61046927SAndroid Build Coastguard Workerfunction CP_SET_MARKER(pkt, size)
186*61046927SAndroid Build Coastguard Worker	mode = pkt[0].MARKER
187*61046927SAndroid Build Coastguard Worker	dbg("mode: %s\n", mode)
188*61046927SAndroid Build Coastguard Workerend
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Workerfunction CP_EVENT_WRITE(pkt, size)
191*61046927SAndroid Build Coastguard Worker	if tostring(pkt[0].EVENT) ~= "BLIT" then
192*61046927SAndroid Build Coastguard Worker		return
193*61046927SAndroid Build Coastguard Worker	end
194*61046927SAndroid Build Coastguard Worker	nullbatch = false
195*61046927SAndroid Build Coastguard Worker	local m = tostring(mode)
196*61046927SAndroid Build Coastguard Worker	if m == "RM6_GMEM" then
197*61046927SAndroid Build Coastguard Worker		-- either clear or restore:
198*61046927SAndroid Build Coastguard Worker		if r.RB_BLIT_INFO.CLEAR_MASK == 0 then
199*61046927SAndroid Build Coastguard Worker			restored[r.RB_BLIT_BASE_GMEM] = 1
200*61046927SAndroid Build Coastguard Worker		else
201*61046927SAndroid Build Coastguard Worker			cleared[r.RB_BLIT_BASE_GMEM] = 1
202*61046927SAndroid Build Coastguard Worker		end
203*61046927SAndroid Build Coastguard Worker		-- push_mrt() because we could have GMEM
204*61046927SAndroid Build Coastguard Worker		-- passes with only a clear and no draws:
205*61046927SAndroid Build Coastguard Worker		local flag = 0
206*61046927SAndroid Build Coastguard Worker		local sysmem = 0;
207*61046927SAndroid Build Coastguard Worker		-- try to match up the GMEM addr with the MRT/DEPTH state,
208*61046927SAndroid Build Coastguard Worker		-- to avoid relying on RB_BLIT_DST also getting written:
209*61046927SAndroid Build Coastguard Worker		for n = 0,r.RB_FS_OUTPUT_CNTL1.MRT-1 do
210*61046927SAndroid Build Coastguard Worker			if r.RB_MRT[n].BASE_GMEM == r.RB_BLIT_BASE_GMEM then
211*61046927SAndroid Build Coastguard Worker				sysmem = r.RB_MRT[n].BASE
212*61046927SAndroid Build Coastguard Worker				flag = r.RB_MRT_FLAG_BUFFER[n].ADDR
213*61046927SAndroid Build Coastguard Worker				break
214*61046927SAndroid Build Coastguard Worker			end
215*61046927SAndroid Build Coastguard Worker		end
216*61046927SAndroid Build Coastguard Worker		if sysmem == 0 and r.RB_BLIT_BASE_GMEM == r.RB_DEPTH_BUFFER_BASE_GMEM then
217*61046927SAndroid Build Coastguard Worker			sysmem = r.RB_DEPTH_BUFFER_BASE
218*61046927SAndroid Build Coastguard Worker			flag = r.RB_DEPTH_FLAG_BUFFER_BASE
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard Worker		end
221*61046927SAndroid Build Coastguard Worker		--NOTE this can get confused by previous blits:
222*61046927SAndroid Build Coastguard Worker		--if sysmem == 0 then
223*61046927SAndroid Build Coastguard Worker		--	-- fallback:
224*61046927SAndroid Build Coastguard Worker		--	sysmem = r.RB_BLIT_DST
225*61046927SAndroid Build Coastguard Worker		--	flag = r.RB_BLIT_FLAG_DST
226*61046927SAndroid Build Coastguard Worker		--end
227*61046927SAndroid Build Coastguard Worker		if not r.RB_BLIT_DST_INFO.FLAGS then
228*61046927SAndroid Build Coastguard Worker			flag = 0
229*61046927SAndroid Build Coastguard Worker		end
230*61046927SAndroid Build Coastguard Worker		-- TODO maybe just emit RB_BLIT_DST/HI for clears.. otherwise
231*61046927SAndroid Build Coastguard Worker		-- we get confused by stale values in registers.. not sure
232*61046927SAndroid Build Coastguard Worker		-- if this is a problem w/ blob
233*61046927SAndroid Build Coastguard Worker		push_mrt(r.RB_BLIT_DST_INFO.COLOR_FORMAT,
234*61046927SAndroid Build Coastguard Worker			r.RB_BLIT_SCISSOR_BR.X + 1,
235*61046927SAndroid Build Coastguard Worker			r.RB_BLIT_SCISSOR_BR.Y + 1,
236*61046927SAndroid Build Coastguard Worker			r.RB_BLIT_DST_INFO.SAMPLES,
237*61046927SAndroid Build Coastguard Worker			sysmem,
238*61046927SAndroid Build Coastguard Worker			flag,
239*61046927SAndroid Build Coastguard Worker			r.RB_BLIT_BASE_GMEM)
240*61046927SAndroid Build Coastguard Worker	elseif m == "RM6_RESOLVE" then
241*61046927SAndroid Build Coastguard Worker		resolved[r.RB_BLIT_BASE_GMEM] = 1
242*61046927SAndroid Build Coastguard Worker	else
243*61046927SAndroid Build Coastguard Worker		printf("I am confused!!!\n")
244*61046927SAndroid Build Coastguard Worker	end
245*61046927SAndroid Build Coastguard Workerend
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Workerfunction A6XX_TEX_CONST(pkt, size)
248*61046927SAndroid Build Coastguard Worker	push_source(pkt[0].FMT,
249*61046927SAndroid Build Coastguard Worker		pkt[1].WIDTH, pkt[1].HEIGHT,
250*61046927SAndroid Build Coastguard Worker		pkt[0].SAMPLES,
251*61046927SAndroid Build Coastguard Worker		pkt[4].BASE_LO | (pkt[5].BASE_HI << 32),
252*61046927SAndroid Build Coastguard Worker		pkt[7].FLAG_LO | (pkt[8].FLAG_HI << 32))
253*61046927SAndroid Build Coastguard Workerend
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Workerfunction handle_blit()
256*61046927SAndroid Build Coastguard Worker	-- blob sometimes uses CP_BLIT for resolves, so filter those out:
257*61046927SAndroid Build Coastguard Worker	-- TODO it would be nice to not hard-code GMEM addr:
258*61046927SAndroid Build Coastguard Worker	-- TODO I guess the src can be an offset from GMEM addr..
259*61046927SAndroid Build Coastguard Worker	if r.SP_PS_2D_SRC == 0x100000 and not r.RB_2D_BLIT_CNTL.SOLID_COLOR then
260*61046927SAndroid Build Coastguard Worker		resolved[0] = 1
261*61046927SAndroid Build Coastguard Worker		return
262*61046927SAndroid Build Coastguard Worker	end
263*61046927SAndroid Build Coastguard Worker	if draws > 0 then
264*61046927SAndroid Build Coastguard Worker		finish()
265*61046927SAndroid Build Coastguard Worker	end
266*61046927SAndroid Build Coastguard Worker	reset()
267*61046927SAndroid Build Coastguard Worker	drawmode = "BLIT"
268*61046927SAndroid Build Coastguard Worker	-- This kinda assumes that we are doing full img blits, which is maybe
269*61046927SAndroid Build Coastguard Worker	-- Not completely legit.  We could perhaps instead just track pitch and
270*61046927SAndroid Build Coastguard Worker	-- size/pitch??  Or maybe the size doesn't matter much
271*61046927SAndroid Build Coastguard Worker	push_mrt(r.RB_2D_DST_INFO.COLOR_FORMAT,
272*61046927SAndroid Build Coastguard Worker		r.GRAS_2D_DST_BR.X + 1,
273*61046927SAndroid Build Coastguard Worker		r.GRAS_2D_DST_BR.Y + 1,
274*61046927SAndroid Build Coastguard Worker		"MSAA_ONE",
275*61046927SAndroid Build Coastguard Worker		r.RB_2D_DST,
276*61046927SAndroid Build Coastguard Worker		r.RB_2D_DST_FLAGS,
277*61046927SAndroid Build Coastguard Worker		-1)
278*61046927SAndroid Build Coastguard Worker	if r.RB_2D_BLIT_CNTL.SOLID_COLOR then
279*61046927SAndroid Build Coastguard Worker		dbg("CLEAR=%x\n", r.RB_2D_DST)
280*61046927SAndroid Build Coastguard Worker		cleared[r.RB_2D_DST] = 1
281*61046927SAndroid Build Coastguard Worker	else
282*61046927SAndroid Build Coastguard Worker		push_source(r.SP_2D_SRC_FORMAT.COLOR_FORMAT,
283*61046927SAndroid Build Coastguard Worker			r.GRAS_2D_SRC_BR_X.X + 1,
284*61046927SAndroid Build Coastguard Worker			r.GRAS_2D_SRC_BR_Y.Y + 1,
285*61046927SAndroid Build Coastguard Worker			"MSAA_ONE",
286*61046927SAndroid Build Coastguard Worker			r.SP_PS_2D_SRC,
287*61046927SAndroid Build Coastguard Worker			r.SP_PS_2D_SRC_FLAGS)
288*61046927SAndroid Build Coastguard Worker	end
289*61046927SAndroid Build Coastguard Worker	blits = blits + 1
290*61046927SAndroid Build Coastguard Worker	finish()
291*61046927SAndroid Build Coastguard Workerend
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Workerfunction valid_transition(curmode, newmode)
294*61046927SAndroid Build Coastguard Worker	if curmode == "RM6_BINNING" and newmode == "RM6_GMEM" then
295*61046927SAndroid Build Coastguard Worker		return true
296*61046927SAndroid Build Coastguard Worker	end
297*61046927SAndroid Build Coastguard Worker	if curmode == "RM6_GMEM" and newmode == "RM6_RESOLVE" then
298*61046927SAndroid Build Coastguard Worker		return true
299*61046927SAndroid Build Coastguard Worker	end
300*61046927SAndroid Build Coastguard Worker	return false
301*61046927SAndroid Build Coastguard Workerend
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Workerfunction draw(primtype, nindx)
304*61046927SAndroid Build Coastguard Worker	dbg("draw: %s (%s)\n", primtype, mode)
305*61046927SAndroid Build Coastguard Worker	nullbatch = false
306*61046927SAndroid Build Coastguard Worker	if primtype == "BLIT_OP_SCALE" then
307*61046927SAndroid Build Coastguard Worker		handle_blit()
308*61046927SAndroid Build Coastguard Worker		return
309*61046927SAndroid Build Coastguard Worker	elseif primtype == "EVENT:BLIT" then
310*61046927SAndroid Build Coastguard Worker		return
311*61046927SAndroid Build Coastguard Worker	end
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker	local m = tostring(mode)
314*61046927SAndroid Build Coastguard Worker
315*61046927SAndroid Build Coastguard Worker	-- detect changes in drawmode which indicate a different
316*61046927SAndroid Build Coastguard Worker	-- pass..  BINNING->GMEM means same pass, but other
317*61046927SAndroid Build Coastguard Worker	-- transitions mean different pass:
318*61046927SAndroid Build Coastguard Worker	if drawmode and m ~= drawmode then
319*61046927SAndroid Build Coastguard Worker		dbg("%s -> %s transition\n", drawmode, m)
320*61046927SAndroid Build Coastguard Worker		if not valid_transition(drawmode, m) then
321*61046927SAndroid Build Coastguard Worker			dbg("invalid transition, new render pass!\n")
322*61046927SAndroid Build Coastguard Worker			finish()
323*61046927SAndroid Build Coastguard Worker			reset()
324*61046927SAndroid Build Coastguard Worker		end
325*61046927SAndroid Build Coastguard Worker	end
326*61046927SAndroid Build Coastguard Worker
327*61046927SAndroid Build Coastguard Worker	if m ~= "RM6_GMEM" and m ~= "RM6_BYPASS" then
328*61046927SAndroid Build Coastguard Worker		if m == "RM6_BINNING" then
329*61046927SAndroid Build Coastguard Worker			drawmode = m
330*61046927SAndroid Build Coastguard Worker			return
331*61046927SAndroid Build Coastguard Worker		end
332*61046927SAndroid Build Coastguard Worker		if m == "RM6_RESOLVE" and primtype == "EVENT:BLIT" then
333*61046927SAndroid Build Coastguard Worker			return
334*61046927SAndroid Build Coastguard Worker		end
335*61046927SAndroid Build Coastguard Worker		if m == "RM6_BLIT2DSCALE" and primtype == "EVENT:LRZ_CLEAR" then
336*61046927SAndroid Build Coastguard Worker			return
337*61046927SAndroid Build Coastguard Worker		end
338*61046927SAndroid Build Coastguard Worker		printf("unknown MODE %s for primtype %s\n", m, primtype)
339*61046927SAndroid Build Coastguard Worker		return
340*61046927SAndroid Build Coastguard Worker	end
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker	-- Only count the first tile for GMEM mode to avoid counting
343*61046927SAndroid Build Coastguard Worker	-- each draw for each tile
344*61046927SAndroid Build Coastguard Worker	if m == "RM6_GMEM" then
345*61046927SAndroid Build Coastguard Worker		if r.RB_WINDOW_OFFSET.X ~= 0 or r.RB_WINDOW_OFFSET.Y ~= 0 then
346*61046927SAndroid Build Coastguard Worker			return
347*61046927SAndroid Build Coastguard Worker		end
348*61046927SAndroid Build Coastguard Worker	end
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker	drawmode = m
351*61046927SAndroid Build Coastguard Worker	local render_components = {}
352*61046927SAndroid Build Coastguard Worker	render_components[0] = r.RB_RENDER_COMPONENTS.RT0;
353*61046927SAndroid Build Coastguard Worker	render_components[1] = r.RB_RENDER_COMPONENTS.RT1;
354*61046927SAndroid Build Coastguard Worker	render_components[2] = r.RB_RENDER_COMPONENTS.RT2;
355*61046927SAndroid Build Coastguard Worker	render_components[3] = r.RB_RENDER_COMPONENTS.RT3;
356*61046927SAndroid Build Coastguard Worker	render_components[4] = r.RB_RENDER_COMPONENTS.RT4;
357*61046927SAndroid Build Coastguard Worker	render_components[5] = r.RB_RENDER_COMPONENTS.RT5;
358*61046927SAndroid Build Coastguard Worker	render_components[6] = r.RB_RENDER_COMPONENTS.RT6;
359*61046927SAndroid Build Coastguard Worker	render_components[7] = r.RB_RENDER_COMPONENTS.RT7;
360*61046927SAndroid Build Coastguard Worker	for n = 0,r.RB_FS_OUTPUT_CNTL1.MRT-1 do
361*61046927SAndroid Build Coastguard Worker		if render_components[n] ~= 0 then
362*61046927SAndroid Build Coastguard Worker			push_mrt(r.RB_MRT[n].BUF_INFO.COLOR_FORMAT,
363*61046927SAndroid Build Coastguard Worker				r.GRAS_SC_SCREEN_SCISSOR[0].BR.X + 1,
364*61046927SAndroid Build Coastguard Worker				r.GRAS_SC_SCREEN_SCISSOR[0].BR.Y + 1,
365*61046927SAndroid Build Coastguard Worker				r.RB_BLIT_GMEM_MSAA_CNTL.SAMPLES,
366*61046927SAndroid Build Coastguard Worker				r.RB_MRT[n].BASE,
367*61046927SAndroid Build Coastguard Worker				r.RB_MRT_FLAG_BUFFER[n].ADDR,
368*61046927SAndroid Build Coastguard Worker				r.RB_MRT[n].BASE_GMEM)
369*61046927SAndroid Build Coastguard Worker		end
370*61046927SAndroid Build Coastguard Worker	end
371*61046927SAndroid Build Coastguard Worker
372*61046927SAndroid Build Coastguard Worker	local depthbase = r.RB_DEPTH_BUFFER_BASE
373*61046927SAndroid Build Coastguard Worker
374*61046927SAndroid Build Coastguard Worker	if depthbase ~= 0 then
375*61046927SAndroid Build Coastguard Worker		push_mrt(r.RB_DEPTH_BUFFER_INFO.DEPTH_FORMAT,
376*61046927SAndroid Build Coastguard Worker			r.GRAS_SC_SCREEN_SCISSOR[0].BR.X + 1,
377*61046927SAndroid Build Coastguard Worker			r.GRAS_SC_SCREEN_SCISSOR[0].BR.Y + 1,
378*61046927SAndroid Build Coastguard Worker			r.RB_BLIT_GMEM_MSAA_CNTL.SAMPLES,
379*61046927SAndroid Build Coastguard Worker			depthbase,
380*61046927SAndroid Build Coastguard Worker			r.RB_DEPTH_FLAG_BUFFER_BASE,
381*61046927SAndroid Build Coastguard Worker			r.RB_DEPTH_BUFFER_BASE_GMEM)
382*61046927SAndroid Build Coastguard Worker	end
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker	if r.RB_DEPTH_CNTL.Z_WRITE_ENABLE then
385*61046927SAndroid Build Coastguard Worker		depthwrite = true
386*61046927SAndroid Build Coastguard Worker	end
387*61046927SAndroid Build Coastguard Worker
388*61046927SAndroid Build Coastguard Worker	if r.RB_DEPTH_CNTL.Z_TEST_ENABLE then
389*61046927SAndroid Build Coastguard Worker		depthtest = true
390*61046927SAndroid Build Coastguard Worker	end
391*61046927SAndroid Build Coastguard Worker
392*61046927SAndroid Build Coastguard Worker	-- clearly 0 != false.. :-/
393*61046927SAndroid Build Coastguard Worker	if r.RB_STENCILWRMASK.WRMASK ~= 0 then
394*61046927SAndroid Build Coastguard Worker		stencilwrite = true
395*61046927SAndroid Build Coastguard Worker	end
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker	if r.RB_STENCIL_CONTROL.STENCIL_ENABLE then
398*61046927SAndroid Build Coastguard Worker		stenciltest = true
399*61046927SAndroid Build Coastguard Worker	end
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker	-- TODO should also check for stencil buffer for z32+s8 case
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker	if m == "RM6_GMEM" then
404*61046927SAndroid Build Coastguard Worker		binw = r.VSC_BIN_SIZE.WIDTH
405*61046927SAndroid Build Coastguard Worker		binh = r.VSC_BIN_SIZE.HEIGHT
406*61046927SAndroid Build Coastguard Worker		nbins = r.VSC_BIN_COUNT.NX * r.VSC_BIN_COUNT.NY
407*61046927SAndroid Build Coastguard Worker	end
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker	draws = draws + 1
410*61046927SAndroid Build Coastguard Workerend
411*61046927SAndroid Build Coastguard Worker
412