summaryrefslogtreecommitdiffstats
path: root/third_party/rust/wgpu-core/src/command/render.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/wgpu-core/src/command/render.rs')
-rw-r--r--third_party/rust/wgpu-core/src/command/render.rs168
1 files changed, 51 insertions, 117 deletions
diff --git a/third_party/rust/wgpu-core/src/command/render.rs b/third_party/rust/wgpu-core/src/command/render.rs
index 7e859e3cc8..87dc9aac16 100644
--- a/third_party/rust/wgpu-core/src/command/render.rs
+++ b/third_party/rust/wgpu-core/src/command/render.rs
@@ -1343,7 +1343,8 @@ impl Global {
let hub = A::hub(self);
- let cmd_buf = CommandBuffer::get_encoder(hub, encoder_id).map_pass_err(pass_scope)?;
+ let cmd_buf: Arc<CommandBuffer<A>> =
+ CommandBuffer::get_encoder(hub, encoder_id).map_pass_err(pass_scope)?;
let device = &cmd_buf.device;
let snatch_guard = device.snatchable_lock.read();
@@ -2409,7 +2410,10 @@ impl Global {
(trackers, pending_discard_init_fixups)
};
- let cmd_buf = hub.command_buffers.get(encoder_id.transmute()).unwrap();
+ let cmd_buf = hub
+ .command_buffers
+ .get(encoder_id.into_command_buffer_id())
+ .unwrap();
let mut cmd_buf_data = cmd_buf.data.lock();
let cmd_buf_data = cmd_buf_data.as_mut().unwrap();
@@ -2455,36 +2459,27 @@ impl Global {
}
}
-pub mod render_ffi {
+pub mod render_commands {
use super::{
super::{Rect, RenderCommand},
RenderPass,
};
- use crate::{id, RawString};
- use std::{convert::TryInto, ffi, num::NonZeroU32, slice};
+ use crate::id;
+ use std::{convert::TryInto, num::NonZeroU32};
use wgt::{BufferAddress, BufferSize, Color, DynamicOffset, IndexFormat};
- /// # Safety
- ///
- /// This function is unsafe as there is no guarantee that the given pointer is
- /// valid for `offset_length` elements.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_render_pass_set_bind_group(
+ pub fn wgpu_render_pass_set_bind_group(
pass: &mut RenderPass,
index: u32,
bind_group_id: id::BindGroupId,
- offsets: *const DynamicOffset,
- offset_length: usize,
+ offsets: &[DynamicOffset],
) {
- let redundant = unsafe {
- pass.current_bind_groups.set_and_check_redundant(
- bind_group_id,
- index,
- &mut pass.base.dynamic_offsets,
- offsets,
- offset_length,
- )
- };
+ let redundant = pass.current_bind_groups.set_and_check_redundant(
+ bind_group_id,
+ index,
+ &mut pass.base.dynamic_offsets,
+ offsets,
+ );
if redundant {
return;
@@ -2492,16 +2487,12 @@ pub mod render_ffi {
pass.base.commands.push(RenderCommand::SetBindGroup {
index,
- num_dynamic_offsets: offset_length,
+ num_dynamic_offsets: offsets.len(),
bind_group_id,
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_pipeline(
- pass: &mut RenderPass,
- pipeline_id: id::RenderPipelineId,
- ) {
+ pub fn wgpu_render_pass_set_pipeline(pass: &mut RenderPass, pipeline_id: id::RenderPipelineId) {
if pass.current_pipeline.set_and_check_redundant(pipeline_id) {
return;
}
@@ -2511,8 +2502,7 @@ pub mod render_ffi {
.push(RenderCommand::SetPipeline(pipeline_id));
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_vertex_buffer(
+ pub fn wgpu_render_pass_set_vertex_buffer(
pass: &mut RenderPass,
slot: u32,
buffer_id: id::BufferId,
@@ -2527,8 +2517,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_index_buffer(
+ pub fn wgpu_render_pass_set_index_buffer(
pass: &mut RenderPass,
buffer: id::BufferId,
index_format: IndexFormat,
@@ -2538,22 +2527,19 @@ pub mod render_ffi {
pass.set_index_buffer(buffer, index_format, offset, size);
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_blend_constant(pass: &mut RenderPass, color: &Color) {
+ pub fn wgpu_render_pass_set_blend_constant(pass: &mut RenderPass, color: &Color) {
pass.base
.commands
.push(RenderCommand::SetBlendConstant(*color));
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_stencil_reference(pass: &mut RenderPass, value: u32) {
+ pub fn wgpu_render_pass_set_stencil_reference(pass: &mut RenderPass, value: u32) {
pass.base
.commands
.push(RenderCommand::SetStencilReference(value));
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_viewport(
+ pub fn wgpu_render_pass_set_viewport(
pass: &mut RenderPass,
x: f32,
y: f32,
@@ -2569,8 +2555,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_set_scissor_rect(
+ pub fn wgpu_render_pass_set_scissor_rect(
pass: &mut RenderPass,
x: u32,
y: u32,
@@ -2582,17 +2567,11 @@ pub mod render_ffi {
.push(RenderCommand::SetScissor(Rect { x, y, w, h }));
}
- /// # Safety
- ///
- /// This function is unsafe as there is no guarantee that the given pointer is
- /// valid for `size_bytes` bytes.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_render_pass_set_push_constants(
+ pub fn wgpu_render_pass_set_push_constants(
pass: &mut RenderPass,
stages: wgt::ShaderStages,
offset: u32,
- size_bytes: u32,
- data: *const u8,
+ data: &[u8],
) {
assert_eq!(
offset & (wgt::PUSH_CONSTANT_ALIGNMENT - 1),
@@ -2600,31 +2579,28 @@ pub mod render_ffi {
"Push constant offset must be aligned to 4 bytes."
);
assert_eq!(
- size_bytes & (wgt::PUSH_CONSTANT_ALIGNMENT - 1),
+ data.len() as u32 & (wgt::PUSH_CONSTANT_ALIGNMENT - 1),
0,
"Push constant size must be aligned to 4 bytes."
);
- let data_slice = unsafe { slice::from_raw_parts(data, size_bytes as usize) };
let value_offset = pass.base.push_constant_data.len().try_into().expect(
"Ran out of push constant space. Don't set 4gb of push constants per RenderPass.",
);
pass.base.push_constant_data.extend(
- data_slice
- .chunks_exact(wgt::PUSH_CONSTANT_ALIGNMENT as usize)
+ data.chunks_exact(wgt::PUSH_CONSTANT_ALIGNMENT as usize)
.map(|arr| u32::from_ne_bytes([arr[0], arr[1], arr[2], arr[3]])),
);
pass.base.commands.push(RenderCommand::SetPushConstant {
stages,
offset,
- size_bytes,
+ size_bytes: data.len() as u32,
values_offset: Some(value_offset),
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_draw(
+ pub fn wgpu_render_pass_draw(
pass: &mut RenderPass,
vertex_count: u32,
instance_count: u32,
@@ -2639,8 +2615,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_draw_indexed(
+ pub fn wgpu_render_pass_draw_indexed(
pass: &mut RenderPass,
index_count: u32,
instance_count: u32,
@@ -2657,8 +2632,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_draw_indirect(
+ pub fn wgpu_render_pass_draw_indirect(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2671,8 +2645,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_draw_indexed_indirect(
+ pub fn wgpu_render_pass_draw_indexed_indirect(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2685,8 +2658,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_multi_draw_indirect(
+ pub fn wgpu_render_pass_multi_draw_indirect(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2700,8 +2672,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_multi_draw_indexed_indirect(
+ pub fn wgpu_render_pass_multi_draw_indexed_indirect(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2715,8 +2686,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_multi_draw_indirect_count(
+ pub fn wgpu_render_pass_multi_draw_indirect_count(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2736,8 +2706,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_multi_draw_indexed_indirect_count(
+ pub fn wgpu_render_pass_multi_draw_indexed_indirect_count(
pass: &mut RenderPass,
buffer_id: id::BufferId,
offset: BufferAddress,
@@ -2757,17 +2726,8 @@ pub mod render_ffi {
});
}
- /// # Safety
- ///
- /// This function is unsafe as there is no guarantee that the given `label`
- /// is a valid null-terminated string.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_render_pass_push_debug_group(
- pass: &mut RenderPass,
- label: RawString,
- color: u32,
- ) {
- let bytes = unsafe { ffi::CStr::from_ptr(label) }.to_bytes();
+ pub fn wgpu_render_pass_push_debug_group(pass: &mut RenderPass, label: &str, color: u32) {
+ let bytes = label.as_bytes();
pass.base.string_data.extend_from_slice(bytes);
pass.base.commands.push(RenderCommand::PushDebugGroup {
@@ -2776,22 +2736,12 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_pop_debug_group(pass: &mut RenderPass) {
+ pub fn wgpu_render_pass_pop_debug_group(pass: &mut RenderPass) {
pass.base.commands.push(RenderCommand::PopDebugGroup);
}
- /// # Safety
- ///
- /// This function is unsafe as there is no guarantee that the given `label`
- /// is a valid null-terminated string.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_render_pass_insert_debug_marker(
- pass: &mut RenderPass,
- label: RawString,
- color: u32,
- ) {
- let bytes = unsafe { ffi::CStr::from_ptr(label) }.to_bytes();
+ pub fn wgpu_render_pass_insert_debug_marker(pass: &mut RenderPass, label: &str, color: u32) {
+ let bytes = label.as_bytes();
pass.base.string_data.extend_from_slice(bytes);
pass.base.commands.push(RenderCommand::InsertDebugMarker {
@@ -2800,8 +2750,7 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_write_timestamp(
+ pub fn wgpu_render_pass_write_timestamp(
pass: &mut RenderPass,
query_set_id: id::QuerySetId,
query_index: u32,
@@ -2812,23 +2761,17 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_begin_occlusion_query(
- pass: &mut RenderPass,
- query_index: u32,
- ) {
+ pub fn wgpu_render_pass_begin_occlusion_query(pass: &mut RenderPass, query_index: u32) {
pass.base
.commands
.push(RenderCommand::BeginOcclusionQuery { query_index });
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_end_occlusion_query(pass: &mut RenderPass) {
+ pub fn wgpu_render_pass_end_occlusion_query(pass: &mut RenderPass) {
pass.base.commands.push(RenderCommand::EndOcclusionQuery);
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_begin_pipeline_statistics_query(
+ pub fn wgpu_render_pass_begin_pipeline_statistics_query(
pass: &mut RenderPass,
query_set_id: id::QuerySetId,
query_index: u32,
@@ -2841,26 +2784,17 @@ pub mod render_ffi {
});
}
- #[no_mangle]
- pub extern "C" fn wgpu_render_pass_end_pipeline_statistics_query(pass: &mut RenderPass) {
+ pub fn wgpu_render_pass_end_pipeline_statistics_query(pass: &mut RenderPass) {
pass.base
.commands
.push(RenderCommand::EndPipelineStatisticsQuery);
}
- /// # Safety
- ///
- /// This function is unsafe as there is no guarantee that the given pointer is
- /// valid for `render_bundle_ids_length` elements.
- #[no_mangle]
- pub unsafe extern "C" fn wgpu_render_pass_execute_bundles(
+ pub fn wgpu_render_pass_execute_bundles(
pass: &mut RenderPass,
- render_bundle_ids: *const id::RenderBundleId,
- render_bundle_ids_length: usize,
+ render_bundle_ids: &[id::RenderBundleId],
) {
- for &bundle_id in
- unsafe { slice::from_raw_parts(render_bundle_ids, render_bundle_ids_length) }
- {
+ for &bundle_id in render_bundle_ids {
pass.base
.commands
.push(RenderCommand::ExecuteBundle(bundle_id));