161 lines
5.7 KiB
Python
161 lines
5.7 KiB
Python
#!/usr/bin/env python
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
Import("env")
|
|
|
|
env_d3d12_rdd = env.Clone()
|
|
|
|
thirdparty_obj = []
|
|
|
|
|
|
# DirectX Headers (must take precedence over Windows SDK's).
|
|
|
|
env.Prepend(CPPPATH=["#thirdparty/directx_headers/include/directx"])
|
|
env_d3d12_rdd.Prepend(CPPPATH=["#thirdparty/directx_headers/include/directx"])
|
|
env_d3d12_rdd.Prepend(CPPPATH=["#thirdparty/directx_headers/include/dxguids"])
|
|
|
|
|
|
# Direct3D 12 Memory Allocator.
|
|
|
|
env.Append(CPPPATH=["#thirdparty/d3d12ma"])
|
|
env_d3d12_rdd.Append(CPPPATH=["#thirdparty/d3d12ma"])
|
|
|
|
|
|
# Agility SDK.
|
|
|
|
if env["agility_sdk_path"] != "" and os.path.exists(env["agility_sdk_path"]):
|
|
env_d3d12_rdd.Append(CPPDEFINES=["AGILITY_SDK_ENABLED"])
|
|
if env["agility_sdk_multiarch"]:
|
|
env_d3d12_rdd.Append(CPPDEFINES=["AGILITY_SDK_MULTIARCH_ENABLED"])
|
|
|
|
|
|
# PIX.
|
|
|
|
if env["use_pix"]:
|
|
env_d3d12_rdd.Append(CPPDEFINES=["PIX_ENABLED"])
|
|
env_d3d12_rdd.Append(CPPPATH=[env["pix_path"] + "/Include"])
|
|
|
|
|
|
# Mesa (SPIR-V to DXIL functionality).
|
|
|
|
mesa_dir = (env["mesa_libs"] + "/godot-mesa").replace("\\", "/")
|
|
mesa_gen_dir = (env["mesa_libs"] + "/godot-mesa/generated").replace("\\", "/")
|
|
mesa_absdir = Dir(mesa_dir).abspath
|
|
mesa_gen_absdir = Dir(mesa_dir + "/generated").abspath
|
|
|
|
custom_build_steps = [
|
|
[
|
|
"src/compiler",
|
|
"glsl/ir_expression_operation.py enum > %s/ir_expression_operation.h",
|
|
"ir_expression_operation.h",
|
|
],
|
|
["src/compiler/nir", "nir_builder_opcodes_h.py > %s/nir_builder_opcodes.h", "nir_builder_opcodes.h"],
|
|
["src/compiler/nir", "nir_constant_expressions.py > %s/nir_constant_expressions.c", "nir_constant_expressions.c"],
|
|
["src/compiler/nir", "nir_intrinsics_h.py --outdir %s", "nir_intrinsics.h"],
|
|
["src/compiler/nir", "nir_intrinsics_c.py --outdir %s", "nir_intrinsics.c"],
|
|
["src/compiler/nir", "nir_intrinsics_indices_h.py --outdir %s", "nir_intrinsics_indices.h"],
|
|
["src/compiler/nir", "nir_opcodes_h.py > %s/nir_opcodes.h", "nir_opcodes.h"],
|
|
["src/compiler/nir", "nir_opcodes_c.py > %s/nir_opcodes.c", "nir_opcodes.c"],
|
|
["src/compiler/nir", "nir_opt_algebraic.py > %s/nir_opt_algebraic.c", "nir_opt_algebraic.c"],
|
|
["src/compiler/spirv", "vtn_generator_ids_h.py spir-v.xml %s/vtn_generator_ids.h", "vtn_generator_ids.h"],
|
|
[
|
|
"src/microsoft/compiler",
|
|
"dxil_nir_algebraic.py -p ../../../src/compiler/nir > %s/dxil_nir_algebraic.c",
|
|
"dxil_nir_algebraic.c",
|
|
],
|
|
["src/util", "format_srgb.py > %s/format_srgb.c", "format_srgb.c"],
|
|
["src/util/format", "u_format_table.py u_format.csv --header > %s/u_format_pack.h", "u_format_pack.h"],
|
|
["src/util/format", "u_format_table.py u_format.csv > %s/u_format_table.c", "u_format_table.c"],
|
|
]
|
|
|
|
mesa_gen_include_paths = [mesa_gen_dir + "/src"]
|
|
|
|
# See update_mesa.sh for explanation.
|
|
for v in custom_build_steps:
|
|
subdir = v[0]
|
|
cmd = v[1]
|
|
gen_filename = v[2]
|
|
|
|
in_dir = str(Path(mesa_absdir + "/" + subdir))
|
|
out_full_path = mesa_dir + "/generated/" + subdir
|
|
out_file_full_path = out_full_path + "/" + gen_filename
|
|
|
|
if gen_filename.endswith(".h"):
|
|
mesa_gen_include_paths += [out_full_path.replace("\\", "/")]
|
|
|
|
mesa_private_inc_paths = [v[0] for v in os.walk(mesa_absdir)]
|
|
mesa_private_inc_paths = [v.replace(mesa_absdir, mesa_dir) for v in mesa_private_inc_paths]
|
|
mesa_private_inc_paths = [v.replace("\\", "/") for v in mesa_private_inc_paths]
|
|
# Avoid build results depending on if generated files already exist.
|
|
mesa_private_inc_paths = [v for v in mesa_private_inc_paths if not v.startswith(mesa_gen_dir)]
|
|
mesa_private_inc_paths.sort()
|
|
# Include the list of the generated ones now, so out-of-the-box sources can include generated headers.
|
|
mesa_private_inc_paths += mesa_gen_include_paths
|
|
# We have to blacklist some because we are bindly adding every Mesa directory
|
|
# to the include path and in some cases that causes the wrong header to be included.
|
|
mesa_blacklist_inc_paths = [
|
|
"src/c11",
|
|
]
|
|
mesa_blacklist_inc_paths = [mesa_dir + "/" + v for v in mesa_blacklist_inc_paths]
|
|
mesa_private_inc_paths = [v for v in mesa_private_inc_paths if v not in mesa_blacklist_inc_paths]
|
|
|
|
# Added by ourselves.
|
|
extra_defines = [
|
|
"WINDOWS_NO_FUTEX",
|
|
]
|
|
|
|
mesa_ver = Path(mesa_absdir + "/VERSION.info")
|
|
if not mesa_ver.is_file():
|
|
mesa_ver = Path(mesa_absdir + "/VERSION")
|
|
|
|
# These defines are inspired by the Meson build scripts in the original repo.
|
|
extra_defines += [
|
|
"__STDC_CONSTANT_MACROS",
|
|
"__STDC_FORMAT_MACROS",
|
|
"__STDC_LIMIT_MACROS",
|
|
("PACKAGE_VERSION", '\\"' + mesa_ver.read_text().strip() + '\\"'),
|
|
("PACKAGE_BUGREPORT", '\\"https://gitlab.freedesktop.org/mesa/mesa/-/issues\\"'),
|
|
"PIPE_SUBSYSTEM_WINDOWS_USER",
|
|
("_Static_assert", "static_assert"),
|
|
]
|
|
|
|
if env.msvc:
|
|
extra_defines += [
|
|
"_USE_MATH_DEFINES",
|
|
"VC_EXTRALEAN",
|
|
"_CRT_SECURE_NO_WARNINGS",
|
|
"_CRT_SECURE_NO_DEPRECATE",
|
|
"_SCL_SECURE_NO_WARNINGS",
|
|
"_SCL_SECURE_NO_DEPRECATE",
|
|
"_ALLOW_KEYWORD_MACROS",
|
|
("_HAS_EXCEPTIONS", 0),
|
|
"NOMINMAX",
|
|
"HAVE_STRUCT_TIMESPEC",
|
|
]
|
|
else:
|
|
extra_defines += [
|
|
("__REQUIRED_RPCNDR_H_VERSION__", 475),
|
|
"HAVE_STRUCT_TIMESPEC",
|
|
]
|
|
|
|
# This is needed since rendering_device_d3d12.cpp needs to include some Mesa internals.
|
|
env_d3d12_rdd.Prepend(CPPPATH=mesa_private_inc_paths)
|
|
# For the same reason as above, the defines must be the same as in the 3rd-party code itself.
|
|
env_d3d12_rdd.Append(CPPDEFINES=extra_defines)
|
|
|
|
|
|
# Add all.
|
|
|
|
env.drivers_sources += thirdparty_obj
|
|
|
|
|
|
# Godot source files.
|
|
|
|
driver_obj = []
|
|
env_d3d12_rdd.add_source_files(driver_obj, "*.cpp")
|
|
env.drivers_sources += driver_obj
|
|
|
|
# Needed to force rebuilding the driver files when the thirdparty code is updated.
|
|
env.Depends(driver_obj, thirdparty_obj)
|