~mmach/netext73/mesa-haswell

« back to all changes in this revision

Viewing changes to src/freedreno/decode/scripts/analyze.lua

  • Committer: mmach
  • Date: 2022-09-22 19:56:13 UTC
  • Revision ID: netbit73@gmail.com-20220922195613-wtik9mmy20tmor0i
2022-09-22 21:17:09

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
--
2
 
--
3
 
--
4
 
 
5
 
local posix = require "posix"
6
 
 
7
 
io.write("Analyzing Data...\n")
8
 
 
9
 
local results = {}
10
 
 
11
 
local test = nil
12
 
local gpuname = nil
13
 
local testname = nil
14
 
 
15
 
 
16
 
function tblsz(tbl)
17
 
  local n = 0;
18
 
  for k,v in pairs(tbl) do
19
 
    n = n + 1
20
 
  end
21
 
  return n
22
 
end
23
 
 
24
 
 
25
 
function start_cmdstream(name)
26
 
  testname = posix.basename(name)
27
 
  gpuname = posix.basename(posix.dirname(name))
28
 
  --io.write("START: gpuname=" .. gpuname .. ", testname=" .. testname .. "\n");
29
 
  local gpu = results[gpuname]
30
 
  if gpu == nil then
31
 
    gpu = {["tests"] = {}, ["regvals"] = {}}
32
 
    results[gpuname] = gpu
33
 
  end
34
 
  test = {["draws"] = {}}
35
 
  gpu["tests"][testname] = test
36
 
end
37
 
 
38
 
function draw(primtype, nindx)
39
 
  -- RECTLIST is only used internally.. we want to ignore it for
40
 
  -- now, although it could potentially be interesting to track
41
 
  -- these separately (separating clear/restore/resolve) just to
42
 
  -- figure out which registers are used for which..
43
 
  if primtype == "DI_PT_RECTLIST" then
44
 
    return
45
 
  end
46
 
  local regtbl = {}
47
 
  local draw = {["primtype"] = primtype, ["regs"] = regtbl}
48
 
  local didx = tblsz(test["draws"])
49
 
 
50
 
  test["draws"][didx] = draw
51
 
 
52
 
  -- populate current regs.  For now just consider ones that have
53
 
  -- been written.. maybe we need to make that configurable in
54
 
  -- case it filters out too many registers.
55
 
  for regbase=0,0xffff do
56
 
    if regs.written(regbase) ~= 0 then
57
 
      local regval = regs.val(regbase)
58
 
 
59
 
      -- track reg vals per draw:
60
 
      regtbl[regbase] = regval
61
 
 
62
 
      -- also track which reg vals appear in which tests:
63
 
      local uniq_regvals = results[gpuname]["regvals"][regbase]
64
 
      if uniq_regvals == nil then
65
 
        uniq_regvals = {}
66
 
        results[gpuname]["regvals"][regbase] = uniq_regvals;
67
 
      end
68
 
      local drawlist = uniq_regvals[regval]
69
 
      if drawlist == nil then
70
 
        drawlist = {}
71
 
        uniq_regvals[regval] = drawlist
72
 
      end
73
 
      table.insert(drawlist, testname .. "." .. didx)
74
 
    end
75
 
  end
76
 
 
77
 
  -- TODO maybe we want to whitelist a few well known regs, for the
78
 
  -- convenience of the code that runs at the end to analyze the data?
79
 
  -- TODO also would be useful to somehow capture CP_SET_BIN..
80
 
 
81
 
end
82
 
 
83
 
function end_cmdstream()
84
 
  test = nil
85
 
  gpuname = nil
86
 
  testname = nil
87
 
end
88
 
 
89
 
function print_draws(gpuname, gpu)
90
 
  io.write("  " .. gpuname .. "\n")
91
 
  for testname,test in pairs(gpu["tests"]) do
92
 
    io.write("    " .. testname .. ", draws=" .. #test["draws"] .. "\n")
93
 
    for didx,draw in pairs(test["draws"]) do
94
 
      io.write("      " .. didx .. ": " .. draw["primtype"] .. "\n")
95
 
    end
96
 
  end
97
 
end
98
 
 
99
 
function drawlistname(drawlist)
100
 
  local name = nil
101
 
  for idx,draw in pairs(drawlist) do
102
 
    if name == nil then
103
 
      name = draw
104
 
    else
105
 
      name = name .. ":" .. draw
106
 
    end
107
 
  end
108
 
  return name
109
 
end
110
 
 
111
 
local rnntbl = {}
112
 
 
113
 
function dumpmatches(name)
114
 
  for gpuname,gpu in pairs(results) do
115
 
    local r = rnntbl[gpuname]
116
 
    if r == nil then
117
 
      io.write("loading rnn database: \n" .. gpuname)
118
 
      r = rnn.init(gpuname)
119
 
      rnntbl[gpuname] = r
120
 
    end
121
 
    for regbase,regvals in pairs(gpu["regvals"]) do
122
 
      for regval,drawlist in pairs(regvals) do
123
 
        local name2 = drawlistname(drawlist)
124
 
        if name == name2 then
125
 
          io.write(string.format("  %s:%s:\t%08x  %s\n",
126
 
                                 gpuname, rnn.regname(r, regbase),
127
 
                                 regval, rnn.regval(r, regbase, regval)))
128
 
        end
129
 
      end
130
 
    end
131
 
  end
132
 
end
133
 
 
134
 
function finish()
135
 
  -- drawlistnames that we've already dumped:
136
 
  local dumped = {}
137
 
 
138
 
  for gpuname,gpu in pairs(results) do
139
 
    -- print_draws(gpuname, gpu)
140
 
    for regbase,regvals in pairs(gpu["regvals"]) do
141
 
      for regval,drawlist in pairs(regvals) do
142
 
        local name = drawlistname(drawlist)
143
 
        if dumped[name] == nil then
144
 
          io.write("\n" .. name .. ":\n")
145
 
          dumpmatches(name)
146
 
          dumped[name] = 1
147
 
        end
148
 
      end
149
 
    end
150
 
  end
151
 
end
152