blob: 2d5069f09ac896685fc8f168679ff7fce27796cd [file] [log] [blame] [edit]
-- Parse logs from test-quad-textured-3d.c to exctract layer/level
-- offsets
--
-- We figure out the offsets from blits, but there may be some
-- unrelated blits. So just save all of them until we find the
-- texture state for the 3d texture. This gives us the base
-- address, and the miplevel #0 width/height/depth. Then work
-- backwards from there finding the blits to the same dst buffer
-- and deducing the miplevel from the minified dimensions
local posix = require "posix"
io.write("Analyzing Data...\n")
local allblits = {}
local nallblits = 0
local r = rnn.init("a630")
function minify(val, lvls)
val = val >> lvls
if val < 1 then
return 1
end
return val
end
function printf(fmt, ...)
return io.write(string.format(fmt, ...))
end
function start_cmdstream(name)
io.write("Parsing " .. name .. "\n")
allblits = {}
nallblits = 0
end
function draw(primtype, nindx)
if primtype ~= "BLIT_OP_SCALE" then
return
end
-- Just in case, filter out anything that isn't starting
-- at 0,0
if r.GRAS_2D_DST_TL.X ~= 0 or r.GRAS_2D_DST_TL.Y ~= 0 then
return
end
local blit = {}
blit.width = r.GRAS_2D_DST_BR.X + 1
blit.height = r.GRAS_2D_DST_BR.Y + 1
blit.pitch = r.RB_2D_DST_SIZE.PITCH
blit.addr = r.RB_2D_DST_LO | (r.RB_2D_DST_HI << 32)
blit.base = bos.base(blit.addr)
blit.endaddr = 0 -- filled in later
--printf("Found blit: 0x%x (0x%x)\n", blit.addr, blit.base)
allblits[nallblits] = blit
nallblits = nallblits + 1
end
function A6XX_TEX_CONST(pkt, size)
-- ignore any texture state w/ DEPTH=1, these aren't the 3d tex state we
-- are looking for
if pkt[5].DEPTH <= 1 then
return
end
local base = pkt[4].BASE_LO | (pkt[5].BASE_HI << 32)
local width0 = pkt[1].WIDTH
local height0 = pkt[1].HEIGHT
local depth0 = pkt[5].DEPTH
printf("Found texture state: %ux%ux%u (MIN_LAYERSZ=0x%x)\n",
width0, height0, depth0, pkt[3].MIN_LAYERSZ)
-- Note that in some case the texture has some extra page or so
-- at the beginning:
local basebase = bos.base(base)
printf("base: 0x%x (0x%x)\n", base, basebase)
-- see if we can find the associated blits.. The blob always seems to
-- start from the lower (larger) mipmap levels and layers, so we don't
-- need to sort by dst address. Also, while we are at it, fill in the
-- end-addr (at least for everything but the last blit)
local blits = {}
local nblits = 0
local lastblit = nil
for n = 0,nallblits-1 do
local blit = allblits[n]
--printf("blit addr: 0x%x (0x%x)\n", blit.addr, blit.base)
if blit.base == basebase and blit.addr >= base then
blits[nblits] = blit
nblits = nblits + 1
if lastblit then
lastblit.endaddr = blit.addr
end
lastblit = blit
end
end
-- now go thru the relevant blits and print out interesting details
local level = 0
local layer = 0
local w = width0 -- track current width/height to detect changing
local h = height0 -- mipmap level
for n = 0,nblits-1 do
local blit = blits[n]
--printf("%u: %ux%u, addr=%x\n", n, blit.width, blit.height, blit.addr)
if w ~= blit.width or h ~= blit.height then
level = level + 1
layer = 0
if blit.width ~= minify(w, 1) or blit.height ~= minify(h, 1) then
printf("I am confused! %ux%u vs %ux%u\n", blit.width, blit.height, minify(w, 1), minify(h, 1))
printf("addr=%x\n", blit.addr)
--return
end
w = blit.width
h = blit.height
end
printf("level=%u, layer=%u, sz=%ux%u, pitch=%u, offset=0x%x, addr=%x",
level, layer, w, h, blit.pitch, blit.addr - base, blit.addr)
if blit.endaddr ~= 0 then
local layersz = blit.endaddr - blit.addr
local alignedheight = layersz / blit.pitch
printf(", layersz=0x%x, alignedheight=%f", layersz, alignedheight)
end
printf("\n")
layer = layer + 1
end
printf("\n\n")
end