summaryrefslogtreecommitdiffstats
path: root/source/slang
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-04-19 21:02:32 -0700
committerGitHub <noreply@github.com>2024-04-19 21:02:32 -0700
commitbeae3a9d219dac1e4e3da9c357b25d06370388f3 (patch)
treeca4eb2a8e9ca67a130e3894c517114709576af75 /source/slang
parentf9bcad35562c1f08638e6d3eb397d370d7d2f8f8 (diff)
Add metal downstream compiler + metallib target. (#3990)
* Add metal downstream compiler + metallib target. * Add more comments. * Add missing override.
Diffstat (limited to 'source/slang')
-rw-r--r--source/slang/slang-capabilities.capdef10
-rw-r--r--source/slang/slang-compiler.cpp10
-rwxr-xr-xsource/slang/slang-compiler.h2
-rw-r--r--source/slang/slang-emit-c-like.cpp2
-rw-r--r--source/slang/slang-ir-link.cpp2
-rw-r--r--source/slang/slang-options.cpp3
-rw-r--r--source/slang/slang-profile-defs.h8
-rw-r--r--source/slang/slang-type-layout.cpp4
-rw-r--r--source/slang/slang.cpp14
9 files changed, 52 insertions, 3 deletions
diff --git a/source/slang/slang-capabilities.capdef b/source/slang/slang-capabilities.capdef
index 4e31948a2..fe11be4b2 100644
--- a/source/slang/slang-capabilities.capdef
+++ b/source/slang/slang-capabilities.capdef
@@ -95,6 +95,10 @@ def glsl_spirv_1_4 : glsl_spirv_1_3;
def glsl_spirv_1_5 : glsl_spirv_1_4;
def glsl_spirv_1_6 : glsl_spirv_1_5;
+def metallib_2_3 : metal;
+def metallib_2_4 : metallib_2_3;
+
+
abstract stage;
def vertex : stage;
def fragment : stage;
@@ -572,6 +576,10 @@ alias DX_6_5 = sm_6_5;
alias DX_6_6 = sm_6_6;
alias DX_6_7 = sm_6_7;
+
+alias METAL_2_3 = metallib_2_3;
+alias METAL_2_4 = metallib_2_4;
+
alias sm_2_0_GLSL_140 = sm_4_0 | glsl | spirv_1_0 | cuda | cpp;
alias sm_2_0_GLSL_400 = sm_4_0 | glsl | spirv_1_0 | cuda | cpp;
alias appendstructuredbuffer = sm_5_0 + raytracing_stages_compute_fragment;
@@ -679,4 +687,4 @@ alias all = _sm_6_7 + hlsl_nvapi
+ _GL_NV_ray_tracing_motion_blur + _GL_NV_shader_texture_footprint
| spirv_1_5 + sm_6_7
+ ser + shaderclock + texturefootprint + fragmentshaderinterlock + spvGroupNonUniformPartitionedNV
- + spvRayTracingMotionBlurNV + spvRayTracingMotionBlurNV; \ No newline at end of file
+ + spvRayTracingMotionBlurNV + spvRayTracingMotionBlurNV;
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index 04536c81a..851e3115b 100644
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -530,6 +530,11 @@ namespace Slang
{
return PassThroughMode::Glslang;
}
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
+ {
+ return PassThroughMode::MetalC;
+ }
case CodeGenTarget::ShaderHostCallable:
case CodeGenTarget::ShaderSharedLibrary:
case CodeGenTarget::HostExecutable:
@@ -957,6 +962,7 @@ namespace Slang
case CodeGenTarget::DXBytecode: return CodeGenTarget::HLSL;
case CodeGenTarget::DXIL: return CodeGenTarget::HLSL;
case CodeGenTarget::SPIRV: return CodeGenTarget::GLSL;
+ case CodeGenTarget::MetalLib: return CodeGenTarget::Metal;
default: break;
}
return CodeGenTarget::Unknown;
@@ -1546,6 +1552,7 @@ namespace Slang
case CodeGenTarget::SPIRVAssembly:
case CodeGenTarget::DXBytecodeAssembly:
case CodeGenTarget::DXILAssembly:
+ case CodeGenTarget::MetalLibAssembly:
{
// First compile to an intermediate target for the corresponding binary format.
const CodeGenTarget intermediateTarget = _getIntermediateTarget(target);
@@ -1573,6 +1580,7 @@ namespace Slang
[[fallthrough]];
case CodeGenTarget::DXIL:
case CodeGenTarget::DXBytecode:
+ case CodeGenTarget::MetalLib:
case CodeGenTarget::PTX:
case CodeGenTarget::ShaderHostCallable:
case CodeGenTarget::ShaderSharedLibrary:
@@ -1602,6 +1610,8 @@ namespace Slang
case CodeGenTarget::SPIRV:
case CodeGenTarget::DXIL:
case CodeGenTarget::DXBytecode:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
case CodeGenTarget::PTX:
case CodeGenTarget::HostHostCallable:
case CodeGenTarget::ShaderHostCallable:
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h
index 7f7903f8b..266c503ae 100755
--- a/source/slang/slang-compiler.h
+++ b/source/slang/slang-compiler.h
@@ -93,6 +93,8 @@ namespace Slang
ObjectCode = SLANG_OBJECT_CODE,
HostHostCallable = SLANG_HOST_HOST_CALLABLE,
Metal = SLANG_METAL,
+ MetalLib = SLANG_METAL_LIB,
+ MetalLibAssembly = SLANG_METAL_LIB_ASM,
CountOf = SLANG_TARGET_COUNT_OF,
};
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index 1926cbdcb..38708ae5e 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -74,6 +74,8 @@ struct CLikeSourceEmitter::ComputeEmitActionsContext
case CodeGenTarget::DXBytecodeAssembly:
case CodeGenTarget::DXIL:
case CodeGenTarget::DXILAssembly:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
{
return SourceLanguage::Unknown;
}
diff --git a/source/slang/slang-ir-link.cpp b/source/slang/slang-ir-link.cpp
index 86e255705..4871062d4 100644
--- a/source/slang/slang-ir-link.cpp
+++ b/source/slang/slang-ir-link.cpp
@@ -1468,6 +1468,8 @@ static bool doesTargetAllowUnresolvedFuncSymbol(TargetRequest* req)
{
case CodeGenTarget::HLSL:
case CodeGenTarget::Metal:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
case CodeGenTarget::DXIL:
case CodeGenTarget::DXILAssembly:
case CodeGenTarget::HostCPPSource:
diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp
index 896388db0..13a11f10b 100644
--- a/source/slang/slang-options.cpp
+++ b/source/slang/slang-options.cpp
@@ -2816,6 +2816,9 @@ SlangResult OptionsParser::_parse(
case CodeGenTarget::ShaderSharedLibrary:
case CodeGenTarget::PyTorchCppBinding:
case CodeGenTarget::DXIL:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
+ case CodeGenTarget::Metal:
rawOutput.isWholeProgram = true;
break;
case CodeGenTarget::SPIRV:
diff --git a/source/slang/slang-profile-defs.h b/source/slang/slang-profile-defs.h
index 9a9c128a5..826555d1b 100644
--- a/source/slang/slang-profile-defs.h
+++ b/source/slang/slang-profile-defs.h
@@ -49,7 +49,7 @@ LANGUAGE(SPIRV, spirv)
LANGUAGE(SPIRV_GL, spirv_gl)
LANGUAGE(C, c)
LANGUAGE(CPP, cpp)
-
+LANGUAGE(METAL, metal)
LANGUAGE_ALIAS(GLSL, glsl_gl)
LANGUAGE_ALIAS(SPIRV, spirv_vk)
@@ -86,6 +86,7 @@ PROFILE_STAGE_ALIAS(Fragment, fragment, Pixel)
PROFILE_FAMILY(DX)
PROFILE_FAMILY(GLSL)
+PROFILE_FAMILY(METAL)
// Profile versions
PROFILE_VERSION(DX_4_0, DX)
@@ -111,6 +112,9 @@ PROFILE_VERSION(GLSL_440, GLSL)
PROFILE_VERSION(GLSL_450, GLSL)
PROFILE_VERSION(GLSL_460, GLSL)
+PROFILE_VERSION(METAL_2_3, METAL)
+PROFILE_VERSION(METAL_2_4, METAL)
+
// Specific profiles
PROFILE(DX_Compute_4_0, cs_4_0, Compute, DX_4_0)
@@ -229,6 +233,8 @@ PROFILE_ALIAS(DX_None_6_5, DX_Lib_6_5, sm_6_5)
PROFILE_ALIAS(DX_None_6_6, DX_Lib_6_6, sm_6_6)
PROFILE_ALIAS(DX_None_6_7, DX_Lib_6_7, sm_6_7)
+PROFILE(METAL_LIB_2_3, metallib_2_3, Unknown, METAL_2_3)
+PROFILE(METAL_LIB_2_4, metallib_2_4, Unknown, METAL_2_4)
// Define all the GLSL profiles
diff --git a/source/slang/slang-type-layout.cpp b/source/slang/slang-type-layout.cpp
index a350226c8..00f365ac3 100644
--- a/source/slang/slang-type-layout.cpp
+++ b/source/slang/slang-type-layout.cpp
@@ -1550,6 +1550,8 @@ LayoutRulesFamilyImpl* getDefaultLayoutRulesFamilyForTarget(TargetRequest* targe
case CodeGenTarget::CPPSource:
case CodeGenTarget::CSource:
case CodeGenTarget::Metal:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
{
// For now lets use some fairly simple CPU binding rules
@@ -1820,6 +1822,8 @@ SourceLanguage getIntermediateSourceLanguageForTarget(TargetProgram* targetProgr
return SourceLanguage::HLSL;
}
case CodeGenTarget::Metal:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
{
return SourceLanguage::Metal;
}
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 437f0cd63..971d6056f 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -257,11 +257,13 @@ void Session::_initCodeGenTransitionMap()
map.addTransition(CodeGenTarget::HLSL, CodeGenTarget::DXBytecode, PassThroughMode::Fxc);
map.addTransition(CodeGenTarget::HLSL, CodeGenTarget::DXIL, PassThroughMode::Dxc);
map.addTransition(CodeGenTarget::GLSL, CodeGenTarget::SPIRV, PassThroughMode::Glslang);
-
+ map.addTransition(CodeGenTarget::Metal, CodeGenTarget::MetalLib, PassThroughMode::MetalC);
// To assembly
map.addTransition(CodeGenTarget::SPIRV, CodeGenTarget::SPIRVAssembly, PassThroughMode::Glslang);
map.addTransition(CodeGenTarget::DXIL, CodeGenTarget::DXILAssembly, PassThroughMode::Dxc);
map.addTransition(CodeGenTarget::DXBytecode, CodeGenTarget::DXBytecodeAssembly, PassThroughMode::Fxc);
+ map.addTransition(CodeGenTarget::MetalLib, CodeGenTarget::MetalLibAssembly, PassThroughMode::MetalC);
+
}
void Session::addBuiltins(
@@ -930,6 +932,14 @@ Profile getEffectiveProfile(EntryPoint* entryPoint, TargetRequest* target)
targetProfile.setVersion(ProfileVersion::DX_5_1);
}
break;
+ case CodeGenTarget::Metal:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
+ if (targetProfile.getFamily() != ProfileFamily::METAL)
+ {
+ targetProfile.setVersion(ProfileVersion::METAL_2_3);
+ }
+ break;
}
auto entryPointProfileVersion = entryPointProfile.getVersion();
@@ -1710,6 +1720,8 @@ CapabilitySet TargetRequest::getTargetCaps()
break;
case CodeGenTarget::Metal:
+ case CodeGenTarget::MetalLib:
+ case CodeGenTarget::MetalLibAssembly:
atoms.add(CapabilityName::metal);
break;