authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-01-18 23:47:25+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-01-19 15:28:17+01:00
log02c138fe7011346ebab5e4b24ba0f8575bb52173
tree5f59ca5e6e25d700dd3aa9d1ea1f9be577bdb1a6
parentb2b87b590011d8df52874e3f9bd1f88d1b0189d1

SPIR-V: Add glsl450 and vulkan spir-v operating system definitions


6 files changed, 48 insertions(+), 5 deletions(-)

lib/std/target.zig+15-3
......@@ -57,7 +57,9 @@ pub const Target = struct {
5757 wasi,
5858 emscripten,
5959 uefi,
60 opencl, // SPIR-V on OpenCL
60 opencl,
61 glsl450,
62 vulkan,
6163 other,
6264
6365 pub fn isDarwin(tag: Tag) bool {
......@@ -249,7 +251,9 @@ pub const Target = struct {
249251 .wasi,
250252 .emscripten,
251253 .uefi,
252 .opencl,
254 .opencl, // TODO: OpenCL versions
255 .glsl450, // TODO: GLSL versions
256 .vulkan,
253257 .other,
254258 => return .{ .none = {} },
255259
......@@ -406,6 +410,8 @@ pub const Target = struct {
406410 .emscripten,
407411 .uefi,
408412 .opencl,
413 .glsl450,
414 .vulkan,
409415 .other,
410416 => false,
411417 };
......@@ -497,7 +503,9 @@ pub const Target = struct {
497503 .wasi,
498504 .emscripten,
499505 => return .musl,
500 .opencl, // TODO: Where should this go?
506 .opencl, // TODO: SPIR-V ABIs with Linkage capability
507 .glsl450,
508 .vulkan,
501509 => return .none,
502510 }
503511 }
......@@ -1367,6 +1375,8 @@ pub const Target = struct {
13671375 .windows,
13681376 .emscripten,
13691377 .opencl,
1378 .glsl450,
1379 .vulkan,
13701380 .other,
13711381 => return false,
13721382 else => return true,
......@@ -1547,6 +1557,8 @@ pub const Target = struct {
15471557 .emscripten,
15481558 .wasi,
15491559 .opencl,
1560 .glsl450,
1561 .vulkan,
15501562 .other,
15511563 => return result,
15521564
lib/std/zig/cross_target.zig+4
......@@ -131,6 +131,8 @@ pub const CrossTarget = struct {
131131 .emscripten,
132132 .uefi,
133133 .opencl,
134 .glsl450,
135 .vulkan,
134136 .other,
135137 => {
136138 self.os_version_min = .{ .none = {} };
......@@ -732,6 +734,8 @@ pub const CrossTarget = struct {
732734 .emscripten,
733735 .uefi,
734736 .opencl,
737 .glsl450,
738 .vulkan,
735739 .other,
736740 => return error.InvalidOperatingSystemVersion,
737741
src/codegen/llvm.zig+5
......@@ -69,6 +69,8 @@ pub fn targetTriple(allocator: *Allocator, target: std.Target) ![:0]u8 {
6969 .renderscript64 => "renderscript64",
7070 .ve => "ve",
7171 .spu_2 => return error.LLVMBackendDoesNotSupportSPUMarkII,
72 .spirv32 => return error.LLVMBackendDoesNotSupportSPIRV,
73 .spirv64 => return error.LLVMBackendDoesNotSupportSPIRV,
7274 };
7375 // TODO Add a sub-arch for some architectures depending on CPU features.
7476
......@@ -109,6 +111,9 @@ pub fn targetTriple(allocator: *Allocator, target: std.Target) ![:0]u8 {
109111 .wasi => "wasi",
110112 .emscripten => "emscripten",
111113 .uefi => "windows",
114 .opencl => return error.LLVMBackendDoesNotSupportOpenCL,
115 .glsl450 => return error.LLVMBackendDoesNotSupportGLSL450,
116 .vulkan => return error.LLVMBackendDoesNotSupportVulkan,
112117 .other => "unknown",
113118 };
114119
src/link/SpirV.zig+20
......@@ -12,6 +12,8 @@ const trace = @import("../tracy.zig").trace;
1212const build_options = @import("build_options");
1313const spec = @import("../codegen/spirv/spec.zig");
1414
15//! SPIR-V Documentation: https://www.khronos.org/registry/spir-v/specs/unified1/SPIRV.html
16
1517pub const FnData = struct {
1618 id: ?u32 = null,
1719 code: std.ArrayListUnmanaged(u32) = .{},
......@@ -32,6 +34,22 @@ pub fn createEmpty(gpa: *Allocator, options: link.Options) !*SpirV {
3234 .allocator = gpa,
3335 },
3436 };
37
38 // TODO: Figure out where to put all of these
39 switch (options.target.cpu.arch) {
40 .spirv32, .spirv64 => {},
41 else => return error.TODOArchNotSupported,
42 }
43
44 switch (options.target.os.tag) {
45 .opencl, .glsl450, .vulkan => {},
46 else => return error.TODOOsNotSupported,
47 }
48
49 if (options.target.abi != .none) {
50 return error.TODOAbiNotSupported;
51 }
52
3553 return spirv;
3654}
3755
......@@ -119,6 +137,8 @@ pub fn flushModule(self: *SpirV, comp: *Compilation) !void {
119137 switch (decl.typed_value) {
120138 .most_recent => |tvm| {
121139 const fn_data = &decl.fn_link.spirv;
140
141 // TODO: This could probably be more efficient.
122142 for (fn_data.code.items) |word| {
123143 try writer.writeIntLittle(u32, word);
124144 }
src/target.zig+2-2
......@@ -189,7 +189,7 @@ pub fn supportsStackProbing(target: std.Target) bool {
189189
190190pub fn osToLLVM(os_tag: std.Target.Os.Tag) llvm.OSType {
191191 return switch (os_tag) {
192 .freestanding, .other => .UnknownOS,
192 .freestanding, .other, .opencl, .glsl450, .vulkan => .UnknownOS,
193193 .windows, .uefi => .Win32,
194194 .ananas => .Ananas,
195195 .cloudabi => .CloudABI,
......@@ -280,7 +280,7 @@ pub fn archToLLVM(arch_tag: std.Target.Cpu.Arch) llvm.ArchType {
280280 .renderscript32 => .renderscript32,
281281 .renderscript64 => .renderscript64,
282282 .ve => .ve,
283 .spu_2 => .UnknownArch,
283 .spu_2, .spirv32, .spirv64 => .UnknownArch,
284284 };
285285}
286286
src/type.zig+2
......@@ -3598,6 +3598,8 @@ pub const CType = enum {
35983598 .hermit,
35993599 .hurd,
36003600 .opencl,
3601 .glsl450,
3602 .vulkan,
36013603 => @panic("TODO specify the C integer and float type sizes for this OS"),
36023604 }
36033605 }