feat: AMD format modifiers.
This commit is contained in:
+123
-10
@@ -1,3 +1,5 @@
|
|||||||
|
const std = @import("std");
|
||||||
|
|
||||||
pub const Format = enum(u32) {
|
pub const Format = enum(u32) {
|
||||||
pub const big_endian: u32 = 1 << 31;
|
pub const big_endian: u32 = 1 << 31;
|
||||||
|
|
||||||
@@ -153,9 +155,9 @@ pub const FormatModifiers = packed struct(u64) {
|
|||||||
|
|
||||||
pub fn resolve(self: FormatModifiers) Resolved {
|
pub fn resolve(self: FormatModifiers) Resolved {
|
||||||
return switch (self.vendor) {
|
return switch (self.vendor) {
|
||||||
.none => .{ .none = .resolve(self.raw) },
|
.none => .{ .none = @enumFromInt(self.raw) },
|
||||||
.intel => .{ .intel = self.raw }, // TODO
|
.intel => .{ .intel = self.raw }, // TODO
|
||||||
.amd => .{ .amd = self.raw }, // TODO
|
.amd => .{ .amd = .resolve(self.raw) },
|
||||||
.nvidia => .{ .nvidia = .resolve(self.raw) },
|
.nvidia => .{ .nvidia = .resolve(self.raw) },
|
||||||
.samsung => .{ .samsung = self.raw }, // TODO
|
.samsung => .{ .samsung = self.raw }, // TODO
|
||||||
.qualcomm => .{ .qualcomm = self.raw }, // TODO
|
.qualcomm => .{ .qualcomm = self.raw }, // TODO
|
||||||
@@ -188,7 +190,7 @@ pub const FormatModifiers = packed struct(u64) {
|
|||||||
pub const Resolved = union(Vendor) {
|
pub const Resolved = union(Vendor) {
|
||||||
none: None,
|
none: None,
|
||||||
intel: u56,
|
intel: u56,
|
||||||
amd: u56,
|
amd: Amd,
|
||||||
nvidia: Nvidia,
|
nvidia: Nvidia,
|
||||||
samsung: u56,
|
samsung: u56,
|
||||||
qualcomm: u56,
|
qualcomm: u56,
|
||||||
@@ -201,16 +203,127 @@ pub const FormatModifiers = packed struct(u64) {
|
|||||||
apple: u56,
|
apple: u56,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const None = union(enum) {
|
pub const None = enum(u56) {
|
||||||
invalid: void,
|
invalid = 0xffffffffffffff,
|
||||||
unknown: u56,
|
_,
|
||||||
|
};
|
||||||
|
|
||||||
pub fn resolve(raw: u56) None {
|
pub const Amd = struct {
|
||||||
return switch (raw) {
|
tile: Tile,
|
||||||
0xffffffffffffff => .invalid,
|
ddc: ?Ddc,
|
||||||
else => |val| .{ .unknown = val },
|
pipe_xor_bits: u3,
|
||||||
|
bank_xor_bits: u3,
|
||||||
|
packers: u3,
|
||||||
|
rb: u3,
|
||||||
|
pipe: u3,
|
||||||
|
|
||||||
|
pub fn resolve(raw: u64) Amd {
|
||||||
|
const tile_version: TileVersion = @enumFromInt(raw & 0xff);
|
||||||
|
const tile_bits: u5 = @intCast((raw >> 8) & 0x1f);
|
||||||
|
const tile = switch (tile_version) {
|
||||||
|
inline .gfx9,
|
||||||
|
.gfx10,
|
||||||
|
.gfx10_rbplus,
|
||||||
|
.gfx11,
|
||||||
|
=> |field| @unionInit(Tile, @tagName(field), @enumFromInt(tile_bits)),
|
||||||
|
.legacy => Tile{ .legacy = {} },
|
||||||
|
.gfx12 => Tile{ .gfx12 = @enumFromInt(tile_bits) },
|
||||||
|
};
|
||||||
|
|
||||||
|
const has_ddc = (raw >> 13) & 0x01 == 0x01;
|
||||||
|
const ddc = if (has_ddc) @as(Ddc, @bitCast(@as(u7, @intCast((raw >> 14) & 0x7f)))) else null;
|
||||||
|
|
||||||
|
const pipe_xor_bits: u3 = @intCast((raw >> 21) & 0x7);
|
||||||
|
const bank_xor_bits: u3 = @intCast((raw >> 24) & 0x7);
|
||||||
|
const packers: u3 = @intCast((raw >> 27) & 0x7);
|
||||||
|
const rb: u3 = @intCast((raw >> 30) & 0x7);
|
||||||
|
const pipe: u3 = @intCast((raw >> 33) & 0x7);
|
||||||
|
|
||||||
|
return Amd{
|
||||||
|
.tile = tile,
|
||||||
|
.ddc = ddc,
|
||||||
|
.pipe_xor_bits = pipe_xor_bits,
|
||||||
|
.bank_xor_bits = bank_xor_bits,
|
||||||
|
.packers = packers,
|
||||||
|
.rb = rb,
|
||||||
|
.pipe = pipe,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub const TileVersion = enum(u8) {
|
||||||
|
legacy = 0,
|
||||||
|
gfx9 = 1,
|
||||||
|
gfx10 = 2,
|
||||||
|
gfx10_rbplus = 3,
|
||||||
|
gfx11 = 4,
|
||||||
|
gfx12 = 5,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Tile = union(TileVersion) {
|
||||||
|
legacy: void,
|
||||||
|
gfx9: Gfx9_11,
|
||||||
|
gfx10: Gfx9_11,
|
||||||
|
gfx10_rbplus: Gfx9_11,
|
||||||
|
gfx11: Gfx9_11,
|
||||||
|
gfx12: Gfx12,
|
||||||
|
|
||||||
|
pub const Gfx9_11 = enum(u5) {
|
||||||
|
linear = 0,
|
||||||
|
@"256b_s" = 1,
|
||||||
|
@"256b_d" = 2,
|
||||||
|
@"256b_r" = 3,
|
||||||
|
@"4kb_z" = 4,
|
||||||
|
@"4kb_s" = 5,
|
||||||
|
@"4kb_d" = 6,
|
||||||
|
@"4kb_r" = 7,
|
||||||
|
@"64kb_z" = 8,
|
||||||
|
@"64kb_s" = 9,
|
||||||
|
@"64kb_d" = 10,
|
||||||
|
@"64kb_r" = 11,
|
||||||
|
@"64kb_z_t" = 16,
|
||||||
|
@"64kb_s_t" = 17,
|
||||||
|
@"64kb_d_t" = 18,
|
||||||
|
@"64kb_r_t" = 19,
|
||||||
|
@"4kb_z_x" = 20,
|
||||||
|
@"4kb_s_x" = 21,
|
||||||
|
@"4kb_d_x" = 22,
|
||||||
|
@"4kb_r_x" = 23,
|
||||||
|
@"64kb_z_x" = 24,
|
||||||
|
@"64kb_s_x" = 25,
|
||||||
|
@"64kb_d_x" = 26,
|
||||||
|
@"64kb_r_x" = 27,
|
||||||
|
@"256kb_z_x" = 28,
|
||||||
|
@"256kb_s_x" = 29,
|
||||||
|
@"256kb_d_x" = 30,
|
||||||
|
@"256kb_r_x" = 31,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Gfx12 = enum(u5) {
|
||||||
|
linear = 0,
|
||||||
|
@"256b_2d" = 1,
|
||||||
|
@"4kb_2d" = 2,
|
||||||
|
@"64kb_2d" = 3,
|
||||||
|
@"256kb_2d" = 4,
|
||||||
|
@"4kb_3d" = 5,
|
||||||
|
@"64kb_3d" = 6,
|
||||||
|
@"256kb_3d" = 7,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Ddc = packed struct(u7) {
|
||||||
|
retile: bool,
|
||||||
|
pipe_align: bool,
|
||||||
|
independent_64b: bool,
|
||||||
|
independent_128b: bool,
|
||||||
|
max_compressed_block: Block,
|
||||||
|
constant_encode: bool,
|
||||||
|
|
||||||
|
pub const Block = enum(u2) {
|
||||||
|
@"64b" = 0,
|
||||||
|
@"128b" = 1,
|
||||||
|
@"256b" = 2,
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pub const Nvidia = union(enum) {
|
pub const Nvidia = union(enum) {
|
||||||
|
|||||||
Reference in New Issue
Block a user