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