vk: fix lifetime issues with ash

Using `build` everywhere was causing miscompilations because of lifetimes leaking.
This commit is contained in:
chyyran 2023-02-15 22:57:20 -05:00
parent d9625187ed
commit b81f415917
16 changed files with 186 additions and 182 deletions

View file

@ -241,7 +241,7 @@ impl FilterChainVulkan {
device.create_command_pool(
&vk::CommandPoolCreateInfo::builder()
.flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER)
.build(),
,
None,
)?
};
@ -253,7 +253,7 @@ impl FilterChainVulkan {
.command_pool(command_pool)
.level(vk::CommandBufferLevel::PRIMARY)
.command_buffer_count(1)
.build(),
,
)?[0]
};
@ -262,7 +262,7 @@ impl FilterChainVulkan {
command_buffer,
&vk::CommandBufferBeginInfo::builder()
.flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT)
.build(),
,
)?
}
@ -279,9 +279,10 @@ impl FilterChainVulkan {
device.end_command_buffer(command_buffer)?;
let buffers = [command_buffer];
let submits = [vk::SubmitInfo::builder().command_buffers(&buffers).build()];
let submit_info = vk::SubmitInfo::builder()
.command_buffers(&buffers);
device.queue_submit(queue, &submits, vk::Fence::null())?;
device.queue_submit(queue, &[*submit_info], vk::Fence::null())?;
device.queue_wait_idle(queue)?;
device.free_command_buffers(command_pool, &buffers);
device.destroy_command_pool(command_pool, None);
@ -583,21 +584,19 @@ impl FilterChainVulkan {
.format(input.format)
.view_type(vk::ImageViewType::TYPE_2D)
.subresource_range(
vk::ImageSubresourceRange::builder()
*vk::ImageSubresourceRange::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.level_count(1)
.layer_count(1)
.build(),
)
.components(
vk::ComponentMapping::builder()
*vk::ComponentMapping::builder()
.r(vk::ComponentSwizzle::R)
.g(vk::ComponentSwizzle::G)
.b(vk::ComponentSwizzle::B)
.a(vk::ComponentSwizzle::A)
.build(),
)
.build();
);
self.vulkan.device.create_image_view(&create_info, None)?
};

View file

@ -57,21 +57,21 @@ impl BindSemantics<NoUniformBinder, Option<()>, RawVulkanBuffer> for FilterPass
device: &Self::DeviceContext,
) {
let sampler = samplers.get(texture.wrap_mode, texture.filter_mode, texture.mip_filter);
let image_info = [vk::DescriptorImageInfo::builder()
let image_info = vk::DescriptorImageInfo::builder()
.sampler(sampler.handle)
.image_view(texture.image_view)
.image_layout(vk::ImageLayout::SHADER_READ_ONLY_OPTIMAL)
.build()];
;
let write_desc = [vk::WriteDescriptorSet::builder()
let image_info = [*image_info];
let write_desc = vk::WriteDescriptorSet::builder()
.dst_set(*descriptors)
.dst_binding(binding.binding)
.dst_array_element(0)
.descriptor_type(vk::DescriptorType::COMBINED_IMAGE_SAMPLER)
.image_info(&image_info)
.build()];
.image_info(&image_info);
unsafe {
device.update_descriptor_sets(&write_desc, &[]);
device.update_descriptor_sets(&[*write_desc], &[]);
}
}
}

View file

@ -21,22 +21,22 @@ impl OutputImage {
.level_count(1)
.layer_count(1)
.aspect_mask(vk::ImageAspectFlags::COLOR)
.build();
;
let swizzle_components = vk::ComponentMapping::builder()
.r(vk::ComponentSwizzle::R)
.g(vk::ComponentSwizzle::G)
.b(vk::ComponentSwizzle::B)
.a(vk::ComponentSwizzle::A)
.build();
;
let view_info = vk::ImageViewCreateInfo::builder()
.view_type(vk::ImageViewType::TYPE_2D)
.format(image.format)
.image(image.image)
.subresource_range(image_subresource)
.components(swizzle_components)
.build();
.subresource_range(*image_subresource)
.components(*swizzle_components)
;
let image_view = unsafe { vulkan.device.create_image_view(&view_info, None)? };

View file

@ -11,6 +11,7 @@ use librashader_reflect::reflect::ShaderReflection;
use librashader_runtime::render_target::RenderTarget;
use std::ffi::CStr;
use std::sync::Arc;
use ash::vk::PushConstantRange;
const ENTRY_POINT: &CStr = unsafe { CStr::from_bytes_with_nul_unchecked(b"main\0") };
@ -77,8 +78,7 @@ impl PipelineDescriptors {
unsafe {
let layout = device.create_descriptor_set_layout(
&vk::DescriptorSetLayoutCreateInfo::builder()
.bindings(self.bindings())
.build(),
.bindings(self.bindings()),
None,
)?;
Ok(layout)
@ -108,25 +108,39 @@ impl PipelineLayoutObjects {
let pipeline_create_info =
vk::PipelineLayoutCreateInfo::builder().set_layouts(&descriptor_set_layout);
let pipeline_create_info = if let Some(push_constant) = &reflection.push_constant {
let push_constant_range = reflection.push_constant.as_ref()
.map(|push_constant| {
let stage_mask = util::binding_stage_to_vulkan_stage(push_constant.stage_mask);
let push_constant_range = [vk::PushConstantRange::builder()
[*vk::PushConstantRange::builder()
.stage_flags(stage_mask)
.size(push_constant.size)
.build()];
pipeline_create_info
.push_constant_ranges(&push_constant_range)
.build()
} else {
pipeline_create_info.build()
};
.size(push_constant.size)]
});
let push_constant_range: &[PushConstantRange] = push_constant_range
.as_ref()
.map_or(&[], |o| o);
let pipeline_create_info = pipeline_create_info
.push_constant_ranges(push_constant_range);
// let pipeline_create_info = if let Some(push_constant) = &reflection.push_constant {
// let stage_mask = util::binding_stage_to_vulkan_stage(push_constant.stage_mask);
// let push_constant_range = vk::PushConstantRange::builder()
// .stage_flags(stage_mask)
// .size(push_constant.size);
// let push_constant_range = [*push_constant_range];
// pipeline_create_info
// .push_constant_ranges(&push_constant_range)
// } else {
// pipeline_create_info
// };
let layout = unsafe { device.create_pipeline_layout(&pipeline_create_info, None)? };
let pool_info = vk::DescriptorPoolCreateInfo::builder()
.max_sets(replicas)
.pool_sizes(&descriptors.pool_sizes)
.build();
;
let pool = unsafe { device.create_descriptor_pool(&pool_info, None)? };
@ -134,7 +148,7 @@ impl PipelineLayoutObjects {
let alloc_info = vk::DescriptorSetAllocateInfo::builder()
.descriptor_pool(pool)
.set_layouts(&descriptor_set_layout)
.build();
;
for _ in 0..replicas {
let set = unsafe { device.allocate_descriptor_sets(&alloc_info)? };
@ -197,7 +211,7 @@ impl VulkanGraphicsPipeline {
) -> error::Result<vk::Pipeline> {
let input_assembly = vk::PipelineInputAssemblyStateCreateInfo::builder()
.topology(vk::PrimitiveTopology::TRIANGLE_STRIP)
.build();
;
let vao_state = [
vk::VertexInputAttributeDescription {
@ -214,16 +228,16 @@ impl VulkanGraphicsPipeline {
},
];
let input_binding = [vk::VertexInputBindingDescription::builder()
let input_binding = vk::VertexInputBindingDescription::builder()
.binding(0)
.stride(4 * std::mem::size_of::<f32>() as u32)
.input_rate(vk::VertexInputRate::VERTEX)
.build()];
.input_rate(vk::VertexInputRate::VERTEX);
let input_binding = [*input_binding];
let pipeline_input_state = vk::PipelineVertexInputStateCreateInfo::builder()
.vertex_binding_descriptions(&input_binding)
.vertex_attribute_descriptions(&vao_state)
.build();
;
let raster_state = vk::PipelineRasterizationStateCreateInfo::builder()
.polygon_mode(vk::PolygonMode::FILL)
@ -233,21 +247,21 @@ impl VulkanGraphicsPipeline {
.rasterizer_discard_enable(false)
.depth_bias_enable(false)
.line_width(1.0)
.build();
;
let attachments = [vk::PipelineColorBlendAttachmentState::builder()
let attachments = vk::PipelineColorBlendAttachmentState::builder()
.blend_enable(false)
.color_write_mask(vk::ColorComponentFlags::from_raw(0xf))
.build()];
.color_write_mask(vk::ColorComponentFlags::from_raw(0xf));
let attachments = [*attachments];
let blend_state = vk::PipelineColorBlendStateCreateInfo::builder()
.attachments(&attachments)
.build();
;
let viewport_state = vk::PipelineViewportStateCreateInfo::builder()
.viewport_count(1)
.scissor_count(1)
.build();
;
let depth_stencil_state = vk::PipelineDepthStencilStateCreateInfo::builder()
.depth_test_enable(false)
@ -256,30 +270,31 @@ impl VulkanGraphicsPipeline {
.depth_bounds_test_enable(false)
.min_depth_bounds(1.0)
.max_depth_bounds(1.0)
.build();
;
let multisample_state = vk::PipelineMultisampleStateCreateInfo::builder()
.rasterization_samples(vk::SampleCountFlags::TYPE_1)
.build();
;
let states = [vk::DynamicState::VIEWPORT, vk::DynamicState::SCISSOR];
let dynamic_state = vk::PipelineDynamicStateCreateInfo::builder()
.dynamic_states(&states)
.build();
;
let shader_stages = [
vk::PipelineShaderStageCreateInfo::builder()
.stage(vk::ShaderStageFlags::VERTEX)
.name(ENTRY_POINT)
.module(vertex_module.shader)
.build(),
,
vk::PipelineShaderStageCreateInfo::builder()
.stage(vk::ShaderStageFlags::FRAGMENT)
.name(ENTRY_POINT)
.module(fragment_module.shader)
.build(),
,
];
let shader_stages = [*shader_stages[0], *shader_stages[1]];
let mut pipeline_info = vk::GraphicsPipelineCreateInfo::builder()
.stages(&shader_stages)
.vertex_input_state(&pipeline_input_state)
@ -296,12 +311,11 @@ impl VulkanGraphicsPipeline {
pipeline_info = pipeline_info.render_pass(render_pass.handle)
}
let pipeline_info = [pipeline_info.build()];
let pipeline = unsafe {
// panic_safety: if this is successful this should return 1 pipelines.
device
.create_graphics_pipelines(*cache, &pipeline_info, None)
.create_graphics_pipelines(*cache, &[*pipeline_info], None)
.map_err(|e| e.1)?[0]
};
@ -320,10 +334,10 @@ impl VulkanGraphicsPipeline {
let vertex_info = vk::ShaderModuleCreateInfo::builder()
.code(shader_assembly.vertex.as_ref())
.build();
;
let fragment_info = vk::ShaderModuleCreateInfo::builder()
.code(shader_assembly.fragment.as_ref())
.build();
;
let vertex_module = VulkanShaderModule::new(device, &vertex_info)?;
let fragment_module = VulkanShaderModule::new(device, &fragment_info)?;
@ -344,7 +358,7 @@ impl VulkanGraphicsPipeline {
if let Some(pipeline_data) = pipeline_data.as_ref() {
cache_info = cache_info.initial_data(pipeline_data);
}
let cache_info = cache_info.build();
let cache_info = cache_info;
let pipeline_cache = unsafe { device.create_pipeline_cache(&cache_info, None)? };
@ -416,7 +430,7 @@ impl VulkanGraphicsPipeline {
.width(output.output.size.width)
.height(output.output.size.height)
.layers(1)
.build(),
,
None,
)?
};
@ -436,18 +450,18 @@ impl VulkanGraphicsPipeline {
offset: vk::Offset2D { x: 0, y: 0 },
extent: output.output.size.into(),
})
.build();
;
unsafe {
device.cmd_begin_render_pass(cmd, &render_pass_info, vk::SubpassContents::INLINE);
}
Ok(Some(framebuffer))
} else {
let attachments = [vk::RenderingAttachmentInfo::builder()
let attachments = vk::RenderingAttachmentInfo::builder()
.load_op(vk::AttachmentLoadOp::DONT_CARE)
.store_op(vk::AttachmentStoreOp::STORE)
.image_layout(vk::ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.image_view(output.output.image_view)
.build()];
.image_view(output.output.image_view);
let attachments = [*attachments];
let rendering_info = vk::RenderingInfo::builder()
.layer_count(1)
@ -456,7 +470,7 @@ impl VulkanGraphicsPipeline {
extent: output.output.size.into(),
})
.color_attachments(&attachments)
.build();
;
unsafe {
device.cmd_begin_rendering(cmd, &rendering_info);

View file

@ -17,7 +17,7 @@ impl VulkanCommandPool {
let create_info = vk::CommandPoolCreateInfo::builder()
.flags(vk::CommandPoolCreateFlags::RESET_COMMAND_BUFFER)
.queue_family_index(indices.graphics_family())
.build();
;
unsafe {
let pool = base.device.create_command_pool(&create_info, None)?;
@ -25,7 +25,7 @@ impl VulkanCommandPool {
.command_pool(pool)
.level(vk::CommandBufferLevel::PRIMARY)
.command_buffer_count(frames_in_flight)
.build();
;
let buffers = base.device.allocate_command_buffers(&buffer_info)?;
Ok(VulkanCommandPool {

View file

@ -20,7 +20,7 @@ impl VulkanFramebuffer {
.width(width)
.height(height)
.layers(1)
.build();
;
unsafe {
let framebuffer = device.create_framebuffer(&framebuffer_info, None)?;

View file

@ -101,7 +101,7 @@ impl VulkanWindow {
..Default::default()
})
.clear_values(&clear_values)
.build();
;
vulkan.base.device.cmd_begin_render_pass(
cmd,
@ -287,7 +287,7 @@ impl VulkanWindow {
// let blit_subresource = vk::ImageSubresourceLayers::builder()
// .layer_count(1)
// .aspect_mask(vk::ImageAspectFlags::COLOR)
// .build();
// ;
//
// let src_offsets = [
// vk::Offset3D { x: 0, y: 0, z: 0 },
@ -344,12 +344,12 @@ impl VulkanWindow {
let stage_mask = [vk::PipelineStageFlags::COLOR_ATTACHMENT_OUTPUT];
let cmd = [cmd];
let submit_info = [vk::SubmitInfo::builder()
let submit_info = [*vk::SubmitInfo::builder()
.wait_dst_stage_mask(&stage_mask)
.wait_semaphores(&image_available)
.signal_semaphores(&render_finished)
.command_buffers(&cmd)
.build()];
];
vulkan
.base
@ -363,7 +363,7 @@ impl VulkanWindow {
.wait_semaphores(&render_finished)
.swapchains(&swapchain)
.image_indices(&swapchain_index)
.build();
;
vulkan
.swapchain

View file

@ -154,7 +154,7 @@ impl VulkanPipeline {
.module(vertex_shader_info.module)
.stage(vk::ShaderStageFlags::VERTEX)
.name(ENTRY_POINT)
.build();
;
let mut frag_spv_file =
Cursor::new(&include_bytes!("../../shader/triangle_simple/frag.spv")[..]);
@ -165,17 +165,17 @@ impl VulkanPipeline {
.module(frag_shader_info.module)
.stage(vk::ShaderStageFlags::FRAGMENT)
.name(ENTRY_POINT)
.build();
;
let vertex_input_state_info = vk::PipelineVertexInputStateCreateInfo::builder()
.vertex_attribute_descriptions(&[])
.vertex_binding_descriptions(&[])
.build();
;
let vertex_input_assembly_state_info = vk::PipelineInputAssemblyStateCreateInfo::builder()
.primitive_restart_enable(false)
.topology(vk::PrimitiveTopology::TRIANGLE_LIST)
.build();
;
let viewports = [vk::Viewport {
x: 0.0,
@ -200,7 +200,7 @@ impl VulkanPipeline {
let states = [vk::DynamicState::VIEWPORT, vk::DynamicState::SCISSOR];
let dynamic_state = vk::PipelineDynamicStateCreateInfo::builder()
.dynamic_states(&states)
.build();
;
let viewport_state_info = vk::PipelineViewportStateCreateInfo::builder()
.scissors(&scissors)
@ -214,15 +214,15 @@ impl VulkanPipeline {
.line_width(1.0f32)
.cull_mode(vk::CullModeFlags::BACK)
.front_face(vk::FrontFace::CLOCKWISE)
.build();
;
let multisample = vk::PipelineMultisampleStateCreateInfo::builder()
.rasterization_samples(vk::SampleCountFlags::TYPE_1)
.min_sample_shading(1.0f32)
.sample_shading_enable(false)
.build();
;
let color_blend_attachment = [vk::PipelineColorBlendAttachmentState::builder()
let color_blend_attachment = [*vk::PipelineColorBlendAttachmentState::builder()
.blend_enable(false)
.color_write_mask(vk::ColorComponentFlags::RGBA)
.src_color_blend_factor(vk::BlendFactor::ONE)
@ -231,18 +231,8 @@ impl VulkanPipeline {
.src_alpha_blend_factor(vk::BlendFactor::ONE)
.dst_alpha_blend_factor(vk::BlendFactor::ZERO)
.alpha_blend_op(vk::BlendOp::ADD)
.build()];
//
// let color_blend_attachment_states = [vk::PipelineColorBlendAttachmentState {
// blend_enable: 0,
// src_color_blend_factor: vk::BlendFactor::SRC_COLOR,
// dst_color_blend_factor: vk::BlendFactor::ONE_MINUS_DST_COLOR,
// color_blend_op: vk::BlendOp::ADD,
// src_alpha_blend_factor: vk::BlendFactor::ZERO,
// dst_alpha_blend_factor: vk::BlendFactor::ZERO,
// alpha_blend_op: vk::BlendOp::ADD,
// color_write_mask: vk::ColorComponentFlags::RGBA,
// }];
];
let color_blend_state = vk::PipelineColorBlendStateCreateInfo::builder()
.logic_op(vk::LogicOp::COPY)
.attachments(&color_blend_attachment);
@ -285,7 +275,7 @@ impl VulkanPipeline {
.create_render_pass(&renderpass_create_info, None)
.unwrap();
let infos = [vertex_stage_info, frag_stage_info];
let infos = [*vertex_stage_info, *frag_stage_info];
let graphic_pipeline_info = vk::GraphicsPipelineCreateInfo::builder()
.stages(&infos)
.vertex_input_state(&vertex_input_state_info)
@ -297,12 +287,13 @@ impl VulkanPipeline {
.dynamic_state(&dynamic_state)
.layout(pipeline_layout)
.render_pass(renderpass);
let graphic_pipeline_info = [*graphic_pipeline_info];
let graphics_pipelines = base
.device
.create_graphics_pipelines(
vk::PipelineCache::null(),
&[graphic_pipeline_info.build()],
&graphic_pipeline_info,
None,
)
.expect("Unable to create graphics pipeline");
@ -324,7 +315,7 @@ pub struct ShaderModule {
impl ShaderModule {
pub fn new(device: &ash::Device, spirv: Vec<u32>) -> VkResult<ShaderModule> {
let create_info = vk::ShaderModuleCreateInfo::builder().code(&spirv).build();
let create_info = vk::ShaderModuleCreateInfo::builder().code(&spirv);
let module = unsafe { device.create_shader_module(&create_info, None)? };

View file

@ -58,7 +58,7 @@ impl VulkanSwapchain {
.image_array_layers(1)
// todo: switch to IMAGE_USAGE_TRANSFER_DST
.image_usage(vk::ImageUsageFlags::COLOR_ATTACHMENT)
.build();
;
let loader = ash::extensions::khr::Swapchain::new(&base.instance, &base.device);
@ -122,7 +122,7 @@ impl VulkanSwapchain {
layer_count: 1,
})
.image(*image)
.build();
;
let view = unsafe { base.device.create_image_view(&create_info, None)? };
// unsafe {
@ -136,7 +136,7 @@ impl VulkanSwapchain {
// b"SwapchainImage\0",
// ))
// .object_type(vk::ObjectType::IMAGE)
// .build(),
// ,
// )
// .expect("could not set object name");
// base.debug
@ -149,7 +149,7 @@ impl VulkanSwapchain {
// b"SwapchainImageView\0",
// ))
// .object_type(vk::ObjectType::IMAGE_VIEW)
// .build(),
// ,
// )
// .expect("could not set object name");
// }
@ -177,7 +177,7 @@ impl VulkanSwapchain {
layer_count: 1,
})
.image(*image)
.build();
;
let view = unsafe { base.device.create_image_view(&create_info, None)? };
// unsafe {
@ -191,7 +191,7 @@ impl VulkanSwapchain {
// b"RenderImageView\0",
// ))
// .object_type(vk::ObjectType::IMAGE_VIEW)
// .build(),
// ,
// )
// .expect("could not set object name");
// }

View file

@ -23,7 +23,7 @@ impl SyncObjects {
device.create_fence(
&vk::FenceCreateInfo::builder()
.flags(vk::FenceCreateFlags::SIGNALED)
.build(),
,
None,
)?,
)

View file

@ -34,7 +34,7 @@ impl VulkanBase {
.engine_version(0)
.application_version(0)
.api_version(vk::make_api_version(0, 1, 3, 0))
.build();
;
dbg!("entry");
// todo: make this xplat
@ -50,7 +50,7 @@ impl VulkanBase {
.application_info(&app_info)
.enabled_layer_names(&layers)
.enabled_extension_names(&extensions)
.build();
;
let instance = unsafe { entry.create_instance(&create_info, None)? };
@ -88,20 +88,20 @@ impl VulkanBase {
let _debug = [unsafe { CStr::from_bytes_with_nul_unchecked(KHRONOS_VALIDATION).as_ptr() }];
let indices = find_queue_family(instance, *physical_device);
let queue_info = [vk::DeviceQueueCreateInfo::builder()
let queue_info = [*vk::DeviceQueueCreateInfo::builder()
.queue_family_index(indices.graphics_family())
.queue_priorities(&[1.0f32])
.build()];
];
// let physical_device_features = vk::PhysicalDeviceFeatures::default();
let mut physical_device_features = vk::PhysicalDeviceVulkan13Features::builder()
.dynamic_rendering(true)
.build();
;
// let mut physical_device_features =
// vk::PhysicalDeviceFeatures2::builder().push_next(&mut physical_device_features)
// .build();
// ;
let extensions = [
ash::extensions::khr::Swapchain::name().as_ptr(),
@ -114,7 +114,7 @@ impl VulkanBase {
.enabled_extension_names(&extensions)
.push_next(&mut physical_device_features)
// .enabled_features(&physical_device_features)
.build();
;
let device =
unsafe { instance.create_device(*physical_device, &device_create_info, None)? };

View file

@ -38,7 +38,7 @@ impl LutTexture {
| vk::ImageUsageFlags::TRANSFER_DST,
)
.initial_layout(vk::ImageLayout::UNDEFINED)
.build();
;
let texture = unsafe { vulkan.device.create_image(&image_info, None)? };
@ -51,22 +51,22 @@ impl LutTexture {
.level_count(image_info.mip_levels)
.layer_count(1)
.aspect_mask(vk::ImageAspectFlags::COLOR)
.build();
;
let swizzle_components = vk::ComponentMapping::builder()
.r(vk::ComponentSwizzle::R)
.g(vk::ComponentSwizzle::G)
.b(vk::ComponentSwizzle::B)
.a(vk::ComponentSwizzle::A)
.build();
;
let view_info = vk::ImageViewCreateInfo::builder()
.view_type(vk::ImageViewType::TYPE_2D)
.format(vk::Format::B8G8R8A8_UNORM)
.image(texture)
.subresource_range(image_subresource)
.components(swizzle_components)
.build();
.subresource_range(*image_subresource)
.components(*swizzle_components)
;
let texture_view = unsafe { vulkan.device.create_image_view(&view_info, None)? };
@ -99,6 +99,17 @@ impl LutTexture {
vk::QUEUE_FAMILY_IGNORED,
);
let builder = vk::BufferImageCopy::builder()
.image_subresource(
*vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(0)
.base_array_layer(0)
.layer_count(1)
,
)
.image_extent(image.size.into());
vulkan.device.cmd_copy_buffer_to_image(
cmd,
staging.handle,
@ -108,17 +119,7 @@ impl LutTexture {
} else {
vk::ImageLayout::TRANSFER_DST_OPTIMAL
},
&[vk::BufferImageCopy::builder()
.image_subresource(
vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(0)
.base_array_layer(0)
.layer_count(1)
.build(),
)
.image_extent(image.size.into())
.build()],
&[*builder],
)
}
@ -149,21 +150,21 @@ impl LutTexture {
.mip_level(level - 1)
.base_array_layer(0)
.layer_count(1)
.build();
;
let dst_subresource = vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(level)
.base_array_layer(0)
.layer_count(1)
.build();
;
let image_blit = [vk::ImageBlit::builder()
.src_subresource(src_subresource)
let image_blit = vk::ImageBlit::builder()
.src_subresource(*src_subresource)
.src_offsets(src_offsets)
.dst_subresource(dst_subresource)
.dst_subresource(*dst_subresource)
.dst_offsets(dst_offsets)
.build()];
;
unsafe {
util::vulkan_image_layout_transition_levels(
@ -188,7 +189,7 @@ impl LutTexture {
vk::ImageLayout::GENERAL,
texture,
vk::ImageLayout::GENERAL,
&image_blit,
&[*image_blit],
config.filter_mode.into(),
);
}

View file

@ -73,7 +73,7 @@ impl VulkanBuffer {
.size(size as vk::DeviceSize)
.usage(usage)
.sharing_mode(vk::SharingMode::EXCLUSIVE)
.build();
;
let buffer = device.create_buffer(&buffer_info, None)?;
let memory_reqs = device.get_buffer_memory_requirements(buffer);
@ -165,21 +165,21 @@ impl RawVulkanBuffer {
storage: &impl UniformStorageAccess,
) -> error::Result<()> {
unsafe {
let buffer_info = [vk::DescriptorBufferInfo::builder()
let buffer_info = vk::DescriptorBufferInfo::builder()
.buffer(self.buffer.handle)
.offset(0)
.range(storage.ubo_slice().len() as vk::DeviceSize)
.build()];
.range(storage.ubo_slice().len() as vk::DeviceSize);
let write_info = [vk::WriteDescriptorSet::builder()
let buffer_info = [*buffer_info];
let write_info = vk::WriteDescriptorSet::builder()
.descriptor_type(vk::DescriptorType::UNIFORM_BUFFER)
.dst_set(descriptor_set)
.dst_binding(binding)
.dst_array_element(0)
.buffer_info(&buffer_info)
.build()];
;
self.buffer.device.update_descriptor_sets(&write_info, &[])
self.buffer.device.update_descriptor_sets(&[*write_info], &[])
}
Ok(())
}

View file

@ -12,7 +12,7 @@ pub struct VulkanRenderPass {
impl VulkanRenderPass {
pub fn create_render_pass(device: &ash::Device, format: vk::Format) -> error::Result<Self> {
// format should never be undefined.
let attachment = [vk::AttachmentDescription::builder()
let attachment = vk::AttachmentDescription::builder()
.flags(vk::AttachmentDescriptionFlags::empty())
.format(format)
.samples(SampleCountFlags::TYPE_1)
@ -21,24 +21,24 @@ impl VulkanRenderPass {
.stencil_load_op(AttachmentLoadOp::DONT_CARE)
.stencil_store_op(AttachmentStoreOp::DONT_CARE)
.initial_layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.final_layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.build()];
.final_layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL);
let attachment = [*attachment];
let attachment_ref = [vk::AttachmentReference::builder()
let attachment_ref = vk::AttachmentReference::builder()
.attachment(0)
.layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL)
.build()];
.layout(ImageLayout::COLOR_ATTACHMENT_OPTIMAL);
let attachment_ref = [*attachment_ref];
let subpass = [vk::SubpassDescription::builder()
let subpass = vk::SubpassDescription::builder()
.pipeline_bind_point(PipelineBindPoint::GRAPHICS)
.color_attachments(&attachment_ref)
.build()];
.color_attachments(&attachment_ref);
let subpass = [*subpass];
let renderpass_info = vk::RenderPassCreateInfo::builder()
.flags(vk::RenderPassCreateFlags::empty())
.attachments(&attachment)
.subpasses(&subpass)
.build();
;
unsafe {
let rp = device.create_render_pass(&renderpass_info, None)?;

View file

@ -30,7 +30,7 @@ impl VulkanSampler {
.address_mode_u(wrap.into())
.address_mode_v(wrap.into())
.address_mode_w(wrap.into())
.build();
;
let sampler = unsafe { device.create_sampler(&create_info, None)? };

View file

@ -59,7 +59,7 @@ impl OwnedImage {
)
.sharing_mode(vk::SharingMode::EXCLUSIVE)
.initial_layout(vk::ImageLayout::UNDEFINED)
.build();
;
let image = unsafe { device.create_image(&image_create_info, None)? };
let mem_reqs = unsafe { device.get_image_memory_requirements(image) };
@ -71,22 +71,22 @@ impl OwnedImage {
.level_count(image_create_info.mip_levels)
.layer_count(1)
.aspect_mask(vk::ImageAspectFlags::COLOR)
.build();
;
let swizzle_components = vk::ComponentMapping::builder()
.r(vk::ComponentSwizzle::R)
.g(vk::ComponentSwizzle::G)
.b(vk::ComponentSwizzle::B)
.a(vk::ComponentSwizzle::A)
.build();
;
let view_info = vk::ImageViewCreateInfo::builder()
.view_type(vk::ImageViewType::TYPE_2D)
.format(format.into())
.image(image)
.subresource_range(image_subresource)
.components(swizzle_components)
.build();
.subresource_range(*image_subresource)
.components(*swizzle_components)
;
let image_view = unsafe { device.create_image_view(&view_info, None)? };
@ -200,7 +200,7 @@ impl OwnedImage {
base_array_layer: 0,
layer_count: vk::REMAINING_ARRAY_LAYERS,
})
.build();
;
let mipchain_barrier = vk::ImageMemoryBarrier::builder()
.src_access_mask(vk::AccessFlags::empty())
@ -217,7 +217,7 @@ impl OwnedImage {
level_count: vk::REMAINING_MIP_LEVELS,
layer_count: vk::REMAINING_ARRAY_LAYERS,
})
.build();
;
unsafe {
self.device.cmd_pipeline_barrier(
@ -227,7 +227,7 @@ impl OwnedImage {
vk::DependencyFlags::empty(),
&[],
&[],
&[input_barrier, mipchain_barrier],
&[*input_barrier, *mipchain_barrier],
);
for level in 1..self.levels {
@ -248,7 +248,7 @@ impl OwnedImage {
level_count: 1,
layer_count: vk::REMAINING_ARRAY_LAYERS,
})
.build();
;
self.device.cmd_pipeline_barrier(
cmd,
@ -257,7 +257,7 @@ impl OwnedImage {
vk::DependencyFlags::empty(),
&[],
&[],
&[next_barrier],
&[*next_barrier],
);
}
@ -287,21 +287,20 @@ impl OwnedImage {
.mip_level(level - 1)
.base_array_layer(0)
.layer_count(1)
.build();
;
let dst_subresource = vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(level)
.base_array_layer(0)
.layer_count(1)
.build();
;
let image_blit = [vk::ImageBlit::builder()
.src_subresource(src_subresource)
let image_blit = vk::ImageBlit::builder()
.src_subresource(*src_subresource)
.src_offsets(src_offsets)
.dst_subresource(dst_subresource)
.dst_offsets(dst_offsets)
.build()];
.dst_subresource(*dst_subresource)
.dst_offsets(dst_offsets);
self.device.cmd_blit_image(
cmd,
@ -309,7 +308,7 @@ impl OwnedImage {
vk::ImageLayout::TRANSFER_SRC_OPTIMAL,
self.image.image,
vk::ImageLayout::TRANSFER_DST_OPTIMAL,
&image_blit,
&[*image_blit],
vk::Filter::LINEAR,
);
}
@ -331,7 +330,7 @@ impl OwnedImage {
base_array_layer: 0,
layer_count: vk::REMAINING_ARRAY_LAYERS,
})
.build();
;
let mipchain_barrier = vk::ImageMemoryBarrier::builder()
.src_access_mask(vk::AccessFlags::TRANSFER_WRITE)
@ -348,7 +347,7 @@ impl OwnedImage {
level_count: 1,
layer_count: vk::REMAINING_ARRAY_LAYERS,
})
.build();
;
// next past waits for ALL_GRAPHICS, use dependency chain and FRAGMENT_SHADER dst stage
// to ensure that next pass doesn't start until mipchain is complete.
@ -359,7 +358,7 @@ impl OwnedImage {
vk::DependencyFlags::empty(),
&[],
&[],
&[input_barrier, mipchain_barrier],
&[*input_barrier, *mipchain_barrier],
);
}
}
@ -373,25 +372,25 @@ impl OwnedImage {
) {
let region = vk::ImageCopy::builder()
.src_subresource(
vk::ImageSubresourceLayers::builder()
*vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(0)
.base_array_layer(0)
.layer_count(1)
.build(),
,
)
.dst_subresource(
vk::ImageSubresourceLayers::builder()
*vk::ImageSubresourceLayers::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.mip_level(0)
.base_array_layer(0)
.layer_count(1)
.build(),
,
)
.src_offset(Default::default())
.dst_offset(Default::default())
.extent(source.size.into())
.build();
;
unsafe {
util::vulkan_image_layout_transition_levels(
@ -415,7 +414,7 @@ impl OwnedImage {
source_layout,
self.image.image,
vk::ImageLayout::TRANSFER_DST_OPTIMAL,
&[region],
&[*region],
);
util::vulkan_image_layout_transition_levels(
&self.device,
@ -457,13 +456,13 @@ impl OwnedImage {
&vk::ClearColorValue {
float32: [0.0, 0.0, 0.0, 0.0],
},
&[vk::ImageSubresourceRange::builder()
&[*vk::ImageSubresourceRange::builder()
.aspect_mask(vk::ImageAspectFlags::COLOR)
.base_mip_level(0)
.level_count(1)
.base_array_layer(0)
.layer_count(1)
.build()],
],
);
util::vulkan_image_layout_transition_levels(