6#include <QtCore/qdebug.h>
10using namespace Qt::StringLiterals;
17QString modifierVendorName(uint8_t vendor)
39 return u"Allwinner"_s;
43 return u"unknown vendor 0x%1"_s.arg(vendor, 2, 16, u'0');
49QString decodeNvidiaModifier(uint64_t payload)
52 return u"Tegra tiled"_s;
53 if (!(payload & 0x10))
54 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
56 const uint32_t h = payload & 0xf;
57 const uint32_t k = (payload >> 12) & 0xff;
58 const uint32_t g = (payload >> 20) & 0x3;
59 const uint32_t s = (payload >> 22) & 0x1;
60 const uint32_t c = (payload >> 23) & 0x7;
62 static const QString gobHeights[] = {
63 u"8, Fermi-Volta/Tegra K1+ page kind mapping"_s,
64 u"4, G80-GT2XX page kind mapping"_s,
65 u"8, Turing+ page kind mapping"_s,
68 static const QString compressionKinds[] = {
69 u"none"_s, u"ROP/3D layout 1"_s, u"ROP/3D layout 2"_s, u"CDE horizontal"_s,
70 u"CDE vertical"_s, u"reserved"_s, u"reserved"_s, u"reserved"_s,
73 return u"block-linear, block height 2^%1 GOBs, page kind 0x%2, GOB height %3, "
74 "sector layout: %4, compression: %5"_s.arg(h)
77 .arg(s ? u"desktop GPU / Tegra Xavier+"_s : u"Tegra K1 - Parker/TX2"_s)
78 .arg(compressionKinds[c]);
82QString decodeIntelModifier(uint64_t payload)
92 return u"Y tiled, CCS"_s;
94 return u"Yf tiled, CCS"_s;
96 return u"Y tiled, Gen12 render compression CCS"_s;
98 return u"Y tiled, Gen12 media compression CCS"_s;
100 return u"Y tiled, Gen12 render compression CCS with clear color"_s;
104 return u"4 tiled, DG2 render compression CCS"_s;
106 return u"4 tiled, DG2 media compression CCS"_s;
108 return u"4 tiled, DG2 render compression CCS with clear color"_s;
110 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
115QString decodeAmdModifier(uint64_t payload)
117 const uint32_t tileVersion = payload & 0xff;
118 if (tileVersion == 0)
119 return u"GFX8 or older, linear-compatible"_s;
121 static const QString tileVersions[] = {
122 {}, u"GFX9"_s, u"GFX10"_s, u"GFX10 RBPlus"_s, u"GFX11"_s,
124 static const QString dccBlockSizes[] = {
131 const uint32_t tile = (payload >> 8) & 0x1f;
132 const bool dcc = (payload >> 13) & 0x1;
134 QString result = u"tile version %1, tile mode %2"_s
135 .arg(tileVersion < std::size(tileVersions) ? tileVersions[tileVersion]
139 const bool dccRetile = (payload >> 14) & 0x1;
140 const bool dccPipeAlign = (payload >> 15) & 0x1;
141 const uint32_t dccMaxCompressedBlock = (payload >> 18) & 0x3;
142 result += u", DCC (retile: %1, pipe-aligned: %2, max compressed block: %3)"_s
143 .arg(dccRetile ? u"yes"_s : u"no"_s)
144 .arg(dccPipeAlign ? u"yes"_s : u"no"_s)
145 .arg(dccBlockSizes[dccMaxCompressedBlock]);
151QString decodeArmModifier(uint64_t payload)
153 const uint32_t type = (payload >> 52) & 0xf;
154 const uint64_t value = payload & 0x000fffffffffffffULL;
157 return u"type 0x%1, raw 0x%2"_s.arg(type).arg(value, 13, 16, u'0');
159 static const QString blockSizes[] = {
160 u"none"_s, u"16x16"_s, u"32x8"_s, u"64x4"_s, u"32x8_64x4"_s,
162 const uint32_t blockSize = value & 0xf;
165 if (value & (1ULL << 4))
167 if (value & (1ULL << 5))
169 if (value & (1ULL << 6))
170 flags << u"sparse"_s;
171 if (value & (1ULL << 7))
173 if (value & (1ULL << 8))
175 if (value & (1ULL << 9))
177 if (value & (1ULL << 10))
178 flags << u"double-buffered"_s;
179 if (value & (1ULL << 11))
180 flags << u"block-channel"_s;
181 if (value & (1ULL << 12))
184 return u"AFBC, superblock size %1%2"_s
185 .arg(blockSize < std::size(blockSizes) ? blockSizes[blockSize] : u"unknown"_s)
186 .arg(flags.isEmpty() ? QString() : u", flags: "_s + flags.join(u'|'));
190QString decodeBroadcomModifier(uint64_t payload)
192 const uint64_t mod = payload & 0xff;
193 const uint64_t param = (payload >> 8) & 0xffffffffffffULL;
197 return u"VC4 T-tiled"_s;
199 return u"SAND32, column height %1"_s.arg(param);
201 return u"SAND64, column height %1"_s.arg(param);
203 return u"SAND128, column height %1"_s.arg(param);
205 return u"SAND256, column height %1"_s.arg(param);
209 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
214QString decodeQualcommModifier(uint64_t payload)
218 return u"compressed"_s;
220 return u"alternate tiled"_s;
224 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
229QString decodeVivanteModifier(uint64_t payload)
233 return u"4x4 tiled"_s;
235 return u"64x64 super-tiled"_s;
237 return u"4x4 tiled, split (dual-pipe)"_s;
239 return u"64x64 super-tiled, split (dual-pipe)"_s;
241 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
246QString decodeSamsungModifier(uint64_t payload)
250 return u"64x32 tiled"_s;
252 return u"16x16 tiled"_s;
254 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
259QString decodeAllwinnerModifier(uint64_t payload)
263 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
267QString decodeAmlogicModifier(uint64_t payload)
269 const uint32_t layout = payload & 0xff;
270 const uint32_t options = (payload >> 8) & 0xff;
275 result = u"FBC basic layout"_s;
278 result = u"FBC scatter layout"_s;
281 return u"unknown layout, raw 0x%1"_s.arg(payload, 14, 16, u'0');
285 result += u", memory saving"_s;
293 const uint32_t code = qToUnderlying(format);
295 for (
int i = 0; i < 4; ++i) {
296 const char c =
char((code >> (8 * i)) & 0xff);
297 result += QChar(c ==
' ' ? u'_' : c);
304 const QDebugStateSaver saver(debug);
305 debug.nospace().noquote() <<
"DRMFormat(0x" << Qt::hex << qToUnderlying(format) << Qt::dec
306 <<
", " << toString(format) <<
')';
312 if (modifier == DrmFormatModifierLinear)
314 if (modifier == DmaBufFormatModifierInvalid)
317 const uint64_t value = qToUnderlying(modifier);
318 const uint8_t vendor = uint8_t(value >> 56);
319 const uint64_t payload = value & ((uint64_t(1) << 56) - 1);
320 const QString vendorName = modifierVendorName(vendor);
324 return vendorName + u", "_s + decodeIntelModifier(payload);
326 return vendorName + u", "_s + decodeAmdModifier(payload);
328 return vendorName + u", "_s + decodeNvidiaModifier(payload);
330 return vendorName + u", "_s + decodeSamsungModifier(payload);
332 return vendorName + u", "_s + decodeQualcommModifier(payload);
334 return vendorName + u", "_s + decodeVivanteModifier(payload);
336 return vendorName + u", "_s + decodeBroadcomModifier(payload);
338 return vendorName + u", "_s + decodeArmModifier(payload);
340 return vendorName + u", "_s + decodeAllwinnerModifier(payload);
342 return vendorName + u", "_s + decodeAmlogicModifier(payload);
344 return u"%1, vendor-specific payload 0x%2"_s.arg(vendorName).arg(payload, 14, 16, u'0');
350 const QDebugStateSaver saver(debug);
351 debug.nospace().noquote() <<
"DRMModifier(0x" << Qt::hex << qToUnderlying(modifier) << Qt::dec
352 <<
", " << toString(modifier) <<
')';
Combined button and popup list for selecting options.