Skip to content

Commit 0ad2483

Browse files
committed
drm/asahi: buffer,render: Identify and provide layer meta buf
It looks like one of the "heapmeta" pointers is actually a layer metadata pointer, that macOS just allocates contiguously with the tilemap headers and heap meta buffers. Size seems to always be 0x100. Let's allocate it after the heapmeta, which will make debugging easier. Signed-off-by: Asahi Lina <lina@asahilina.net>
1 parent 5be9c76 commit 0ad2483

4 files changed

Lines changed: 21 additions & 10 deletions

File tree

drivers/gpu/drm/asahi/buffer.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ pub(crate) struct TileInfo {
9191
pub(crate) tpc_size: usize,
9292
/// Number of blocks in the clustering meta buffer (for clustering).
9393
pub(crate) meta1_blocks: u32,
94+
/// Layering metadata size.
95+
pub(crate) layermeta_size: usize,
9496
/// Minimum number of TVB blocks for this render.
9597
pub(crate) min_tvb_blocks: usize,
9698
/// Tiling parameter structure passed to firmware.
@@ -163,6 +165,11 @@ impl Scene::ver {
163165
self.object.tvb_heapmeta.gpu_pointer()
164166
}
165167

168+
/// Returns the GPU pointer to the layer metadata buffer.
169+
pub(crate) fn tvb_layermeta_pointer(&self) -> GpuPointer<'_, &'_ [u8]> {
170+
self.object.tvb_heapmeta.gpu_offset_pointer(0x200)
171+
}
172+
166173
/// Returns the GPU pointer to the top-level TVB tilemap buffer.
167174
pub(crate) fn tvb_tilemap_pointer(&self) -> GpuPointer<'_, &'_ [u8]> {
168175
self.object.tvb_tilemap.gpu_pointer()
@@ -546,7 +553,10 @@ impl Buffer::ver {
546553
b"UBUF",
547554
)?;
548555

549-
let tvb_heapmeta = inner.ualloc.lock().array_empty_tagged(0x200, b"HMTA")?;
556+
let tvb_heapmeta = inner
557+
.ualloc
558+
.lock()
559+
.array_empty_tagged(0x200 + tile_info.layermeta_size, b"HMTA")?;
550560
let tvb_tilemap = inner
551561
.ualloc
552562
.lock()

drivers/gpu/drm/asahi/fw/fragment.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ pub(crate) mod raw {
9797
pub(crate) stencil_meta_buffer_ptr2: U64,
9898
pub(crate) unk_d0: U64,
9999
pub(crate) tvb_tilemap: GpuPointer<'a, &'a [u8]>,
100-
pub(crate) tvb_heapmeta: GpuPointer<'a, &'a [u8]>,
100+
pub(crate) tvb_layermeta: GpuPointer<'a, &'a [u8]>,
101101
pub(crate) mtile_stride_dwords: U64,
102-
pub(crate) tvb_heapmeta_2: GpuPointer<'a, &'a [u8]>,
102+
pub(crate) tvb_heapmeta: GpuPointer<'a, &'a [u8]>,
103103
pub(crate) tile_config: U64,
104104
pub(crate) aux_fb: GpuPointer<'a, &'a [u8]>,
105105
pub(crate) unk_108: Array<0x6, U64>,

drivers/gpu/drm/asahi/fw/vertex.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub(crate) mod raw {
4747
pub(crate) utile_config: u32,
4848
pub(crate) unk_4c: u32,
4949
pub(crate) ppp_multisamplectl: U64,
50-
pub(crate) tvb_heapmeta_2: GpuPointer<'a, &'a [u8]>,
50+
pub(crate) tvb_layermeta: GpuPointer<'a, &'a [u8]>,
5151
#[ver(G < G14)]
5252
pub(crate) unk_60: U64,
5353
#[ver(G < G14)]

drivers/gpu/drm/asahi/queue/render.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ impl super::Queue::ver {
168168
tilemap_size,
169169
tpc_size,
170170
meta1_blocks,
171+
layermeta_size: if layers > 1 { 0x100 } else { 0 },
171172
min_tvb_blocks: min_tvb_blocks as usize,
172173
params: fw::vertex::raw::TilingParameters {
173174
rgn_size,
@@ -794,9 +795,9 @@ impl super::Queue::ver {
794795
stencil_meta_buffer_ptr2: U64(cmdbuf.stencil_meta_buffer_store),
795796
unk_d0: Default::default(),
796797
tvb_tilemap: inner.scene.tvb_tilemap_pointer(),
797-
tvb_heapmeta: inner.scene.tvb_heapmeta_pointer(),
798+
tvb_layermeta: inner.scene.tvb_layermeta_pointer(),
798799
mtile_stride_dwords: U64((4 * tile_info.params.rgn_size as u64) << 24),
799-
tvb_heapmeta_2: inner.scene.tvb_heapmeta_pointer(),
800+
tvb_heapmeta: inner.scene.tvb_heapmeta_pointer(),
800801
tile_config: U64(tile_config),
801802
aux_fb: inner.aux_fb.gpu_pointer(),
802803
unk_108: Default::default(),
@@ -896,7 +897,7 @@ impl super::Queue::ver {
896897
r.add(0x153d9, cmdbuf.stencil_meta_buffer_store);
897898
r.add(0x15439, 0);
898899
r.add(0x16429, inner.scene.tvb_tilemap_pointer().into());
899-
r.add(0x16060, inner.scene.tvb_heapmeta_pointer().into());
900+
r.add(0x16060, inner.scene.tvb_layermeta_pointer().into());
900901
r.add(0x16431, (4 * tile_info.params.rgn_size as u64) << 24); // ISP_RGN?
901902
r.add(0x10039, tile_config); // tile_config ISP_CTL?
902903
r.add(0x16451, 0x0); // ISP_RENDER_ORIGIN
@@ -1278,7 +1279,7 @@ impl super::Queue::ver {
12781279
utile_config,
12791280
unk_4c: 0,
12801281
ppp_multisamplectl: U64(cmdbuf.ppp_multisamplectl), // fixed
1281-
tvb_heapmeta_2: inner.scene.tvb_heapmeta_pointer(),
1282+
tvb_layermeta: inner.scene.tvb_layermeta_pointer(),
12821283
#[ver(G < G14)]
12831284
unk_60: U64(0x0), // fixed
12841285
#[ver(G < G14)]
@@ -1368,8 +1369,8 @@ impl super::Queue::ver {
13681369
); // tvb_cluster_meta3
13691370
r.add(0x1c890, tiling_control.into()); // tvb_tiling_control
13701371
r.add(0x1c918, unks.tiling_control_2);
1371-
r.add(0x1c079, inner.scene.tvb_heapmeta_pointer().into());
1372-
r.add(0x1c9d8, inner.scene.tvb_heapmeta_pointer().into());
1372+
r.add(0x1c079, inner.scene.tvb_layermeta_pointer().into());
1373+
r.add(0x1c9d8, inner.scene.tvb_layermeta_pointer().into());
13731374
r.add(0x1c089, 0);
13741375
r.add(0x1c9e0, 0);
13751376
let cl_meta_4_pointer =

0 commit comments

Comments
 (0)