diff options
| author | Yong He <yonghe@outlook.com> | 2024-04-19 21:02:32 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-19 21:02:32 -0700 |
| commit | beae3a9d219dac1e4e3da9c357b25d06370388f3 (patch) | |
| tree | ca4eb2a8e9ca67a130e3894c517114709576af75 /source/slang | |
| parent | f9bcad35562c1f08638e6d3eb397d370d7d2f8f8 (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.capdef | 10 | ||||
| -rw-r--r-- | source/slang/slang-compiler.cpp | 10 | ||||
| -rwxr-xr-x | source/slang/slang-compiler.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir-link.cpp | 2 | ||||
| -rw-r--r-- | source/slang/slang-options.cpp | 3 | ||||
| -rw-r--r-- | source/slang/slang-profile-defs.h | 8 | ||||
| -rw-r--r-- | source/slang/slang-type-layout.cpp | 4 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 14 |
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; |
