123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #!/usr/bin/env python
- from misc.utility.scons_hints import *
- import os
- from pathlib import Path
- import methods
- 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 += [
- "HAVE_STRUCT_TIMESPEC",
- ]
- if methods.using_gcc(env) and methods.get_compiler_version(env)["major"] < 13:
- # `region` & `endregion` not recognized as valid pragmas.
- env_d3d12_rdd.Append(CCFLAGS=["-Wno-unknown-pragmas"])
- env.Append(CCFLAGS=["-Wno-unknown-pragmas"])
- # 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)
|