gpu: add OpenGL fallback support for Linux

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
This commit is contained in:
Stephen Gutekanst 2021-12-05 04:25:19 +00:00
parent 6b0129f590
commit 1c6792a492

View file

@ -42,9 +42,8 @@ pub const Options = struct {
if (options.vulkan == null) options.vulkan = tag == .fuchsia or linux_desktop_like; if (options.vulkan == null) options.vulkan = tag == .fuchsia or linux_desktop_like;
// TODO(build-system): respect these options / defaults // TODO(build-system): respect these options / defaults
options.desktop_gl = false; if (options.desktop_gl == null) options.desktop_gl = linux_desktop_like; // TODO(build-system): add windows
options.opengl_es = false; options.opengl_es = false;
// if (options.desktop_gl == null) options.desktop_gl = tag == .windows or linux_desktop_like;
// if (options.opengl_es == null) options.opengl_es = tag == .windows or tag == .emscripten or target.isAndroid() or linux_desktop_like; // if (options.opengl_es == null) options.opengl_es = tag == .windows or tag == .emscripten or target.isAndroid() or linux_desktop_like;
return options; return options;
} }
@ -54,7 +53,7 @@ pub fn link(b: *Builder, step: *std.build.LibExeObjStep, options: Options) void
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;
const opt = options.detectDefaults(target); const opt = options.detectDefaults(target);
const lib_mach_dawn_native = buildLibMachDawnNative(b, step); const lib_mach_dawn_native = buildLibMachDawnNative(b, step, opt);
step.linkLibrary(lib_mach_dawn_native); step.linkLibrary(lib_mach_dawn_native);
const lib_dawn_common = buildLibDawnCommon(b, step); const lib_dawn_common = buildLibDawnCommon(b, step);
@ -87,7 +86,7 @@ fn isLinuxDesktopLike(target: std.Target) bool {
return !tag.isDarwin() and tag != .windows and tag != .fuchsia and tag != .emscripten and !target.isAndroid(); return !tag.isDarwin() and tag != .windows and tag != .fuchsia and tag != .emscripten and !target.isAndroid();
} }
fn buildLibMachDawnNative(b: *Builder, step: *std.build.LibExeObjStep) *std.build.LibExeObjStep { fn buildLibMachDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Options) *std.build.LibExeObjStep {
var main_abs = std.fs.path.join(b.allocator, &.{ thisDir(), "src/dawn/dummy.zig" }) catch unreachable; var main_abs = std.fs.path.join(b.allocator, &.{ thisDir(), "src/dawn/dummy.zig" }) catch unreachable;
const lib = b.addStaticLibrary("dawn-native-mach", main_abs); const lib = b.addStaticLibrary("dawn-native-mach", main_abs);
lib.install(); lib.install();
@ -97,13 +96,18 @@ fn buildLibMachDawnNative(b: *Builder, step: *std.build.LibExeObjStep) *std.buil
// TODO(build-system): pass system SDK options through // TODO(build-system): pass system SDK options through
glfw.link(b, lib, .{ .system_sdk = .{ .set_sysroot = false } }); glfw.link(b, lib, .{ .system_sdk = .{ .set_sysroot = false } });
lib.addCSourceFile("src/dawn/dawn_native_mach.cpp", &.{
var flags = std.ArrayList([]const u8).init(b.allocator);
appendDawnEnableBackendTypeFlags(&flags, options) catch unreachable;
flags.appendSlice(&.{
include("libs/mach-glfw/upstream/glfw/include"), include("libs/mach-glfw/upstream/glfw/include"),
include("libs/dawn/out/Debug/gen/src/include"), include("libs/dawn/out/Debug/gen/src/include"),
include("libs/dawn/out/Debug/gen/src"), include("libs/dawn/out/Debug/gen/src"),
include("libs/dawn/src/include"), include("libs/dawn/src/include"),
include("libs/dawn/src"), include("libs/dawn/src"),
}); }) catch unreachable;
lib.addCSourceFile("src/dawn/dawn_native_mach.cpp", flags.items);
return lib; return lib;
} }
@ -170,6 +174,7 @@ fn appendDawnEnableBackendTypeFlags(flags: *std.ArrayList([]const u8), options:
const d3d12 = "-DDAWN_ENABLE_BACKEND_D3D12"; const d3d12 = "-DDAWN_ENABLE_BACKEND_D3D12";
const metal = "-DDAWN_ENABLE_BACKEND_METAL"; const metal = "-DDAWN_ENABLE_BACKEND_METAL";
const vulkan = "-DDAWN_ENABLE_BACKEND_VULKAN"; const vulkan = "-DDAWN_ENABLE_BACKEND_VULKAN";
const opengl = "-DDAWN_ENABLE_BACKEND_OPENGL";
const desktop_gl = "-DDAWN_ENABLE_BACKEND_DESKTOP_GL"; const desktop_gl = "-DDAWN_ENABLE_BACKEND_DESKTOP_GL";
const opengl_es = "-DDAWN_ENABLE_BACKEND_OPENGLES"; const opengl_es = "-DDAWN_ENABLE_BACKEND_OPENGLES";
const backend_null = "-DDAWN_ENABLE_BACKEND_NULL"; const backend_null = "-DDAWN_ENABLE_BACKEND_NULL";
@ -178,8 +183,8 @@ fn appendDawnEnableBackendTypeFlags(flags: *std.ArrayList([]const u8), options:
if (options.d3d12.?) try flags.append(d3d12); if (options.d3d12.?) try flags.append(d3d12);
if (options.metal.?) try flags.append(metal); if (options.metal.?) try flags.append(metal);
if (options.vulkan.?) try flags.append(vulkan); if (options.vulkan.?) try flags.append(vulkan);
if (options.desktop_gl.?) try flags.append(desktop_gl); if (options.desktop_gl.?) try flags.appendSlice(&.{ opengl, desktop_gl });
if (options.opengl_es.?) try flags.append(opengl_es); if (options.opengl_es.?) try flags.appendSlice(&.{ opengl, opengl_es });
} }
// Builds dawn native sources; derived from src/dawn_native/BUILD.gn // Builds dawn native sources; derived from src/dawn_native/BUILD.gn
@ -194,6 +199,13 @@ fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
var flags = std.ArrayList([]const u8).init(b.allocator); var flags = std.ArrayList([]const u8).init(b.allocator);
appendDawnEnableBackendTypeFlags(&flags, options) catch unreachable; appendDawnEnableBackendTypeFlags(&flags, options) catch unreachable;
if (options.desktop_gl.?) {
// OpenGL requires spriv-cross until Dawn moves OpenGL shader generation to Tint.
flags.append(include("libs/dawn/third_party/vulkan-deps/spirv-cross/src")) catch unreachable;
const lib_spirv_cross = buildLibSPIRVCross(b, step);
step.linkLibrary(lib_spirv_cross);
}
flags.appendSlice(&.{ flags.appendSlice(&.{
include("libs/dawn/src"), include("libs/dawn/src"),
include("libs/dawn/src/include"), include("libs/dawn/src/include"),
@ -425,12 +437,13 @@ fn buildLibDawnNative(b: *Builder, step: *std.build.LibExeObjStep, options: Opti
} }
if (options.desktop_gl.?) { if (options.desktop_gl.?) {
// TODO(build-system): opengl for ([_][]const u8{
// public_deps += [ "out/Debug/gen/src/dawn_native/opengl/OpenGLFunctionsBase_autogen.cpp",
// ":dawn_native_opengl_loader_gen", }) |path| {
// "${dawn_root}/third_party/khronos:khronos_platform", var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn", path }) catch unreachable;
// ] lib.addCSourceFile(abs_path, flags.items);
// sources += get_target_outputs(":dawn_native_opengl_loader_gen") }
for ([_][]const u8{ for ([_][]const u8{
"src/dawn_native/opengl/BackendGL.cpp", "src/dawn_native/opengl/BackendGL.cpp",
"src/dawn_native/opengl/BindGroupGL.cpp", "src/dawn_native/opengl/BindGroupGL.cpp",
@ -1142,6 +1155,50 @@ fn buildLibSPIRVTools(b: *Builder, step: *std.build.LibExeObjStep) *std.build.Li
return lib; return lib;
} }
// Builds third_party/vulkan-deps/spirv-tools sources; derived from third_party/vulkan-deps/spirv-tools/src/BUILD.gn
fn buildLibSPIRVCross(b: *Builder, step: *std.build.LibExeObjStep) *std.build.LibExeObjStep {
var main_abs = std.fs.path.join(b.allocator, &.{ thisDir(), "src/dawn/dummy.zig" }) catch unreachable;
const lib = b.addStaticLibrary("spirv-cross", main_abs);
lib.install();
lib.setBuildMode(step.build_mode);
lib.setTarget(step.target);
lib.linkLibCpp();
var flags = std.ArrayList([]const u8).init(b.allocator);
flags.appendSlice(&.{
"-DSPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS",
include("libs/dawn/third_party/vulkan-deps/spirv-cross/src"),
"-Wno-extra-semi",
"-Wno-ignored-qualifiers",
"-Wno-implicit-fallthrough",
"-Wno-inconsistent-missing-override",
"-Wno-missing-field-initializers",
"-Wno-newline-eof",
"-Wno-sign-compare",
"-Wno-unused-variable",
}) catch unreachable;
const target = (std.zig.system.NativeTargetInfo.detect(b.allocator, step.target) catch unreachable).target;
if (target.os.tag != .windows) flags.append("-fno-exceptions") catch unreachable;
// spvtools_link
for ([_][]const u8{
"third_party/vulkan-deps/spirv-cross/src/spirv_cfg.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_cross.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_cross_parsed_ir.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_cross_util.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_glsl.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_hlsl.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_msl.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_parser.cpp",
"third_party/vulkan-deps/spirv-cross/src/spirv_reflect.cpp",
}) |path| {
var abs_path = std.fs.path.join(b.allocator, &.{ thisDir(), "libs/dawn", path }) catch unreachable;
lib.addCSourceFile(abs_path, flags.items);
}
return lib;
}
// Builds third_party/abseil sources; derived from: // Builds third_party/abseil sources; derived from:
// //
// ``` // ```