refactor(viewport): Primitive carries Vec<ViewportData> + MultiPipeline (step 2-3/8)
Birleşik viewport mimarisinin yapısal temeli. Primitive artık tek kamera/ geometri yerine viewport başına bir ViewportData listesi taşıyor; yeni MultiPipeline her viewport için bir iç Pipeline instance tutuyor. prepare/render viewport listesi üzerinde dönüp her iç-pipeline'ı kendi (normalized) ekran rect'ine çiziyor. Mevcut Pipeline kodu (upload/LOD/render/blit) HİÇ değişmedi — sadece viewport başına bir kez çalışıyor. build_primitive ve build_viewport_primitive tek-elemanlı liste (FULL_VIEWPORT_RECT) ürettiği için render davranışı tek-viewport ile birebir aynı; çoklu viewport sonraki adımda (view.rs tek widget + active_viewports) aktive edilecek. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
fbc127b8d9
commit
b073421b92
2 changed files with 170 additions and 88 deletions
|
|
@ -1835,8 +1835,38 @@ fn create_msaa_texture(
|
|||
})
|
||||
}
|
||||
|
||||
impl iced::widget::shader::Pipeline for Pipeline {
|
||||
fn new(device: &wgpu::Device, queue: &wgpu::Queue, format: wgpu::TextureFormat) -> Self {
|
||||
Self::new(device, queue, format)
|
||||
/// Holds one inner `Pipeline` per viewport drawn this frame. A single
|
||||
/// shader widget owns one `MultiPipeline`; the unified renderer grows the
|
||||
/// `inners` vector to match the viewport count and draws each into its own
|
||||
/// screen rectangle. Inner `Pipeline` code (upload / LOD / render / blit)
|
||||
/// is unchanged — it just runs once per viewport.
|
||||
pub struct MultiPipeline {
|
||||
pub(crate) inners: Vec<Pipeline>,
|
||||
format: wgpu::TextureFormat,
|
||||
}
|
||||
|
||||
impl MultiPipeline {
|
||||
/// Ensure exactly `n` (≥1) inner pipelines exist, creating any missing
|
||||
/// ones. Extra pipelines beyond `n` are dropped.
|
||||
pub(crate) fn ensure_len(
|
||||
&mut self,
|
||||
device: &wgpu::Device,
|
||||
queue: &wgpu::Queue,
|
||||
n: usize,
|
||||
) {
|
||||
let n = n.max(1);
|
||||
while self.inners.len() < n {
|
||||
self.inners.push(Pipeline::new(device, queue, self.format));
|
||||
}
|
||||
self.inners.truncate(n);
|
||||
}
|
||||
}
|
||||
|
||||
impl iced::widget::shader::Pipeline for MultiPipeline {
|
||||
fn new(device: &wgpu::Device, queue: &wgpu::Queue, format: wgpu::TextureFormat) -> Self {
|
||||
Self {
|
||||
inners: vec![Pipeline::new(device, queue, format)],
|
||||
format,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue