gpu-dawn: build Dawn & DirectXShaderCompiler for windows
Helps hexops/mach#86 Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
parent
bc4f6f36c5
commit
1e2c49d14e
2 changed files with 214 additions and 4 deletions
|
|
@ -137,6 +137,11 @@ fn linkFromSource(b: *Builder, step: *std.build.LibExeObjStep, options: Options)
|
||||||
const lib_dawn_native = buildLibDawnNative(b, step, options);
|
const lib_dawn_native = buildLibDawnNative(b, step, options);
|
||||||
step.linkLibrary(lib_dawn_native);
|
step.linkLibrary(lib_dawn_native);
|
||||||
|
|
||||||
|
if (options.d3d12.?) {
|
||||||
|
const lib_dxcompiler = buildLibDxcompiler(b, step, options);
|
||||||
|
step.linkLibrary(lib_dxcompiler);
|
||||||
|
}
|
||||||
|
|
||||||
const lib_dawn_wire = buildLibDawnWire(b, step, options);
|
const lib_dawn_wire = buildLibDawnWire(b, step, options);
|
||||||
step.linkLibrary(lib_dawn_wire);
|
step.linkLibrary(lib_dawn_wire);
|
||||||
|
|
||||||
|
|
@ -168,6 +173,7 @@ fn linkFromSource(b: *Builder, step: *std.build.LibExeObjStep, options: Options)
|
||||||
_ = buildLibDawnUtils(b, lib_dawn, options);
|
_ = buildLibDawnUtils(b, lib_dawn, options);
|
||||||
_ = buildLibSPIRVTools(b, lib_dawn, options);
|
_ = buildLibSPIRVTools(b, lib_dawn, options);
|
||||||
_ = buildLibTint(b, lib_dawn, options);
|
_ = buildLibTint(b, lib_dawn, options);
|
||||||
|
if (options.d3d12.?) _ = buildLibDxcompiler(b, lib_dawn, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ensureSubmodules(allocator: std.mem.Allocator) !void {
|
fn ensureSubmodules(allocator: std.mem.Allocator) !void {
|
||||||
|
|
@ -435,6 +441,14 @@ fn buildLibMachDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options:
|
||||||
include("libs/dawn/include"),
|
include("libs/dawn/include"),
|
||||||
include("libs/dawn/src"),
|
include("libs/dawn/src"),
|
||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
|
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
|
||||||
|
if (target.os.tag == .windows) {
|
||||||
|
cpp_flags.appendSlice(&.{
|
||||||
|
"-D_DEBUG",
|
||||||
|
"-D_MT",
|
||||||
|
"-D_DLL",
|
||||||
|
}) catch unreachable;
|
||||||
|
}
|
||||||
|
|
||||||
lib.addCSourceFile("src/dawn/dawn_native_mach.cpp", cpp_flags.items);
|
lib.addCSourceFile("src/dawn/dawn_native_mach.cpp", cpp_flags.items);
|
||||||
return lib;
|
return lib;
|
||||||
|
|
@ -474,6 +488,10 @@ fn buildLibDawnCommon(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
|
||||||
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn/src/dawn/common/SystemUtils_mac.mm" }) catch unreachable;
|
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn/src/dawn/common/SystemUtils_mac.mm" }) catch unreachable;
|
||||||
cpp_sources.append(abs_path) catch unreachable;
|
cpp_sources.append(abs_path) catch unreachable;
|
||||||
}
|
}
|
||||||
|
if (target.os.tag == .windows) {
|
||||||
|
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn/src/dawn/common/WindowsUtils.cpp" }) catch unreachable;
|
||||||
|
cpp_sources.append(abs_path) catch unreachable;
|
||||||
|
}
|
||||||
|
|
||||||
var cpp_flags = std.ArrayList([]const u8).init(b.allocator);
|
var cpp_flags = std.ArrayList([]const u8).init(b.allocator);
|
||||||
cpp_flags.appendSlice(flags.items) catch unreachable;
|
cpp_flags.appendSlice(flags.items) catch unreachable;
|
||||||
|
|
@ -534,6 +552,25 @@ fn appendDawnEnableBackendTypeFlags(flags: *std.ArrayList([]const u8), options:
|
||||||
if (options.opengl_es.?) try flags.appendSlice(&.{ opengl, opengl_es });
|
if (options.opengl_es.?) try flags.appendSlice(&.{ opengl, opengl_es });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const dawn_d3d12_flags = &[_][]const u8{
|
||||||
|
"-DDAWN_NO_WINDOWS_UI",
|
||||||
|
"-D__EMULATE_UUID=1",
|
||||||
|
"-Wno-nonportable-include-path",
|
||||||
|
"-Wno-extern-c-compat",
|
||||||
|
"-Wno-invalid-noreturn",
|
||||||
|
"-Wno-pragma-pack",
|
||||||
|
"-Wno-microsoft-template-shadow",
|
||||||
|
"-Wno-unused-command-line-argument",
|
||||||
|
"-Wno-microsoft-exception-spec",
|
||||||
|
"-Wno-implicit-exception-spec-mismatch",
|
||||||
|
"-Wno-unknown-attributes",
|
||||||
|
"-Wno-c++20-extensions",
|
||||||
|
"-D_CRT_SECURE_NO_WARNINGS",
|
||||||
|
"-DWIN32_LEAN_AND_MEAN",
|
||||||
|
"-DD3D10_ARBITRARY_HEADER_ORDERING",
|
||||||
|
"-DNOMINMAX",
|
||||||
|
};
|
||||||
|
|
||||||
// Builds dawn native sources; derived from src/dawn/native/BUILD.gn
|
// Builds dawn native sources; derived from src/dawn/native/BUILD.gn
|
||||||
fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *std.build.LibExeObjStep {
|
fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *std.build.LibExeObjStep {
|
||||||
const lib = if (!options.separate_libs) step else blk: {
|
const lib = if (!options.separate_libs) step else blk: {
|
||||||
|
|
@ -572,6 +609,7 @@ fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
|
||||||
include("libs/dawn/out/Debug/gen/include"),
|
include("libs/dawn/out/Debug/gen/include"),
|
||||||
include("libs/dawn/out/Debug/gen/src"),
|
include("libs/dawn/out/Debug/gen/src"),
|
||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
|
if (options.d3d12.?) flags.appendSlice(dawn_d3d12_flags) catch unreachable;
|
||||||
|
|
||||||
appendLangScannedSources(b, lib, options, .{
|
appendLangScannedSources(b, lib, options, .{
|
||||||
.rel_dirs = &.{
|
.rel_dirs = &.{
|
||||||
|
|
@ -602,9 +640,18 @@ fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
|
||||||
// TODO(build-system): allow use_angle here. See src/dawn/native/BUILD.gn
|
// TODO(build-system): allow use_angle here. See src/dawn/native/BUILD.gn
|
||||||
// TODO(build-system): could allow use_swiftshader here. See src/dawn/native/BUILD.gn
|
// TODO(build-system): could allow use_swiftshader here. See src/dawn/native/BUILD.gn
|
||||||
|
|
||||||
|
var cpp_sources = std.ArrayList([]const u8).init(b.allocator);
|
||||||
if (options.d3d12.?) {
|
if (options.d3d12.?) {
|
||||||
// TODO(build-system): windows
|
lib.linkSystemLibrary("dxgi");
|
||||||
// libs += [ "dxguid.lib" ]
|
lib.linkSystemLibrary("dxguid");
|
||||||
|
|
||||||
|
for ([_][]const u8{
|
||||||
|
"src/dawn/mingw_helpers.cpp",
|
||||||
|
}) |path| {
|
||||||
|
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), path }) catch unreachable;
|
||||||
|
cpp_sources.append(abs_path) catch unreachable;
|
||||||
|
}
|
||||||
|
|
||||||
appendLangScannedSources(b, lib, options, .{
|
appendLangScannedSources(b, lib, options, .{
|
||||||
.rel_dirs = &.{
|
.rel_dirs = &.{
|
||||||
"libs/dawn/src/dawn/native/d3d12/",
|
"libs/dawn/src/dawn/native/d3d12/",
|
||||||
|
|
@ -632,7 +679,6 @@ fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
|
||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cpp_sources = std.ArrayList([]const u8).init(b.allocator);
|
|
||||||
if (options.linux_window_manager != null and options.linux_window_manager.? == .X11) {
|
if (options.linux_window_manager != null and options.linux_window_manager.? == .X11) {
|
||||||
lib.linkSystemLibrary("X11");
|
lib.linkSystemLibrary("X11");
|
||||||
for ([_][]const u8{
|
for ([_][]const u8{
|
||||||
|
|
@ -1031,13 +1077,20 @@ fn buildLibAbseilCpp(b: *Builder, step: *std.build.LibExeObjStep, options: Optio
|
||||||
|
|
||||||
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
|
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
|
||||||
if (target.os.tag == .macos) lib.linkFramework("CoreFoundation");
|
if (target.os.tag == .macos) lib.linkFramework("CoreFoundation");
|
||||||
|
if (target.os.tag == .windows) lib.linkSystemLibrary("bcrypt");
|
||||||
|
|
||||||
var flags = std.ArrayList([]const u8).init(b.allocator);
|
var flags = std.ArrayList([]const u8).init(b.allocator);
|
||||||
flags.appendSlice(&.{
|
flags.appendSlice(&.{
|
||||||
include("libs/dawn"),
|
include("libs/dawn"),
|
||||||
include("libs/dawn/third_party/abseil-cpp"),
|
include("libs/dawn/third_party/abseil-cpp"),
|
||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
if (target.os.tag == .windows) flags.append("-DABSL_FORCE_THREAD_IDENTITY_MODE=2") catch unreachable;
|
if (target.os.tag == .windows) flags.appendSlice(&.{
|
||||||
|
"-DABSL_FORCE_THREAD_IDENTITY_MODE=2",
|
||||||
|
"-DWIN32_LEAN_AND_MEAN",
|
||||||
|
"-DD3D10_ARBITRARY_HEADER_ORDERING",
|
||||||
|
"-D_CRT_SECURE_NO_WARNINGS",
|
||||||
|
"-DNOMINMAX",
|
||||||
|
}) catch unreachable;
|
||||||
|
|
||||||
// absl
|
// absl
|
||||||
appendLangScannedSources(b, lib, options, .{
|
appendLangScannedSources(b, lib, options, .{
|
||||||
|
|
@ -1143,6 +1196,7 @@ fn buildLibDawnUtils(b: *Builder, step: *std.build.LibExeObjStep, options: Optio
|
||||||
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn", path }) catch unreachable;
|
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn", path }) catch unreachable;
|
||||||
cpp_sources.append(abs_path) catch unreachable;
|
cpp_sources.append(abs_path) catch unreachable;
|
||||||
}
|
}
|
||||||
|
flags.appendSlice(dawn_d3d12_flags) catch unreachable;
|
||||||
}
|
}
|
||||||
if (options.metal.?) {
|
if (options.metal.?) {
|
||||||
for ([_][]const u8{
|
for ([_][]const u8{
|
||||||
|
|
@ -1178,6 +1232,106 @@ fn buildLibDawnUtils(b: *Builder, step: *std.build.LibExeObjStep, options: Optio
|
||||||
return lib;
|
return lib;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Buids dxcompiler sources; derived from libs/DirectXShaderCompiler/CMakeLists.txt
|
||||||
|
fn buildLibDxcompiler(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *std.build.LibExeObjStep {
|
||||||
|
const lib = if (!options.separate_libs) step else blk: {
|
||||||
|
var main_abs = std.fs.path.join(b.allocator, &.{ thisDir(), "src/dawn/dummy.zig" }) catch unreachable;
|
||||||
|
const separate_lib = b.addStaticLibrary("dxcompiler", main_abs);
|
||||||
|
separate_lib.install();
|
||||||
|
separate_lib.setBuildMode(step.build_mode);
|
||||||
|
separate_lib.setTarget(step.target);
|
||||||
|
separate_lib.linkLibCpp();
|
||||||
|
break :blk separate_lib;
|
||||||
|
};
|
||||||
|
system_sdk.include(b, lib, .{});
|
||||||
|
|
||||||
|
lib.linkSystemLibrary("oleaut32");
|
||||||
|
lib.linkSystemLibrary("ole32");
|
||||||
|
lib.linkSystemLibrary("dbghelp");
|
||||||
|
lib.linkSystemLibrary("dxguid");
|
||||||
|
lib.linkLibCpp();
|
||||||
|
|
||||||
|
var flags = std.ArrayList([]const u8).init(b.allocator);
|
||||||
|
flags.appendSlice(&.{
|
||||||
|
include("libs/"),
|
||||||
|
include("libs/DirectXShaderCompiler/include/llvm/llvm_assert"),
|
||||||
|
include("libs/DirectXShaderCompiler/include"),
|
||||||
|
include("libs/DirectXShaderCompiler/build/include"),
|
||||||
|
include("libs/DirectXShaderCompiler/build/lib/HLSL"),
|
||||||
|
include("libs/DirectXShaderCompiler/build/lib/DxilPIXPasses"),
|
||||||
|
include("libs/DirectXShaderCompiler/build/include"),
|
||||||
|
"-DUNREFERENCED_PARAMETER(x)=",
|
||||||
|
"-Wno-inconsistent-missing-override",
|
||||||
|
"-Wno-missing-exception-spec",
|
||||||
|
"-Wno-switch",
|
||||||
|
"-Wno-deprecated-declarations",
|
||||||
|
"-Wno-macro-redefined", // regex2.h and regcomp.c requires this for OUT redefinition
|
||||||
|
"-DMSFT_SUPPORTS_CHILD_PROCESSES=1",
|
||||||
|
"-DHAVE_LIBPSAPI=1",
|
||||||
|
"-DHAVE_LIBSHELL32=1",
|
||||||
|
"-DLLVM_ON_WIN32=1",
|
||||||
|
}) catch unreachable;
|
||||||
|
|
||||||
|
appendLangScannedSources(b, lib, options, .{
|
||||||
|
.zero_debug_symbols = true,
|
||||||
|
.rel_dirs = &.{
|
||||||
|
"libs/DirectXShaderCompiler/lib/Analysis/IPA",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Analysis",
|
||||||
|
"libs/DirectXShaderCompiler/lib/AsmParser",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Bitcode/Writer",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxcBindingTable",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxcSupport",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxilContainer",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxilPIXPasses",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxilRootSignature",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DXIL",
|
||||||
|
"libs/DirectXShaderCompiler/lib/DxrFallback",
|
||||||
|
"libs/DirectXShaderCompiler/lib/HLSL",
|
||||||
|
"libs/DirectXShaderCompiler/lib/IRReader",
|
||||||
|
"libs/DirectXShaderCompiler/lib/IR",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Linker",
|
||||||
|
"libs/DirectXShaderCompiler/lib/miniz",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Option",
|
||||||
|
"libs/DirectXShaderCompiler/lib/PassPrinters",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Passes",
|
||||||
|
"libs/DirectXShaderCompiler/lib/ProfileData",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Target",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Transforms/InstCombine",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Transforms/IPO",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Transforms/Scalar",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Transforms/Utils",
|
||||||
|
"libs/DirectXShaderCompiler/lib/Transforms/Vectorize",
|
||||||
|
},
|
||||||
|
.flags = flags.items,
|
||||||
|
}) catch unreachable;
|
||||||
|
|
||||||
|
appendLangScannedSources(b, lib, options, .{
|
||||||
|
.zero_debug_symbols = true,
|
||||||
|
.rel_dirs = &.{
|
||||||
|
"libs/DirectXShaderCompiler/lib/Support",
|
||||||
|
},
|
||||||
|
.flags = flags.items,
|
||||||
|
.excluding_contains = &.{
|
||||||
|
"DynamicLibrary.cpp", // ignore, HLSL_IGNORE_SOURCES
|
||||||
|
"PluginLoader.cpp", // ignore, HLSL_IGNORE_SOURCES
|
||||||
|
"Path.cpp", // ignore, LLVM_INCLUDE_TESTS
|
||||||
|
"DynamicLibrary.cpp", // ignore
|
||||||
|
},
|
||||||
|
}) catch unreachable;
|
||||||
|
|
||||||
|
appendLangScannedSources(b, lib, options, .{
|
||||||
|
.zero_debug_symbols = true,
|
||||||
|
.rel_dirs = &.{
|
||||||
|
"libs/DirectXShaderCompiler/lib/Bitcode/Reader",
|
||||||
|
},
|
||||||
|
.flags = flags.items,
|
||||||
|
.excluding_contains = &.{
|
||||||
|
"BitReader.cpp", // ignore
|
||||||
|
},
|
||||||
|
}) catch unreachable;
|
||||||
|
return lib;
|
||||||
|
}
|
||||||
|
|
||||||
fn include(comptime rel: []const u8) []const u8 {
|
fn include(comptime rel: []const u8) []const u8 {
|
||||||
return "-I" ++ thisDir() ++ "/" ++ rel;
|
return "-I" ++ thisDir() ++ "/" ++ rel;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
56
gpu-dawn/src/dawn/mingw_helpers.cpp
Normal file
56
gpu-dawn/src/dawn/mingw_helpers.cpp
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifdef __MINGW32__
|
||||||
|
#include <guiddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define MINGW_UUIDOF(type, spec) \
|
||||||
|
extern "C++" { \
|
||||||
|
struct __declspec(uuid(spec)) type; \
|
||||||
|
template<> const GUID &__mingw_uuidof<type>() { \
|
||||||
|
static constexpr IID __uuid_inst = guid_from_string(spec); \
|
||||||
|
return __uuid_inst; \
|
||||||
|
} \
|
||||||
|
template<> const GUID &__mingw_uuidof<type*>() { \
|
||||||
|
return __mingw_uuidof<type>(); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr uint8_t nybble_from_hex(char c) {
|
||||||
|
return ((c >= '0' && c <= '9')
|
||||||
|
? (c - '0')
|
||||||
|
: ((c >= 'a' && c <= 'f')
|
||||||
|
? (c - 'a' + 10)
|
||||||
|
: ((c >= 'A' && c <= 'F') ? (c - 'A' + 10)
|
||||||
|
: /* Should be an error */ -1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr uint8_t byte_from_hex(char c1, char c2) {
|
||||||
|
return nybble_from_hex(c1) << 4 | nybble_from_hex(c2);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr uint8_t byte_from_hexstr(const char str[2]) {
|
||||||
|
return nybble_from_hex(str[0]) << 4 | nybble_from_hex(str[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr GUID guid_from_string(const char str[37]) {
|
||||||
|
return GUID{static_cast<uint32_t>(byte_from_hexstr(str)) << 24 |
|
||||||
|
static_cast<uint32_t>(byte_from_hexstr(str + 2)) << 16 |
|
||||||
|
static_cast<uint32_t>(byte_from_hexstr(str + 4)) << 8 |
|
||||||
|
byte_from_hexstr(str + 6),
|
||||||
|
static_cast<uint16_t>(
|
||||||
|
static_cast<uint16_t>(byte_from_hexstr(str + 9)) << 8 |
|
||||||
|
byte_from_hexstr(str + 11)),
|
||||||
|
static_cast<uint16_t>(
|
||||||
|
static_cast<uint16_t>(byte_from_hexstr(str + 14)) << 8 |
|
||||||
|
byte_from_hexstr(str + 16)),
|
||||||
|
{byte_from_hexstr(str + 19), byte_from_hexstr(str + 21),
|
||||||
|
byte_from_hexstr(str + 24), byte_from_hexstr(str + 26),
|
||||||
|
byte_from_hexstr(str + 28), byte_from_hexstr(str + 30),
|
||||||
|
byte_from_hexstr(str + 32), byte_from_hexstr(str + 34)}};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // __MINGW32__
|
||||||
|
|
||||||
|
// The point of this helper file is to export the specializations for MINGW_UUIDOF
|
||||||
|
// below, since MinGW does not have these as part of dxguid yet (not completely up
|
||||||
|
// to date.)
|
||||||
|
MINGW_UUIDOF(IDXGraphicsAnalysis, "9f251514-9d4d-4902-9d60-18988ab7d4b5")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue