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