mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-21 22:33:49 +00:00
Bump version to 0.5.6 (#771)
This commit is contained in:
parent
eeda6dcdfd
commit
7e1fe247fc
@ -1,5 +1,8 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## v0.5.6 (2020-07-09)
|
||||||
|
- add debug markers support
|
||||||
|
|
||||||
## v0.5.5 (2020-05-20)
|
## v0.5.5 (2020-05-20)
|
||||||
- fix destruction of adapters, swap chains, and bind group layouts
|
- fix destruction of adapters, swap chains, and bind group layouts
|
||||||
- fix command pool leak with temporary threads
|
- fix command pool leak with temporary threads
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "wgpu-core"
|
name = "wgpu-core"
|
||||||
version = "0.5.5"
|
version = "0.5.6"
|
||||||
authors = [
|
authors = [
|
||||||
"Dzmitry Malyshau <kvark@mozilla.com>",
|
"Dzmitry Malyshau <kvark@mozilla.com>",
|
||||||
"Joshua Groves <josh@joshgroves.com>",
|
"Joshua Groves <josh@joshgroves.com>",
|
||||||
|
@ -16,7 +16,7 @@ use hal::command::CommandBuffer as _;
|
|||||||
use peek_poke::{Peek, PeekPoke, Poke};
|
use peek_poke::{Peek, PeekPoke, Poke};
|
||||||
use wgt::{BufferAddress, BufferUsage, DynamicOffset, BIND_BUFFER_ALIGNMENT};
|
use wgt::{BufferAddress, BufferUsage, DynamicOffset, BIND_BUFFER_ALIGNMENT};
|
||||||
|
|
||||||
use std::iter;
|
use std::{iter, str};
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
enum PipelineState {
|
enum PipelineState {
|
||||||
@ -38,9 +38,28 @@ enum ComputeCommand {
|
|||||||
buffer_id: id::BufferId,
|
buffer_id: id::BufferId,
|
||||||
offset: BufferAddress,
|
offset: BufferAddress,
|
||||||
},
|
},
|
||||||
|
PushDebugGroup {
|
||||||
|
color: u32,
|
||||||
|
len: usize,
|
||||||
|
#[cfg_attr(any(feature = "trace", feature = "replay"), serde(skip))]
|
||||||
|
phantom_marker: PhantomSlice<u8>,
|
||||||
|
},
|
||||||
|
PopDebugGroup,
|
||||||
|
InsertDebugMarker {
|
||||||
|
color: u32,
|
||||||
|
len: usize,
|
||||||
|
#[cfg_attr(any(feature = "trace", feature = "replay"), serde(skip))]
|
||||||
|
phantom_marker: PhantomSlice<u8>,
|
||||||
|
},
|
||||||
End,
|
End,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct State {
|
||||||
|
binder: Binder,
|
||||||
|
debug_scope_depth: u32,
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for ComputeCommand {
|
impl Default for ComputeCommand {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
ComputeCommand::End
|
ComputeCommand::End
|
||||||
@ -78,7 +97,6 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
|
let (mut cmb_guard, mut token) = hub.command_buffers.write(&mut token);
|
||||||
let cmb = &mut cmb_guard[encoder_id];
|
let cmb = &mut cmb_guard[encoder_id];
|
||||||
let raw = cmb.raw.last_mut().unwrap();
|
let raw = cmb.raw.last_mut().unwrap();
|
||||||
let mut binder = Binder::new(cmb.limits.max_bind_groups);
|
|
||||||
|
|
||||||
let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
|
let (pipeline_layout_guard, mut token) = hub.pipeline_layouts.read(&mut token);
|
||||||
let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
|
let (bind_group_guard, mut token) = hub.bind_groups.read(&mut token);
|
||||||
@ -88,6 +106,11 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
|
|
||||||
let mut pipeline_state = PipelineState::Required;
|
let mut pipeline_state = PipelineState::Required;
|
||||||
|
|
||||||
|
let mut state = State {
|
||||||
|
binder: Binder::new(cmb.limits.max_bind_groups),
|
||||||
|
debug_scope_depth: 0,
|
||||||
|
};
|
||||||
|
|
||||||
let mut peeker = raw_data.as_ptr();
|
let mut peeker = raw_data.as_ptr();
|
||||||
let raw_data_end = unsafe { raw_data.as_ptr().add(raw_data.len()) };
|
let raw_data_end = unsafe { raw_data.as_ptr().add(raw_data.len()) };
|
||||||
let mut command = ComputeCommand::Dispatch([0; 3]); // dummy
|
let mut command = ComputeCommand::Dispatch([0; 3]); // dummy
|
||||||
@ -142,9 +165,12 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
&*texture_guard,
|
&*texture_guard,
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some((pipeline_layout_id, follow_ups)) =
|
if let Some((pipeline_layout_id, follow_ups)) = state.binder.provide_entry(
|
||||||
binder.provide_entry(index as usize, bind_group_id, bind_group, offsets)
|
index as usize,
|
||||||
{
|
bind_group_id,
|
||||||
|
bind_group,
|
||||||
|
offsets,
|
||||||
|
) {
|
||||||
let bind_groups = iter::once(bind_group.raw.raw()).chain(
|
let bind_groups = iter::once(bind_group.raw.raw()).chain(
|
||||||
follow_ups
|
follow_ups
|
||||||
.clone()
|
.clone()
|
||||||
@ -176,13 +202,16 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Rebind resources
|
// Rebind resources
|
||||||
if binder.pipeline_layout_id != Some(pipeline.layout_id.value) {
|
if state.binder.pipeline_layout_id != Some(pipeline.layout_id.value) {
|
||||||
let pipeline_layout = &pipeline_layout_guard[pipeline.layout_id.value];
|
let pipeline_layout = &pipeline_layout_guard[pipeline.layout_id.value];
|
||||||
binder.pipeline_layout_id = Some(pipeline.layout_id.value);
|
state.binder.pipeline_layout_id = Some(pipeline.layout_id.value);
|
||||||
binder.reset_expectations(pipeline_layout.bind_group_layout_ids.len());
|
state
|
||||||
|
.binder
|
||||||
|
.reset_expectations(pipeline_layout.bind_group_layout_ids.len());
|
||||||
let mut is_compatible = true;
|
let mut is_compatible = true;
|
||||||
|
|
||||||
for (index, (entry, bgl_id)) in binder
|
for (index, (entry, bgl_id)) in state
|
||||||
|
.binder
|
||||||
.entries
|
.entries
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.zip(&pipeline_layout.bind_group_layout_ids)
|
.zip(&pipeline_layout.bind_group_layout_ids)
|
||||||
@ -243,6 +272,39 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
raw.dispatch_indirect(&src_buffer.raw, offset);
|
raw.dispatch_indirect(&src_buffer.raw, offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ComputeCommand::PushDebugGroup {
|
||||||
|
color,
|
||||||
|
len,
|
||||||
|
phantom_marker,
|
||||||
|
} => unsafe {
|
||||||
|
state.debug_scope_depth += 1;
|
||||||
|
|
||||||
|
let (new_peeker, label) =
|
||||||
|
{ phantom_marker.decode_unaligned(peeker, len, raw_data_end) };
|
||||||
|
peeker = new_peeker;
|
||||||
|
|
||||||
|
raw.begin_debug_marker(str::from_utf8(label).unwrap(), color)
|
||||||
|
},
|
||||||
|
ComputeCommand::PopDebugGroup => unsafe {
|
||||||
|
assert_ne!(
|
||||||
|
state.debug_scope_depth, 0,
|
||||||
|
"Can't pop debug group, because number of pushed debug groups is zero!"
|
||||||
|
);
|
||||||
|
state.debug_scope_depth -= 1;
|
||||||
|
|
||||||
|
raw.end_debug_marker()
|
||||||
|
},
|
||||||
|
ComputeCommand::InsertDebugMarker {
|
||||||
|
color,
|
||||||
|
len,
|
||||||
|
phantom_marker,
|
||||||
|
} => unsafe {
|
||||||
|
let (new_peeker, label) =
|
||||||
|
{ phantom_marker.decode_unaligned(peeker, len, raw_data_end) };
|
||||||
|
peeker = new_peeker;
|
||||||
|
|
||||||
|
raw.insert_debug_marker(str::from_utf8(label).unwrap(), color)
|
||||||
|
},
|
||||||
ComputeCommand::End => break,
|
ComputeCommand::End => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -255,7 +317,7 @@ pub mod compute_ffi {
|
|||||||
ComputeCommand,
|
ComputeCommand,
|
||||||
};
|
};
|
||||||
use crate::{id, RawString};
|
use crate::{id, RawString};
|
||||||
use std::{convert::TryInto, slice};
|
use std::{convert::TryInto, ffi, slice};
|
||||||
use wgt::{BufferAddress, DynamicOffset};
|
use wgt::{BufferAddress, DynamicOffset};
|
||||||
|
|
||||||
/// # Safety
|
/// # Safety
|
||||||
@ -309,21 +371,40 @@ pub mod compute_ffi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn wgpu_compute_pass_push_debug_group(_pass: &mut RawPass, _label: RawString) {
|
pub unsafe extern "C" fn wgpu_compute_pass_push_debug_group(
|
||||||
//TODO
|
pass: &mut RawPass,
|
||||||
}
|
label: RawString,
|
||||||
|
color: u32,
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn wgpu_compute_pass_pop_debug_group(_pass: &mut RawPass) {
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern "C" fn wgpu_compute_pass_insert_debug_marker(
|
|
||||||
_pass: &mut RawPass,
|
|
||||||
_label: RawString,
|
|
||||||
) {
|
) {
|
||||||
//TODO
|
let bytes = ffi::CStr::from_ptr(label).to_bytes();
|
||||||
|
|
||||||
|
pass.encode(&ComputeCommand::PushDebugGroup {
|
||||||
|
color,
|
||||||
|
len: bytes.len(),
|
||||||
|
phantom_marker: PhantomSlice::default(),
|
||||||
|
});
|
||||||
|
pass.encode_slice(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wgpu_compute_pass_pop_debug_group(pass: &mut RawPass) {
|
||||||
|
pass.encode(&ComputeCommand::PopDebugGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn wgpu_compute_pass_insert_debug_marker(
|
||||||
|
pass: &mut RawPass,
|
||||||
|
label: RawString,
|
||||||
|
color: u32,
|
||||||
|
) {
|
||||||
|
let bytes = ffi::CStr::from_ptr(label).to_bytes();
|
||||||
|
|
||||||
|
pass.encode(&ComputeCommand::InsertDebugMarker {
|
||||||
|
color,
|
||||||
|
len: bytes.len(),
|
||||||
|
phantom_marker: PhantomSlice::default(),
|
||||||
|
});
|
||||||
|
pass.encode_slice(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
@ -22,6 +22,8 @@ use crate::{
|
|||||||
LifeGuard, PrivateFeatures, Stored,
|
LifeGuard, PrivateFeatures, Stored,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use hal::command::CommandBuffer as _;
|
||||||
|
|
||||||
use peek_poke::PeekPoke;
|
use peek_poke::PeekPoke;
|
||||||
|
|
||||||
use std::{marker::PhantomData, mem, ptr, slice, thread::ThreadId};
|
use std::{marker::PhantomData, mem, ptr, slice, thread::ThreadId};
|
||||||
@ -259,4 +261,51 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
log::debug!("Command buffer {:?} {:#?}", encoder_id, comb.trackers);
|
log::debug!("Command buffer {:?} {:#?}", encoder_id, comb.trackers);
|
||||||
encoder_id
|
encoder_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn command_encoder_push_debug_group<B: GfxBackend>(
|
||||||
|
&self,
|
||||||
|
encoder_id: id::CommandEncoderId,
|
||||||
|
label: &str,
|
||||||
|
) {
|
||||||
|
let hub = B::hub(self);
|
||||||
|
let mut token = Token::root();
|
||||||
|
|
||||||
|
let (mut cmb_guard, _) = hub.command_buffers.write(&mut token);
|
||||||
|
let cmb = &mut cmb_guard[encoder_id];
|
||||||
|
let cmb_raw = cmb.raw.last_mut().unwrap();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
cmb_raw.begin_debug_marker(label, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn command_encoder_insert_debug_marker<B: GfxBackend>(
|
||||||
|
&self,
|
||||||
|
encoder_id: id::CommandEncoderId,
|
||||||
|
label: &str,
|
||||||
|
) {
|
||||||
|
let hub = B::hub(self);
|
||||||
|
let mut token = Token::root();
|
||||||
|
|
||||||
|
let (mut cmb_guard, _) = hub.command_buffers.write(&mut token);
|
||||||
|
let cmb = &mut cmb_guard[encoder_id];
|
||||||
|
let cmb_raw = cmb.raw.last_mut().unwrap();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
cmb_raw.insert_debug_marker(label, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn command_encoder_pop_debug_group<B: GfxBackend>(&self, encoder_id: id::CommandEncoderId) {
|
||||||
|
let hub = B::hub(self);
|
||||||
|
let mut token = Token::root();
|
||||||
|
|
||||||
|
let (mut cmb_guard, _) = hub.command_buffers.write(&mut token);
|
||||||
|
let cmb = &mut cmb_guard[encoder_id];
|
||||||
|
let cmb_raw = cmb.raw.last_mut().unwrap();
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
cmb_raw.end_debug_marker();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ use wgt::{
|
|||||||
TextureUsage, BIND_BUFFER_ALIGNMENT,
|
TextureUsage, BIND_BUFFER_ALIGNMENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
use std::{borrow::Borrow, collections::hash_map::Entry, fmt, iter, mem, ops::Range, slice};
|
use std::{borrow::Borrow, collections::hash_map::Entry, fmt, iter, mem, ops::Range, slice, str};
|
||||||
|
|
||||||
pub type RenderPassColorAttachmentDescriptor =
|
pub type RenderPassColorAttachmentDescriptor =
|
||||||
RenderPassColorAttachmentDescriptorBase<id::TextureViewId>;
|
RenderPassColorAttachmentDescriptorBase<id::TextureViewId>;
|
||||||
@ -102,6 +102,19 @@ enum RenderCommand {
|
|||||||
buffer_id: id::BufferId,
|
buffer_id: id::BufferId,
|
||||||
offset: BufferAddress,
|
offset: BufferAddress,
|
||||||
},
|
},
|
||||||
|
PushDebugGroup {
|
||||||
|
color: u32,
|
||||||
|
len: usize,
|
||||||
|
#[cfg_attr(any(feature = "trace", feature = "replay"), serde(skip))]
|
||||||
|
phantom_marker: PhantomSlice<u8>,
|
||||||
|
},
|
||||||
|
PopDebugGroup,
|
||||||
|
InsertDebugMarker {
|
||||||
|
color: u32,
|
||||||
|
len: usize,
|
||||||
|
#[cfg_attr(any(feature = "trace", feature = "replay"), serde(skip))]
|
||||||
|
phantom_marker: PhantomSlice<u8>,
|
||||||
|
},
|
||||||
End,
|
End,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,6 +279,7 @@ struct State {
|
|||||||
pipeline: OptionalState,
|
pipeline: OptionalState,
|
||||||
index: IndexState,
|
index: IndexState,
|
||||||
vertex: VertexState,
|
vertex: VertexState,
|
||||||
|
debug_scope_depth: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
@ -832,6 +846,7 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
vertex_limit: 0,
|
vertex_limit: 0,
|
||||||
instance_limit: 0,
|
instance_limit: 0,
|
||||||
},
|
},
|
||||||
|
debug_scope_depth: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut command = RenderCommand::Draw {
|
let mut command = RenderCommand::Draw {
|
||||||
@ -1197,6 +1212,39 @@ impl<G: GlobalIdentityHandlerFactory> Global<G> {
|
|||||||
raw.draw_indexed_indirect(&buffer.raw, offset, 1, 0);
|
raw.draw_indexed_indirect(&buffer.raw, offset, 1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
RenderCommand::PushDebugGroup {
|
||||||
|
color,
|
||||||
|
len,
|
||||||
|
phantom_marker,
|
||||||
|
} => unsafe {
|
||||||
|
state.debug_scope_depth += 1;
|
||||||
|
|
||||||
|
let (new_peeker, label) =
|
||||||
|
{ phantom_marker.decode_unaligned(peeker, len, raw_data_end) };
|
||||||
|
peeker = new_peeker;
|
||||||
|
|
||||||
|
raw.begin_debug_marker(str::from_utf8(label).unwrap(), color)
|
||||||
|
},
|
||||||
|
RenderCommand::PopDebugGroup => unsafe {
|
||||||
|
assert_ne!(
|
||||||
|
state.debug_scope_depth, 0,
|
||||||
|
"Can't pop debug group, because number of pushed debug groups is zero!"
|
||||||
|
);
|
||||||
|
state.debug_scope_depth -= 1;
|
||||||
|
|
||||||
|
raw.end_debug_marker()
|
||||||
|
},
|
||||||
|
RenderCommand::InsertDebugMarker {
|
||||||
|
color,
|
||||||
|
len,
|
||||||
|
phantom_marker,
|
||||||
|
} => unsafe {
|
||||||
|
let (new_peeker, label) =
|
||||||
|
{ phantom_marker.decode_unaligned(peeker, len, raw_data_end) };
|
||||||
|
peeker = new_peeker;
|
||||||
|
|
||||||
|
raw.insert_debug_marker(str::from_utf8(label).unwrap(), color)
|
||||||
|
},
|
||||||
RenderCommand::End => break,
|
RenderCommand::End => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1225,7 +1273,7 @@ pub mod render_ffi {
|
|||||||
RenderCommand,
|
RenderCommand,
|
||||||
};
|
};
|
||||||
use crate::{id, RawString};
|
use crate::{id, RawString};
|
||||||
use std::{convert::TryInto, slice};
|
use std::{convert::TryInto, ffi, slice};
|
||||||
use wgt::{BufferAddress, Color, DynamicOffset};
|
use wgt::{BufferAddress, Color, DynamicOffset};
|
||||||
|
|
||||||
/// # Safety
|
/// # Safety
|
||||||
@ -1392,18 +1440,40 @@ pub mod render_ffi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn wgpu_render_pass_push_debug_group(_pass: &mut RawPass, _label: RawString) {
|
pub unsafe extern "C" fn wgpu_render_pass_push_debug_group(
|
||||||
//TODO
|
pass: &mut RawPass,
|
||||||
|
label: RawString,
|
||||||
|
color: u32,
|
||||||
|
) {
|
||||||
|
let bytes = ffi::CStr::from_ptr(label).to_bytes();
|
||||||
|
|
||||||
|
pass.encode(&RenderCommand::PushDebugGroup {
|
||||||
|
color,
|
||||||
|
len: bytes.len(),
|
||||||
|
phantom_marker: PhantomSlice::default(),
|
||||||
|
});
|
||||||
|
pass.encode_slice(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn wgpu_render_pass_pop_debug_group(_pass: &mut RawPass) {
|
pub unsafe extern "C" fn wgpu_render_pass_pop_debug_group(pass: &mut RawPass) {
|
||||||
//TODO
|
pass.encode(&RenderCommand::PopDebugGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn wgpu_render_pass_insert_debug_marker(_pass: &mut RawPass, _label: RawString) {
|
pub unsafe extern "C" fn wgpu_render_pass_insert_debug_marker(
|
||||||
//TODO
|
pass: &mut RawPass,
|
||||||
|
label: RawString,
|
||||||
|
color: u32,
|
||||||
|
) {
|
||||||
|
let bytes = ffi::CStr::from_ptr(label).to_bytes();
|
||||||
|
|
||||||
|
pass.encode(&RenderCommand::InsertDebugMarker {
|
||||||
|
color,
|
||||||
|
len: bytes.len(),
|
||||||
|
phantom_marker: PhantomSlice::default(),
|
||||||
|
});
|
||||||
|
pass.encode_slice(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
Loading…
Reference in New Issue
Block a user