Attempt to fix cube map generation

This commit is contained in:
hodasemi 2025-03-01 09:59:30 +01:00
parent 74fafcdd8f
commit 788543ae97

View file

@ -172,11 +172,12 @@ impl ImageBuilder {
Self::optimize_fill( Self::optimize_fill(
device, device,
queue, queue,
&raw.into_iter() [raw.into_iter()
.map(|d| RawBuffer { d }) .map(|d| RawBuffer { d })
.collect::<Vec<RawBuffer>>(), .collect::<Vec<RawBuffer>>()
.as_slice()]
.into_iter(),
&arc_image, &arc_image,
0,
)?; )?;
Ok(arc_image) Ok(arc_image)
@ -203,17 +204,21 @@ impl ImageBuilder {
self.file_name, self.file_name,
)?; )?;
for (layer, raw) in raw_array.into_iter().enumerate() { let data = raw_array
Self::optimize_fill( .into_iter()
device, .map(|raw| {
queue, raw.into_iter()
&raw.into_iter()
.map(|d| RawBuffer { d }) .map(|d| RawBuffer { d })
.collect::<Vec<RawBuffer>>(), .collect::<Vec<RawBuffer>>()
&arc_image, })
layer as u32, .collect::<Vec<_>>();
)?;
} Self::optimize_fill(
device,
queue,
data.iter().map(|r| r.as_slice()),
&arc_image,
)?;
Ok(arc_image) Ok(arc_image)
} }
@ -477,20 +482,23 @@ impl ImageBuilder {
device.create_image(image_ci) device.create_image(image_ci)
} }
fn optimize_fill( fn optimize_fill<'a>(
device: &Arc<Device>, device: &Arc<Device>,
queue: &Arc<Mutex<Queue>>, queue: &Arc<Mutex<Queue>>,
data: &[RawBuffer], data: impl Iterator<Item = &'a [RawBuffer]>,
image: &Arc<Image>, image: &Arc<Image>,
layer: u32,
) -> Result<()> { ) -> Result<()> {
let staging_buffer = Buffer::builder() let staging_buffers = data
.set_usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT) .map(|data| {
.set_memory_usage(MemoryUsage::CpuToGpu) Buffer::builder()
.set_data(data) .set_usage(VK_BUFFER_USAGE_TRANSFER_SRC_BIT)
.build(device.clone())?; .set_memory_usage(MemoryUsage::CpuToGpu)
.set_data(data)
.build(device.clone())
})
.collect::<Result<Vec<_>>>()?;
copy_buffer_to_image(device, queue, &staging_buffer, image, layer)?; copy_buffers_to_image(device, queue, staging_buffers.iter(), image)?;
Ok(()) Ok(())
} }
@ -967,7 +975,7 @@ impl Image {
} }
pub fn copy_buffer_to_image(self: &Arc<Image>, buffer: &Arc<Buffer<RawBuffer>>) -> Result<()> { pub fn copy_buffer_to_image(self: &Arc<Image>, buffer: &Arc<Buffer<RawBuffer>>) -> Result<()> {
copy_buffer_to_image(&self.device, &self.queue, &buffer, self, 0) copy_buffers_to_image(&self.device, &self.queue, [buffer].into_iter(), self)
} }
} }
@ -1031,17 +1039,16 @@ fn into_layout(image: &Arc<Image>, layout: VkImageLayout) -> Result<()> {
Ok(()) Ok(())
} }
fn copy_buffer_to_image<T: ReprC + Send + Sync + 'static>( fn copy_buffers_to_image<'a, T: ReprC + Send + Sync + 'static>(
device: &Arc<Device>, device: &Arc<Device>,
queue: &Arc<Mutex<Queue>>, queue: &Arc<Mutex<Queue>>,
buffer: &Arc<Buffer<T>>, buffers: impl ExactSizeIterator<Item = &'a Arc<Buffer<T>>>,
image: &Arc<Image>, image: &Arc<Image>,
layer: u32,
) -> Result<()> ) -> Result<()>
where where
T: Copy, T: Copy,
{ {
debug_assert!(layer < image.layers); debug_assert!(buffers.len() < image.layers as usize);
// create a new command buffer // create a new command buffer
let command_buffer = CommandBuffer::new_primary().build(device.clone(), queue.clone())?; let command_buffer = CommandBuffer::new_primary().build(device.clone(), queue.clone())?;
@ -1052,27 +1059,8 @@ where
VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
))?; ))?;
// copy info for copying the content of the buffer into the image
let buffer_image_copy = VkBufferImageCopy {
bufferOffset: 0,
bufferRowLength: 0,
bufferImageHeight: 0,
imageSubresource: VkImageSubresourceLayers {
aspectMask: VK_IMAGE_ASPECT_COLOR_BIT.into(),
mipLevel: 0,
baseArrayLayer: layer,
layerCount: 1,
},
imageOffset: VkOffset3D { x: 0, y: 0, z: 0 },
imageExtent: VkExtent3D {
width: image.width(),
height: image.height(),
depth: 1,
},
};
// subresource information // subresource information
let mut subresource_range = VkImageSubresourceRange { let subresource_range = VkImageSubresourceRange {
aspectMask: VK_IMAGE_ASPECT_COLOR_BIT.into(), aspectMask: VK_IMAGE_ASPECT_COLOR_BIT.into(),
baseMipLevel: 0, baseMipLevel: 0,
levelCount: image.levels(), levelCount: image.levels(),
@ -1087,16 +1075,34 @@ where
subresource_range.clone(), subresource_range.clone(),
); );
// the actual copy command for (layer, buffer) in buffers.enumerate() {
buffer_recorder.copy_buffer_to_image( // copy info for copying the content of the buffer into the image
buffer, let buffer_image_copy = VkBufferImageCopy {
image, bufferOffset: 0,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, bufferRowLength: 0,
&[buffer_image_copy], bufferImageHeight: 0,
); imageSubresource: VkImageSubresourceLayers {
aspectMask: VK_IMAGE_ASPECT_COLOR_BIT.into(),
mipLevel: 0,
baseArrayLayer: layer as u32,
layerCount: 1,
},
imageOffset: VkOffset3D { x: 0, y: 0, z: 0 },
imageExtent: VkExtent3D {
width: image.width(),
height: image.height(),
depth: 1,
},
};
// just transition one mip level at a time // the actual copy command
subresource_range.levelCount = 1; buffer_recorder.copy_buffer_to_image(
buffer,
image,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
&[buffer_image_copy],
);
}
// mip map creation // mip map creation
if image.levels() > 1 { if image.levels() > 1 {
@ -1279,7 +1285,7 @@ fn blit_mip_maps(
baseMipLevel: 0, baseMipLevel: 0,
levelCount: 1, levelCount: 1,
baseArrayLayer: 0, baseArrayLayer: 0,
layerCount: 1, layerCount: image.layers(),
}; };
for i in 1..image.levels() { for i in 1..image.levels() {