Skip to content

Commit 29e263f

Browse files
committed
drm/asahi: Identify and allocate clustered layering metadata buf
Turns out multi-cluster machines also need a clustered buffer for layered rendering. Fixes layered rendering on G13X with barriers (I guess if you don't flush memory this stays in some kind of cache and somehow doesn't matter?). Signed-off-by: Asahi Lina <[email protected]>
1 parent 0f47112 commit 29e263f

3 files changed

Lines changed: 25 additions & 9 deletions

File tree

drivers/gpu/drm/asahi/buffer.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ pub(crate) struct Scene {
111111
// Note: these are dead code only on some version variants.
112112
// It's easier to do this than to propagate the version conditionals everywhere.
113113
#[allow(dead_code)]
114+
meta1_off: usize,
115+
#[allow(dead_code)]
114116
meta2_off: usize,
115117
#[allow(dead_code)]
116118
meta3_off: usize,
@@ -208,13 +210,22 @@ impl Scene::ver {
208210
.map(|c| c.tilemaps.gpu_pointer())
209211
}
210212

213+
/// Returns the GPU pointer to the clustering layer metadata buffer, if clustering is enabled.
214+
#[allow(dead_code)]
215+
pub(crate) fn tvb_cluster_layermeta_pointer(&self) -> Option<GpuPointer<'_, &'_ [u8]>> {
216+
self.object
217+
.clustering
218+
.as_ref()
219+
.map(|c| c.meta.gpu_pointer())
220+
}
221+
211222
/// Returns the GPU pointer to the clustering metadata 1 buffer, if clustering is enabled.
212223
#[allow(dead_code)]
213224
pub(crate) fn meta_1_pointer(&self) -> Option<GpuPointer<'_, &'_ [u8]>> {
214225
self.object
215226
.clustering
216227
.as_ref()
217-
.map(|c| c.meta.gpu_pointer())
228+
.map(|c| c.meta.gpu_offset_pointer(self.meta1_off))
218229
}
219230

220231
/// Returns the GPU pointer to the clustering metadata 2 buffer, if clustering is enabled.
@@ -585,21 +596,23 @@ impl Buffer::ver {
585596
}
586597
};
587598

599+
let mut clmeta_size = 0;
588600
let mut meta1_size = 0;
589601
let mut meta2_size = 0;
590602
let mut meta3_size = 0;
591603

592604
let clustering = if inner.num_clusters > 1 {
593605
let cfg = inner.cfg.clustering.as_ref().unwrap();
594606

607+
clmeta_size = tile_info.layermeta_size * cfg.max_splits;
595608
// Maybe: (4x4 macro tiles + 1 global page)*n, 32bit each (17*4*n)
596609
// Unused on t602x?
597610
meta1_size = align(tile_info.meta1_blocks as usize * cfg.meta1_blocksize, 0x80);
598611
meta2_size = align(cfg.meta2_size, 0x80);
599612
meta3_size = align(cfg.meta3_size, 0x80);
600613
let meta4_size = cfg.meta4_size;
601614

602-
let meta_size = meta1_size + meta2_size + meta3_size + meta4_size;
615+
let meta_size = clmeta_size + meta1_size + meta2_size + meta3_size + meta4_size;
603616

604617
mod_pr_debug!("Buffer: Allocating clustering buffers\n");
605618
let tilemaps = inner
@@ -685,9 +698,10 @@ impl Buffer::ver {
685698
rebind,
686699
preempt2_off: inner.preempt1_size,
687700
preempt3_off: inner.preempt1_size + inner.preempt2_size,
688-
meta2_off: meta1_size,
689-
meta3_off: meta1_size + meta2_size,
690-
meta4_off: meta1_size + meta2_size + meta3_size,
701+
meta1_off: clmeta_size,
702+
meta2_off: clmeta_size + meta1_size,
703+
meta3_off: clmeta_size + meta1_size + meta2_size,
704+
meta4_off: clmeta_size + meta1_size + meta2_size + meta3_size,
691705
})
692706
}
693707

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub(crate) mod raw {
4949
pub(crate) ppp_multisamplectl: U64,
5050
pub(crate) tvb_layermeta: GpuPointer<'a, &'a [u8]>,
5151
#[ver(G < G14)]
52-
pub(crate) unk_60: U64,
52+
pub(crate) tvb_cluster_layermeta: Option<GpuPointer<'a, &'a [u8]>>,
5353
#[ver(G < G14)]
5454
pub(crate) core_mask: Array<2, u32>,
5555
pub(crate) preempt_buf1: GpuPointer<'a, &'a [u8]>,

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,7 @@ impl super::Queue::ver {
13101310
ppp_multisamplectl: U64(cmdbuf.ppp_multisamplectl), // fixed
13111311
tvb_layermeta: inner.scene.tvb_layermeta_pointer(),
13121312
#[ver(G < G14)]
1313-
unk_60: U64(0x0), // fixed
1313+
tvb_cluster_layermeta: inner.scene.tvb_cluster_layermeta_pointer(),
13141314
#[ver(G < G14)]
13151315
core_mask: Array::new([
13161316
*core_masks.first().unwrap_or(&0),
@@ -1403,8 +1403,10 @@ impl super::Queue::ver {
14031403
r.add(0x1c918, unks.tiling_control_2);
14041404
r.add(0x1c079, inner.scene.tvb_layermeta_pointer().into());
14051405
r.add(0x1c9d8, inner.scene.tvb_layermeta_pointer().into());
1406-
r.add(0x1c089, 0);
1407-
r.add(0x1c9e0, 0);
1406+
let cl_layermeta_pointer =
1407+
inner.scene.tvb_cluster_layermeta_pointer().map_or(0, |a| a.into());
1408+
r.add(0x1c089, cl_layermeta_pointer);
1409+
r.add(0x1c9e0, cl_layermeta_pointer);
14081410
let cl_meta_4_pointer =
14091411
inner.scene.meta_4_pointer().map_or(0, |a| a.into());
14101412
r.add(0x16c41, cl_meta_4_pointer); // tvb_cluster_meta4

0 commit comments

Comments
 (0)