Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hardware Abstraction Layer #1471

Merged
merged 48 commits into from
Jun 17, 2021
Merged
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
569cd0c
WIP new wgpu-hal
kvark Jun 4, 2021
0ea4cac
Rework shader and pipeline creation
kvark Jun 5, 2021
bae3c69
Documentation update
kvark Jun 5, 2021
738ae2b
Surface API
kvark Jun 6, 2021
6d51fab
hal:: Fill the command buffer calls
kvark Jun 6, 2021
c61ee12
hal: transfer operations
kvark Jun 7, 2021
0a82c23
hal: port the rest of wgpu-core
kvark Jun 8, 2021
ff2a3e8
update synchronization, fix last errors in wgc
kvark Jun 8, 2021
a421c1c
Instance plumbing
kvark Jun 8, 2021
502c575
hal: bunnymark example
kvark Jun 8, 2021
a0b51ce
hal: remove the cows
kvark Jun 8, 2021
6d22984
hal: redesign the bind group descriptor
kvark Jun 8, 2021
3475d83
hal/metal: instance,adapter, and surface
kvark Jun 9, 2021
f46459c
hal/mtl: buffer, texture, and view creation
kvark Jun 9, 2021
9f90470
hal/mtl: creation of bind groups
kvark Jun 9, 2021
bdaf57d
hal/mtl: pipelines and fences
kvark Jun 10, 2021
3109b1b
hal/mtl: most of the command encoding
kvark Jun 10, 2021
782c72d
hal/mtl: queue
kvark Jun 10, 2021
3172377
hal: rename bunnymark to halmark
kvark Jun 10, 2021
006f8ab
build and clippy fixes, command buffer cleanup
kvark Jun 10, 2021
38e13a1
hal/mtl: array length support
kvark Jun 10, 2021
d88aa99
Fix rows-per-image treatment, clippy warnings
kvark Jun 10, 2021
faf8f7e
Simple API for coherent mapping
kvark Jun 10, 2021
e345ad1
hal: make example to destroy temporary views
kvark Jun 10, 2021
75b6ece
hal: Fix iOS build
kvark Jun 10, 2021
dc34042
hal/vk: instance and adapter
kvark Jun 11, 2021
9ae5e36
hal/vk: format mapping
kvark Jun 11, 2021
b4380e4
hal/vk: buffer and texture creation
kvark Jun 11, 2021
61e2e24
hal/vk: textures and samplers
kvark Jun 11, 2021
006c1ba
hal/vk: pipeline layout, object labels and logging
kvark Jun 12, 2021
4eae5a3
hal/vk: hook up gpu-descriptor
kvark Jun 12, 2021
c2bb2d5
Experimental command pool API
kvark Jun 14, 2021
d8979ca
hal/vk: command pools, clippy warnings
kvark Jun 14, 2021
9d85602
hal: re-architect command encoding and pooling
kvark Jun 14, 2021
00de159
hal/vk: pipeline creation
kvark Jun 15, 2021
668fedd
hal: rename aux to util
kvark Jun 15, 2021
a260cff
hal/vk: queue operations
kvark Jun 15, 2021
6f655e0
hal/vk: barriers and copies
kvark Jun 15, 2021
bc6bb0c
hal/vk: render passes and queries
kvark Jun 16, 2021
67dfdb9
hal/vk: debug markers, bind groups, viewports
kvark Jun 16, 2021
1952ecb
hal/vk: enable vulkan portability support on macos
kvark Jun 16, 2021
c53adda
hal/vk: draws and dispatches. Refactor query set descriptor
kvark Jun 16, 2021
fb662df
hal/vk: polishing to run halmark with no validation issues
kvark Jun 16, 2021
54d7391
Minor tweaks to make CI happy
kvark Jun 17, 2021
7410b70
fix swapchain recycling, copies, device destruction, RODS
kvark Jun 17, 2021
0b506af
hal/vk: use non-coherent-atom-size
kvark Jun 17, 2021
5578222
Switch ubuntu CI to 20.04
kvark Jun 17, 2021
220f359
Address review notes
kvark Jun 17, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
hal/vk: barriers and copies
kvark committed Jun 15, 2021
commit 6f655e0b142e71b1cffa28f3c1f0c33046b40c39
3 changes: 3 additions & 0 deletions wgpu-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -56,6 +56,9 @@ hal = { path = "../wgpu-hal", package = "wgpu-hal", features = ["metal"] }
[target.'cfg(all(not(target_arch = "wasm32"), unix, not(target_os = "ios"), not(target_os = "macos")))'.dependencies]
hal = { path = "../wgpu-hal", package = "wgpu-hal", features = ["vulkan"] }

[target.'cfg(all(not(target_arch = "wasm32"), windows))'.dependencies]
hal = { path = "../wgpu-hal", package = "wgpu-hal", features = ["vulkan"] }

[dev-dependencies]
loom = "0.3"

2 changes: 1 addition & 1 deletion wgpu-hal/src/vulkan/adapter.rs
Original file line number Diff line number Diff line change
@@ -199,7 +199,7 @@ impl PhysicalDeviceFeatures {
| F::ADDRESS_MODE_CLAMP_TO_BORDER
| F::SAMPLED_TEXTURE_BINDING_ARRAY
| F::BUFFER_BINDING_ARRAY;
let mut dl_flags = Df::COMPARISON_SAMPLERS;
let mut dl_flags = Df::all();

dl_flags.set(Df::CUBE_ARRAY_TEXTURES, self.core.image_cube_array != 0);
dl_flags.set(Df::ANISOTROPIC_FILTERING, self.core.sampler_anisotropy != 0);
187 changes: 182 additions & 5 deletions wgpu-hal/src/vulkan/command.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,42 @@
use std::ops::Range;
use super::conv;

use ash::{version::DeviceV1_0, vk};
use inplace_it::inplace_or_alloc_from_iter;

use std::ops::Range;

const ALLOCATION_GRANULARITY: u32 = 16;
const DST_IMAGE_LAYOUT: vk::ImageLayout = vk::ImageLayout::TRANSFER_DST_OPTIMAL;

impl super::Texture {
fn map_buffer_copies<T>(&self, regions: T) -> impl Iterator<Item = vk::BufferImageCopy>
where
T: Iterator<Item = crate::BufferTextureCopy>,
{
let dim = self.dim;
let aspects = self.aspects;
let fi = self.format_info;
regions.map(move |r| {
let (layer_count, image_extent) = conv::map_extent(r.size, dim);
let (image_subresource, image_offset) =
conv::map_subresource_layers(&r.texture_base, dim, aspects, layer_count);
vk::BufferImageCopy {
buffer_offset: r.buffer_layout.offset,
buffer_row_length: r
.buffer_layout
.bytes_per_row
.map_or(0, |bpr| bpr.get() / fi.block_size as u32),
buffer_image_height: r
.buffer_layout
.rows_per_image
.map_or(0, |rpi| rpi.get() * fi.block_dimensions.1 as u32),
image_subresource,
image_offset,
image_extent,
}
})
}
}

impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
unsafe fn begin_encoding(&mut self, label: crate::Label) -> Result<(), crate::DeviceError> {
@@ -53,23 +87,102 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
where
T: Iterator<Item = crate::BufferBarrier<'a, super::Api>>,
{
let mut src_stages = vk::PipelineStageFlags::empty();
let mut dst_stages = vk::PipelineStageFlags::empty();
let vk_barrier_iter = barriers.map(move |bar| {
let (src_stage, src_access) = conv::map_buffer_usage_to_barrier(bar.usage.start);
src_stages |= src_stage;
let (dst_stage, dst_access) = conv::map_buffer_usage_to_barrier(bar.usage.end);
dst_stages |= dst_stage;

vk::BufferMemoryBarrier::builder()
.buffer(bar.buffer.raw)
.size(vk::WHOLE_SIZE)
.src_access_mask(src_access)
.dst_access_mask(dst_access)
.build()
});

inplace_or_alloc_from_iter(vk_barrier_iter, |vk_barriers| {
self.device.raw.cmd_pipeline_barrier(
self.active,
src_stages,
dst_stages,
vk::DependencyFlags::empty(),
&[],
vk_barriers,
&[],
);
});
}

unsafe fn transition_textures<'a, T>(&mut self, barriers: T)
where
T: Iterator<Item = crate::TextureBarrier<'a, super::Api>>,
{
let mut src_stages = vk::PipelineStageFlags::empty();
let mut dst_stages = vk::PipelineStageFlags::empty();
let vk_barrier_iter = barriers.map(move |bar| {
let range = conv::map_subresource_range(&bar.range, bar.texture.aspects);
let (src_stage, src_access) = conv::map_texture_usage_to_barrier(bar.usage.start);
let src_layout = conv::derive_image_layout(bar.usage.start);
src_stages |= src_stage;
let (dst_stage, dst_access) = conv::map_texture_usage_to_barrier(bar.usage.end);
let dst_layout = conv::derive_image_layout(bar.usage.end);
dst_stages |= dst_stage;

vk::ImageMemoryBarrier::builder()
.image(bar.texture.raw)
.subresource_range(range)
.src_access_mask(src_access)
.dst_access_mask(dst_access)
.old_layout(src_layout)
.new_layout(dst_layout)
.build()
});

inplace_or_alloc_from_iter(vk_barrier_iter, |vk_barriers| {
self.device.raw.cmd_pipeline_barrier(
self.active,
src_stages,
dst_stages,
vk::DependencyFlags::empty(),
&[],
&[],
vk_barriers,
);
});
}

unsafe fn fill_buffer(&mut self, buffer: &super::Buffer, range: crate::MemoryRange, value: u8) {
self.device.raw.cmd_fill_buffer(
self.active,
buffer.raw,
range.start,
range.end - range.start,
(value as u32) * 0x01010101,
);
}

unsafe fn copy_buffer_to_buffer<T>(
&mut self,
src: &super::Buffer,
dst: &super::Buffer,
regions: T,
) {
) where
T: Iterator<Item = crate::BufferCopy>,
{
let vk_regions_iter = regions.map(|r| vk::BufferCopy {
src_offset: r.src_offset,
dst_offset: r.dst_offset,
size: r.size.get(),
});

inplace_or_alloc_from_iter(vk_regions_iter, |vk_regions| {
self.device
.raw
.cmd_copy_buffer(self.active, src.raw, dst.raw, vk_regions)
})
}

unsafe fn copy_texture_to_texture<T>(
@@ -78,15 +191,57 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
src_usage: crate::TextureUse,
dst: &super::Texture,
regions: T,
) {
) where
T: Iterator<Item = crate::TextureCopy>,
{
let src_layout = conv::derive_image_layout(src_usage);

let vk_regions_iter = regions.map(|r| {
let (layer_count, extent) = conv::map_extent(r.size, src.dim);
let (src_subresource, src_offset) =
conv::map_subresource_layers(&r.src_base, src.dim, src.aspects, layer_count);
let (dst_subresource, dst_offset) =
conv::map_subresource_layers(&r.dst_base, dst.dim, dst.aspects, layer_count);
vk::ImageCopy {
src_subresource,
src_offset,
dst_subresource,
dst_offset,
extent,
}
});

inplace_or_alloc_from_iter(vk_regions_iter, |vk_regions| {
self.device.raw.cmd_copy_image(
self.active,
src.raw,
src_layout,
dst.raw,
DST_IMAGE_LAYOUT,
vk_regions,
);
});
}

unsafe fn copy_buffer_to_texture<T>(
&mut self,
src: &super::Buffer,
dst: &super::Texture,
regions: T,
) {
) where
T: Iterator<Item = crate::BufferTextureCopy>,
{
let vk_regions_iter = dst.map_buffer_copies(regions);

inplace_or_alloc_from_iter(vk_regions_iter, |vk_regions| {
self.device.raw.cmd_copy_buffer_to_image(
self.active,
src.raw,
dst.raw,
DST_IMAGE_LAYOUT,
vk_regions,
);
});
}

unsafe fn copy_texture_to_buffer<T>(
@@ -95,7 +250,21 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
src_usage: crate::TextureUse,
dst: &super::Buffer,
regions: T,
) {
) where
T: Iterator<Item = crate::BufferTextureCopy>,
{
let src_layout = conv::derive_image_layout(src_usage);
let vk_regions_iter = src.map_buffer_copies(regions);

inplace_or_alloc_from_iter(vk_regions_iter, |vk_regions| {
self.device.raw.cmd_copy_image_to_buffer(
self.active,
src.raw,
src_layout,
dst.raw,
vk_regions,
);
});
}

unsafe fn begin_query(&mut self, set: &super::QuerySet, index: u32) {}
@@ -228,3 +397,11 @@ impl crate::CommandEncoder<super::Api> for super::CommandEncoder {
unsafe fn dispatch(&mut self, count: [u32; 3]) {}
unsafe fn dispatch_indirect(&mut self, buffer: &super::Buffer, offset: wgt::BufferAddress) {}
}

#[test]
fn check_dst_image_layout() {
assert_eq!(
conv::derive_image_layout(crate::TextureUse::COPY_DST),
DST_IMAGE_LAYOUT
);
}
Loading