Fix input attachment for unit test

This commit is contained in:
hodasemi 2023-01-22 18:05:58 +01:00
parent 495892cfa8
commit cab3d9e530
3 changed files with 140 additions and 9 deletions

View file

@ -43,9 +43,6 @@ pub use super::{OutOfDate, VkHandle, VulkanDevice};
pub use image;
pub use vulkan_sys::prelude::*;
pub use super::render_target::{
sub_pass::{ClearValue, CustomTarget, SubPass, SubPassBuilder},
RenderTarget,
};
pub use super::render_target::{sub_pass::*, *};
pub use super::single_submit::SingleSubmit;

View file

@ -345,3 +345,109 @@ impl RenderTarget {
buffer_recorder.end_render_pass();
}
}
#[cfg(test)]
mod test {
use crate::prelude::*;
use anyhow::Result;
use std::sync::{Arc, Mutex};
fn create_vk_handles() -> Result<(Arc<Device>, Arc<Mutex<Queue>>)> {
let instance = Instance::new(
VkApplicationInfo::new(
&VkString::new("Test"),
1,
&VkString::new("no name"),
1,
VK_MAKE_VERSION(1, 3, 0),
),
VulkanDebugInfo::default(),
InstanceExtensions::default(),
)?;
let physical_device = PhysicalDevice::new(instance)?;
let queue_info = Queue::create_non_presentable_request_info(
&physical_device,
VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_TRANSFER_BIT,
)?;
let device = Device::new(
physical_device,
DeviceExtensions::default(),
&[queue_info.queue_create_info],
DeviceFeatures::default(),
)?;
let queue = device.get_queue(queue_info.queue_family_index, queue_info.queue_index);
Ok((device, queue))
}
#[test]
fn test_render_target() {
let (device, queue) = create_vk_handles().unwrap();
let target_images: Vec<Arc<Image>> = (0..2)
.map(|_| {
let image = Image::empty(
1920,
1080,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
VK_SAMPLE_COUNT_1_BIT,
)
.format(VK_FORMAT_R8G8B8A8_UNORM)
.build(&device, &queue)?;
image.convert_layout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL)?;
Ok(image)
})
.collect::<Result<Vec<Arc<Image>>>>()
.unwrap();
RenderTarget::builder()
.add_sub_pass(
SubPass::builder(target_images[0].width(), target_images[0].height())
.set_prepared_targets(&target_images, 0, [0.0, 0.0, 0.0, 0.0], false)
.build(&device)
.unwrap(),
)
.add_sub_pass(
SubPass::builder(target_images[0].width(), target_images[0].height())
.add_target_info(CustomTarget {
usage: VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT.into(),
format: VK_FORMAT_R8G8B8A8_UNORM,
clear_on_load: true,
store_on_save: true,
attach_sampler: false,
use_as_input: false,
clear_value: ClearValue::Color([0.0, 0.0, 0.0, 0.0]),
})
.set_sample_count(VK_SAMPLE_COUNT_4_BIT)
.add_resolve_targets(CustomTarget::resolve(
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
VK_FORMAT_R8G8B8A8_UNORM,
None,
false,
true,
))
.use_queue(queue.clone())
.build(&device)
.unwrap(),
)
.add_sub_pass(
SubPass::builder(target_images[0].width(), target_images[0].height())
.set_input_attachment_info(InputAttachmentInfo {
sub_pass_index: 1,
input_indices: vec![1],
})
.set_prepared_targets(&target_images, 0, [0.0, 0.0, 0.0, 0.0], false)
.build(&device)
.unwrap(),
)
.build(&device)
.unwrap();
}
}

View file

@ -18,8 +18,8 @@ pub struct CustomTarget {
}
impl CustomTarget {
pub fn depth() -> CustomTarget {
CustomTarget {
pub fn depth() -> Self {
Self {
usage: VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT.into(),
format: VK_FORMAT_D16_UNORM,
clear_on_load: true,
@ -30,6 +30,30 @@ impl CustomTarget {
}
}
pub fn resolve(
usage: impl Into<VkImageUsageFlagBits>,
format: VkFormat,
clear_value: impl Into<Option<ClearValue>>,
attach_sampler: bool,
use_as_input: bool,
) -> Self {
let clear_value = clear_value.into();
Self {
usage: usage.into(),
format,
clear_on_load: if use_as_input {
false
} else {
clear_value.is_some()
},
store_on_save: true,
attach_sampler,
use_as_input,
clear_value: clear_value.unwrap_or(ClearValue::Color([0.0, 0.0, 0.0, 0.0])),
}
}
fn to_attachment_info(
&self,
device: &Arc<Device>,
@ -104,7 +128,13 @@ impl CustomTarget {
unimplemented!();
};
let mut image_builder = Image::empty(width, height, self.usage, sample_count)
let mut vk_usage = self.usage;
if self.use_as_input {
vk_usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
}
let mut image_builder = Image::empty(width, height, vk_usage, sample_count)
.format(format)
.aspect_mask(aspect);
@ -114,8 +144,6 @@ impl CustomTarget {
let image = image_builder.build(device, queue)?;
image.convert_layout(layout)?;
match aspect {
VK_IMAGE_ASPECT_DEPTH_BIT => {
Image::convert_layout(&image, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL)?