diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md index 35028b9d..2e8fdfff 100644 --- a/Docs/Whats_New.md +++ b/Docs/Whats_New.md @@ -21,7 +21,15 @@ Released TBD - Support maximum point primitive size of 511. - Improved checks for timestamp GPU counter support on older devices. - Update to latest SPIRV-Cross version: - - Add support for `OpSpecConstantOp` ops `OpQuantizeToF16` and `OpSRem`. + - MSL: Add support for `OpSpecConstantOp` ops `OpQuantizeToF16` and `OpSRem`. + - MSL: Return fragment function value even when last SPIR-V Op is discard (`OpKill`). + - MSL: Fix location and component variable matching between shader stages. + - MSL: Track location component to match vecsize between shader stages. + - MSL: Selectively enable `fast-math` in MSL code to match Vulkan CTS results. + - MSL: Honor `DecorationNoContraction` when compiling using `fast-math`. + - MSL: Honor infinities in `OpQuantizeToF16` when compiling using `fast-math`. + - MSL: Support synthetic functions in function constants. + - MSL: Improve handling of `INT_MIN/INT64_MIN` literals. diff --git a/ExternalDependencies.xcodeproj/project.pbxproj b/ExternalDependencies.xcodeproj/project.pbxproj index 2753539a..f92a13b8 100644 --- a/ExternalDependencies.xcodeproj/project.pbxproj +++ b/ExternalDependencies.xcodeproj/project.pbxproj @@ -1226,6 +1226,18 @@ A9560DDC25E46D1F008BC84F /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A95604FC25E46D1D008BC84F /* decoration.h */; }; A9560DDD25E46D1F008BC84F /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A95604FC25E46D1D008BC84F /* decoration.h */; }; A9560DDE25E46D1F008BC84F /* decoration.h in Headers */ = {isa = PBXBuildFile; fileRef = A95604FC25E46D1D008BC84F /* decoration.h */; }; + A9717C0526EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0326EE8C570041AE82 /* spirv_cross_containers.hpp */; }; + A9717C0626EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0326EE8C570041AE82 /* spirv_cross_containers.hpp */; }; + A9717C0726EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0326EE8C570041AE82 /* spirv_cross_containers.hpp */; }; + A9717C0826EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0426EE8C570041AE82 /* spirv_cross_error_handling.hpp */; }; + A9717C0926EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0426EE8C570041AE82 /* spirv_cross_error_handling.hpp */; }; + A9717C0A26EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0426EE8C570041AE82 /* spirv_cross_error_handling.hpp */; }; + A9717C0C26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0B26EE8C730041AE82 /* spirv_cross_util.hpp */; }; + A9717C0D26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0B26EE8C730041AE82 /* spirv_cross_util.hpp */; }; + A9717C0E26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0B26EE8C730041AE82 /* spirv_cross_util.hpp */; }; + A9717C1026EE8C9D0041AE82 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0F26EE8C9D0041AE82 /* spirv.hpp */; }; + A9717C1126EE8C9D0041AE82 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0F26EE8C9D0041AE82 /* spirv.hpp */; }; + A9717C1226EE8C9D0041AE82 /* spirv.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A9717C0F26EE8C9D0041AE82 /* spirv.hpp */; }; A976290F21CC60BC00B52A68 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; }; A976291021CC60BC00B52A68 /* spirv_msl.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290221CC60BC00B52A68 /* spirv_msl.hpp */; }; A976291121CC60BC00B52A68 /* spirv_cross.hpp in Headers */ = {isa = PBXBuildFile; fileRef = A976290321CC60BC00B52A68 /* spirv_cross.hpp */; }; @@ -2025,6 +2037,10 @@ A95604FA25E46D1D008BC84F /* validation_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validation_state.cpp; sourceTree = ""; }; A95604FB25E46D1D008BC84F /* validate_primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_primitives.cpp; sourceTree = ""; }; A95604FC25E46D1D008BC84F /* decoration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration.h; sourceTree = ""; }; + A9717C0326EE8C570041AE82 /* spirv_cross_containers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = spirv_cross_containers.hpp; path = spirv_cross_containers.hpp; sourceTree = ""; }; + A9717C0426EE8C570041AE82 /* spirv_cross_error_handling.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = spirv_cross_error_handling.hpp; path = spirv_cross_error_handling.hpp; sourceTree = ""; }; + A9717C0B26EE8C730041AE82 /* spirv_cross_util.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = spirv_cross_util.hpp; path = spirv_cross_util.hpp; sourceTree = ""; }; + A9717C0F26EE8C9D0041AE82 /* spirv.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = spirv.hpp; path = spirv.hpp; sourceTree = ""; }; A972A80F21CECBBF0013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; }; A972A82321CECBE90013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; }; A972ABDC21CED7BC0013AB25 /* libglslang.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libglslang.a; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -2648,8 +2664,11 @@ A976290B21CC60BC00B52A68 /* spirv_cfg.cpp */, A976290921CC60BC00B52A68 /* spirv_cfg.hpp */, A976290721CC60BC00B52A68 /* spirv_common.hpp */, + A9717C0326EE8C570041AE82 /* spirv_cross_containers.hpp */, + A9717C0426EE8C570041AE82 /* spirv_cross_error_handling.hpp */, A976290E21CC60BC00B52A68 /* spirv_cross_parsed_ir.cpp */, A976290821CC60BC00B52A68 /* spirv_cross_parsed_ir.hpp */, + A9717C0B26EE8C730041AE82 /* spirv_cross_util.hpp */, A976290521CC60BC00B52A68 /* spirv_cross.cpp */, A976290321CC60BC00B52A68 /* spirv_cross.hpp */, A976290621CC60BC00B52A68 /* spirv_glsl.cpp */, @@ -2660,6 +2679,7 @@ A976290C21CC60BC00B52A68 /* spirv_parser.hpp */, 450A4F64221C5A95007203D7 /* spirv_reflect.cpp */, 450A4F63221C5A95007203D7 /* spirv_reflect.hpp */, + A9717C0F26EE8C9D0041AE82 /* spirv.hpp */, ); path = "SPIRV-Cross"; sourceTree = ""; @@ -3133,6 +3153,10 @@ 2FEA0CDD2490322B00EEF3AD /* spirv_common.hpp in Headers */, 2FEA0CDE2490322B00EEF3AD /* spirv_glsl.hpp in Headers */, 2FEA0CDF2490322B00EEF3AD /* spirv_parser.hpp in Headers */, + A9717C0D26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */, + A9717C0626EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */, + A9717C1126EE8C9D0041AE82 /* spirv.hpp in Headers */, + A9717C0926EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */, 2FEA0CE02490322B00EEF3AD /* spirv_cross.hpp in Headers */, 2FEA0CE12490322B00EEF3AD /* spirv_msl.hpp in Headers */, 2FEA0CE22490322B00EEF3AD /* spirv_reflect.hpp in Headers */, @@ -3650,6 +3674,10 @@ A976291A21CC60BC00B52A68 /* spirv_common.hpp in Headers */, A976292021CC60BC00B52A68 /* spirv_glsl.hpp in Headers */, A976292421CC60BC00B52A68 /* spirv_parser.hpp in Headers */, + A9717C0E26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */, + A9717C0726EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */, + A9717C1226EE8C9D0041AE82 /* spirv.hpp in Headers */, + A9717C0A26EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */, A976291221CC60BC00B52A68 /* spirv_cross.hpp in Headers */, A976291021CC60BC00B52A68 /* spirv_msl.hpp in Headers */, 450A4F66221C5A95007203D7 /* spirv_reflect.hpp in Headers */, @@ -3665,6 +3693,10 @@ A976291921CC60BC00B52A68 /* spirv_common.hpp in Headers */, A976291F21CC60BC00B52A68 /* spirv_glsl.hpp in Headers */, A976292321CC60BC00B52A68 /* spirv_parser.hpp in Headers */, + A9717C0C26EE8C730041AE82 /* spirv_cross_util.hpp in Headers */, + A9717C0526EE8C570041AE82 /* spirv_cross_containers.hpp in Headers */, + A9717C1026EE8C9D0041AE82 /* spirv.hpp in Headers */, + A9717C0826EE8C570041AE82 /* spirv_cross_error_handling.hpp in Headers */, A976291121CC60BC00B52A68 /* spirv_cross.hpp in Headers */, A976290F21CC60BC00B52A68 /* spirv_msl.hpp in Headers */, 450A4F65221C5A95007203D7 /* spirv_reflect.hpp in Headers */, diff --git a/ExternalRevisions/README.md b/ExternalRevisions/README.md index 0af69c5a..ad5ba928 100644 --- a/ExternalRevisions/README.md +++ b/ExternalRevisions/README.md @@ -124,8 +124,11 @@ if you encounter any building errors, you may need to re-add the *SPIRV-Cross* l spirv_cfg.cpp spirv_cfg.hpp spirv_common.hpp + spirv_cross_containers.hpp + spirv_cross_error_handling.hpp spirv_cross_parsed_ir.cpp spirv_cross_parsed_ir.hpp + spirv_cross_util.hpp spirv_cross.cpp spirv_cross.hpp spirv_glsl.cpp @@ -134,6 +137,9 @@ if you encounter any building errors, you may need to re-add the *SPIRV-Cross* l spirv_msl.hpp spirv_parser.cpp spirv_parser.hpp + spirv_reflect.cpp + spirv_reflect.hpp + spirv.hpp In the ***Choose options for adding these files*** dialog that opens, select the ***Create groups*** option, add the files to *all* of the `SPIRV-Cross-macOS`, `SPIRV-Cross-iOS`, and `SPIRV-Cross-tvOS` targets, diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm index b47ad782..672a5dda 100644 --- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm +++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm @@ -1655,6 +1655,7 @@ void MVKGraphicsPipeline::addPrevStageOutputToShaderConversionConfig(SPIRVToMSLC mvk::MSLShaderInput si; si.shaderInput.location = shaderOutputs[siIdx].location; + si.shaderInput.component = shaderOutputs[siIdx].component; si.shaderInput.builtin = shaderOutputs[siIdx].builtin; si.shaderInput.vecsize = shaderOutputs[siIdx].vecWidth; @@ -2129,6 +2130,7 @@ namespace SPIRV_CROSS_NAMESPACE { template void serialize(Archive & archive, MSLShaderInput& si) { archive(si.location, + si.component, si.format, si.builtin, si.vecsize); diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h index a9305ee8..f96f693e 100644 --- a/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h +++ b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h @@ -64,6 +64,9 @@ namespace mvk { /** The location number of the output. */ uint32_t location; + /** The component index of the output. */ + uint32_t component; + /** If this is a builtin, the kind of builtin this is. */ spv::BuiltIn builtin; @@ -202,9 +205,13 @@ namespace mvk { isUsed = reflect.has_active_builtin(biType, storage); } uint32_t loc = -1; + uint32_t cmp = 0; if (reflect.has_decoration(varID, spv::DecorationLocation)) { loc = reflect.get_decoration(varID, spv::DecorationLocation); } + if (reflect.has_decoration(varID, spv::DecorationComponent)) { + cmp = reflect.get_decoration(varID, spv::DecorationComponent); + } if (model == spv::ExecutionModelTessellationControl && !patch) type = &reflect.get_type(type->parent_type); @@ -213,8 +220,10 @@ namespace mvk { // Each member may have a location decoration. If not, each member // gets an incrementing location. uint32_t memberLoc = addSat(loc, idx); + uint32_t memberCmp = 0; if (reflect.has_member_decoration(type->self, idx, spv::DecorationLocation)) { memberLoc = reflect.get_member_decoration(type->self, idx, spv::DecorationLocation); + memberCmp = reflect.get_member_decoration(type->self, idx, spv::DecorationComponent); } patch = patch || reflect.has_member_decoration(type->self, idx, spv::DecorationPatch); if (reflect.has_member_decoration(type->self, idx, spv::DecorationBuiltIn)) { @@ -224,26 +233,26 @@ namespace mvk { const SPIRV_CROSS_NAMESPACE::SPIRType& memberType = reflect.get_type(type->member_types[idx]); if (memberType.columns > 1) { for (uint32_t i = 0; i < memberType.columns; i++) { - outputs.push_back({memberType.basetype, memberType.vecsize, addSat(memberLoc, i), biType, patch, isUsed}); + outputs.push_back({memberType.basetype, memberType.vecsize, addSat(memberLoc, i), memberCmp, biType, patch, isUsed}); } } else if (!memberType.array.empty()) { for (uint32_t i = 0; i < memberType.array[0]; i++) { - outputs.push_back({memberType.basetype, memberType.vecsize, addSat(memberLoc, i), biType, patch, isUsed}); + outputs.push_back({memberType.basetype, memberType.vecsize, addSat(memberLoc, i), memberCmp, biType, patch, isUsed}); } } else { - outputs.push_back({memberType.basetype, memberType.vecsize, memberLoc, biType, patch, isUsed}); + outputs.push_back({memberType.basetype, memberType.vecsize, memberLoc, memberCmp, biType, patch, isUsed}); } } } else if (type->columns > 1) { for (uint32_t i = 0; i < type->columns; i++) { - outputs.push_back({type->basetype, type->vecsize, addSat(loc, i), biType, patch, isUsed}); + outputs.push_back({type->basetype, type->vecsize, addSat(loc, i), cmp, biType, patch, isUsed}); } } else if (!type->array.empty()) { for (uint32_t i = 0; i < type->array[0]; i++) { - outputs.push_back({type->basetype, type->vecsize, addSat(loc, i), biType, patch, isUsed}); + outputs.push_back({type->basetype, type->vecsize, addSat(loc, i), cmp, biType, patch, isUsed}); } } else { - outputs.push_back({type->basetype, type->vecsize, loc, biType, patch, isUsed}); + outputs.push_back({type->basetype, type->vecsize, loc, cmp, biType, patch, isUsed}); } } // Sort outputs by ascending location. diff --git a/Scripts/runcts b/Scripts/runcts index df894777..90a02630 100755 --- a/Scripts/runcts +++ b/Scripts/runcts @@ -29,7 +29,7 @@ # The path to the directory containing the built CTS executable. # If this parameter is not provided, it defaults to: # "../../VK-GL-CTS/build/external/vulkancts/modules/vulkan/Debug". -# +# # -p # Same as the --portability option. #