gpu: correct alignment in pointer casts; handle void Context in all callbacks (#233)
* Fixed ErrorCallback.init() alignment * Fixed callbacks alignments * Fixed more of the callback alignment problems * Added checks for void Context in callback
This commit is contained in:
parent
d664c8e55d
commit
169b1e2a42
10 changed files with 29 additions and 24 deletions
|
|
@ -164,7 +164,7 @@ pub const RequestDeviceCallback = struct {
|
|||
) RequestDeviceCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, response: RequestDeviceResponse) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), response);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), response);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
const std = @import("std");
|
||||
const BufferUsage = @import("enums.zig").BufferUsage;
|
||||
|
||||
const Buffer = @This();
|
||||
|
|
@ -73,7 +74,7 @@ pub const MapCallback = struct {
|
|||
) MapCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, status: MapAsyncStatus) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), status);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), status);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
const std = @import("std");
|
||||
const PipelineLayout = @import("PipelineLayout.zig");
|
||||
const ProgrammableStageDescriptor = @import("structs.zig").ProgrammableStageDescriptor;
|
||||
const BindGroupLayout = @import("BindGroupLayout.zig");
|
||||
|
|
@ -73,7 +74,7 @@ pub const CreateCallback = struct {
|
|||
message: [:0]const u8,
|
||||
) void {
|
||||
callback(
|
||||
@ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)),
|
||||
if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)),
|
||||
status,
|
||||
pipeline,
|
||||
message,
|
||||
|
|
|
|||
|
|
@ -137,7 +137,7 @@ pub const LostCallback = struct {
|
|||
) LostCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, reason: LostReason, message: [*:0]const u8) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), reason, message);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), reason, message);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ pub const RequestAdapterCallback = struct {
|
|||
) RequestAdapterCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, response: RequestAdapterResponse) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), response);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), response);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -67,13 +67,13 @@ pub fn wrap(instance: *anyopaque) NativeInstance {
|
|||
const interface_vtable = Interface.VTable{
|
||||
.reference = (struct {
|
||||
pub fn reference(ptr: *anyopaque) void {
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(@alignOf(*NativeInstance), ptr));
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(std.meta.alignment(*NativeInstance), ptr));
|
||||
c.wgpuInstanceReference(native.instance);
|
||||
}
|
||||
}).reference,
|
||||
.release = (struct {
|
||||
pub fn release(ptr: *anyopaque) void {
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(@alignOf(*NativeInstance), ptr));
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(std.meta.alignment(*NativeInstance), ptr));
|
||||
c.wgpuInstanceRelease(native.instance);
|
||||
}
|
||||
}).release,
|
||||
|
|
@ -83,7 +83,7 @@ const interface_vtable = Interface.VTable{
|
|||
options: *const RequestAdapterOptions,
|
||||
callback: *RequestAdapterCallback,
|
||||
) void {
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(@alignOf(*NativeInstance), ptr));
|
||||
const native = @ptrCast(*NativeInstance, @alignCast(std.meta.alignment(*NativeInstance), ptr));
|
||||
|
||||
const opt = c.WGPURequestAdapterOptions{
|
||||
.nextInChain = null,
|
||||
|
|
@ -94,7 +94,7 @@ const interface_vtable = Interface.VTable{
|
|||
|
||||
const cCallback = (struct {
|
||||
pub fn cCallback(status: c.WGPURequestAdapterStatus, adapter: c.WGPUAdapter, message: [*c]const u8, userdata: ?*anyopaque) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*RequestAdapterCallback, @alignCast(@alignOf(*RequestAdapterCallback), userdata.?));
|
||||
const callback_info = @ptrCast(*RequestAdapterCallback, @alignCast(std.meta.alignment(*RequestAdapterCallback), userdata.?));
|
||||
|
||||
// Store the response into a field on the native instance for later reading.
|
||||
const response = if (status == c.WGPURequestAdapterStatus_Success) RequestAdapterResponse{
|
||||
|
|
@ -284,7 +284,7 @@ const adapter_vtable = Adapter.VTable{
|
|||
|
||||
const cCallback = (struct {
|
||||
pub fn cCallback(status: c.WGPURequestDeviceStatus, device: c.WGPUDevice, message: [*c]const u8, userdata: ?*anyopaque) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*RequestDeviceCallback, @alignCast(@alignOf(*RequestDeviceCallback), userdata.?));
|
||||
const callback_info = @ptrCast(*RequestDeviceCallback, @alignCast(std.meta.alignment(*RequestDeviceCallback), userdata.?));
|
||||
|
||||
const response = if (status == c.WGPURequestDeviceStatus_Success) RequestDeviceResponse{
|
||||
.device = wrapDevice(device.?),
|
||||
|
|
@ -359,7 +359,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*ErrorCallback, @alignCast(@alignOf(*ErrorCallback), userdata));
|
||||
const callback_info = @ptrCast(*ErrorCallback, @alignCast(std.meta.alignment(*ErrorCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(ErrorType, typ),
|
||||
|
|
@ -429,7 +429,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*Device.LostCallback, @alignCast(@alignOf(*Device.LostCallback), userdata));
|
||||
const callback_info = @ptrCast(*Device.LostCallback, @alignCast(std.meta.alignment(*Device.LostCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(Device.LostReason, reason),
|
||||
|
|
@ -576,7 +576,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*ComputePipeline.CreateCallback, @alignCast(@alignOf(*ComputePipeline.CreateCallback), userdata));
|
||||
const callback_info = @ptrCast(*ComputePipeline.CreateCallback, @alignCast(std.meta.alignment(*ComputePipeline.CreateCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(ComputePipeline.CreateStatus, status),
|
||||
|
|
@ -692,7 +692,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*RenderPipeline.CreateCallback, @alignCast(@alignOf(*RenderPipeline.CreateCallback), userdata));
|
||||
const callback_info = @ptrCast(*RenderPipeline.CreateCallback, @alignCast(std.meta.alignment(*RenderPipeline.CreateCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(RenderPipeline.CreateStatus, status),
|
||||
|
|
@ -721,7 +721,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*ErrorCallback, @alignCast(@alignOf(*ErrorCallback), userdata));
|
||||
const callback_info = @ptrCast(*ErrorCallback, @alignCast(std.meta.alignment(*ErrorCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(ErrorType, typ),
|
||||
|
|
@ -748,7 +748,7 @@ const device_vtable = Device.VTable{
|
|||
message: [*c]const u8,
|
||||
userdata: ?*anyopaque,
|
||||
) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*LoggingCallback, @alignCast(@alignOf(*LoggingCallback), userdata));
|
||||
const callback_info = @ptrCast(*LoggingCallback, @alignCast(std.meta.alignment(*LoggingCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(LoggingType, typ),
|
||||
|
|
@ -880,7 +880,7 @@ const queue_vtable = Queue.VTable{
|
|||
|
||||
const cCallback = (struct {
|
||||
pub fn cCallback(status: c.WGPUQueueWorkDoneStatus, userdata: ?*anyopaque) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*Queue.WorkDoneCallback, @alignCast(@alignOf(*Queue.WorkDoneCallback), userdata));
|
||||
const callback_info = @ptrCast(*Queue.WorkDoneCallback, @alignCast(std.meta.alignment(*Queue.WorkDoneCallback), userdata));
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
@intToEnum(Queue.WorkDoneStatus, status),
|
||||
|
|
@ -979,7 +979,7 @@ const shader_module_vtable = ShaderModule.VTable{
|
|||
pub fn getCompilationInfo(ptr: *anyopaque, callback: *ShaderModule.CompilationInfoCallback) void {
|
||||
const cCallback = (struct {
|
||||
pub fn cCallback(status: c.WGPUCompilationInfoRequestStatus, info: [*c]const c.WGPUCompilationInfo, userdata: ?*anyopaque) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*ShaderModule.CompilationInfoCallback, @alignCast(@alignOf(*ShaderModule.CompilationInfoCallback), userdata.?));
|
||||
const callback_info = @ptrCast(*ShaderModule.CompilationInfoCallback, @alignCast(std.meta.alignment(*ShaderModule.CompilationInfoCallback), userdata.?));
|
||||
|
||||
callback_info.type_erased_callback(
|
||||
callback_info.type_erased_ctx,
|
||||
|
|
@ -1741,7 +1741,7 @@ const buffer_vtable = Buffer.VTable{
|
|||
) void {
|
||||
const cCallback = (struct {
|
||||
pub fn cCallback(status: c.WGPUBufferMapAsyncStatus, userdata: ?*anyopaque) callconv(.C) void {
|
||||
const callback_info = @ptrCast(*Buffer.MapCallback, @alignCast(@alignOf(*Buffer.MapCallback), userdata.?));
|
||||
const callback_info = @ptrCast(*Buffer.MapCallback, @alignCast(std.meta.alignment(*Buffer.MapCallback), userdata.?));
|
||||
callback_info.type_erased_callback(callback_info.type_erased_ctx, @intToEnum(Buffer.MapAsyncStatus, status));
|
||||
}
|
||||
}).cCallback;
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ pub const WorkDoneCallback = struct {
|
|||
) WorkDoneCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, status: WorkDoneStatus) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), status);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), status);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
const std = @import("std");
|
||||
const PipelineLayout = @import("PipelineLayout.zig");
|
||||
const VertexState = @import("structs.zig").VertexState;
|
||||
const PrimitiveState = @import("structs.zig").PrimitiveState;
|
||||
|
|
@ -81,7 +82,7 @@ pub const CreateCallback = struct {
|
|||
message: [:0]const u8,
|
||||
) void {
|
||||
callback(
|
||||
@ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)),
|
||||
if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)),
|
||||
status,
|
||||
pipeline,
|
||||
message,
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
const std = @import("std");
|
||||
const ShaderModule = @This();
|
||||
|
||||
/// The type erased pointer to the ShaderModule implementation
|
||||
|
|
@ -39,7 +40,7 @@ pub const CompilationInfoCallback = struct {
|
|||
) CompilationInfoCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, status: CompilationInfoRequestStatus) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), status);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), status);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
//! Structures which are not ABI compatible with webgpu.h
|
||||
const std = @import("std");
|
||||
const math = @import("std").math;
|
||||
const Buffer = @import("Buffer.zig");
|
||||
const Sampler = @import("Sampler.zig");
|
||||
|
|
@ -150,7 +151,7 @@ pub const ErrorCallback = struct {
|
|||
) ErrorCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, typ: ErrorType, message: [*:0]const u8) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), typ, message);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), typ, message);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
@ -172,7 +173,7 @@ pub const LoggingCallback = struct {
|
|||
) LoggingCallback {
|
||||
const erased = (struct {
|
||||
pub inline fn erased(type_erased_ctx: *anyopaque, typ: LoggingType, message: [*:0]const u8) void {
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(@alignOf(Context), type_erased_ctx)), typ, message);
|
||||
callback(if (Context == void) {} else @ptrCast(Context, @alignCast(std.meta.alignment(Context), type_erased_ctx)), typ, message);
|
||||
}
|
||||
}).erased;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue