Skip to content

Commit

Permalink
hal:: Fill the command buffer calls
Browse files Browse the repository at this point in the history
  • Loading branch information
kvark committed Jun 6, 2021
1 parent 858eb3d commit 4e50c76
Show file tree
Hide file tree
Showing 15 changed files with 537 additions and 230 deletions.
2 changes: 1 addition & 1 deletion wgpu-core/src/command/bundle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@ use crate::{
AttachmentData, Device, DeviceError, RenderPassContext, MAX_VERTEX_BUFFERS,
SHADER_STAGE_COUNT,
},
hal::BufferUse,
hub::{GlobalIdentityHandlerFactory, HalApi, Hub, Resource, Storage, Token},
id,
memory_init_tracker::{MemoryInitKind, MemoryInitTrackerAction},
resource::BufferUse,
track::{TrackerSet, UsageConflict},
validation::check_buffer_usage,
Label, LabelHelpers, LifeGuard, Stored, MAX_BIND_GROUPS,
Expand Down
4 changes: 2 additions & 2 deletions wgpu-core/src/command/compute.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::{
Label, DOWNLEVEL_ERROR_WARNING_MESSAGE,
};

use hal::command::CommandBuffer as _;
use hal::CommandBuffer as _;
use thiserror::Error;
use wgt::{BufferAddress, BufferUsage, ShaderStage};

Expand Down Expand Up @@ -216,7 +216,7 @@ impl State {

fn flush_states<A: HalApi>(
&mut self,
raw_cmd_buf: &mut B::CommandBuffer,
raw_cmd_buf: &mut A::CommandBuffer,
base_trackers: &mut TrackerSet,
bind_group_guard: &Storage<BindGroup<A>, id::BindGroupId>,
buffer_guard: &Storage<Buffer<A>, id::BufferId>,
Expand Down
2 changes: 1 addition & 1 deletion wgpu-core/src/command/draw.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@

use crate::{
binding_model::PushConstantUploadError,
hal::BufferUse,
id,
resource::BufferUse,
track::UseExtendError,
validation::{MissingBufferUsageError, MissingTextureUsageError},
};
Expand Down
13 changes: 3 additions & 10 deletions wgpu-core/src/command/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,13 @@ impl<A: HalApi> CommandBuffer<A> {
}

pub(crate) fn insert_barriers(
raw: &mut B::CommandBuffer,
raw: &mut A::CommandBuffer,
base: &mut TrackerSet,
head_buffers: &ResourceTracker<BufferState>,
head_textures: &ResourceTracker<TextureState>,
buffer_guard: &Storage<Buffer<A>, id::BufferId>,
texture_guard: &Storage<Texture<A>, id::TextureId>,
) {
use hal::command::CommandBuffer as _;

profiling::scope!("insert_barriers");
debug_assert_eq!(A::VARIANT, base.backend());

Expand All @@ -135,14 +133,9 @@ impl<A: HalApi> CommandBuffer<A> {
pending.into_hal(tex)
});

//TODO: be more deliberate about the stages
let stages = all_buffer_stages() | all_image_stages();
unsafe {
raw.pipeline_barrier(
stages..stages,
hal::memory::Dependencies::empty(),
buffer_barriers.chain(texture_barriers),
);
raw.transition_buffers(buffer_barriers);
raw.transition_textures(texture_barriers);
}
}
}
Expand Down
1 change: 0 additions & 1 deletion wgpu-core/src/command/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ use hal::command::CommandBuffer as _;
use crate::device::trace::Command as TraceCommand;
use crate::{
command::{CommandBuffer, CommandEncoderError},
device::all_buffer_stages,
hub::{Global, GlobalIdentityHandlerFactory, HalApi, Storage, Token},
id::{self, Id, TypedId},
resource::{BufferUse, QuerySet},
Expand Down
71 changes: 71 additions & 0 deletions wgpu-core/src/conv.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,77 @@ pub fn is_valid_copy_dst_texture_format(format: wgt::TextureFormat) -> bool {
}
}

pub fn map_buffer_usage(usage: wgt::BufferUsage) -> hal::BufferUse {
let mut u = hal::BufferUse::empty();
u.set(
hal::BufferUse::MAP_READ,
usage.contains(wgt::BufferUsage::MAP_READ),
);
u.set(
hal::BufferUse::MAP_WRITE,
usage.contains(wgt::BufferUsage::MAP_WRITE),
);
u.set(
hal::BufferUse::COPY_SRC,
usage.contains(wgt::BufferUsage::COPY_SRC),
);
u.set(
hal::BufferUse::COPY_DST,
usage.contains(wgt::BufferUsage::COPY_DST),
);
u.set(
hal::BufferUse::INDEX,
usage.contains(wgt::BufferUsage::INDEX),
);
u.set(
hal::BufferUse::VERTEX,
usage.contains(wgt::BufferUsage::VERTEX),
);
u.set(
hal::BufferUse::UNIFORM,
usage.contains(wgt::BufferUsage::UNIFORM),
);
u.set(
hal::BufferUse::STORAGE,
usage.contains(wgt::BufferUsage::STORAGE),
);
u.set(
hal::BufferUse::INDIRECT,
usage.contains(wgt::BufferUsage::INDIRECT),
);
u
}

pub fn map_texture_usage(usage: wgt::TextureUsage, aspect: hal::FormatAspect) -> hal::TextureUse {
let mut u = hal::TextureUse::empty();
u.set(
hal::TextureUse::COPY_SRC,
usage.contains(wgt::TextureUsage::COPY_SRC),
);
u.set(
hal::TextureUse::COPY_DST,
usage.contains(wgt::TextureUsage::COPY_DST),
);
u.set(
hal::TextureUse::SAMPLED,
usage.contains(wgt::TextureUsage::SAMPLED),
);
u.set(
hal::TextureUse::STORAGE_LOAD | hal::TextureUse::STORAGE_STORE,
usage.contains(wgt::TextureUsage::STORAGE),
);
let is_color = aspect.contains(hal::FormatAspect::COLOR);
u.set(
hal::TextureUse::COLOR_TARGET,
usage.contains(wgt::TextureUsage::RENDER_ATTACHMENT) && is_color,
);
u.set(
hal::TextureUse::DEPTH_STENCIL_READ | hal::TextureUse::DEPTH_STENCIL_WRITE,
usage.contains(wgt::TextureUsage::RENDER_ATTACHMENT) && !is_color,
);
u
}

pub fn check_texture_dimension_size(
dimension: wgt::TextureDimension,
wgt::Extent3d {
Expand Down
85 changes: 46 additions & 39 deletions wgpu-core/src/device/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -448,13 +448,13 @@ impl<A: HalApi> Device<A> {
return Err(resource::CreateBufferError::EmptyUsage);
}

let buffer = unsafe {
self.raw.create_buffer(&resource::BufferDescriptor {
usage,
..desc.clone()
})
}
.map_err(DeviceError::from)?;
let hal_desc = hal::BufferDescriptor {
label: desc.label,
size: desc.size,
usage: conv::map_buffer_usage(usage),
memory_flags: hal::MemoryFlag::empty(),
};
let buffer = unsafe { self.raw.create_buffer(&hal_desc) }.map_err(DeviceError::from)?;

Ok(resource::Buffer {
raw: Some(buffer),
Expand Down Expand Up @@ -529,10 +529,24 @@ impl<A: HalApi> Device<A> {
return Err(resource::CreateTextureError::InvalidMipLevelCount(mips));
}

let mut image = unsafe { self.raw.create_image(desc).map_err(DeviceError::from)? };
let hal_desc = hal::TextureDescriptor {
label: desc.label,
size: desc.size,
mip_level_count: desc.mip_level_count,
sample_count: desc.sample_count,
dimension: desc.dimension,
format: desc.format,
usage: conv::map_texture_usage(desc.usage, desc.format.into()),
memory_flags: hal::MemoryFlag::empty(),
};
let mut raw = unsafe {
self.raw
.create_texture(&hal_desc)
.map_err(DeviceError::from)?
};

Ok(resource::Texture {
raw: Some(image),
raw: Some(raw),
device_id: Stored {
value: id::Valid(self_id),
ref_count: self.life_guard.add_ref(),
Expand Down Expand Up @@ -698,9 +712,9 @@ impl<A: HalApi> Device<A> {
samples: texture.kind.num_samples(),
// once a storage - forever a storage
sampled_internal_use: if texture.usage.contains(wgt::TextureUsage::STORAGE) {
resource::TextureUse::SAMPLED | resource::TextureUse::STORAGE_LOAD
hal::TextureUse::SAMPLED | hal::TextureUse::STORAGE_LOAD
} else {
resource::TextureUse::SAMPLED
hal::TextureUse::SAMPLED
},
selector,
life_guard: LifeGuard::new(desc.label.borrow_or_default()),
Expand Down Expand Up @@ -1083,15 +1097,15 @@ impl<A: HalApi> Device<A> {
let (pub_usage, internal_use, range_limit) = match binding_ty {
wgt::BufferBindingType::Uniform => (
wgt::BufferUsage::UNIFORM,
resource::BufferUse::UNIFORM,
hal::BufferUse::UNIFORM,
limits.max_uniform_buffer_binding_size,
),
wgt::BufferBindingType::Storage { read_only } => (
wgt::BufferUsage::STORAGE,
if read_only {
resource::BufferUse::STORAGE_LOAD
hal::BufferUse::STORAGE_LOAD
} else {
resource::BufferUse::STORAGE_STORE
hal::BufferUse::STORAGE_STORE
},
limits.max_storage_buffer_binding_size,
),
Expand Down Expand Up @@ -1360,10 +1374,10 @@ impl<A: HalApi> Device<A> {
}
let internal_use = match access {
wgt::StorageTextureAccess::ReadOnly => {
resource::TextureUse::STORAGE_LOAD
hal::TextureUse::STORAGE_LOAD
}
wgt::StorageTextureAccess::WriteOnly => {
resource::TextureUse::STORAGE_STORE
hal::TextureUse::STORAGE_STORE
}
wgt::StorageTextureAccess::ReadWrite => {
if !view.format_features.flags.contains(
Expand All @@ -1374,8 +1388,7 @@ impl<A: HalApi> Device<A> {
));
}

resource::TextureUse::STORAGE_STORE
| resource::TextureUse::STORAGE_LOAD
hal::TextureUse::STORAGE_STORE | hal::TextureUse::STORAGE_LOAD
}
};
(wgt::TextureUsage::STORAGE, internal_use)
Expand Down Expand Up @@ -2459,7 +2472,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
let ref_count = buffer.life_guard.add_ref();

let buffer_use = if !desc.mapped_at_creation {
resource::BufferUse::EMPTY
hal::BufferUse::EMPTY
} else if desc.usage.contains(wgt::BufferUsage::MAP_WRITE) {
// buffer is mappable, so we are just doing that at start
let map_size = buffer.size;
Expand All @@ -2480,7 +2493,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
range: 0..map_size,
host: HostMap::Write,
};
resource::BufferUse::MAP_WRITE
hal::BufferUse::MAP_WRITE
} else {
// buffer needs staging area for initialization only
let stage_desc = wgt::BufferDescriptor {
Expand Down Expand Up @@ -2533,7 +2546,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
stage_buffer,
stage_memory,
};
resource::BufferUse::COPY_DST
hal::BufferUse::COPY_DST
};

let id = fid.assign(buffer, &mut token);
Expand Down Expand Up @@ -4236,8 +4249,8 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
let mut token = Token::root();
let (device_guard, mut token) = hub.devices.read(&mut token);
let (pub_usage, internal_use) = match op.host {
HostMap::Read => (wgt::BufferUsage::MAP_READ, resource::BufferUse::MAP_READ),
HostMap::Write => (wgt::BufferUsage::MAP_WRITE, resource::BufferUse::MAP_WRITE),
HostMap::Read => (wgt::BufferUsage::MAP_READ, hal::BufferUse::MAP_READ),
HostMap::Write => (wgt::BufferUsage::MAP_WRITE, hal::BufferUse::MAP_WRITE),
};

if range.start % wgt::MAP_ALIGNMENT != 0 || range.end % wgt::COPY_BUFFER_ALIGNMENT != 0 {
Expand Down Expand Up @@ -4404,32 +4417,26 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
.ok_or(resource::BufferAccessError::Destroyed)?;

buffer.life_guard.use_at(device.active_submission_index + 1);
let region = hal::command::BufferCopy {
let region = hal::BufferCopy {
src: 0,
dst: 0,
size: buffer.size,
};
let transition_src = hal::memory::Barrier::Buffer {
states: hal::buffer::Access::HOST_WRITE..hal::buffer::Access::TRANSFER_READ,
target: &stage_buffer,
range: hal::buffer::SubRange::WHOLE,
families: None,
let transition_src = hal::BufferBarrier {
buffer: &stage_buffer,
usage: hal::BufferUse::MAP_WRITE..hal::BufferUse::COPY_SRC,
};
let transition_dst = hal::memory::Barrier::Buffer {
states: hal::buffer::Access::empty()..hal::buffer::Access::TRANSFER_WRITE,
target: buf_raw,
range: hal::buffer::SubRange::WHOLE,
families: None,
let transition_dst = hal::BufferBarrier {
buffer: buf_raw,
usage: hal::BufferUse::empty()..hal::BufferUse::COPY_DST,
};
unsafe {
let cmdbuf = device.borrow_pending_writes();
cmdbuf.pipeline_barrier(
hal::pso::PipelineStage::HOST..hal::pso::PipelineStage::TRANSFER,
hal::memory::Dependencies::empty(),
let cmd_buf = device.borrow_pending_writes();
cmd_buf.transition_buffers(
iter::once(transition_src).chain(iter::once(transition_dst)),
);
if buffer.size > 0 {
cmdbuf.copy_buffer(&stage_buffer, buf_raw, iter::once(region));
cmd_buf.copy_buffer_to_buffer(&stage_buffer, buf_raw, iter::once(region));
}
}
device
Expand Down
Loading

0 comments on commit 4e50c76

Please sign in to comment.