diff --git a/vulkano/src/command_buffer/commands/clear.rs b/vulkano/src/command_buffer/commands/clear.rs index 9e68611198..68019d9a3b 100644 --- a/vulkano/src/command_buffer/commands/clear.rs +++ b/vulkano/src/command_buffer/commands/clear.rs @@ -821,7 +821,7 @@ impl UnsafeCommandBufferBuilder { let fns = self.device.fns(); (fns.v1_0.cmd_clear_color_image)( self.handle, - image.inner().image.handle(), + image.inner().handle(), image_layout.into(), &clear_value, ranges.len() as u32, @@ -857,7 +857,7 @@ impl UnsafeCommandBufferBuilder { let fns = self.device.fns(); (fns.v1_0.cmd_clear_depth_stencil_image)( self.handle, - image.inner().image.handle(), + image.inner().handle(), image_layout.into(), &clear_value, ranges.len() as u32, diff --git a/vulkano/src/command_buffer/commands/copy.rs b/vulkano/src/command_buffer/commands/copy.rs index 1911713d26..bf3c79cf1e 100644 --- a/vulkano/src/command_buffer/commands/copy.rs +++ b/vulkano/src/command_buffer/commands/copy.rs @@ -367,7 +367,7 @@ where let mut src_image_aspects_used = ImageAspects::empty(); let mut dst_image_aspects_used = ImageAspects::empty(); - let same_image = src_image_inner.image == dst_image_inner.image; + let is_same_image = src_image_inner == dst_image_inner; let mut overlap_subresource_indices = None; let mut overlap_extent_indices = None; @@ -664,13 +664,11 @@ where )?; // VUID-VkCopyImageInfo2-pRegions-00124 - if same_image { + if is_same_image { let src_region_index = region_index; let src_subresource_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; let src_extent_axes = [ src_offset[0]..src_offset[0] + extent[0], @@ -693,12 +691,8 @@ where } let dst_subresource_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level - + dst_subresource.mip_level - + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; if src_subresource_axes.iter().zip(dst_subresource_axes).any( @@ -784,13 +778,11 @@ where // VUID-VkCopyImageInfo2-pRegions-00124 // A simpler version that assumes the region covers the full extent. - if same_image { + if is_same_image { let src_region_index = region_index; let src_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; for (dst_region_index, dst_region) in regions.iter().enumerate() { @@ -807,12 +799,8 @@ where } let dst_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level - + dst_subresource.mip_level - + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; // There is only overlap if all of the axes overlap. @@ -2027,7 +2015,7 @@ where } } - let same_image = src_image_inner.image == dst_image_inner.image; + let is_same_image = src_image_inner == dst_image_inner; let mut overlap_subresource_indices = None; let mut overlap_extent_indices = None; @@ -2213,13 +2201,11 @@ where )?; // VUID-VkBlitImageInfo2-pRegions-00217 - if same_image { + if is_same_image { let src_region_index = region_index; let src_subresource_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; let src_extent_axes = [ min(src_offsets[0][0], src_offsets[1][0]) @@ -2238,10 +2224,8 @@ where } = dst_region; let dst_subresource_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level + dst_subresource.mip_level + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; if src_subresource_axes.iter().zip(dst_subresource_axes).any( @@ -3311,16 +3295,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageCopy2 { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3345,9 +3319,9 @@ impl UnsafeCommandBufferBuilder { .collect(); let copy_image_info = ash::vk::CopyImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3372,16 +3346,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageCopy { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3406,9 +3370,9 @@ impl UnsafeCommandBufferBuilder { (fns.v1_0.cmd_copy_image)( self.handle, - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -3457,11 +3421,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += dst_image_inner.first_layer; - image_subresource.array_layers.end += dst_image_inner.first_layer; - image_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy2 { buffer_offset: buffer_offset + src_buffer.offset(), buffer_row_length, @@ -3484,7 +3443,7 @@ impl UnsafeCommandBufferBuilder { let copy_buffer_to_image_info = ash::vk::CopyBufferToImageInfo2 { src_buffer: src_buffer.buffer().handle(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3513,11 +3472,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += dst_image_inner.first_layer; - image_subresource.array_layers.end += dst_image_inner.first_layer; - image_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy { buffer_offset: buffer_offset + src_buffer.offset(), buffer_row_length, @@ -3540,7 +3494,7 @@ impl UnsafeCommandBufferBuilder { (fns.v1_0.cmd_copy_buffer_to_image)( self.handle, src_buffer.buffer().handle(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -3589,11 +3543,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += src_image_inner.first_layer; - image_subresource.array_layers.end += src_image_inner.first_layer; - image_subresource.mip_level += src_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy2 { buffer_offset: buffer_offset + dst_buffer.offset(), buffer_row_length, @@ -3615,7 +3564,7 @@ impl UnsafeCommandBufferBuilder { .collect(); let copy_image_to_buffer_info = ash::vk::CopyImageToBufferInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), dst_buffer: dst_buffer.buffer().handle(), region_count: regions.len() as u32, @@ -3644,10 +3593,6 @@ impl UnsafeCommandBufferBuilder { image_extent, _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += src_image_inner.first_layer; - image_subresource.array_layers.end += src_image_inner.first_layer; - image_subresource.mip_level += src_image_inner.first_mipmap_level; ash::vk::BufferImageCopy { buffer_offset: buffer_offset + dst_buffer.offset(), @@ -3670,7 +3615,7 @@ impl UnsafeCommandBufferBuilder { (fns.v1_0.cmd_copy_image_to_buffer)( self.handle, - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), dst_buffer.buffer().handle(), regions.len() as u32, @@ -3718,16 +3663,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageBlit2 { src_subresource: src_subresource.into(), src_offsets: [ @@ -3761,9 +3696,9 @@ impl UnsafeCommandBufferBuilder { .collect(); let blit_image_info = ash::vk::BlitImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3788,16 +3723,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageBlit { src_subresource: src_subresource.into(), src_offsets: [ @@ -3831,9 +3756,9 @@ impl UnsafeCommandBufferBuilder { (fns.v1_0.cmd_blit_image)( self.handle, - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -3881,16 +3806,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageResolve2 { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3915,9 +3830,9 @@ impl UnsafeCommandBufferBuilder { .collect(); let resolve_image_info = ash::vk::ResolveImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3942,16 +3857,6 @@ impl UnsafeCommandBufferBuilder { _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageResolve { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3976,9 +3881,9 @@ impl UnsafeCommandBufferBuilder { (fns.v1_0.cmd_resolve_image)( self.handle, - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), diff --git a/vulkano/src/command_buffer/standard/builder/clear.rs b/vulkano/src/command_buffer/standard/builder/clear.rs index 40ba94132e..ef36a0d7f3 100644 --- a/vulkano/src/command_buffer/standard/builder/clear.rs +++ b/vulkano/src/command_buffer/standard/builder/clear.rs @@ -202,7 +202,7 @@ where let fns = self.device().fns(); (fns.v1_0.cmd_clear_color_image)( self.handle(), - image_inner.image.handle(), + image_inner.handle(), image_layout.into(), &clear_value, ranges.len() as u32, @@ -218,15 +218,10 @@ where secondary_use_ref: None, }; - for mut subresource_range in regions { - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - + for subresource_range in regions { self.resources_usage_state.record_image_access( &use_ref, - image_inner.image, + image_inner, subresource_range, PipelineStageAccess::Clear_TransferWrite, image_layout, @@ -435,7 +430,7 @@ where let fns = self.device().fns(); (fns.v1_0.cmd_clear_depth_stencil_image)( self.handle(), - image_inner.image.handle(), + image_inner.handle(), image_layout.into(), &clear_value, ranges.len() as u32, @@ -451,15 +446,10 @@ where secondary_use_ref: None, }; - for mut subresource_range in regions { - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - + for subresource_range in regions { self.resources_usage_state.record_image_access( &use_ref, - image_inner.image, + image_inner, subresource_range, PipelineStageAccess::Clear_TransferWrite, image_layout, diff --git a/vulkano/src/command_buffer/standard/builder/copy.rs b/vulkano/src/command_buffer/standard/builder/copy.rs index 4d80e2a591..50b3f5cbc2 100644 --- a/vulkano/src/command_buffer/standard/builder/copy.rs +++ b/vulkano/src/command_buffer/standard/builder/copy.rs @@ -506,7 +506,7 @@ where let mut src_image_aspects_used = ImageAspects::empty(); let mut dst_image_aspects_used = ImageAspects::empty(); - let same_image = src_image_inner.image == dst_image_inner.image; + let is_same_image = src_image_inner == dst_image_inner; let mut overlap_subresource_indices = None; let mut overlap_extent_indices = None; @@ -803,13 +803,11 @@ where )?; // VUID-VkCopyImageInfo2-pRegions-00124 - if same_image { + if is_same_image { let src_region_index = region_index; let src_subresource_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; let src_extent_axes = [ src_offset[0]..src_offset[0] + extent[0], @@ -832,12 +830,8 @@ where } let dst_subresource_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level - + dst_subresource.mip_level - + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; if src_subresource_axes.iter().zip(dst_subresource_axes).any( @@ -923,13 +917,11 @@ where // VUID-VkCopyImageInfo2-pRegions-00124 // A simpler version that assumes the region covers the full extent. - if same_image { + if is_same_image { let src_region_index = region_index; let src_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; for (dst_region_index, dst_region) in regions.iter().enumerate() { @@ -946,12 +938,8 @@ where } let dst_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level - + dst_subresource.mip_level - + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; // There is only overlap if all of the axes overlap. @@ -1072,16 +1060,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageCopy2 { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -1106,9 +1084,9 @@ where .collect(); let copy_image_info = ash::vk::CopyImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -1133,16 +1111,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageCopy { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -1167,9 +1135,9 @@ where (fns.v1_0.cmd_copy_image)( self.handle(), - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -1201,28 +1169,18 @@ where _ne: _, } = region; - let mut src_subresource_range = ImageSubresourceRange::from(src_subresource); - src_subresource_range.array_layers.start += src_image_inner.first_layer; - src_subresource_range.array_layers.end += src_image_inner.first_layer; - src_subresource_range.mip_levels.start += src_image_inner.first_mipmap_level; - src_subresource_range.mip_levels.end += src_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &src_use_ref, - src_image_inner.image, - src_subresource_range, + src_image_inner, + ImageSubresourceRange::from(src_subresource), PipelineStageAccess::Copy_TransferRead, src_image_layout, ); - let mut dst_subresource_range = ImageSubresourceRange::from(dst_subresource); - dst_subresource_range.array_layers.start += dst_image_inner.first_layer; - dst_subresource_range.array_layers.end += dst_image_inner.first_layer; - dst_subresource_range.mip_levels.start += dst_image_inner.first_mipmap_level; - dst_subresource_range.mip_levels.end += dst_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &dst_use_ref, - dst_image_inner.image, - dst_subresource_range, + dst_image_inner, + ImageSubresourceRange::from(dst_subresource), PipelineStageAccess::Copy_TransferWrite, dst_image_layout, ); @@ -1717,11 +1675,6 @@ where _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += dst_image_inner.first_layer; - image_subresource.array_layers.end += dst_image_inner.first_layer; - image_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy2 { buffer_offset: buffer_offset + src_buffer.offset(), buffer_row_length, @@ -1744,7 +1697,7 @@ where let copy_buffer_to_image_info = ash::vk::CopyBufferToImageInfo2 { src_buffer: src_buffer.buffer().handle(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -1773,11 +1726,6 @@ where _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += dst_image_inner.first_layer; - image_subresource.array_layers.end += dst_image_inner.first_layer; - image_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy { buffer_offset: buffer_offset + src_buffer.offset(), buffer_row_length, @@ -1800,7 +1748,7 @@ where (fns.v1_0.cmd_copy_buffer_to_image)( self.handle(), src_buffer.buffer().handle(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -1845,15 +1793,10 @@ where PipelineStageAccess::Copy_TransferRead, ); - let mut dst_subresource_range = ImageSubresourceRange::from(image_subresource); - dst_subresource_range.array_layers.start += dst_image_inner.first_layer; - dst_subresource_range.array_layers.end += dst_image_inner.first_layer; - dst_subresource_range.mip_levels.start += dst_image_inner.first_mipmap_level; - dst_subresource_range.mip_levels.end += dst_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &dst_use_ref, - dst_image_inner.image, - dst_subresource_range, + dst_image_inner, + ImageSubresourceRange::from(image_subresource), PipelineStageAccess::Copy_TransferWrite, dst_image_layout, ); @@ -2339,11 +2282,6 @@ where _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += src_image_inner.first_layer; - image_subresource.array_layers.end += src_image_inner.first_layer; - image_subresource.mip_level += src_image_inner.first_mipmap_level; - ash::vk::BufferImageCopy2 { buffer_offset: buffer_offset + dst_buffer.offset(), buffer_row_length, @@ -2365,7 +2303,7 @@ where .collect(); let copy_image_to_buffer_info = ash::vk::CopyImageToBufferInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), dst_buffer: dst_buffer.buffer().handle(), region_count: regions.len() as u32, @@ -2394,10 +2332,6 @@ where image_extent, _ne: _, } = region; - let mut image_subresource = image_subresource.clone(); - image_subresource.array_layers.start += src_image_inner.first_layer; - image_subresource.array_layers.end += src_image_inner.first_layer; - image_subresource.mip_level += src_image_inner.first_mipmap_level; ash::vk::BufferImageCopy { buffer_offset: buffer_offset + dst_buffer.offset(), @@ -2420,7 +2354,7 @@ where (fns.v1_0.cmd_copy_image_to_buffer)( self.handle(), - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), dst_buffer.buffer().handle(), regions.len() as u32, @@ -2456,15 +2390,10 @@ where _ne: _, } = region; - let mut src_subresource_range = ImageSubresourceRange::from(image_subresource); - src_subresource_range.array_layers.start += src_image_inner.first_layer; - src_subresource_range.array_layers.end += src_image_inner.first_layer; - src_subresource_range.mip_levels.start += src_image_inner.first_mipmap_level; - src_subresource_range.mip_levels.end += src_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &src_use_ref, - src_image_inner.image, - src_subresource_range, + src_image_inner, + ImageSubresourceRange::from(image_subresource), PipelineStageAccess::Copy_TransferRead, src_image_layout, ); @@ -2751,7 +2680,7 @@ where } } - let same_image = src_image_inner.image == dst_image_inner.image; + let is_same_image = src_image_inner == dst_image_inner; let mut overlap_subresource_indices = None; let mut overlap_extent_indices = None; @@ -2937,13 +2866,11 @@ where )?; // VUID-VkBlitImageInfo2-pRegions-00217 - if same_image { + if is_same_image { let src_region_index = region_index; let src_subresource_axes = [ - src_image_inner.first_mipmap_level + src_subresource.mip_level - ..src_image_inner.first_mipmap_level + src_subresource.mip_level + 1, - src_image_inner.first_layer + src_subresource.array_layers.start - ..src_image_inner.first_layer + src_subresource.array_layers.end, + src_subresource.mip_level..src_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; let src_extent_axes = [ min(src_offsets[0][0], src_offsets[1][0]) @@ -2962,10 +2889,8 @@ where } = dst_region; let dst_subresource_axes = [ - dst_image_inner.first_mipmap_level + dst_subresource.mip_level - ..dst_image_inner.first_mipmap_level + dst_subresource.mip_level + 1, - dst_image_inner.first_layer + src_subresource.array_layers.start - ..dst_image_inner.first_layer + src_subresource.array_layers.end, + dst_subresource.mip_level..dst_subresource.mip_level + 1, + src_subresource.array_layers.start..src_subresource.array_layers.end, ]; if src_subresource_axes.iter().zip(dst_subresource_axes).any( @@ -3066,16 +2991,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageBlit2 { src_subresource: src_subresource.into(), src_offsets: [ @@ -3109,9 +3024,9 @@ where .collect(); let blit_image_info = ash::vk::BlitImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3136,16 +3051,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageBlit { src_subresource: src_subresource.into(), src_offsets: [ @@ -3179,9 +3084,9 @@ where (fns.v1_0.cmd_blit_image)( self.handle(), - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -3213,28 +3118,18 @@ where _ne: _, } = region; - let mut src_subresource_range = ImageSubresourceRange::from(src_subresource); - src_subresource_range.array_layers.start += src_image_inner.first_layer; - src_subresource_range.array_layers.end += src_image_inner.first_layer; - src_subresource_range.mip_levels.start += src_image_inner.first_mipmap_level; - src_subresource_range.mip_levels.end += src_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &src_use_ref, - src_image_inner.image, - src_subresource_range, + src_image_inner, + ImageSubresourceRange::from(src_subresource), PipelineStageAccess::Blit_TransferRead, src_image_layout, ); - let mut dst_subresource_range = ImageSubresourceRange::from(dst_subresource); - dst_subresource_range.array_layers.start += dst_image_inner.first_layer; - dst_subresource_range.array_layers.end += dst_image_inner.first_layer; - dst_subresource_range.mip_levels.start += dst_image_inner.first_mipmap_level; - dst_subresource_range.mip_levels.end += dst_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &dst_use_ref, - dst_image_inner.image, - dst_subresource_range, + dst_image_inner, + ImageSubresourceRange::from(dst_subresource), PipelineStageAccess::Blit_TransferWrite, dst_image_layout, ); @@ -3564,16 +3459,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageResolve2 { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3598,9 +3483,9 @@ where .collect(); let resolve_image_info = ash::vk::ResolveImageInfo2 { - src_image: src_image_inner.image.handle(), + src_image: src_image_inner.handle(), src_image_layout: src_image_layout.into(), - dst_image: dst_image_inner.image.handle(), + dst_image: dst_image_inner.handle(), dst_image_layout: dst_image_layout.into(), region_count: regions.len() as u32, p_regions: regions.as_ptr(), @@ -3625,16 +3510,6 @@ where _ne: _, } = region; - let mut src_subresource = src_subresource.clone(); - src_subresource.array_layers.start += src_image_inner.first_layer; - src_subresource.array_layers.end += src_image_inner.first_layer; - src_subresource.mip_level += src_image_inner.first_mipmap_level; - - let mut dst_subresource = dst_subresource.clone(); - dst_subresource.array_layers.start += dst_image_inner.first_layer; - dst_subresource.array_layers.end += dst_image_inner.first_layer; - dst_subresource.mip_level += dst_image_inner.first_mipmap_level; - ash::vk::ImageResolve { src_subresource: src_subresource.into(), src_offset: ash::vk::Offset3D { @@ -3659,9 +3534,9 @@ where (fns.v1_0.cmd_resolve_image)( self.handle(), - src_image_inner.image.handle(), + src_image_inner.handle(), src_image_layout.into(), - dst_image_inner.image.handle(), + dst_image_inner.handle(), dst_image_layout.into(), regions.len() as u32, regions.as_ptr(), @@ -3693,28 +3568,18 @@ where _ne: _, } = region; - let mut src_subresource_range = ImageSubresourceRange::from(src_subresource); - src_subresource_range.array_layers.start += src_image_inner.first_layer; - src_subresource_range.array_layers.end += src_image_inner.first_layer; - src_subresource_range.mip_levels.start += src_image_inner.first_mipmap_level; - src_subresource_range.mip_levels.end += src_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &src_use_ref, - src_image_inner.image, - src_subresource_range, + src_image_inner, + ImageSubresourceRange::from(src_subresource), PipelineStageAccess::Resolve_TransferRead, src_image_layout, ); - let mut dst_subresource_range = ImageSubresourceRange::from(dst_subresource); - dst_subresource_range.array_layers.start += dst_image_inner.first_layer; - dst_subresource_range.array_layers.end += dst_image_inner.first_layer; - dst_subresource_range.mip_levels.start += dst_image_inner.first_mipmap_level; - dst_subresource_range.mip_levels.end += dst_image_inner.first_mipmap_level; self.resources_usage_state.record_image_access( &dst_use_ref, - dst_image_inner.image, - dst_subresource_range, + dst_image_inner, + ImageSubresourceRange::from(dst_subresource), PipelineStageAccess::Resolve_TransferWrite, dst_image_layout, ); diff --git a/vulkano/src/command_buffer/standard/builder/pipeline.rs b/vulkano/src/command_buffer/standard/builder/pipeline.rs index fef8bc695e..7b8d4472fc 100644 --- a/vulkano/src/command_buffer/standard/builder/pipeline.rs +++ b/vulkano/src/command_buffer/standard/builder/pipeline.rs @@ -2138,17 +2138,11 @@ fn record_descriptor_sets_access( .layout_for(descriptor_type); let (use_ref, stage_access_iter) = use_iter(index as u32); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - for stage_access in stage_access_iter { resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range.clone(), + image_inner, + image_view.subresource_range().clone(), stage_access, layout, ); @@ -2169,17 +2163,11 @@ fn record_descriptor_sets_access( .layout_for(descriptor_type); let (use_ref, stage_access_iter) = use_iter(index as u32); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - for stage_access in stage_access_iter { resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range.clone(), + image_inner, + image_view.subresource_range().clone(), stage_access, layout, ); @@ -2314,14 +2302,6 @@ fn record_subpass_attachments_access( let image = image_view.image(); let image_inner = image.inner(); - let mut subresource_range = ImageSubresourceRange { - aspects: ImageAspects::DEPTH, - ..image_view.subresource_range().clone() - }; - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; let use_ref = ResourceUseRef { command_index, @@ -2333,8 +2313,11 @@ fn record_subpass_attachments_access( for &access in accesses { resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range.clone(), + image_inner, + ImageSubresourceRange { + aspects: ImageAspects::DEPTH, + ..image_view.subresource_range().clone() + }, access, image_layout, ); @@ -2366,14 +2349,6 @@ fn record_subpass_attachments_access( let image = image_view.image(); let image_inner = image.inner(); - let mut subresource_range = ImageSubresourceRange { - aspects: ImageAspects::STENCIL, - ..image_view.subresource_range().clone() - }; - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; let use_ref = ResourceUseRef { command_index, @@ -2385,8 +2360,11 @@ fn record_subpass_attachments_access( for &access in accesses { resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range.clone(), + image_inner, + ImageSubresourceRange { + aspects: ImageAspects::STENCIL, + ..image_view.subresource_range().clone() + }, access, image_layout, ); @@ -2404,11 +2382,6 @@ fn record_subpass_attachments_access( let image = image_view.image(); let image_inner = image.inner(); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; let use_ref = ResourceUseRef { command_index, @@ -2422,8 +2395,8 @@ fn record_subpass_attachments_access( // TODO: is it possible to only read a color attachment but not write it? resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range, + image_inner, + image_view.subresource_range().clone(), PipelineStageAccess::ColorAttachmentOutput_ColorAttachmentWrite, image_layout, ); diff --git a/vulkano/src/command_buffer/standard/builder/render_pass.rs b/vulkano/src/command_buffer/standard/builder/render_pass.rs index 43d04d4a46..ff2e1834e8 100644 --- a/vulkano/src/command_buffer/standard/builder/render_pass.rs +++ b/vulkano/src/command_buffer/standard/builder/render_pass.rs @@ -20,7 +20,7 @@ use crate::{ }, device::{DeviceOwned, QueueFlags}, format::{ClearColorValue, ClearValue, NumericType}, - image::{ImageAspects, ImageLayout, ImageUsage, SampleCount}, + image::{ImageAspects, ImageLayout, ImageSubresourceRange, ImageUsage, SampleCount}, pipeline::graphics::subpass::PipelineRenderingCreateInfo, render_pass::{AttachmentDescription, LoadOp, ResolveMode, SubpassDescription}, sync::PipelineStageAccess, @@ -1906,25 +1906,6 @@ fn record_subpass_attachments_resolve( .. } = attachment_info; - let image = image_view.image(); - let image_inner = image.inner(); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - - if let Some(aspects) = aspects_override { - subresource_range.aspects = aspects; - } - - let use_ref = ResourceUseRef { - command_index, - command_name, - resource_in_command, - secondary_use_ref: None, - }; - if let Some(resolve_info) = resolve_info { let &RenderPassStateAttachmentResolveInfo { image_view: ref resolve_image_view, @@ -1932,22 +1913,13 @@ fn record_subpass_attachments_resolve( .. } = resolve_info; - let resolve_image = resolve_image_view.image(); - let resolve_image_inner = resolve_image.inner(); - let mut resolve_subresource_range = resolve_image_view.subresource_range().clone(); - resolve_subresource_range.array_layers.start += resolve_image_inner.first_layer; - resolve_subresource_range.array_layers.end += resolve_image_inner.first_layer; - resolve_subresource_range.mip_levels.start += resolve_image_inner.first_mipmap_level; - resolve_subresource_range.mip_levels.end += resolve_image_inner.first_mipmap_level; - - if let Some(aspects) = aspects_override { - resolve_subresource_range.aspects = aspects; - } + let image = image_view.image(); + let image_inner = image.inner(); - let resolve_use_ref = ResourceUseRef { + let use_ref = ResourceUseRef { command_index, command_name, - resource_in_command: resolve_resource_in_command, + resource_in_command, secondary_use_ref: None, }; @@ -1955,15 +1927,40 @@ fn record_subpass_attachments_resolve( // even for depth/stencil attachments. resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range, + image_inner, + if let Some(aspects) = aspects_override { + ImageSubresourceRange { + aspects, + ..image_view.subresource_range().clone() + } + } else { + image_view.subresource_range().clone() + }, PipelineStageAccess::ColorAttachmentOutput_ColorAttachmentRead, image_layout, ); + + let resolve_image = resolve_image_view.image(); + let resolve_image_inner = resolve_image.inner(); + + let resolve_use_ref = ResourceUseRef { + command_index, + command_name, + resource_in_command: resolve_resource_in_command, + secondary_use_ref: None, + }; + resources_usage_state.record_image_access( &resolve_use_ref, - resolve_image_inner.image, - resolve_subresource_range, + resolve_image_inner, + if let Some(aspects) = aspects_override { + ImageSubresourceRange { + aspects, + ..resolve_image_view.subresource_range().clone() + } + } else { + resolve_image_view.subresource_range().clone() + }, PipelineStageAccess::ColorAttachmentOutput_ColorAttachmentWrite, resolve_image_layout, ); @@ -2028,10 +2025,6 @@ fn record_subpass_attachments_store( let image = image_view.image(); let image_inner = image.inner(); let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; if let Some(aspects) = aspects_override { subresource_range.aspects = aspects; @@ -2046,7 +2039,7 @@ fn record_subpass_attachments_store( resources_usage_state.record_image_access( &use_ref, - image_inner.image, + image_inner, subresource_range, access, image_layout, @@ -2064,15 +2057,6 @@ fn record_subpass_attachments_store( if let Some(access) = store_access { let image = image_view.image(); let image_inner = image.inner(); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - - if let Some(aspects) = aspects_override { - subresource_range.aspects = aspects; - } let use_ref = ResourceUseRef { command_index, @@ -2083,8 +2067,15 @@ fn record_subpass_attachments_store( resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range, + image_inner, + if let Some(aspects) = aspects_override { + ImageSubresourceRange { + aspects, + ..image_view.subresource_range().clone() + } + } else { + image_view.subresource_range().clone() + }, access, image_layout, ); @@ -2150,10 +2141,6 @@ fn record_subpass_attachments_load( let image = image_view.image(); let image_inner = image.inner(); let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; if let Some(aspects) = aspects_override { subresource_range.aspects = aspects; @@ -2168,7 +2155,7 @@ fn record_subpass_attachments_load( resources_usage_state.record_image_access( &use_ref, - image_inner.image, + image_inner, subresource_range, access, image_layout, @@ -2186,15 +2173,6 @@ fn record_subpass_attachments_load( if let Some(access) = load_access { let image = image_view.image(); let image_inner = image.inner(); - let mut subresource_range = image_view.subresource_range().clone(); - subresource_range.array_layers.start += image_inner.first_layer; - subresource_range.array_layers.end += image_inner.first_layer; - subresource_range.mip_levels.start += image_inner.first_mipmap_level; - subresource_range.mip_levels.end += image_inner.first_mipmap_level; - - if let Some(aspects) = aspects_override { - subresource_range.aspects = aspects; - } let use_ref = ResourceUseRef { command_index, @@ -2205,8 +2183,15 @@ fn record_subpass_attachments_load( resources_usage_state.record_image_access( &use_ref, - image_inner.image, - subresource_range, + image_inner, + if let Some(aspects) = aspects_override { + ImageSubresourceRange { + aspects, + ..image_view.subresource_range().clone() + } + } else { + image_view.subresource_range().clone() + }, access, image_layout, ); diff --git a/vulkano/src/command_buffer/standard/builder/sync.rs b/vulkano/src/command_buffer/standard/builder/sync.rs index c6081949d2..d780fa6b1e 100644 --- a/vulkano/src/command_buffer/standard/builder/sync.rs +++ b/vulkano/src/command_buffer/standard/builder/sync.rs @@ -1032,7 +1032,7 @@ where // The image is not known until you execute it in a primary command buffer. if let Some(framebuffer) = &begin_render_pass_state.framebuffer { let attachment_index = (framebuffer.attachments().iter()) - .position(|attachment| attachment.image().inner().image == &barrier.image) + .position(|attachment| attachment.image().inner() == &barrier.image) .ok_or(SynchronizationError::ImageMemoryBarrierNotInputAttachment { barrier_index, })? as u32; diff --git a/vulkano/src/command_buffer/synced/builder.rs b/vulkano/src/command_buffer/synced/builder.rs index 4ad6029197..a4bb57df02 100644 --- a/vulkano/src/command_buffer/synced/builder.rs +++ b/vulkano/src/command_buffer/synced/builder.rs @@ -277,7 +277,7 @@ impl SyncCommandBufferBuilder { fn find_image_conflict( &self, image: &dyn ImageAccess, - mut subresource_range: ImageSubresourceRange, + subresource_range: ImageSubresourceRange, memory: &PipelineMemoryAccess, start_layout: ImageLayout, _end_layout: ImageLayout, @@ -288,14 +288,9 @@ impl SyncCommandBufferBuilder { self.latest_render_pass_enter.unwrap_or(self.commands.len()); let inner = image.inner(); - subresource_range.array_layers.start += inner.first_layer; - subresource_range.array_layers.end += inner.first_layer; - subresource_range.mip_levels.start += inner.first_mipmap_level; - subresource_range.mip_levels.end += inner.first_mipmap_level; - - let range_map = self.images2.get(inner.image)?; + let range_map = self.images2.get(inner)?; - for range in inner.image.iter_ranges(subresource_range) { + for range in inner.iter_ranges(subresource_range) { for (_range, state) in range_map .range(&range) .filter(|(_range, state)| !state.resource_uses.is_empty()) @@ -532,10 +527,6 @@ impl SyncCommandBufferBuilder { .unwrap_or(self.commands.len() - 1); let inner = image.inner(); - subresource_range.array_layers.start += inner.first_layer; - subresource_range.array_layers.end += inner.first_layer; - subresource_range.mip_levels.start += inner.first_mipmap_level; - subresource_range.mip_levels.end += inner.first_mipmap_level; // VUID-VkImageMemoryBarrier2-image-03320 if !self @@ -550,9 +541,9 @@ impl SyncCommandBufferBuilder { subresource_range.aspects = ImageAspects::DEPTH | ImageAspects::STENCIL; } - let range_map = self.images2.entry(inner.image.clone()).or_insert_with(|| { + let range_map = self.images2.entry(inner.clone()).or_insert_with(|| { [( - 0..inner.image.range_size(), + 0..inner.range_size(), match self.level { CommandBufferLevel::Primary => { // In a primary command buffer, the initial layout is determined @@ -594,7 +585,7 @@ impl SyncCommandBufferBuilder { .collect() }); - for range in inner.image.iter_ranges(subresource_range) { + for range in inner.iter_ranges(subresource_range) { range_map.split_at(&range.start); range_map.split_at(&range.end); @@ -628,8 +619,8 @@ impl SyncCommandBufferBuilder { dst_access: AccessFlags::MEMORY_READ | AccessFlags::MEMORY_WRITE, old_layout: state.initial_layout, new_layout: start_layout, - subresource_range: inner.image.range_to_subresources(range.clone()), - ..ImageMemoryBarrier::image(inner.image.clone()) + subresource_range: inner.range_to_subresources(range.clone()), + ..ImageMemoryBarrier::image(inner.clone()) }; // If the `new_layout` is Undefined or Preinitialized, this requires @@ -746,8 +737,8 @@ impl SyncCommandBufferBuilder { dst_access: memory.access, old_layout: state.current_layout, new_layout: start_layout, - subresource_range: inner.image.range_to_subresources(range.clone()), - ..ImageMemoryBarrier::image(inner.image.clone()) + subresource_range: inner.range_to_subresources(range.clone()), + ..ImageMemoryBarrier::image(inner.clone()) }); // Update state. diff --git a/vulkano/src/descriptor_set/update.rs b/vulkano/src/descriptor_set/update.rs index 8ba61c561f..df97770a9c 100644 --- a/vulkano/src/descriptor_set/update.rs +++ b/vulkano/src/descriptor_set/update.rs @@ -529,8 +529,7 @@ pub(crate) fn check_descriptor_write<'a>( if matches!( image_view.view_type(), ImageViewType::Dim2d | ImageViewType::Dim2dArray - ) && image_view.image().inner().image.dimensions().image_type() - == ImageType::Dim3d + ) && image_view.image().inner().dimensions().image_type() == ImageType::Dim3d { return Err(DescriptorSetUpdateError::ImageView2dFrom3d { binding: write.binding(), @@ -623,8 +622,7 @@ pub(crate) fn check_descriptor_write<'a>( if matches!( image_view.view_type(), ImageViewType::Dim2d | ImageViewType::Dim2dArray - ) && image_view.image().inner().image.dimensions().image_type() - == ImageType::Dim3d + ) && image_view.image().inner().dimensions().image_type() == ImageType::Dim3d { return Err(DescriptorSetUpdateError::ImageView2dFrom3d { binding: write.binding(), @@ -682,8 +680,7 @@ pub(crate) fn check_descriptor_write<'a>( if matches!( image_view.view_type(), ImageViewType::Dim2d | ImageViewType::Dim2dArray - ) && image_view.image().inner().image.dimensions().image_type() - == ImageType::Dim3d + ) && image_view.image().inner().dimensions().image_type() == ImageType::Dim3d { return Err(DescriptorSetUpdateError::ImageView2dFrom3d { binding: write.binding(), @@ -742,8 +739,7 @@ pub(crate) fn check_descriptor_write<'a>( if matches!( image_view.view_type(), ImageViewType::Dim2d | ImageViewType::Dim2dArray - ) && image_view.image().inner().image.dimensions().image_type() - == ImageType::Dim3d + ) && image_view.image().inner().dimensions().image_type() == ImageType::Dim3d { return Err(DescriptorSetUpdateError::ImageView2dFrom3d { binding: write.binding(), @@ -947,8 +943,7 @@ pub(crate) fn check_descriptor_write<'a>( if matches!( image_view.view_type(), ImageViewType::Dim2d | ImageViewType::Dim2dArray - ) && image_view.image().inner().image.dimensions().image_type() - == ImageType::Dim3d + ) && image_view.image().inner().dimensions().image_type() == ImageType::Dim3d { return Err(DescriptorSetUpdateError::ImageView2dFrom3d { binding: write.binding(), diff --git a/vulkano/src/device/queue.rs b/vulkano/src/device/queue.rs index 11fc703cbd..efb44774e6 100644 --- a/vulkano/src/device/queue.rs +++ b/vulkano/src/device/queue.rs @@ -267,7 +267,7 @@ impl<'a> QueueGuard<'a> { .map(|(image, memory_binds)| { ( ash::vk::SparseImageOpaqueMemoryBindInfo { - image: image.inner().image.handle(), + image: image.inner().handle(), bind_count: 0, p_binds: ptr::null(), }, @@ -309,7 +309,7 @@ impl<'a> QueueGuard<'a> { .map(|(image, memory_binds)| { ( ash::vk::SparseImageMemoryBindInfo { - image: image.inner().image.handle(), + image: image.inner().handle(), bind_count: 0, p_binds: ptr::null(), }, @@ -1452,14 +1452,14 @@ impl<'a> States<'a> { } for (image, _) in image_opaque_binds { - let image = &image.inner().image; + let image = image.inner(); images .entry(image.handle()) .or_insert_with(|| image.state()); } for (image, _) in image_binds { - let image = &image.inner().image; + let image = image.inner(); images .entry(image.handle()) .or_insert_with(|| image.state()); diff --git a/vulkano/src/image/attachment.rs b/vulkano/src/image/attachment.rs index 1a4faaff59..893d40fbfb 100644 --- a/vulkano/src/image/attachment.rs +++ b/vulkano/src/image/attachment.rs @@ -10,8 +10,8 @@ use super::{ sys::{Image, ImageMemory, RawImage}, traits::ImageContent, - ImageAccess, ImageAspects, ImageDescriptorLayouts, ImageError, ImageInner, ImageLayout, - ImageUsage, SampleCount, + ImageAccess, ImageAspects, ImageDescriptorLayouts, ImageError, ImageLayout, ImageUsage, + SampleCount, }; use crate::{ device::{Device, DeviceOwned}, @@ -589,14 +589,8 @@ impl AttachmentImage { unsafe impl ImageAccess for AttachmentImage { #[inline] - fn inner(&self) -> ImageInner<'_> { - ImageInner { - image: &self.inner, - first_layer: 0, - num_layers: self.inner.dimensions().array_layers(), - first_mipmap_level: 0, - num_mipmap_levels: 1, - } + fn inner(&self) -> &Arc { + &self.inner } #[inline] diff --git a/vulkano/src/image/immutable.rs b/vulkano/src/image/immutable.rs index 42503796b3..817e536af9 100644 --- a/vulkano/src/image/immutable.rs +++ b/vulkano/src/image/immutable.rs @@ -10,7 +10,7 @@ use super::{ sys::{Image, RawImage}, traits::ImageContent, - ImageAccess, ImageCreateFlags, ImageDescriptorLayouts, ImageDimensions, ImageError, ImageInner, + ImageAccess, ImageCreateFlags, ImageDescriptorLayouts, ImageDimensions, ImageError, ImageLayout, ImageSubresourceLayers, ImageUsage, MipmapsCount, }; use crate::{ @@ -313,14 +313,8 @@ unsafe impl DeviceOwned for ImmutableImage { unsafe impl ImageAccess for ImmutableImage { #[inline] - fn inner(&self) -> ImageInner<'_> { - ImageInner { - image: &self.inner, - first_layer: 0, - num_layers: self.inner.dimensions().array_layers(), - first_mipmap_level: 0, - num_mipmap_levels: self.inner.mip_levels(), - } + fn inner(&self) -> &Arc { + &self.inner } #[inline] @@ -384,7 +378,7 @@ unsafe impl DeviceOwned for ImmutableImageInitialization { unsafe impl ImageAccess for ImmutableImageInitialization { #[inline] - fn inner(&self) -> ImageInner<'_> { + fn inner(&self) -> &Arc { self.image.inner() } diff --git a/vulkano/src/image/mod.rs b/vulkano/src/image/mod.rs index 6b8c2b64f6..852db131b3 100644 --- a/vulkano/src/image/mod.rs +++ b/vulkano/src/image/mod.rs @@ -54,7 +54,7 @@ pub use self::{ storage::StorageImage, swapchain::SwapchainImage, sys::ImageError, - traits::{ImageAccess, ImageInner}, + traits::ImageAccess, usage::ImageUsage, view::{ImageViewAbstract, ImageViewType}, }; @@ -635,6 +635,18 @@ impl From for ash::vk::ImageSubresourceLayers { } } +impl From<&ImageSubresourceLayers> for ash::vk::ImageSubresourceLayers { + #[inline] + fn from(val: &ImageSubresourceLayers) -> Self { + Self { + aspect_mask: val.aspects.into(), + mip_level: val.mip_level, + base_array_layer: val.array_layers.start, + layer_count: val.array_layers.end - val.array_layers.start, + } + } +} + /// One or more subresources of an image that should be accessed by a command. #[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct ImageSubresourceRange { diff --git a/vulkano/src/image/storage.rs b/vulkano/src/image/storage.rs index f4fb2e1d5a..19018c3207 100644 --- a/vulkano/src/image/storage.rs +++ b/vulkano/src/image/storage.rs @@ -11,7 +11,7 @@ use super::{ sys::{Image, ImageMemory, RawImage}, traits::ImageContent, ImageAccess, ImageAspects, ImageCreateFlags, ImageDescriptorLayouts, ImageDimensions, - ImageError, ImageInner, ImageLayout, ImageUsage, + ImageError, ImageLayout, ImageUsage, }; use crate::{ device::{Device, DeviceOwned, Queue}, @@ -468,14 +468,8 @@ unsafe impl DeviceOwned for StorageImage { unsafe impl ImageAccess for StorageImage { #[inline] - fn inner(&self) -> ImageInner<'_> { - ImageInner { - image: &self.inner, - first_layer: 0, - num_layers: self.inner.dimensions().array_layers(), - first_mipmap_level: 0, - num_mipmap_levels: 1, - } + fn inner(&self) -> &Arc { + &self.inner } #[inline] diff --git a/vulkano/src/image/swapchain.rs b/vulkano/src/image/swapchain.rs index 6fa6853075..88e333b6b6 100644 --- a/vulkano/src/image/swapchain.rs +++ b/vulkano/src/image/swapchain.rs @@ -10,7 +10,7 @@ use super::{ sys::{Image, ImageMemory}, traits::ImageContent, - ImageAccess, ImageDescriptorLayouts, ImageInner, ImageLayout, + ImageAccess, ImageDescriptorLayouts, ImageLayout, }; use crate::{ device::{Device, DeviceOwned}, @@ -70,14 +70,8 @@ unsafe impl DeviceOwned for SwapchainImage { } unsafe impl ImageAccess for SwapchainImage { - fn inner(&self) -> ImageInner<'_> { - ImageInner { - image: &self.inner, - first_layer: 0, - num_layers: self.inner.dimensions().array_layers(), - first_mipmap_level: 0, - num_mipmap_levels: 1, - } + fn inner(&self) -> &Arc { + &self.inner } fn initial_layout_requirement(&self) -> ImageLayout { diff --git a/vulkano/src/image/traits.rs b/vulkano/src/image/traits.rs index 5b5a6a5072..6614281752 100644 --- a/vulkano/src/image/traits.rs +++ b/vulkano/src/image/traits.rs @@ -25,82 +25,48 @@ use std::{ /// Trait for types that represent the way a GPU can access an image. pub unsafe trait ImageAccess: DeviceOwned + Send + Sync { /// Returns the inner unsafe image object used by this image. - fn inner(&self) -> ImageInner<'_>; + fn inner(&self) -> &Arc; /// Returns the dimensions of the image. #[inline] fn dimensions(&self) -> ImageDimensions { - let inner = self.inner(); - - match self - .inner() - .image - .dimensions() - .mip_level_dimensions(inner.first_mipmap_level) - .unwrap() - { - ImageDimensions::Dim1d { - width, - array_layers: _, - } => ImageDimensions::Dim1d { - width, - array_layers: inner.num_layers, - }, - ImageDimensions::Dim2d { - width, - height, - array_layers: _, - } => ImageDimensions::Dim2d { - width, - height, - array_layers: inner.num_layers, - }, - ImageDimensions::Dim3d { - width, - height, - depth, - } => ImageDimensions::Dim3d { - width, - height, - depth, - }, - } + self.inner().dimensions() } /// Returns the format of this image. #[inline] fn format(&self) -> Format { - self.inner().image.format().unwrap() + self.inner().format().unwrap() } /// Returns the features supported by the image's format. #[inline] fn format_features(&self) -> FormatFeatures { - self.inner().image.format_features() + self.inner().format_features() } /// Returns the number of mipmap levels of this image. #[inline] fn mip_levels(&self) -> u32 { - self.inner().num_mipmap_levels + self.inner().mip_levels() } /// Returns the number of samples of this image. #[inline] fn samples(&self) -> SampleCount { - self.inner().image.samples() + self.inner().samples() } /// Returns the usage the image was created with. #[inline] fn usage(&self) -> ImageUsage { - self.inner().image.usage() + self.inner().usage() } /// Returns the stencil usage the image was created with. #[inline] fn stencil_usage(&self) -> ImageUsage { - self.inner().image.stencil_usage() + self.inner().stencil_usage() } /// Returns an `ImageSubresourceLayers` covering the first mip level of the image. All aspects @@ -145,7 +111,7 @@ pub unsafe trait ImageAccess: DeviceOwned + Send + Sync { #[inline] fn initial_layout(&self) -> ImageLayout { - self.inner().image.initial_layout() + self.inner().initial_layout() } /// Returns the layout that the image has when it is first used in a primary command buffer. @@ -191,25 +157,6 @@ pub unsafe trait ImageAccess: DeviceOwned + Send + Sync { fn descriptor_layouts(&self) -> Option; } -/// Inner information about an image. -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] -pub struct ImageInner<'a> { - /// The underlying image object. - pub image: &'a Arc, - - /// The first layer of `image` to consider. - pub first_layer: u32, - - /// The number of layers of `image` to consider. - pub num_layers: u32, - - /// The first mipmap level of `image` to consider. - pub first_mipmap_level: u32, - - /// The number of mipmap levels of `image` to consider. - pub num_mipmap_levels: u32, -} - impl Debug for dyn ImageAccess { fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), FmtError> { f.debug_struct("dyn ImageAccess") @@ -254,7 +201,7 @@ unsafe impl ImageAccess for ImageAccessFromUndefinedLayout where I: ImageAccess, { - fn inner(&self) -> ImageInner<'_> { + fn inner(&self) -> &Arc { self.image.inner() } @@ -305,7 +252,7 @@ where T: SafeDeref + Send + Sync, T::Target: ImageAccess, { - fn inner(&self) -> ImageInner<'_> { + fn inner(&self) -> &Arc { (**self).inner() } diff --git a/vulkano/src/image/view.rs b/vulkano/src/image/view.rs index 99bed3b567..147ac03098 100644 --- a/vulkano/src/image/view.rs +++ b/vulkano/src/image/view.rs @@ -99,7 +99,7 @@ where _ne: _, } = create_info; - let image_inner = image.inner().image; + let image_inner = image.inner(); let device = image_inner.device(); let format = format.unwrap(); @@ -526,8 +526,7 @@ where image: Arc, create_info: ImageViewCreateInfo, ) -> Result, VulkanError> { - let format_features = - Self::get_format_features(create_info.format.unwrap(), image.inner().image); + let format_features = Self::get_format_features(create_info.format.unwrap(), image.inner()); Self::new_unchecked_with_format_features(image, create_info, format_features) } @@ -546,7 +545,7 @@ where _ne: _, } = &create_info; - let image_inner = image.inner().image; + let image_inner = image.inner(); let device = image_inner.device(); let default_usage = Self::get_default_usage(subresource_range.aspects, image_inner); @@ -626,8 +625,7 @@ where handle: ash::vk::ImageView, create_info: ImageViewCreateInfo, ) -> Result, VulkanError> { - let format_features = - Self::get_format_features(create_info.format.unwrap(), image.inner().image); + let format_features = Self::get_format_features(create_info.format.unwrap(), image.inner()); Self::from_handle_with_format_features(image, handle, create_info, format_features) } @@ -647,7 +645,7 @@ where _ne: _, } = create_info; - let image_inner = image.inner().image; + let image_inner = image.inner(); let device = image_inner.device(); if usage.is_empty() { @@ -794,7 +792,7 @@ where I: ImageAccess + ?Sized, { fn device(&self) -> &Arc { - self.image.inner().image.device() + self.image.inner().device() } }