247: Add support for indirect drawing r=kvark a=dragly



Co-authored-by: Svenn-Arne Dragly <dragly@cognite.com>
This commit is contained in:
bors[bot]
2019-07-30 15:22:00 +00:00
4 changed files with 61 additions and 0 deletions

View File

@@ -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

View File

@@ -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,

View File

@@ -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)
}

View File

@@ -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;
}