Skip to content

Commit b6dbc85

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 <[email protected]>
1 parent a4dc876 commit b6dbc85

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,
@@ -797,9 +798,9 @@ impl super::Queue::ver {
797798
stencil_meta_buffer_ptr2: U64(cmdbuf.stencil_meta_buffer_store),
798799
unk_d0: Default::default(),
799800
tvb_tilemap: inner.scene.tvb_tilemap_pointer(),
800-
tvb_heapmeta: inner.scene.tvb_heapmeta_pointer(),
801+
tvb_layermeta: inner.scene.tvb_layermeta_pointer(),
801802
mtile_stride_dwords: U64((4 * tile_info.params.rgn_size as u64) << 24),
802-
tvb_heapmeta_2: inner.scene.tvb_heapmeta_pointer(),
803+
tvb_heapmeta: inner.scene.tvb_heapmeta_pointer(),
803804
tile_config: U64(tile_config),
804805
aux_fb: inner.aux_fb.gpu_pointer(),
805806
unk_108: Default::default(),
@@ -899,7 +900,7 @@ impl super::Queue::ver {
899900
r.add(0x153d9, cmdbuf.stencil_meta_buffer_store);
900901
r.add(0x15439, 0);
901902
r.add(0x16429, inner.scene.tvb_tilemap_pointer().into());
902-
r.add(0x16060, inner.scene.tvb_heapmeta_pointer().into());
903+
r.add(0x16060, inner.scene.tvb_layermeta_pointer().into());
903904
r.add(0x16431, (4 * tile_info.params.rgn_size as u64) << 24); // ISP_RGN?
904905
r.add(0x10039, tile_config); // tile_config ISP_CTL?
905906
r.add(0x16451, 0x0); // ISP_RENDER_ORIGIN
@@ -1281,7 +1282,7 @@ impl super::Queue::ver {
12811282
utile_config,
12821283
unk_4c: 0,
12831284
ppp_multisamplectl: U64(cmdbuf.ppp_multisamplectl), // fixed
1284-
tvb_heapmeta_2: inner.scene.tvb_heapmeta_pointer(),
1285+
tvb_layermeta: inner.scene.tvb_layermeta_pointer(),
12851286
#[ver(G < G14)]
12861287
unk_60: U64(0x0), // fixed
12871288
#[ver(G < G14)]
@@ -1371,8 +1372,8 @@ impl super::Queue::ver {
13711372
); // tvb_cluster_meta3
13721373
r.add(0x1c890, tiling_control.into()); // tvb_tiling_control
13731374
r.add(0x1c918, unks.tiling_control_2);
1374-
r.add(0x1c079, inner.scene.tvb_heapmeta_pointer().into());
1375-
r.add(0x1c9d8, inner.scene.tvb_heapmeta_pointer().into());
1375+
r.add(0x1c079, inner.scene.tvb_layermeta_pointer().into());
1376+
r.add(0x1c9d8, inner.scene.tvb_layermeta_pointer().into());
13761377
r.add(0x1c089, 0);
13771378
r.add(0x1c9e0, 0);
13781379
let cl_meta_4_pointer =

0 commit comments

Comments
 (0)