im lost..

This commit is contained in:
janis 2026-04-15 23:33:09 +02:00
parent d1b5e427a7
commit d1a0fbd592
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
2 changed files with 73 additions and 63 deletions

View file

@ -41,48 +41,60 @@ impl<T: Resource> Command for ImportResource<T> {
} }
} }
// pub struct CopyBuffers { pub struct CopyBuffers {
// pub src: Read<BufferSlice>, pub src: BufferSlice,
// pub dst: Write<BufferSlice>, pub dst: BufferSlice,
// } }
// pub struct CopyTextures { pub struct CopyTextures {
// pub src: Read<TextureRegion>, pub src: TextureRegion,
// pub dst: Write<TextureRegion>, pub dst: TextureRegion,
// } }
// pub struct CopyBufferToTexture { pub struct CopyBufferToTexture {
// pub src: Read<BufferSlice>, pub src: BufferSlice,
// pub dst: Write<TextureRegion>, pub rows: Option<BufferRows>,
// } pub dst: TextureRegion,
}
// pub struct CopyTextureToBuffer { pub struct CopyTextureToBuffer {
// pub src: Read<TextureRegion>, pub src: TextureRegion,
// pub dst: Write<BufferSlice>, pub rows: Option<BufferRows>,
// } pub dst: BufferSlice,
}
pub struct CopyBuffersToTextures {
pub src: BufferSlice,
pub src_rows: Vec<BufferRows>,
pub dst: Texture,
pub src_ranges: Vec<(TextureRegion, vk::Offset3D, vk::Extent3D)>,
}
pub struct Copy<T: Resource, U: Resource> { pub struct Copy<T: Resource, U: Resource> {
pub src: T, pub src: T,
pub dst: U, pub dst: U,
} }
impl<T: Resource, U: Resource> Copy<T, U> {
fn side_effects_inner(&self, mut map: SideEffectMap) { fn copy_side_effects_inner<T, U>(src: &T, dst: &U, mut map: SideEffectMap)
self.src.side_effect(map.reborrow().into_side_effect_map2( where
vk::PipelineStageFlags2::TRANSFER, T: Resource,
U: Resource,
{
src.side_effect(map.reborrow().into_side_effect_map2(
vk::PipelineStageFlags2::COPY,
vk::AccessFlags2::TRANSFER_READ, vk::AccessFlags2::TRANSFER_READ,
Some(vk::ImageLayout::TRANSFER_SRC_OPTIMAL), Some(vk::ImageLayout::TRANSFER_SRC_OPTIMAL),
)); ));
self.src.side_effect(map.reborrow().into_side_effect_map2( dst.side_effect(map.reborrow().into_side_effect_map2(
vk::PipelineStageFlags2::TRANSFER, vk::PipelineStageFlags2::COPY,
vk::AccessFlags2::TRANSFER_WRITE, vk::AccessFlags2::TRANSFER_WRITE,
Some(vk::ImageLayout::TRANSFER_DST_OPTIMAL), Some(vk::ImageLayout::TRANSFER_DST_OPTIMAL),
)); ));
} }
}
impl Command for Copy<BufferRowSlice, TextureRegion> { impl Command for CopyBufferToTexture {
fn side_effects(&self, map: SideEffectMap) { fn side_effects(&self, map: SideEffectMap) {
self.side_effects_inner(map) copy_side_effects_inner(&self.src, &self.dst, map)
} }
fn apply(self, recorder: &mut CommandRecorder) { fn apply(self, recorder: &mut CommandRecorder) {
@ -93,12 +105,13 @@ impl Command for Copy<BufferRowSlice, TextureRegion> {
// levels, considering the mip extents are different for each level. // levels, considering the mip extents are different for each level.
debug_assert_eq!(self.dst.range.mip_levels.len(), 1); debug_assert_eq!(self.dst.range.mip_levels.len(), 1);
let rows = self.rows.unwrap_or_default();
let regions = &[vk::BufferImageCopy2::default() let regions = &[vk::BufferImageCopy2::default()
.buffer_offset(self.src.row.offset) .buffer_offset(self.src.range.offset + rows.offset)
.buffer_row_length(self.src.row.row_size) .buffer_row_length(rows.row_size)
.buffer_image_height(self.src.row.row_count) .buffer_image_height(rows.row_count)
.image_offset(self.dst.range.offset()) .image_offset(self.dst.offset)
.image_extent(self.dst.range.extent()) .image_extent(self.dst.extent)
.image_subresource( .image_subresource(
vk::ImageSubresourceLayers::default() vk::ImageSubresourceLayers::default()
.aspect_mask(self.dst.range.aspect) .aspect_mask(self.dst.range.aspect)

View file

@ -9,9 +9,29 @@ pub trait Resource: Sized {
fn side_effect(&self, map: SideEffectMap2); fn side_effect(&self, map: SideEffectMap2);
} }
mod sealed {
pub trait Texture {}
pub trait Buffer {}
}
#[derive(Debug, Clone, Copy)]
pub enum SubresourceRange {
Buffer(BufferRange),
Texture(TextureRange),
}
mod impls { mod impls {
use super::*; use super::*;
impl sealed::Texture for Texture {}
impl sealed::Texture for TextureRegion {}
impl sealed::Texture for TextureRegions {}
impl sealed::Texture for TextureView {}
impl sealed::Buffer for Buffer {}
impl sealed::Buffer for BufferSlice {}
impl sealed::Buffer for BufferSlices {}
impl Resource for Buffer { impl Resource for Buffer {
fn id(&self) -> ResourceId { fn id(&self) -> ResourceId {
self.0 self.0
@ -102,7 +122,7 @@ mod impls {
fn side_effect(&self, mut map: SideEffectMap2) { fn side_effect(&self, mut map: SideEffectMap2) {
for range in &self.ranges { for range in &self.ranges {
map.insert_range(self.id(), *range); map.insert_range(self.id(), range.0);
} }
} }
} }
@ -330,8 +350,6 @@ pub enum ResourceRange {
aspect: vk::ImageAspectFlags, aspect: vk::ImageAspectFlags,
mip_level: MipRange, mip_level: MipRange,
array_layers: MipRange, array_layers: MipRange,
origin: (i32, i32, i32),
extent: (u32, u32, u32),
layout: vk::ImageLayout, layout: vk::ImageLayout,
}, },
} }
@ -372,25 +390,6 @@ pub struct TextureRange {
pub aspect: vk::ImageAspectFlags, pub aspect: vk::ImageAspectFlags,
pub mip_levels: MipRange, pub mip_levels: MipRange,
pub array_layers: MipRange, pub array_layers: MipRange,
pub origin: (i32, i32, i32),
pub extent: (u32, u32, u32),
}
impl TextureRange {
pub fn offset(&self) -> vk::Offset3D {
vk::Offset3D {
x: self.origin.0,
y: self.origin.1,
z: self.origin.2,
}
}
pub fn extent(&self) -> vk::Extent3D {
vk::Extent3D {
width: self.extent.0,
height: self.extent.1,
depth: self.extent.2,
}
}
} }
impl From<(BufferRange, vk::ImageLayout)> for ResourceRange { impl From<(BufferRange, vk::ImageLayout)> for ResourceRange {
@ -408,8 +407,6 @@ impl From<(TextureRange, vk::ImageLayout)> for ResourceRange {
aspect: value.aspect, aspect: value.aspect,
mip_level: value.mip_levels, mip_level: value.mip_levels,
array_layers: value.array_layers, array_layers: value.array_layers,
origin: value.origin,
extent: value.extent,
layout, layout,
} }
} }
@ -432,8 +429,6 @@ impl TextureRange {
| vk::ImageAspectFlags::STENCIL, | vk::ImageAspectFlags::STENCIL,
mip_levels: MipRange::default(), mip_levels: MipRange::default(),
array_layers: MipRange::default(), array_layers: MipRange::default(),
origin: (0, 0, 0),
extent: (u32::MAX, u32::MAX, u32::MAX),
} }
} }
} }
@ -477,11 +472,13 @@ pub struct BufferRowSlices {
pub struct TextureRegion { pub struct TextureRegion {
pub texture: Texture, pub texture: Texture,
pub range: TextureRange, pub range: TextureRange,
pub offset: vk::Offset3D,
pub extent: vk::Extent3D,
} }
pub struct TextureRegions { pub struct TextureRegions {
pub texture: Texture, pub texture: Texture,
pub ranges: Vec<TextureRange>, pub ranges: Vec<(TextureRange, vk::Offset3D, vk::Extent3D)>,
} }
pub struct TextureView { pub struct TextureView {