From ca028ea0381f42e09ff5d1809e32b096bdf33a2d Mon Sep 17 00:00:00 2001 From: Stephen Gutekanst Date: Fri, 19 Aug 2022 20:42:53 -0700 Subject: [PATCH] gpu: improve compatibility with self-hosted compiler Signed-off-by: Stephen Gutekanst --- gpu/examples/sample_utils.zig | 33 ++++++--- gpu/src/buffer.zig | 5 +- gpu/src/callbacks.zig | 131 ++++++++++++++++++++++++---------- gpu/src/device.zig | 17 +++-- gpu/src/queue.zig | 14 ++-- gpu/src/types.zig | 5 +- 6 files changed, 145 insertions(+), 60 deletions(-) diff --git a/gpu/examples/sample_utils.zig b/gpu/examples/sample_utils.zig index 5a767276..22eac556 100644 --- a/gpu/examples/sample_utils.zig +++ b/gpu/examples/sample_utils.zig @@ -236,18 +236,31 @@ pub const AutoReleasePool = if (!@import("builtin").target.isDarwin()) opaque { pub fn msgSend(obj: anytype, sel_name: [:0]const u8, args: anytype, comptime ReturnType: type) ReturnType { const args_meta = @typeInfo(@TypeOf(args)).Struct.fields; - const FnType = switch (args_meta.len) { - 0 => fn (@TypeOf(obj), objc.SEL) callconv(.C) ReturnType, - 1 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type) callconv(.C) ReturnType, - 2 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type) callconv(.C) ReturnType, - 3 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type) callconv(.C) ReturnType, - 4 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type, args_meta[3].field_type) callconv(.C) ReturnType, - else => @compileError("Unsupported number of args"), - }; + const FnType = if (@import("builtin").zig_backend == .stage1) + switch (args_meta.len) { + 0 => fn (@TypeOf(obj), objc.SEL) callconv(.C) ReturnType, + 1 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type) callconv(.C) ReturnType, + 2 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type) callconv(.C) ReturnType, + 3 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type) callconv(.C) ReturnType, + 4 => fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type, args_meta[3].field_type) callconv(.C) ReturnType, + else => @compileError("Unsupported number of args"), + } + else + switch (args_meta.len) { + 0 => *const fn (@TypeOf(obj), objc.SEL) callconv(.C) ReturnType, + 1 => *const fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type) callconv(.C) ReturnType, + 2 => *const fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type) callconv(.C) ReturnType, + 3 => *const fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type) callconv(.C) ReturnType, + 4 => *const fn (@TypeOf(obj), objc.SEL, args_meta[0].field_type, args_meta[1].field_type, args_meta[2].field_type, args_meta[3].field_type) callconv(.C) ReturnType, + else => @compileError("Unsupported number of args"), + }; // NOTE: func is a var because making it const causes a compile error which I believe is a compiler bug - var func = @ptrCast(FnType, objc.objc_msgSend); - const sel = objc.sel_getUid(sel_name); + var func = if (@import("builtin").zig_backend == .stage1) + @ptrCast(FnType, objc.objc_msgSend) + else + @ptrCast(FnType, &objc.objc_msgSend); + const sel = objc.sel_getUid(@ptrCast([*c]const u8, sel_name)); return @call(.{}, func, .{ obj, sel } ++ args); } diff --git a/gpu/src/buffer.zig b/gpu/src/buffer.zig index 09702a7d..aab2ec70 100644 --- a/gpu/src/buffer.zig +++ b/gpu/src/buffer.zig @@ -4,7 +4,10 @@ const MapModeFlags = @import("types.zig").MapModeFlags; const Impl = @import("interface.zig").Impl; pub const Buffer = opaque { - pub const MapCallback = fn (status: MapAsyncStatus, userdata: ?*anyopaque) callconv(.C) void; + pub const MapCallback = if (@import("builtin").zig_backend == .stage1) + fn (status: MapAsyncStatus, userdata: ?*anyopaque) callconv(.C) void + else + *const fn (status: MapAsyncStatus, userdata: ?*anyopaque) callconv(.C) void; pub const BindingType = enum(u32) { undef = 0x00000000, diff --git a/gpu/src/callbacks.zig b/gpu/src/callbacks.zig index 1e64d294..6a164e11 100644 --- a/gpu/src/callbacks.zig +++ b/gpu/src/callbacks.zig @@ -10,48 +10,101 @@ const Adapter = @import("adapter.zig").Adapter; const ComputePipeline = @import("compute_pipeline.zig").ComputePipeline; const RenderPipeline = @import("render_pipeline.zig").RenderPipeline; -pub const CompilationInfoCallback = fn ( - status: CompilationInfoRequestStatus, - compilation_info: *const CompilationInfo, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const CompilationInfoCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: CompilationInfoRequestStatus, + compilation_info: *const CompilationInfo, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + status: CompilationInfoRequestStatus, + compilation_info: *const CompilationInfo, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const ErrorCallback = fn ( - typ: ErrorType, - message: [*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const ErrorCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + typ: ErrorType, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + typ: ErrorType, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const LoggingCallback = fn ( - typ: LoggingType, - message: [*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const LoggingCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + typ: LoggingType, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + typ: LoggingType, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const RequestDeviceCallback = fn ( - status: RequestDeviceStatus, - device: *Device, - message: ?[*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const RequestDeviceCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: RequestDeviceStatus, + device: *Device, + message: ?[*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + status: RequestDeviceStatus, + device: *Device, + message: ?[*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const RequestAdapterCallback = fn ( - status: RequestAdapterStatus, - adapter: *Adapter, - message: ?[*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const RequestAdapterCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: RequestAdapterStatus, + adapter: *Adapter, + message: ?[*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + status: RequestAdapterStatus, + adapter: *Adapter, + message: ?[*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const CreateComputePipelineAsyncCallback = fn ( - status: CreatePipelineAsyncStatus, - compute_pipeline: *ComputePipeline, - message: [*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const CreateComputePipelineAsyncCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: CreatePipelineAsyncStatus, + compute_pipeline: *ComputePipeline, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + status: CreatePipelineAsyncStatus, + compute_pipeline: *ComputePipeline, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; -pub const CreateRenderPipelineAsyncCallback = fn ( - status: CreatePipelineAsyncStatus, - pipeline: *RenderPipeline, - message: [*:0]const u8, - userdata: ?*anyopaque, -) callconv(.C) void; +pub const CreateRenderPipelineAsyncCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: CreatePipelineAsyncStatus, + pipeline: *RenderPipeline, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void +else + *const fn ( + status: CreatePipelineAsyncStatus, + pipeline: *RenderPipeline, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; diff --git a/gpu/src/device.zig b/gpu/src/device.zig index 90cfad82..5785a5d4 100644 --- a/gpu/src/device.zig +++ b/gpu/src/device.zig @@ -31,11 +31,18 @@ const Impl = @import("interface.zig").Impl; const dawn = @import("dawn.zig"); pub const Device = opaque { - pub const LostCallback = fn ( - reason: LostReason, - message: [*:0]const u8, - userdata: ?*anyopaque, - ) callconv(.C) void; + pub const LostCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + reason: LostReason, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void + else + *const fn ( + reason: LostReason, + message: [*:0]const u8, + userdata: ?*anyopaque, + ) callconv(.C) void; pub const LostReason = enum(u32) { undef = 0x00000000, diff --git a/gpu/src/queue.zig b/gpu/src/queue.zig index 799be464..831e8d3c 100644 --- a/gpu/src/queue.zig +++ b/gpu/src/queue.zig @@ -9,10 +9,16 @@ const CopyTextureForBrowserOptions = @import("types.zig").CopyTextureForBrowserO const Impl = @import("interface.zig").Impl; pub const Queue = opaque { - pub const WorkDoneCallback = fn ( - status: WorkDoneStatus, - userdata: ?*anyopaque, - ) callconv(.C) void; + pub const WorkDoneCallback = if (@import("builtin").zig_backend == .stage1) + fn ( + status: WorkDoneStatus, + userdata: ?*anyopaque, + ) callconv(.C) void + else + *const fn ( + status: WorkDoneStatus, + userdata: ?*anyopaque, + ) callconv(.C) void; pub const WorkDoneStatus = enum(u32) { success = 0x00000000, diff --git a/gpu/src/types.zig b/gpu/src/types.zig index d9bfa109..d1616dc7 100644 --- a/gpu/src/types.zig +++ b/gpu/src/types.zig @@ -17,7 +17,10 @@ pub const whole_size = 0xffffffffffffffff; /// Generic function pointer type, used for returning API function pointers. Must be /// cast to the right `fn (...) callconv(.C) T` type before use. -pub const Proc = fn () callconv(.C) void; +pub const Proc = if (@import("builtin").zig_backend == .stage1) + fn () callconv(.C) void +else + *const fn () callconv(.C) void; pub const ComputePassTimestampWrite = extern struct { query_set: *QuerySet,