gpu: implement RenderPassEncoder.executeBundles
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
45d27fdbb2
commit
8615f346dd
2 changed files with 30 additions and 1 deletions
|
|
@ -950,6 +950,30 @@ const render_pass_encoder_vtable = RenderPassEncoder.VTable{
|
||||||
c.wgpuRenderPassEncoderEnd(@ptrCast(c.WGPURenderPassEncoder, ptr));
|
c.wgpuRenderPassEncoderEnd(@ptrCast(c.WGPURenderPassEncoder, ptr));
|
||||||
}
|
}
|
||||||
}).end,
|
}).end,
|
||||||
|
.executeBundles = (struct {
|
||||||
|
pub fn executeBundles(ptr: *anyopaque, bundles: []RenderBundle) void {
|
||||||
|
var few_bundles: [16]c.WGPURenderBundle = undefined;
|
||||||
|
const c_bundles = if (bundles.len <= 8) blk: {
|
||||||
|
for (bundles) |bundle, i| {
|
||||||
|
few_bundles[i] = @ptrCast(c.WGPURenderBundle, bundle.ptr);
|
||||||
|
}
|
||||||
|
break :blk few_bundles[0..bundles.len];
|
||||||
|
} else blk: {
|
||||||
|
const mem = std.heap.page_allocator.alloc(c.WGPURenderBundle, bundles.len) catch unreachable;
|
||||||
|
for (bundles) |bundle, i| {
|
||||||
|
mem[i] = @ptrCast(c.WGPURenderBundle, bundle.ptr);
|
||||||
|
}
|
||||||
|
break :blk mem;
|
||||||
|
};
|
||||||
|
defer if (bundles.len > 8) std.heap.page_allocator.free(c_bundles);
|
||||||
|
|
||||||
|
c.wgpuRenderPassEncoderExecuteBundles(
|
||||||
|
@ptrCast(c.WGPURenderPassEncoder, ptr),
|
||||||
|
@intCast(u32, c_bundles.len),
|
||||||
|
&c_bundles[0],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}).executeBundles,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn wrapRenderBundleEncoder(enc: c.WGPURenderBundleEncoder) RenderBundleEncoder {
|
fn wrapRenderBundleEncoder(enc: c.WGPURenderBundleEncoder) RenderBundleEncoder {
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ const RenderPassDepthStencilAttachment = @import("structs.zig").RenderPassDepthS
|
||||||
const RenderPassTimestampWrite = @import("structs.zig").RenderPassTimestampWrite;
|
const RenderPassTimestampWrite = @import("structs.zig").RenderPassTimestampWrite;
|
||||||
const RenderPipeline = @import("RenderPipeline.zig");
|
const RenderPipeline = @import("RenderPipeline.zig");
|
||||||
const Buffer = @import("Buffer.zig");
|
const Buffer = @import("Buffer.zig");
|
||||||
|
const RenderBundle = @import("RenderBundle.zig");
|
||||||
|
|
||||||
const RenderPassEncoder = @This();
|
const RenderPassEncoder = @This();
|
||||||
|
|
||||||
|
|
@ -29,7 +30,7 @@ pub const VTable = struct {
|
||||||
beginOcclusionQuery: fn (ptr: *anyopaque, query_index: u32) void,
|
beginOcclusionQuery: fn (ptr: *anyopaque, query_index: u32) void,
|
||||||
endOcclusionQuery: fn (ptr: *anyopaque) void,
|
endOcclusionQuery: fn (ptr: *anyopaque) void,
|
||||||
end: fn (ptr: *anyopaque) void,
|
end: fn (ptr: *anyopaque) void,
|
||||||
// WGPU_EXPORT void wgpuRenderPassEncoderExecuteBundles(WGPURenderPassEncoder renderPassEncoder, uint32_t bundlesCount, WGPURenderBundle const * bundles);
|
executeBundles: fn (ptr: *anyopaque, bundles: []RenderBundle) void,
|
||||||
// WGPU_EXPORT void wgpuRenderPassEncoderInsertDebugMarker(WGPURenderPassEncoder renderPassEncoder, char const * markerLabel);
|
// WGPU_EXPORT void wgpuRenderPassEncoderInsertDebugMarker(WGPURenderPassEncoder renderPassEncoder, char const * markerLabel);
|
||||||
// WGPU_EXPORT void wgpuRenderPassEncoderPopDebugGroup(WGPURenderPassEncoder renderPassEncoder);
|
// WGPU_EXPORT void wgpuRenderPassEncoderPopDebugGroup(WGPURenderPassEncoder renderPassEncoder);
|
||||||
// WGPU_EXPORT void wgpuRenderPassEncoderPushDebugGroup(WGPURenderPassEncoder renderPassEncoder, char const * groupLabel);
|
// WGPU_EXPORT void wgpuRenderPassEncoderPushDebugGroup(WGPURenderPassEncoder renderPassEncoder, char const * groupLabel);
|
||||||
|
|
@ -94,6 +95,10 @@ pub inline fn end(pass: RenderPassEncoder) void {
|
||||||
pass.vtable.end(pass.ptr);
|
pass.vtable.end(pass.ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub inline fn executeBundles(pass: RenderPassEncoder, bundles: []RenderBundle) void {
|
||||||
|
pass.vtable.executeBundles(pass.ptr, bundles);
|
||||||
|
}
|
||||||
|
|
||||||
pub inline fn setLabel(pass: RenderPassEncoder, label: [:0]const u8) void {
|
pub inline fn setLabel(pass: RenderPassEncoder, label: [:0]const u8) void {
|
||||||
pass.vtable.setLabel(pass.ptr, label);
|
pass.vtable.setLabel(pass.ptr, label);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue