From 05853da23375cd3c2c98bfed3857daf1e1c52684 Mon Sep 17 00:00:00 2001 From: d3m1gd <3992031+d3m1gd@users.noreply.github.com> Date: Sun, 17 Apr 2022 00:16:20 +0700 Subject: [PATCH] gpu: fix alignment issues with getMappedRange, getConstMappedRange (#223) fixes alignment issues with getMappedRange, getConstMappedRange Prior to this change `getMappedRange` and `getConstMappedRange` would not handle alignment to `COPY_BUFFER_ALIGNMENT` for users, and so invocation could result in an unhelpful error message: ``` thread 254201 panic: attempt to use null value .../mach/gpu/src/NativeInstance.zig:1721:42: 0x480747 in .gpu.NativeInstance.buffer_vtable.getMappedRange (game) return @ptrCast([*c]u8, range.?)[0..size]; ^ ``` To address this: 1. Ensure we always request a 4-byte aligned buffer when `createBuffer` is called. 2. Ensure we always map 4-byte aligned buffers. Co-authored-by: d3m1gd --- gpu/src/Buffer.zig | 8 +++++--- gpu/src/Device.zig | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/gpu/src/Buffer.zig b/gpu/src/Buffer.zig index 54f0778d..691351ce 100644 --- a/gpu/src/Buffer.zig +++ b/gpu/src/Buffer.zig @@ -37,12 +37,14 @@ pub inline fn destroy(buf: Buffer) void { } pub inline fn getConstMappedRange(buf: Buffer, comptime T: type, offset: usize, len: usize) []const T { - const data = buf.vtable.getConstMappedRange(buf.ptr, offset, @sizeOf(T) * len); - return @ptrCast([*]const T, data.ptr)[0..len]; + const size = @sizeOf(T) * len; + const data = buf.vtable.getConstMappedRange(buf.ptr, offset, size + size % 4); + return @ptrCast([*]const T, @alignCast(@alignOf(T), data.ptr))[0..len]; } pub inline fn getMappedRange(buf: Buffer, comptime T: type, offset: usize, len: usize) []T { - const data = buf.vtable.getMappedRange(buf.ptr, offset, @sizeOf(T) * len); + const size = @sizeOf(T) * len; + const data = buf.vtable.getMappedRange(buf.ptr, offset, size + size % 4); return @ptrCast([*]T, @alignCast(@alignOf(T), data.ptr))[0..len]; } diff --git a/gpu/src/Device.zig b/gpu/src/Device.zig index a8dd9378..0efd205a 100644 --- a/gpu/src/Device.zig +++ b/gpu/src/Device.zig @@ -177,7 +177,9 @@ pub inline fn destroy(device: Device) void { } pub inline fn createBuffer(device: Device, descriptor: *const Buffer.Descriptor) Buffer { - return device.vtable.createBuffer(device.ptr, descriptor); + var local_descriptor = descriptor.*; + local_descriptor.size += local_descriptor.size % 4; + return device.vtable.createBuffer(device.ptr, &local_descriptor); } pub inline fn createCommandEncoder(device: Device, descriptor: ?*const CommandEncoder.Descriptor) CommandEncoder {