Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/freedreno/decode/scripts/texturator-to-unit-test-5xx.lua
4573 views
1
-- Parse logs from https://github.com/freedreno/freedreno/
2
-- test-texturator.c to generate a src/freedreno/fdl/fd5_layout_test.c
3
-- block. We figure out the offsets from blits, but there may be some
4
-- unrelated blits. So just save all of them until we find the
5
-- texture state. This gives us the base address, and the miplevel #0
6
-- width/height/depth. Then work backwards from there finding the
7
-- blits to the same dst buffer and deducing the miplevel from the
8
-- minified dimensions
9
10
local posix = require "posix"
11
12
io.write("Analyzing Data...\n")
13
14
local r = rnn.init("a530")
15
local found_tex = 0
16
17
local allblits = {}
18
local nallblits = 0
19
20
function get_first_blit(base, width, height)
21
local first_blit = nil
22
23
for n = 0,nallblits-1 do
24
local blit = allblits[n]
25
if blit.base == base and blit.width == width and blit.height == height then
26
if not first_blit or blit.addr < first_blit.addr then
27
first_blit = blit
28
end
29
end
30
end
31
32
return first_blit
33
end
34
35
function minify(val, lvls)
36
val = val >> lvls
37
if val < 1 then
38
return 1
39
end
40
return val
41
end
42
43
function printf(fmt, ...)
44
return io.write(string.format(fmt, ...))
45
end
46
47
function start_cmdstream(name)
48
io.write("Parsing " .. name .. "\n")
49
allblits = {}
50
nallblits = 0
51
end
52
53
-- Record texture upload blits done through CP_EVENT_WRITE
54
function CP_EVENT_WRITE(pkt, size)
55
if tostring(pkt[0].EVENT) ~= "BLIT" then
56
return
57
end
58
59
local blit = {}
60
61
blit.width = r.RB_RESOLVE_CNTL_2.X + 1
62
blit.height = r.RB_RESOLVE_CNTL_2.Y + 1
63
blit.pitch = r.RB_BLIT_DST_PITCH
64
blit.addr = r.RB_BLIT_DST_LO | (r.RB_BLIT_DST_HI << 32)
65
blit.base = bos.base(blit.addr)
66
blit.ubwc_addr = r.RB_BLIT_FLAG_DST_LO | (r.RB_BLIT_FLAG_DST_HI << 32)
67
blit.ubwc_base = bos.base(blit.ubwc_addr)
68
blit.ubwc_pitch = r.RB_BLIT_FLAG_DST_PITCH
69
blit.endaddr = 0 -- filled in later
70
printf("Found event blit: 0x%x (0x%x) %dx%d UBWC 0x%x (0x%x) tiled %s\n", blit.addr, blit.base, blit.width, blit.height, blit.ubwc_addr, blit.ubwc_base, r.RB_RESOLVE_CNTL_3.TILED)
71
72
allblits[nallblits] = blit
73
nallblits = nallblits + 1
74
end
75
76
function CP_BLIT(pkt, size)
77
-- Just in case, filter out anything that isn't starting
78
-- at 0,0
79
if pkt[1].SRC_X1 ~= 0 or pkt[1].SRC_Y1 ~= 0 then
80
return
81
end
82
83
local blit = {}
84
85
blit.width = pkt[2].SRC_X2 + 1
86
blit.height = pkt[2].SRC_Y2 + 1
87
blit.pitch = r.RB_2D_DST_SIZE.PITCH
88
blit.addr = r.RB_2D_DST_LO | (r.RB_2D_DST_HI << 32)
89
blit.base = bos.base(blit.addr)
90
blit.ubwc_addr = r.RB_2D_DST_FLAGS_LO | (r.RB_2D_DST_FLAGS_HI << 32)
91
blit.ubwc_base = bos.base(blit.ubwc_addr)
92
blit.ubwc_pitch = r.RB_2D_DST_FLAGS_PITCH
93
blit.endaddr = 0 -- filled in later
94
printf("Found cp blit: 0x%x (0x%x) %dx%d UBWC 0x%x (0x%x) %s\n", blit.addr, blit.base, blit.width, blit.height, blit.ubwc_addr, blit.ubwc_base, r.RB_2D_DST_INFO.TILE_MODE)
95
96
allblits[nallblits] = blit
97
nallblits = nallblits + 1
98
end
99
100
function A5XX_TEX_CONST(pkt, size)
101
-- ignore any texture state w/ DEPTH=1, these aren't the 3d tex state we
102
-- are looking for
103
104
local base = pkt[4].BASE_LO | (pkt[5].BASE_HI << 32)
105
-- UBWC base on a5xx seems to be at the start of each miplevel, followed by pixels
106
-- somewhere past that.
107
local ubwc_base = base
108
local width0 = pkt[1].WIDTH
109
local height0 = pkt[1].HEIGHT
110
local depth0 = pkt[5].DEPTH
111
112
if (found_tex ~= 0) then
113
return
114
end
115
found_tex = 1
116
117
printf("Found texture state:\n %ux%ux%u (%s, %s, UBWC=%s)\n",
118
width0, height0, depth0, pkt[0].FMT, pkt[0].TILE_MODE, tostring(pkt[3].FLAG))
119
120
-- Note that in some case the texture has some extra page or so
121
-- at the beginning:
122
local basebase = bos.base(base)
123
printf("base: 0x%x (0x%x)\n", base, basebase)
124
printf("ubwcbase: 0x%x (0x%x)\n", ubwc_base, bos.base(ubwc_base))
125
126
-- see if we can find the associated blits.. The blob always seems to
127
-- start from the lower (larger) mipmap levels and layers, so we don't
128
-- need to sort by dst address. Also, while we are at it, fill in the
129
-- end-addr (at least for everything but the last blit)
130
local blits = {}
131
local nblits = 0
132
local lastblit = nil
133
for n = 0,nallblits-1 do
134
local blit = allblits[n]
135
--printf("blit addr: 0x%x (0x%x)\n", blit.addr, blit.base)
136
if blit.base == basebase and blit.addr >= base then
137
blits[nblits] = blit
138
nblits = nblits + 1
139
if lastblit then
140
lastblit.endaddr = blit.addr
141
end
142
lastblit = blit
143
end
144
end
145
146
printf(" {\n")
147
printf(" .format = %s,\n", pkt[0].FMT)
148
if (tostring(pkt[2].TYPE) == "A5XX_TEX_3D") then
149
printf(" .is_3d = true,\n")
150
end
151
152
printf(" .layout = {\n")
153
printf(" .tile_mode = %s,\n", pkt[0].TILE_MODE)
154
printf(" .ubwc = %s,\n", tostring(pkt[3].FLAG))
155
156
if (tostring(pkt[2].TYPE) == "A5XX_TEX_3D") then
157
printf(" .width0 = %d, .height0 = %d, .depth0 = %d,\n", width0, height0, depth0)
158
else
159
printf(" .width0 = %d, .height0 = %d,\n", width0, height0)
160
end
161
162
printf(" .slices = {\n")
163
local w = 0
164
local h = 0
165
local level = 0
166
repeat
167
local w = minify(width0, level)
168
local h = minify(height0, level)
169
local blit = get_first_blit(basebase, w, h)
170
if blit then
171
printf(" { .offset = %d, .pitch = %u },\n",
172
blit.addr - base,
173
blit.pitch);
174
end
175
level = level + 1
176
until w == 1 and h == 1
177
printf(" },\n")
178
179
if pkt[3].FLAG then
180
printf(" .ubwc_slices = {\n")
181
level = 0
182
repeat
183
local w = minify(width0, level)
184
local h = minify(height0, level)
185
local blit = get_first_blit(basebase, w, h)
186
if blit then
187
printf(" { .offset = %d, .pitch = %u },\n",
188
blit.ubwc_addr - ubwc_base,
189
blit.ubwc_pitch);
190
end
191
level = level + 1
192
until w == 1 and h == 1
193
printf(" },\n")
194
end
195
196
printf(" },\n")
197
printf(" },\n")
198
printf("\n\n")
199
end
200
201
202