gpu: make Buffer.get*MappedRange a friendlier slice API
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
1848ac8ac7
commit
825a07ac2f
4 changed files with 34 additions and 12 deletions
|
|
@ -152,6 +152,8 @@ Some WebGPU APIs expose slices as pointers and lengths, we either wrap these to
|
||||||
The slice helpers are:
|
The slice helpers are:
|
||||||
|
|
||||||
* `Adapter.enumerateFeaturesOwned`
|
* `Adapter.enumerateFeaturesOwned`
|
||||||
|
* `Buffer.getConstMappedRange`
|
||||||
|
* `Buffer.getMappedRange`
|
||||||
* `CommandEncoder.writeBuffer`
|
* `CommandEncoder.writeBuffer`
|
||||||
* `Queue.writeTexture`
|
* `Queue.writeTexture`
|
||||||
* `Queue.writeBuffer`
|
* `Queue.writeBuffer`
|
||||||
|
|
@ -216,8 +218,6 @@ There may be other opportunities for helpers, to improve the existing APIs, or a
|
||||||
|
|
||||||
The following are definitive candidates for helpers we haven't implemented yet:
|
The following are definitive candidates for helpers we haven't implemented yet:
|
||||||
|
|
||||||
* `gpu.Buffer.getConstMappedRange` (slices)
|
|
||||||
* `gpu.Buffer.getMappedRange` (slices)
|
|
||||||
* `gpu.ComputePassEncoder.setBindGroup` (slice param)
|
* `gpu.ComputePassEncoder.setBindGroup` (slice param)
|
||||||
* `gpu.Device.enumerateFeatures` (owned slice)
|
* `gpu.Device.enumerateFeatures` (owned slice)
|
||||||
* `gpu.RenderBundleEncoder.setBindGroup` (slice param)
|
* `gpu.RenderBundleEncoder.setBindGroup` (slice param)
|
||||||
|
|
|
||||||
|
|
@ -69,16 +69,38 @@ pub const Buffer = opaque {
|
||||||
Impl.bufferDestroy(buffer);
|
Impl.bufferDestroy(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default `offset`: 0
|
/// Default `offset_bytes`: 0
|
||||||
/// Default `size`: `gpu.whole_map_size`
|
/// Default `len`: `gpu.whole_map_size` / `std.math.maxint(usize)` (whole range)
|
||||||
pub inline fn getConstMappedRange(buffer: *Buffer, offset: usize, size: usize) ?*const anyopaque {
|
pub inline fn getConstMappedRange(
|
||||||
return Impl.bufferGetConstMappedRange(buffer, offset, size);
|
buffer: *Buffer,
|
||||||
|
comptime T: type,
|
||||||
|
offset_bytes: usize,
|
||||||
|
len: usize,
|
||||||
|
) ?[]const T {
|
||||||
|
const size = @sizeOf(T) * len;
|
||||||
|
const data = Impl.bufferGetConstMappedRange(
|
||||||
|
buffer,
|
||||||
|
offset_bytes,
|
||||||
|
size + size % 4,
|
||||||
|
);
|
||||||
|
return if (data) |d| @ptrCast([*]const T, @alignCast(@alignOf(T), d.ptr))[0..len] else null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Default `offset`: 0
|
/// Default `offset_bytes`: 0
|
||||||
/// Default `size`: `gpu.whole_map_size`
|
/// Default `len`: `gpu.whole_map_size` / `std.math.maxint(usize)` (whole range)
|
||||||
pub inline fn getMappedRange(buffer: *Buffer, offset: usize, size: usize) ?*anyopaque {
|
pub inline fn getMappedRange(
|
||||||
return Impl.bufferGetMappedRange(buffer, offset, size);
|
buffer: *Buffer,
|
||||||
|
comptime T: type,
|
||||||
|
offset_bytes: usize,
|
||||||
|
len: usize,
|
||||||
|
) ?[]T {
|
||||||
|
const size = @sizeOf(T) * len;
|
||||||
|
const data = Impl.bufferGetMappedRange(
|
||||||
|
buffer,
|
||||||
|
offset_bytes,
|
||||||
|
size + size % 4,
|
||||||
|
);
|
||||||
|
return if (data) |d| @ptrCast([*]T, @alignCast(@alignOf(T), d.ptr))[0..len] else null;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub inline fn getSize(buffer: *Buffer) u64 {
|
pub inline fn getSize(buffer: *Buffer) u64 {
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
const std = @import("std");
|
||||||
const ComputePassEncoder = @import("compute_pass_encoder.zig").ComputePassEncoder;
|
const ComputePassEncoder = @import("compute_pass_encoder.zig").ComputePassEncoder;
|
||||||
const RenderPassEncoder = @import("render_pass_encoder.zig").RenderPassEncoder;
|
const RenderPassEncoder = @import("render_pass_encoder.zig").RenderPassEncoder;
|
||||||
const CommandBuffer = @import("command_buffer.zig").CommandBuffer;
|
const CommandBuffer = @import("command_buffer.zig").CommandBuffer;
|
||||||
|
|
@ -91,8 +92,6 @@ pub const CommandEncoder = opaque {
|
||||||
command_encoder,
|
command_encoder,
|
||||||
buffer,
|
buffer,
|
||||||
buffer_offset_bytes,
|
buffer_offset_bytes,
|
||||||
data,
|
|
||||||
size,
|
|
||||||
@ptrCast([*]const u8, data_slice.ptr),
|
@ptrCast([*]const u8, data_slice.ptr),
|
||||||
@intCast(u64, data_slice.len) * @sizeOf(std.meta.Elem(@TypeOf(data_slice))),
|
@intCast(u64, data_slice.len) * @sizeOf(std.meta.Elem(@TypeOf(data_slice))),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
const std = @import("std");
|
||||||
const CommandBuffer = @import("command_buffer.zig").CommandBuffer;
|
const CommandBuffer = @import("command_buffer.zig").CommandBuffer;
|
||||||
const Buffer = @import("buffer.zig").Buffer;
|
const Buffer = @import("buffer.zig").Buffer;
|
||||||
const Texture = @import("texture.zig").Texture;
|
const Texture = @import("texture.zig").Texture;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue