xref: /aosp_15_r20/external/mesa3d/src/freedreno/decode/scripts/tex3d-layout.lua (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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