1*61046927SAndroid Build Coastguard Worker-- Parse logs from test-quad-textured-3d.c to exctract layer/level 2*61046927SAndroid Build Coastguard Worker-- offsets 3*61046927SAndroid Build Coastguard Worker-- 4*61046927SAndroid Build Coastguard Worker-- We figure out the offsets from blits, but there may be some 5*61046927SAndroid Build Coastguard Worker-- unrelated blits. So just save all of them until we find the 6*61046927SAndroid Build Coastguard Worker-- texture state for the 3d texture. This gives us the base 7*61046927SAndroid Build Coastguard Worker-- address, and the miplevel #0 width/height/depth. Then work 8*61046927SAndroid Build Coastguard Worker-- backwards from there finding the blits to the same dst buffer 9*61046927SAndroid Build Coastguard Worker-- and deducing the miplevel from the minified dimensions 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Workerlocal posix = require "posix" 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Workerio.write("Analyzing Data...\n") 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Workerlocal allblits = {} 16*61046927SAndroid Build Coastguard Workerlocal nallblits = 0 17*61046927SAndroid Build Coastguard Workerlocal r = rnn.init("a630") 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard Workerfunction minify(val, lvls) 20*61046927SAndroid Build Coastguard Worker val = val >> lvls 21*61046927SAndroid Build Coastguard Worker if val < 1 then 22*61046927SAndroid Build Coastguard Worker return 1 23*61046927SAndroid Build Coastguard Worker end 24*61046927SAndroid Build Coastguard Worker return val 25*61046927SAndroid Build Coastguard Workerend 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Workerfunction printf(fmt, ...) 28*61046927SAndroid Build Coastguard Worker return io.write(string.format(fmt, ...)) 29*61046927SAndroid Build Coastguard Workerend 30*61046927SAndroid Build Coastguard Worker 31*61046927SAndroid Build Coastguard Workerfunction start_cmdstream(name) 32*61046927SAndroid Build Coastguard Worker io.write("Parsing " .. name .. "\n") 33*61046927SAndroid Build Coastguard Worker allblits = {} 34*61046927SAndroid Build Coastguard Worker nallblits = 0 35*61046927SAndroid Build Coastguard Workerend 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Workerfunction draw(primtype, nindx) 38*61046927SAndroid Build Coastguard Worker if primtype ~= "BLIT_OP_SCALE" then 39*61046927SAndroid Build Coastguard Worker return 40*61046927SAndroid Build Coastguard Worker end 41*61046927SAndroid Build Coastguard Worker 42*61046927SAndroid Build Coastguard Worker -- Just in case, filter out anything that isn't starting 43*61046927SAndroid Build Coastguard Worker -- at 0,0 44*61046927SAndroid Build Coastguard Worker if r.GRAS_2D_DST_TL.X ~= 0 or r.GRAS_2D_DST_TL.Y ~= 0 then 45*61046927SAndroid Build Coastguard Worker return 46*61046927SAndroid Build Coastguard Worker end 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker local blit = {} 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker blit.width = r.GRAS_2D_DST_BR.X + 1 51*61046927SAndroid Build Coastguard Worker blit.height = r.GRAS_2D_DST_BR.Y + 1 52*61046927SAndroid Build Coastguard Worker blit.pitch = r.RB_2D_DST_SIZE.PITCH 53*61046927SAndroid Build Coastguard Worker blit.addr = r.RB_2D_DST_LO | (r.RB_2D_DST_HI << 32) 54*61046927SAndroid Build Coastguard Worker blit.base = bos.base(blit.addr) 55*61046927SAndroid Build Coastguard Worker blit.endaddr = 0 -- filled in later 56*61046927SAndroid Build Coastguard Worker --printf("Found blit: 0x%x (0x%x)\n", blit.addr, blit.base) 57*61046927SAndroid Build Coastguard Worker 58*61046927SAndroid Build Coastguard Worker allblits[nallblits] = blit 59*61046927SAndroid Build Coastguard Worker nallblits = nallblits + 1 60*61046927SAndroid Build Coastguard Workerend 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Workerfunction A6XX_TEX_CONST(pkt, size) 63*61046927SAndroid Build Coastguard Worker -- ignore any texture state w/ DEPTH=1, these aren't the 3d tex state we 64*61046927SAndroid Build Coastguard Worker -- are looking for 65*61046927SAndroid Build Coastguard Worker if pkt[5].DEPTH <= 1 then 66*61046927SAndroid Build Coastguard Worker return 67*61046927SAndroid Build Coastguard Worker end 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker local base = pkt[4].BASE_LO | (pkt[5].BASE_HI << 32) 70*61046927SAndroid Build Coastguard Worker local width0 = pkt[1].WIDTH 71*61046927SAndroid Build Coastguard Worker local height0 = pkt[1].HEIGHT 72*61046927SAndroid Build Coastguard Worker local depth0 = pkt[5].DEPTH 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker printf("Found texture state: %ux%ux%u (MIN_LAYERSZ=0x%x)\n", 75*61046927SAndroid Build Coastguard Worker width0, height0, depth0, pkt[3].MIN_LAYERSZ) 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Worker -- Note that in some case the texture has some extra page or so 78*61046927SAndroid Build Coastguard Worker -- at the beginning: 79*61046927SAndroid Build Coastguard Worker local basebase = bos.base(base) 80*61046927SAndroid Build Coastguard Worker printf("base: 0x%x (0x%x)\n", base, basebase) 81*61046927SAndroid Build Coastguard Worker 82*61046927SAndroid Build Coastguard Worker -- see if we can find the associated blits.. The blob always seems to 83*61046927SAndroid Build Coastguard Worker -- start from the lower (larger) mipmap levels and layers, so we don't 84*61046927SAndroid Build Coastguard Worker -- need to sort by dst address. Also, while we are at it, fill in the 85*61046927SAndroid Build Coastguard Worker -- end-addr (at least for everything but the last blit) 86*61046927SAndroid Build Coastguard Worker local blits = {} 87*61046927SAndroid Build Coastguard Worker local nblits = 0 88*61046927SAndroid Build Coastguard Worker local lastblit = nil 89*61046927SAndroid Build Coastguard Worker for n = 0,nallblits-1 do 90*61046927SAndroid Build Coastguard Worker local blit = allblits[n] 91*61046927SAndroid Build Coastguard Worker --printf("blit addr: 0x%x (0x%x)\n", blit.addr, blit.base) 92*61046927SAndroid Build Coastguard Worker if blit.base == basebase and blit.addr >= base then 93*61046927SAndroid Build Coastguard Worker blits[nblits] = blit 94*61046927SAndroid Build Coastguard Worker nblits = nblits + 1 95*61046927SAndroid Build Coastguard Worker if lastblit then 96*61046927SAndroid Build Coastguard Worker lastblit.endaddr = blit.addr 97*61046927SAndroid Build Coastguard Worker end 98*61046927SAndroid Build Coastguard Worker lastblit = blit 99*61046927SAndroid Build Coastguard Worker end 100*61046927SAndroid Build Coastguard Worker end 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker -- now go thru the relevant blits and print out interesting details 103*61046927SAndroid Build Coastguard Worker local level = 0 104*61046927SAndroid Build Coastguard Worker local layer = 0 105*61046927SAndroid Build Coastguard Worker local w = width0 -- track current width/height to detect changing 106*61046927SAndroid Build Coastguard Worker local h = height0 -- mipmap level 107*61046927SAndroid Build Coastguard Worker for n = 0,nblits-1 do 108*61046927SAndroid Build Coastguard Worker local blit = blits[n] 109*61046927SAndroid Build Coastguard Worker --printf("%u: %ux%u, addr=%x\n", n, blit.width, blit.height, blit.addr) 110*61046927SAndroid Build Coastguard Worker if w ~= blit.width or h ~= blit.height then 111*61046927SAndroid Build Coastguard Worker level = level + 1 112*61046927SAndroid Build Coastguard Worker layer = 0 113*61046927SAndroid Build Coastguard Worker 114*61046927SAndroid Build Coastguard Worker if blit.width ~= minify(w, 1) or blit.height ~= minify(h, 1) then 115*61046927SAndroid Build Coastguard Worker printf("I am confused! %ux%u vs %ux%u\n", blit.width, blit.height, minify(w, 1), minify(h, 1)) 116*61046927SAndroid Build Coastguard Worker printf("addr=%x\n", blit.addr) 117*61046927SAndroid Build Coastguard Worker --return 118*61046927SAndroid Build Coastguard Worker end 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker w = blit.width 121*61046927SAndroid Build Coastguard Worker h = blit.height 122*61046927SAndroid Build Coastguard Worker end 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker printf("level=%u, layer=%u, sz=%ux%u, pitch=%u, offset=0x%x, addr=%x", 125*61046927SAndroid Build Coastguard Worker level, layer, w, h, blit.pitch, blit.addr - base, blit.addr) 126*61046927SAndroid Build Coastguard Worker if blit.endaddr ~= 0 then 127*61046927SAndroid Build Coastguard Worker local layersz = blit.endaddr - blit.addr 128*61046927SAndroid Build Coastguard Worker local alignedheight = layersz / blit.pitch 129*61046927SAndroid Build Coastguard Worker printf(", layersz=0x%x, alignedheight=%f", layersz, alignedheight) 130*61046927SAndroid Build Coastguard Worker end 131*61046927SAndroid Build Coastguard Worker printf("\n") 132*61046927SAndroid Build Coastguard Worker 133*61046927SAndroid Build Coastguard Worker layer = layer + 1 134*61046927SAndroid Build Coastguard Worker end 135*61046927SAndroid Build Coastguard Worker printf("\n\n") 136*61046927SAndroid Build Coastguard Workerend 137*61046927SAndroid Build Coastguard Worker 138