Add support for the VK_KHR_shader_float_controls extension.

- Enable shaderSignedZeroInfNanPreserveFloat16 and
  shaderSignedZeroInfNanPreserveFloat32.
  Other float control properties are not settable in Metal.
- MVKShaderModule log whether compiling with fast math enabled.
- Update MoltenVK_Runtime_UserGuide.md and Whats_New.md documents.
- runcts script enable MVK_CONFIG_FAST_MATH_ENABLED by default.
This commit is contained in:
Bill Hollings 2022-08-18 13:35:35 -04:00
parent d447ea7940
commit e0a50c8f2d
6 changed files with 50 additions and 24 deletions

View File

@ -289,6 +289,7 @@ In addition to core *Vulkan* functionality, **MoltenVK** also supports the foll
- `VK_KHR_sampler_ycbcr_conversion`
- `VK_KHR_separate_depth_stencil_layouts`
- `VK_KHR_shader_draw_parameters`
- `VK_KHR_shader_float_controls`
- `VK_KHR_shader_float16_int8`
- `VK_KHR_shader_subgroup_extended_types` *(requires Metal 2.1 on Mac or Metal 2.2 and Apple family 4 on iOS)*
- `VK_KHR_storage_buffer_storage_class`

View File

@ -18,6 +18,8 @@ MoltenVK 1.1.12
Released TBD
- Add support for extensions:
- `VK_KHR_shader_float_controls`
- Fix occassional crash from retention of `MVKSwapchain` for future drawable presentations.
- Add `MVK_USE_CEREAL` build setting to avoid use of Cereal external library (for pipeline caching).

View File

@ -429,23 +429,23 @@ void MVKPhysicalDevice::getProperties(VkPhysicalDeviceProperties2* properties) {
supportedProps12.conformanceVersion.minor = 0;
supportedProps12.conformanceVersion.subminor = 0;
supportedProps12.conformanceVersion.patch = 0;
supportedProps12.denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY; // VK_KHR_shader_float_controls
supportedProps12.roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_32_BIT_ONLY; // VK_KHR_shader_float_controls
supportedProps12.shaderSignedZeroInfNanPreserveFloat16 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderSignedZeroInfNanPreserveFloat32 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderSignedZeroInfNanPreserveFloat64 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormPreserveFloat16 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormPreserveFloat32 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormPreserveFloat64 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormFlushToZeroFloat16 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormFlushToZeroFloat32 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderDenormFlushToZeroFloat64 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTEFloat16 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTEFloat32 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTEFloat64 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTZFloat16 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTZFloat32 = false; // VK_KHR_shader_float_controls
supportedProps12.shaderRoundingModeRTZFloat64 = false; // VK_KHR_shader_float_controls
supportedProps12.denormBehaviorIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE;
supportedProps12.roundingModeIndependence = VK_SHADER_FLOAT_CONTROLS_INDEPENDENCE_NONE;
supportedProps12.shaderSignedZeroInfNanPreserveFloat16 = true;
supportedProps12.shaderSignedZeroInfNanPreserveFloat32 = true;
supportedProps12.shaderSignedZeroInfNanPreserveFloat64 = false;
supportedProps12.shaderDenormPreserveFloat16 = false;
supportedProps12.shaderDenormPreserveFloat32 = false;
supportedProps12.shaderDenormPreserveFloat64 = false;
supportedProps12.shaderDenormFlushToZeroFloat16 = false;
supportedProps12.shaderDenormFlushToZeroFloat32 = false;
supportedProps12.shaderDenormFlushToZeroFloat64 = false;
supportedProps12.shaderRoundingModeRTEFloat16 = false;
supportedProps12.shaderRoundingModeRTEFloat32 = false;
supportedProps12.shaderRoundingModeRTEFloat64 = false;
supportedProps12.shaderRoundingModeRTZFloat16 = false;
supportedProps12.shaderRoundingModeRTZFloat32 = false;
supportedProps12.shaderRoundingModeRTZFloat64 = false;
supportedProps12.maxUpdateAfterBindDescriptorsInAllPools = kMVKUndefinedLargeUInt32;
supportedProps12.shaderUniformBufferArrayNonUniformIndexingNative = false;
supportedProps12.shaderSampledImageArrayNonUniformIndexingNative = _metalFeatures.arrayOfTextures && _metalFeatures.arrayOfSamplers;
@ -612,6 +612,27 @@ void MVKPhysicalDevice::getProperties(VkPhysicalDeviceProperties2* properties) {
texelBuffAlignProps->pNext = pNext;
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES: {
auto* floatControlsProperties = (VkPhysicalDeviceFloatControlsProperties*)next;
floatControlsProperties->denormBehaviorIndependence = supportedProps12.denormBehaviorIndependence;
floatControlsProperties->roundingModeIndependence = supportedProps12.roundingModeIndependence;
floatControlsProperties->shaderSignedZeroInfNanPreserveFloat16 = supportedProps12.shaderSignedZeroInfNanPreserveFloat16;
floatControlsProperties->shaderSignedZeroInfNanPreserveFloat32 = supportedProps12.shaderSignedZeroInfNanPreserveFloat32;
floatControlsProperties->shaderSignedZeroInfNanPreserveFloat64 = supportedProps12.shaderSignedZeroInfNanPreserveFloat64;
floatControlsProperties->shaderDenormPreserveFloat16 = supportedProps12.shaderDenormPreserveFloat16;
floatControlsProperties->shaderDenormPreserveFloat32 = supportedProps12.shaderDenormPreserveFloat32;
floatControlsProperties->shaderDenormPreserveFloat64 = supportedProps12.shaderDenormPreserveFloat64;
floatControlsProperties->shaderDenormFlushToZeroFloat16 = supportedProps12.shaderDenormFlushToZeroFloat16;
floatControlsProperties->shaderDenormFlushToZeroFloat32 = supportedProps12.shaderDenormFlushToZeroFloat32;
floatControlsProperties->shaderDenormFlushToZeroFloat64 = supportedProps12.shaderDenormFlushToZeroFloat64;
floatControlsProperties->shaderRoundingModeRTEFloat16 = supportedProps12.shaderRoundingModeRTEFloat16;
floatControlsProperties->shaderRoundingModeRTEFloat32 = supportedProps12.shaderRoundingModeRTEFloat32;
floatControlsProperties->shaderRoundingModeRTEFloat64 = supportedProps12.shaderRoundingModeRTEFloat64;
floatControlsProperties->shaderRoundingModeRTZFloat16 = supportedProps12.shaderRoundingModeRTZFloat16;
floatControlsProperties->shaderRoundingModeRTZFloat32 = supportedProps12.shaderRoundingModeRTZFloat32;
floatControlsProperties->shaderRoundingModeRTZFloat64 = supportedProps12.shaderRoundingModeRTZFloat64;
break;
}
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR: {
auto* barycentricProperties = (VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR*)next;
barycentricProperties->triStripVertexOrderIndependentOfProvokingVertex = false;
@ -4568,10 +4589,9 @@ void MVKDevice::enableFeatures(VkBool32* pEnabledBools, const VkBool32* pRequest
}
void MVKDevice::enableExtensions(const VkDeviceCreateInfo* pCreateInfo) {
MVKExtensionList* pWritableExtns = (MVKExtensionList*)&_enabledExtensions;
setConfigurationResult(pWritableExtns->enable(pCreateInfo->enabledExtensionCount,
pCreateInfo->ppEnabledExtensionNames,
&_physicalDevice->_supportedExtensions));
setConfigurationResult(_enabledExtensions.enable(pCreateInfo->enabledExtensionCount,
pCreateInfo->ppEnabledExtensionNames,
&_physicalDevice->_supportedExtensions));
}
// Create the command queues

View File

@ -447,9 +447,11 @@ id<MTLLibrary> MVKShaderLibraryCompiler::newMTLLibrary(NSString* mslSourceCode,
compile(lock, ^{
auto mtlDev = _owner->getMTLDevice();
@synchronized (mtlDev) {
auto mtlCompileOptions = _owner->getDevice()->getMTLCompileOptions(shaderConversionResults.entryPoint.supportsFastMath,
shaderConversionResults.isPositionInvariant);
MVKLogInfoIf(mvkConfig().debugMode, "Compiling Metal shader%s.", mtlCompileOptions.fastMathEnabled ? " with FastMath enabled" : "");
[mtlDev newLibraryWithSource: mslSourceCode
options: _owner->getDevice()->getMTLCompileOptions(shaderConversionResults.entryPoint.supportsFastMath,
shaderConversionResults.isPositionInvariant)
options: mtlCompileOptions
completionHandler: ^(id<MTLLibrary> mtlLib, NSError* error) {
bool isLate = compileComplete(mtlLib, error);
if (isLate) { destroy(); }

View File

@ -76,6 +76,7 @@ MVK_EXTENSION(KHR_sampler_mirror_clamp_to_edge, KHR_SAMPLER_MIRROR_CLAMP_TO_E
MVK_EXTENSION(KHR_sampler_ycbcr_conversion, KHR_SAMPLER_YCBCR_CONVERSION, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_separate_depth_stencil_layouts, KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_shader_draw_parameters, KHR_SHADER_DRAW_PARAMETERS, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_shader_float_controls, KHR_SHADER_FLOAT_CONTROLS, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_shader_float16_int8, KHR_SHADER_FLOAT16_INT8, DEVICE, 10.11, 8.0)
MVK_EXTENSION(KHR_shader_subgroup_extended_types, KHR_SHADER_SUBGROUP_EXTENDED_TYPES, DEVICE, 10.14, 13.0)
MVK_EXTENSION(KHR_storage_buffer_storage_class, KHR_STORAGE_BUFFER_STORAGE_CLASS, DEVICE, 10.11, 8.0)

View File

@ -105,7 +105,7 @@ export MVK_DEBUG=0
# Additional MoltenVK configuration can be set here by
# editing below, or can be set before calling this script.
export MVK_CONFIG_RESUME_LOST_DEVICE=1
export MVK_CONFIG_FAST_MATH_ENABLED=0
export MVK_CONFIG_FAST_MATH_ENABLED=1
export MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS=0
export MVK_CONFIG_FORCE_LOW_POWER_GPU=0