Skip to content

Commit

Permalink
Update book to vulkano 0.34 (#26)
Browse files Browse the repository at this point in the history
* Update chapter code to vulkano 0.34

* Use correct `memory_type_filter` in graphics_pipeline example

Co-authored-by: marc0246 <[email protected]>

* Use `HOST_RANDOM_ACCESS` for sequential read and write access in buffer_creation

Co-authored-by: marc0246 <[email protected]>

* Remove unnecessary `ImageUsage::STORAGE` image usage

Co-authored-by: marc0246 <[email protected]>

* Remove needless borrows

Co-authored-by: marc0246 <[email protected]>

* Remove another needless borrow

* Update vulkano version in introduction.md

* Update buffer_creation documentation

* Update images chapter

* Update image_creation description

* Minor fixes

* Update the rest

---------

Co-authored-by: marc0246 <[email protected]>
  • Loading branch information
YouSafe and marc0246 authored Nov 8, 2023
1 parent 0039f87 commit 488b689
Show file tree
Hide file tree
Showing 37 changed files with 794 additions and 514 deletions.
7 changes: 3 additions & 4 deletions chapter_code/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
vulkano = "0.33.0"
vulkano-shaders = "0.33.0"
vulkano = "0.34.0"
vulkano-shaders = "0.34.0"
image = "0.24.0"
winit = "0.28.3"
vulkano-win = "0.33.0"
winit = "0.28.0"
rand = "0.8.5"

[profile.dev]
Expand Down
16 changes: 10 additions & 6 deletions chapter_code/src/bin/buffer_creation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@
//!
//! It is not commented, as the explanations can be found in the guide itself.

use std::sync::Arc;

use vulkano::buffer::{Buffer, BufferCreateInfo, BufferUsage};
use vulkano::command_buffer::allocator::StandardCommandBufferAllocator;
use vulkano::command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferInfo};
use vulkano::device::{Device, DeviceCreateInfo, QueueCreateInfo, QueueFlags};
use vulkano::instance::{Instance, InstanceCreateInfo};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryUsage, StandardMemoryAllocator};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryTypeFilter, StandardMemoryAllocator};
use vulkano::sync::{self, GpuFuture};
use vulkano::VulkanLibrary;

Expand Down Expand Up @@ -55,18 +57,19 @@ fn main() {

let queue = queues.next().unwrap();

let memory_allocator = StandardMemoryAllocator::new_default(device.clone());
let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone()));

// Example operation
let source_content: Vec<i32> = (0..64).collect();
let source = Buffer::from_iter(
&memory_allocator,
memory_allocator.clone(),
BufferCreateInfo {
usage: BufferUsage::TRANSFER_SRC,
..Default::default()
},
AllocationCreateInfo {
usage: MemoryUsage::Upload,
memory_type_filter: MemoryTypeFilter::PREFER_HOST
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
..Default::default()
},
source_content,
Expand All @@ -75,13 +78,14 @@ fn main() {

let destination_content: Vec<i32> = (0..64).map(|_| 0).collect();
let destination = Buffer::from_iter(
&memory_allocator,
memory_allocator.clone(),
BufferCreateInfo {
usage: BufferUsage::TRANSFER_DST,
..Default::default()
},
AllocationCreateInfo {
usage: MemoryUsage::Download,
memory_type_filter: MemoryTypeFilter::PREFER_HOST
| MemoryTypeFilter::HOST_RANDOM_ACCESS,
..Default::default()
},
destination_content,
Expand Down
38 changes: 29 additions & 9 deletions chapter_code/src/bin/compute_pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
//!
//! It is not commented, as the explanations can be found in the guide itself.

use std::sync::Arc;

use vulkano::buffer::{Buffer, BufferCreateInfo, BufferUsage};
use vulkano::command_buffer::allocator::{
StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo,
Expand All @@ -20,8 +22,12 @@ use vulkano::descriptor_set::allocator::StandardDescriptorSetAllocator;
use vulkano::descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet};
use vulkano::device::{Device, DeviceCreateInfo, DeviceExtensions, QueueCreateInfo, QueueFlags};
use vulkano::instance::{Instance, InstanceCreateInfo};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryUsage, StandardMemoryAllocator};
use vulkano::pipeline::{ComputePipeline, Pipeline, PipelineBindPoint};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryTypeFilter, StandardMemoryAllocator};
use vulkano::pipeline::compute::ComputePipelineCreateInfo;
use vulkano::pipeline::layout::PipelineDescriptorSetLayoutCreateInfo;
use vulkano::pipeline::{
ComputePipeline, Pipeline, PipelineBindPoint, PipelineLayout, PipelineShaderStageCreateInfo,
};
use vulkano::sync::{self, GpuFuture};

fn main() {
Expand Down Expand Up @@ -66,17 +72,18 @@ fn main() {

// Introduction to compute operations

let memory_allocator = StandardMemoryAllocator::new_default(device.clone());
let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone()));

let data_iter = 0..65536u32;
let data_buffer = Buffer::from_iter(
&memory_allocator,
memory_allocator.clone(),
BufferCreateInfo {
usage: BufferUsage::STORAGE_BUFFER,
..Default::default()
},
AllocationCreateInfo {
usage: MemoryUsage::Upload,
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
..Default::default()
},
data_iter,
Expand Down Expand Up @@ -105,16 +112,26 @@ fn main() {
}

let shader = cs::load(device.clone()).expect("failed to create shader module");

let cs = shader.entry_point("main").unwrap();
let stage = PipelineShaderStageCreateInfo::new(cs);
let layout = PipelineLayout::new(
device.clone(),
PipelineDescriptorSetLayoutCreateInfo::from_stages([&stage])
.into_pipeline_layout_create_info(device.clone())
.unwrap(),
)
.unwrap();

let compute_pipeline = ComputePipeline::new(
device.clone(),
shader.entry_point("main").unwrap(),
&(),
None,
|_| {},
ComputePipelineCreateInfo::stage_layout(stage, layout),
)
.expect("failed to create compute pipeline");

let descriptor_set_allocator = StandardDescriptorSetAllocator::new(device.clone());
let descriptor_set_allocator =
StandardDescriptorSetAllocator::new(device.clone(), Default::default());

let pipeline_layout = compute_pipeline.layout();
let descriptor_set_layouts = pipeline_layout.set_layouts();
Expand All @@ -127,6 +144,7 @@ fn main() {
&descriptor_set_allocator,
descriptor_set_layout.clone(),
[WriteDescriptorSet::buffer(0, data_buffer.clone())], // 0 is the binding
[],
)
.unwrap();

Expand All @@ -146,12 +164,14 @@ fn main() {

command_buffer_builder
.bind_pipeline_compute(compute_pipeline.clone())
.unwrap()
.bind_descriptor_sets(
PipelineBindPoint::Compute,
compute_pipeline.layout().clone(),
descriptor_set_layout_index as u32,
descriptor_set,
)
.unwrap()
.dispatch(work_group_counts)
.unwrap();

Expand Down
121 changes: 88 additions & 33 deletions chapter_code/src/bin/graphics_pipeline.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,30 @@
//!
//! It is not commented, as the explanations can be found in the guide itself.

use std::sync::Arc;

use image::{ImageBuffer, Rgba};
use vulkano::buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage};
use vulkano::command_buffer::allocator::StandardCommandBufferAllocator;
use vulkano::command_buffer::{
AutoCommandBufferBuilder, CommandBufferUsage, CopyImageToBufferInfo, RenderPassBeginInfo,
SubpassContents,
SubpassBeginInfo, SubpassContents,
};
use vulkano::device::{Device, DeviceCreateInfo, QueueCreateInfo, QueueFlags};
use vulkano::format::Format;
use vulkano::image::view::ImageView;
use vulkano::image::{ImageDimensions, StorageImage};
use vulkano::image::{Image, ImageCreateInfo, ImageType, ImageUsage};
use vulkano::instance::{Instance, InstanceCreateInfo};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryUsage, StandardMemoryAllocator};
use vulkano::memory::allocator::{AllocationCreateInfo, MemoryTypeFilter, StandardMemoryAllocator};
use vulkano::pipeline::graphics::color_blend::{ColorBlendAttachmentState, ColorBlendState};
use vulkano::pipeline::graphics::input_assembly::InputAssemblyState;
use vulkano::pipeline::graphics::vertex_input::Vertex;
use vulkano::pipeline::graphics::multisample::MultisampleState;
use vulkano::pipeline::graphics::rasterization::RasterizationState;
use vulkano::pipeline::graphics::vertex_input::{Vertex, VertexDefinition};
use vulkano::pipeline::graphics::viewport::{Viewport, ViewportState};
use vulkano::pipeline::GraphicsPipeline;
use vulkano::pipeline::graphics::GraphicsPipelineCreateInfo;
use vulkano::pipeline::layout::PipelineDescriptorSetLayoutCreateInfo;
use vulkano::pipeline::{GraphicsPipeline, PipelineLayout, PipelineShaderStageCreateInfo};
use vulkano::render_pass::{Framebuffer, FramebufferCreateInfo, Subpass};
use vulkano::sync::{self, GpuFuture};

Expand Down Expand Up @@ -63,28 +70,33 @@ fn main() {

let queue = queues.next().unwrap();

let memory_allocator = StandardMemoryAllocator::new_default(device.clone());
let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone()));

let image = StorageImage::new(
&memory_allocator,
ImageDimensions::Dim2d {
width: 1024,
height: 1024,
array_layers: 1,
let image = Image::new(
memory_allocator.clone(),
ImageCreateInfo {
image_type: ImageType::Dim2d,
format: Format::R8G8B8A8_UNORM,
extent: [1024, 1024, 1],
usage: ImageUsage::COLOR_ATTACHMENT | ImageUsage::TRANSFER_SRC,
..Default::default()
},
AllocationCreateInfo {
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
..Default::default()
},
Format::R8G8B8A8_UNORM,
Some(queue.queue_family_index()),
)
.unwrap();

let buf = Buffer::from_iter(
&memory_allocator,
memory_allocator.clone(),
BufferCreateInfo {
usage: BufferUsage::TRANSFER_DST,
..Default::default()
},
AllocationCreateInfo {
usage: MemoryUsage::Upload,
memory_type_filter: MemoryTypeFilter::PREFER_HOST
| MemoryTypeFilter::HOST_RANDOM_ACCESS,
..Default::default()
},
(0..1024 * 1024 * 4).map(|_| 0u8),
Expand All @@ -108,13 +120,14 @@ fn main() {
position: [0.5, -0.25],
};
let vertex_buffer = Buffer::from_iter(
&memory_allocator,
memory_allocator.clone(),
BufferCreateInfo {
usage: BufferUsage::VERTEX_BUFFER,
..Default::default()
},
AllocationCreateInfo {
usage: MemoryUsage::Upload,
memory_type_filter: MemoryTypeFilter::PREFER_DEVICE
| MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
..Default::default()
},
vec![vertex1, vertex2, vertex3].into_iter(),
Expand All @@ -124,10 +137,10 @@ fn main() {
let render_pass = vulkano::single_pass_renderpass!(device.clone(),
attachments: {
color: {
load: Clear,
store: Store,
format: Format::R8G8B8A8_UNORM,
samples: 1,
load_op: Clear,
store_op: Store,
},
},
pass: {
Expand Down Expand Up @@ -181,21 +194,58 @@ fn main() {
let fs = fs::load(device.clone()).expect("failed to create shader module");

let viewport = Viewport {
origin: [0.0, 0.0],
dimensions: [1024.0, 1024.0],
depth_range: 0.0..1.0,
offset: [0.0, 0.0],
extent: [1024.0, 1024.0],
depth_range: 0.0..=1.0,
};

let pipeline = GraphicsPipeline::start()
.vertex_input_state(MyVertex::per_vertex())
.vertex_shader(vs.entry_point("main").unwrap(), ())
.input_assembly_state(InputAssemblyState::new())
.viewport_state(ViewportState::viewport_fixed_scissor_irrelevant([viewport]))
.fragment_shader(fs.entry_point("main").unwrap(), ())
.render_pass(Subpass::from(render_pass, 0).unwrap())
.build(device.clone())
let pipeline = {
let vs = vs.entry_point("main").unwrap();
let fs = fs.entry_point("main").unwrap();

let vertex_input_state = MyVertex::per_vertex()
.definition(&vs.info().input_interface)
.unwrap();

let stages = [
PipelineShaderStageCreateInfo::new(vs),
PipelineShaderStageCreateInfo::new(fs),
];

let layout = PipelineLayout::new(
device.clone(),
PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages)
.into_pipeline_layout_create_info(device.clone())
.unwrap(),
)
.unwrap();

let subpass = Subpass::from(render_pass.clone(), 0).unwrap();

GraphicsPipeline::new(
device.clone(),
None,
GraphicsPipelineCreateInfo {
stages: stages.into_iter().collect(),
vertex_input_state: Some(vertex_input_state),
input_assembly_state: Some(InputAssemblyState::default()),
viewport_state: Some(ViewportState {
viewports: [viewport].into_iter().collect(),
..Default::default()
}),
rasterization_state: Some(RasterizationState::default()),
multisample_state: Some(MultisampleState::default()),
color_blend_state: Some(ColorBlendState::with_attachment_states(
subpass.num_color_attachments(),
ColorBlendAttachmentState::default(),
)),
subpass: Some(subpass.into()),
..GraphicsPipelineCreateInfo::layout(layout)
},
)
.unwrap()
};

let command_buffer_allocator =
StandardCommandBufferAllocator::new(device.clone(), Default::default());

Expand All @@ -212,16 +262,21 @@ fn main() {
clear_values: vec![Some([0.0, 0.0, 1.0, 1.0].into())],
..RenderPassBeginInfo::framebuffer(framebuffer)
},
SubpassContents::Inline,
SubpassBeginInfo {
contents: SubpassContents::Inline,
..Default::default()
},
)
.unwrap()
.bind_pipeline_graphics(pipeline)
.unwrap()
.bind_vertex_buffers(0, vertex_buffer)
.unwrap()
.draw(
3, 1, 0, 0, // 3 is the number of vertices, 1 is the number of instances
)
.unwrap()
.end_render_pass()
.end_render_pass(Default::default())
.unwrap()
.copy_image_to_buffer(CopyImageToBufferInfo::image_buffer(image, buf.clone()))
.unwrap();
Expand Down
Loading

0 comments on commit 488b689

Please sign in to comment.