mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Merge #247
247: Add support for indirect drawing r=kvark a=dragly Co-authored-by: Svenn-Arne Dragly <dragly@cognite.com>
This commit is contained in:
@@ -429,6 +429,7 @@ typedef uint32_t WGPUBufferUsage;
|
||||
#define WGPUBufferUsage_VERTEX 32
|
||||
#define WGPUBufferUsage_UNIFORM 64
|
||||
#define WGPUBufferUsage_STORAGE 128
|
||||
#define WGPUBufferUsage_INDIRECT 256
|
||||
#define WGPUBufferUsage_NONE 0
|
||||
#define WGPUBufferUsage_WRITE_ALL 2 + 8 + 128
|
||||
|
||||
|
||||
@@ -379,6 +379,34 @@ pub extern "C" fn wgpu_render_pass_draw(
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn wgpu_render_pass_draw_indirect(
|
||||
pass_id: RenderPassId,
|
||||
indirect_buffer_id: BufferId,
|
||||
indirect_offset: BufferAddress,
|
||||
) {
|
||||
let mut token = Token::root();
|
||||
let (mut pass_guard, _) = HUB.render_passes.write(&mut token);
|
||||
let (buffer_guard, _) = HUB.buffers.read(&mut token);
|
||||
let pass = &mut pass_guard[pass_id];
|
||||
pass.is_ready().unwrap();
|
||||
|
||||
let buffer = pass
|
||||
.trackers
|
||||
.buffers
|
||||
.use_extend(&*buffer_guard, indirect_buffer_id, (), BufferUsage::INDIRECT)
|
||||
.unwrap();
|
||||
|
||||
unsafe {
|
||||
pass.raw.draw_indirect(
|
||||
&buffer.raw,
|
||||
indirect_offset,
|
||||
1,
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn wgpu_render_pass_draw_indexed(
|
||||
pass_id: RenderPassId,
|
||||
@@ -406,6 +434,34 @@ pub extern "C" fn wgpu_render_pass_draw_indexed(
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn wgpu_render_pass_draw_indexed_indirect(
|
||||
pass_id: RenderPassId,
|
||||
indirect_buffer_id: BufferId,
|
||||
indirect_offset: BufferAddress,
|
||||
) {
|
||||
let mut token = Token::root();
|
||||
let (mut pass_guard, _) = HUB.render_passes.write(&mut token);
|
||||
let (buffer_guard, _) = HUB.buffers.read(&mut token);
|
||||
let pass = &mut pass_guard[pass_id];
|
||||
pass.is_ready().unwrap();
|
||||
|
||||
let buffer = pass
|
||||
.trackers
|
||||
.buffers
|
||||
.use_extend(&*buffer_guard, indirect_buffer_id, (), BufferUsage::INDIRECT)
|
||||
.unwrap();
|
||||
|
||||
unsafe {
|
||||
pass.raw.draw_indexed_indirect(
|
||||
&buffer.raw,
|
||||
indirect_offset,
|
||||
1,
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn wgpu_render_pass_set_pipeline(
|
||||
pass_id: RenderPassId,
|
||||
|
||||
@@ -34,6 +34,9 @@ pub fn map_buffer_usage(
|
||||
if usage.contains(W::STORAGE) {
|
||||
hal_usage |= U::STORAGE;
|
||||
}
|
||||
if usage.contains(W::INDIRECT) {
|
||||
hal_usage |= U::INDIRECT;
|
||||
}
|
||||
|
||||
(hal_usage, hal_memory)
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ bitflags! {
|
||||
const VERTEX = 32;
|
||||
const UNIFORM = 64;
|
||||
const STORAGE = 128;
|
||||
const INDIRECT = 256;
|
||||
const NONE = 0;
|
||||
const WRITE_ALL = 2 + 8 + 128;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user