Path: blob/21.2-virgl/src/freedreno/decode/scripts/analyze.lua
4573 views
-- A script that compares a set of equivalent cmdstream captures from1-- various generations, looking for equivalencies between registers.2--3-- This would be run across a group of similar tests for various4-- generations, for example:5--6-- cffdump --script scripts/analyze.lua a320/quad-flat-*.rd a420/quad-flat-*.rd7--8-- This is done by comparing unique register values. Ie. for each9-- generation, find the set of registers that have different values10-- between equivalent draw calls.1112local posix = require "posix"1314io.write("Analyzing Data...\n")1516-- results - table structure:17-- * [gpuname] - gpu18-- * tests19-- * [testname] - current test20-- * draws21-- * [1..n] - the draws22-- * primtype - the primitive type23-- * regs - table of values for draw24-- * [regbase] - regval25-- * regvals - table of unique values across all draws26-- * [regbase]27-- * [regval] - list of test names28-- * [1..n] - testname "." didx29local results = {}3031local test = nil32local gpuname = nil33local testname = nil343536-- srsly, no sparse table size() op?37function tblsz(tbl)38local n = 0;39for k,v in pairs(tbl) do40n = n + 141end42return n43end444546function start_cmdstream(name)47testname = posix.basename(name)48gpuname = posix.basename(posix.dirname(name))49--io.write("START: gpuname=" .. gpuname .. ", testname=" .. testname .. "\n");50local gpu = results[gpuname]51if gpu == nil then52gpu = {["tests"] = {}, ["regvals"] = {}}53results[gpuname] = gpu54end55test = {["draws"] = {}}56gpu["tests"][testname] = test57end5859function draw(primtype, nindx)60-- RECTLIST is only used internally.. we want to ignore it for61-- now, although it could potentially be interesting to track62-- these separately (separating clear/restore/resolve) just to63-- figure out which registers are used for which..64if primtype == "DI_PT_RECTLIST" then65return66end67local regtbl = {}68local draw = {["primtype"] = primtype, ["regs"] = regtbl}69local didx = tblsz(test["draws"])7071test["draws"][didx] = draw7273-- populate current regs. For now just consider ones that have74-- been written.. maybe we need to make that configurable in75-- case it filters out too many registers.76for regbase=0,0xffff do77if regs.written(regbase) ~= 0 then78local regval = regs.val(regbase)7980-- track reg vals per draw:81regtbl[regbase] = regval8283-- also track which reg vals appear in which tests:84local uniq_regvals = results[gpuname]["regvals"][regbase]85if uniq_regvals == nil then86uniq_regvals = {}87results[gpuname]["regvals"][regbase] = uniq_regvals;88end89local drawlist = uniq_regvals[regval]90if drawlist == nil then91drawlist = {}92uniq_regvals[regval] = drawlist93end94table.insert(drawlist, testname .. "." .. didx)95end96end9798-- TODO maybe we want to whitelist a few well known regs, for the99-- convenience of the code that runs at the end to analyze the data?100-- TODO also would be useful to somehow capture CP_SET_BIN..101102end103104function end_cmdstream()105test = nil106gpuname = nil107testname = nil108end109110function print_draws(gpuname, gpu)111io.write(" " .. gpuname .. "\n")112for testname,test in pairs(gpu["tests"]) do113io.write(" " .. testname .. ", draws=" .. #test["draws"] .. "\n")114for didx,draw in pairs(test["draws"]) do115io.write(" " .. didx .. ": " .. draw["primtype"] .. "\n")116end117end118end119120-- sort and concat a list of draw names to form a key which can be121-- compared to other drawlists to check for equality122-- TODO maybe we instead want a scheme that allows for some fuzzyness123-- in the matching??124function drawlistname(drawlist)125local name = nil126for idx,draw in pairs(drawlist) do127if name == nil then128name = draw129else130name = name .. ":" .. draw131end132end133return name134end135136local rnntbl = {}137138function dumpmatches(name)139for gpuname,gpu in pairs(results) do140local r = rnntbl[gpuname]141if r == nil then142io.write("loading rnn database: \n" .. gpuname)143r = rnn.init(gpuname)144rnntbl[gpuname] = r145end146for regbase,regvals in pairs(gpu["regvals"]) do147for regval,drawlist in pairs(regvals) do148local name2 = drawlistname(drawlist)149if name == name2 then150io.write(string.format(" %s:%s:\t%08x %s\n",151gpuname, rnn.regname(r, regbase),152regval, rnn.regval(r, regbase, regval)))153end154end155end156end157end158159function finish()160-- drawlistnames that we've already dumped:161local dumped = {}162163for gpuname,gpu in pairs(results) do164-- print_draws(gpuname, gpu)165for regbase,regvals in pairs(gpu["regvals"]) do166for regval,drawlist in pairs(regvals) do167local name = drawlistname(drawlist)168if dumped[name] == nil then169io.write("\n" .. name .. ":\n")170dumpmatches(name)171dumped[name] = 1172end173end174end175end176end177178179180