mirror of
https://github.com/gfx-rs/wgpu.git
synced 2024-11-22 06:44:14 +00:00
Introduce DynComputePipeline & DynRenderPipeline
This commit is contained in:
parent
50a1811229
commit
fc764b4b17
@ -629,6 +629,8 @@ pub struct RenderPipeline {
|
||||
vertex_strides: [Option<NonZeroU32>; crate::MAX_VERTEX_BUFFERS],
|
||||
}
|
||||
|
||||
impl crate::DynRenderPipeline for RenderPipeline {}
|
||||
|
||||
unsafe impl Send for RenderPipeline {}
|
||||
unsafe impl Sync for RenderPipeline {}
|
||||
|
||||
@ -638,6 +640,8 @@ pub struct ComputePipeline {
|
||||
layout: PipelineLayoutShared,
|
||||
}
|
||||
|
||||
impl crate::DynComputePipeline for ComputePipeline {}
|
||||
|
||||
unsafe impl Send for ComputePipeline {}
|
||||
unsafe impl Sync for ComputePipeline {}
|
||||
|
||||
|
@ -1,11 +1,13 @@
|
||||
use std::ops::Range;
|
||||
|
||||
use crate::{
|
||||
BufferBarrier, BufferBinding, BufferCopy, CommandEncoder, DeviceError, DynBindGroup,
|
||||
DynPipelineLayout, DynQuerySet, Label, MemoryRange,
|
||||
BufferBarrier, BufferBinding, BufferCopy, CommandEncoder, DeviceError, Label, MemoryRange, Rect,
|
||||
};
|
||||
|
||||
use super::{DynBuffer, DynResourceExt as _};
|
||||
use super::{
|
||||
DynBindGroup, DynBuffer, DynComputePipeline, DynPipelineLayout, DynQuerySet, DynRenderPipeline,
|
||||
DynResourceExt as _,
|
||||
};
|
||||
|
||||
pub trait DynCommandEncoder: std::fmt::Debug {
|
||||
unsafe fn begin_encoding(&mut self, label: Label) -> Result<(), DeviceError>;
|
||||
@ -56,6 +58,8 @@ pub trait DynCommandEncoder: std::fmt::Debug {
|
||||
stride: wgt::BufferSize,
|
||||
);
|
||||
|
||||
unsafe fn set_render_pipeline(&mut self, pipeline: &dyn DynRenderPipeline);
|
||||
|
||||
unsafe fn set_index_buffer<'a>(
|
||||
&mut self,
|
||||
binding: BufferBinding<'a, dyn DynBuffer>,
|
||||
@ -67,6 +71,75 @@ pub trait DynCommandEncoder: std::fmt::Debug {
|
||||
index: u32,
|
||||
binding: BufferBinding<'a, dyn DynBuffer>,
|
||||
);
|
||||
unsafe fn set_viewport(&mut self, rect: &Rect<f32>, depth_range: Range<f32>);
|
||||
unsafe fn set_scissor_rect(&mut self, rect: &Rect<u32>);
|
||||
unsafe fn set_stencil_reference(&mut self, value: u32);
|
||||
unsafe fn set_blend_constants(&mut self, color: &[f32; 4]);
|
||||
|
||||
unsafe fn draw(
|
||||
&mut self,
|
||||
first_vertex: u32,
|
||||
vertex_count: u32,
|
||||
first_instance: u32,
|
||||
instance_count: u32,
|
||||
);
|
||||
unsafe fn draw_indexed(
|
||||
&mut self,
|
||||
first_index: u32,
|
||||
index_count: u32,
|
||||
base_vertex: i32,
|
||||
first_instance: u32,
|
||||
instance_count: u32,
|
||||
);
|
||||
unsafe fn draw_indirect(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
draw_count: u32,
|
||||
);
|
||||
unsafe fn draw_indexed_indirect(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
draw_count: u32,
|
||||
);
|
||||
unsafe fn draw_indirect_count(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
count_buffer: &dyn DynBuffer,
|
||||
count_offset: wgt::BufferAddress,
|
||||
max_count: u32,
|
||||
);
|
||||
unsafe fn draw_indexed_indirect_count(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
count_buffer: &dyn DynBuffer,
|
||||
count_offset: wgt::BufferAddress,
|
||||
max_count: u32,
|
||||
);
|
||||
|
||||
// unsafe fn begin_compute_pass(&mut self, desc: &ComputePassDescriptor<Self::A>);
|
||||
// unsafe fn end_compute_pass(&mut self);
|
||||
|
||||
unsafe fn set_compute_pipeline(&mut self, pipeline: &dyn DynComputePipeline);
|
||||
|
||||
unsafe fn dispatch(&mut self, count: [u32; 3]);
|
||||
unsafe fn dispatch_indirect(&mut self, buffer: &dyn DynBuffer, offset: wgt::BufferAddress);
|
||||
|
||||
// unsafe fn build_acceleration_structures<'a, T>(
|
||||
// &mut self,
|
||||
// descriptor_count: u32,
|
||||
// descriptors: T,
|
||||
// ) where
|
||||
// Self::A: 'a,
|
||||
// T: IntoIterator<Item = BuildAccelerationStructureDescriptor<'a, Self::A>>;
|
||||
|
||||
// unsafe fn place_acceleration_structure_barrier(
|
||||
// &mut self,
|
||||
// barrier: AccelerationStructureBarrier,
|
||||
// );
|
||||
}
|
||||
|
||||
impl<C: CommandEncoder> DynCommandEncoder for C {
|
||||
@ -178,6 +251,142 @@ impl<C: CommandEncoder> DynCommandEncoder for C {
|
||||
unsafe { C::copy_query_results(self, set, range, buffer, offset, stride) };
|
||||
}
|
||||
|
||||
unsafe fn set_viewport(&mut self, rect: &Rect<f32>, depth_range: Range<f32>) {
|
||||
unsafe {
|
||||
C::set_viewport(self, rect, depth_range);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn set_scissor_rect(&mut self, rect: &Rect<u32>) {
|
||||
unsafe {
|
||||
C::set_scissor_rect(self, rect);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn set_stencil_reference(&mut self, value: u32) {
|
||||
unsafe {
|
||||
C::set_stencil_reference(self, value);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn set_blend_constants(&mut self, color: &[f32; 4]) {
|
||||
unsafe { C::set_blend_constants(self, color) };
|
||||
}
|
||||
|
||||
unsafe fn draw(
|
||||
&mut self,
|
||||
first_vertex: u32,
|
||||
vertex_count: u32,
|
||||
first_instance: u32,
|
||||
instance_count: u32,
|
||||
) {
|
||||
unsafe {
|
||||
C::draw(
|
||||
self,
|
||||
first_vertex,
|
||||
vertex_count,
|
||||
first_instance,
|
||||
instance_count,
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
unsafe fn draw_indexed(
|
||||
&mut self,
|
||||
first_index: u32,
|
||||
index_count: u32,
|
||||
base_vertex: i32,
|
||||
first_instance: u32,
|
||||
instance_count: u32,
|
||||
) {
|
||||
unsafe {
|
||||
C::draw_indexed(
|
||||
self,
|
||||
first_index,
|
||||
index_count,
|
||||
base_vertex,
|
||||
first_instance,
|
||||
instance_count,
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
unsafe fn draw_indirect(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
draw_count: u32,
|
||||
) {
|
||||
let buffer = buffer.expect_downcast_ref();
|
||||
unsafe { C::draw_indirect(self, buffer, offset, draw_count) };
|
||||
}
|
||||
|
||||
unsafe fn draw_indexed_indirect(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
draw_count: u32,
|
||||
) {
|
||||
let buffer = buffer.expect_downcast_ref();
|
||||
unsafe { C::draw_indexed_indirect(self, buffer, offset, draw_count) };
|
||||
}
|
||||
|
||||
unsafe fn draw_indirect_count(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
count_buffer: &dyn DynBuffer,
|
||||
count_offset: wgt::BufferAddress,
|
||||
max_count: u32,
|
||||
) {
|
||||
let buffer = buffer.expect_downcast_ref();
|
||||
let count_buffer = count_buffer.expect_downcast_ref();
|
||||
unsafe {
|
||||
C::draw_indirect_count(self, buffer, offset, count_buffer, count_offset, max_count)
|
||||
};
|
||||
}
|
||||
|
||||
unsafe fn draw_indexed_indirect_count(
|
||||
&mut self,
|
||||
buffer: &dyn DynBuffer,
|
||||
offset: wgt::BufferAddress,
|
||||
count_buffer: &dyn DynBuffer,
|
||||
count_offset: wgt::BufferAddress,
|
||||
max_count: u32,
|
||||
) {
|
||||
let buffer = buffer.expect_downcast_ref();
|
||||
let count_buffer = count_buffer.expect_downcast_ref();
|
||||
unsafe {
|
||||
C::draw_indexed_indirect_count(
|
||||
self,
|
||||
buffer,
|
||||
offset,
|
||||
count_buffer,
|
||||
count_offset,
|
||||
max_count,
|
||||
)
|
||||
};
|
||||
}
|
||||
|
||||
unsafe fn set_compute_pipeline(&mut self, pipeline: &dyn DynComputePipeline) {
|
||||
let pipeline = pipeline.expect_downcast_ref();
|
||||
unsafe { C::set_compute_pipeline(self, pipeline) };
|
||||
}
|
||||
|
||||
unsafe fn dispatch(&mut self, count: [u32; 3]) {
|
||||
unsafe { C::dispatch(self, count) };
|
||||
}
|
||||
|
||||
unsafe fn dispatch_indirect(&mut self, buffer: &dyn DynBuffer, offset: wgt::BufferAddress) {
|
||||
let buffer = buffer.expect_downcast_ref();
|
||||
unsafe { C::dispatch_indirect(self, buffer, offset) };
|
||||
}
|
||||
|
||||
unsafe fn set_render_pipeline(&mut self, pipeline: &dyn DynRenderPipeline) {
|
||||
let pipeline = pipeline.expect_downcast_ref();
|
||||
unsafe { C::set_render_pipeline(self, pipeline) };
|
||||
}
|
||||
|
||||
unsafe fn set_index_buffer<'a>(
|
||||
&mut self,
|
||||
binding: BufferBinding<'a, dyn DynBuffer>,
|
||||
|
@ -90,6 +90,8 @@ pub trait DynBindGroup: DynResource + std::fmt::Debug {}
|
||||
pub trait DynBuffer: DynResource + std::fmt::Debug {}
|
||||
pub trait DynPipelineLayout: DynResource + std::fmt::Debug {}
|
||||
pub trait DynQuerySet: DynResource + std::fmt::Debug {}
|
||||
pub trait DynRenderPipeline: DynResource + std::fmt::Debug {}
|
||||
pub trait DynComputePipeline: DynResource + std::fmt::Debug {}
|
||||
|
||||
impl<'a> BufferBinding<'a, dyn DynBuffer> {
|
||||
pub fn expect_downcast<B: DynBuffer>(self) -> BufferBinding<'a, B> {
|
||||
|
@ -46,6 +46,8 @@ impl crate::DynBindGroup for Resource {}
|
||||
impl crate::DynBuffer for Resource {}
|
||||
impl crate::DynPipelineLayout for Resource {}
|
||||
impl crate::DynQuerySet for Resource {}
|
||||
impl crate::DynRenderPipeline for Resource {}
|
||||
impl crate::DynComputePipeline for Resource {}
|
||||
|
||||
impl crate::Instance for Context {
|
||||
type A = Api;
|
||||
|
@ -653,6 +653,8 @@ pub struct RenderPipeline {
|
||||
alpha_to_coverage_enabled: bool,
|
||||
}
|
||||
|
||||
impl crate::DynRenderPipeline for RenderPipeline {}
|
||||
|
||||
#[cfg(send_sync)]
|
||||
unsafe impl Sync for RenderPipeline {}
|
||||
#[cfg(send_sync)]
|
||||
@ -663,6 +665,8 @@ pub struct ComputePipeline {
|
||||
inner: Arc<PipelineInner>,
|
||||
}
|
||||
|
||||
impl crate::DynComputePipeline for ComputePipeline {}
|
||||
|
||||
#[cfg(send_sync)]
|
||||
unsafe impl Sync for ComputePipeline {}
|
||||
#[cfg(send_sync)]
|
||||
|
@ -265,7 +265,10 @@ pub mod api {
|
||||
mod dynamic;
|
||||
|
||||
pub(crate) use dynamic::{impl_dyn_resource, DynResource};
|
||||
pub use dynamic::{DynBindGroup, DynBuffer, DynCommandEncoder, DynPipelineLayout, DynQuerySet};
|
||||
pub use dynamic::{
|
||||
DynBindGroup, DynBuffer, DynCommandEncoder, DynComputePipeline, DynPipelineLayout, DynQuerySet,
|
||||
DynRenderPipeline,
|
||||
};
|
||||
|
||||
use std::{
|
||||
borrow::{Borrow, Cow},
|
||||
@ -434,8 +437,8 @@ pub trait Api: Clone + fmt::Debug + Sized {
|
||||
type BindGroup: DynBindGroup;
|
||||
type PipelineLayout: DynPipelineLayout;
|
||||
type ShaderModule: fmt::Debug + WasmNotSendSync;
|
||||
type RenderPipeline: fmt::Debug + WasmNotSendSync;
|
||||
type ComputePipeline: fmt::Debug + WasmNotSendSync;
|
||||
type RenderPipeline: DynRenderPipeline;
|
||||
type ComputePipeline: DynComputePipeline;
|
||||
type PipelineCache: fmt::Debug + WasmNotSendSync;
|
||||
|
||||
type AccelerationStructure: fmt::Debug + WasmNotSendSync + 'static;
|
||||
|
@ -767,6 +767,8 @@ pub struct RenderPipeline {
|
||||
unsafe impl Send for RenderPipeline {}
|
||||
unsafe impl Sync for RenderPipeline {}
|
||||
|
||||
impl crate::DynRenderPipeline for RenderPipeline {}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ComputePipeline {
|
||||
raw: metal::ComputePipelineState,
|
||||
@ -780,6 +782,8 @@ pub struct ComputePipeline {
|
||||
unsafe impl Send for ComputePipeline {}
|
||||
unsafe impl Sync for ComputePipeline {}
|
||||
|
||||
impl crate::DynComputePipeline for ComputePipeline {}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct QuerySet {
|
||||
raw_buffer: metal::Buffer,
|
||||
|
@ -822,11 +822,15 @@ pub struct RenderPipeline {
|
||||
raw: vk::Pipeline,
|
||||
}
|
||||
|
||||
impl crate::DynRenderPipeline for RenderPipeline {}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct ComputePipeline {
|
||||
raw: vk::Pipeline,
|
||||
}
|
||||
|
||||
impl crate::DynComputePipeline for ComputePipeline {}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct PipelineCache {
|
||||
raw: vk::PipelineCache,
|
||||
|
Loading…
Reference in New Issue
Block a user