Merge branch 'master' of https://github.com/billhollings/MoltenVK
diff --git a/Common/MVKLogging.h b/Common/MVKLogging.h
index c7af750..0975ccd 100644
--- a/Common/MVKLogging.h
+++ b/Common/MVKLogging.h
@@ -183,7 +183,7 @@
 	char lvlFmt[strlen(lvlStr) + strlen(format) + 5];
 	sprintf(lvlFmt, "[%s] %s\n", lvlStr, format);
 
-	if (logToPrintf) { vprintf(lvlFmt, args); }
+	if (logToPrintf) { vfprintf(stderr, lvlFmt, args); }
 //	if (logToASL) { asl_vlog(NULL, NULL, aslLvl, lvlFmt, args); }       // Multi-threaded ASL support requires a separate ASL client to be opened per thread!
 }
 
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 8acf695..75975f6 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -33,9 +33,10 @@
 - Allow default GPU Capture scope to be assigned to any queue in any queue family.
 - VkPhysicalDevice: Correct some features and limits.
 - Stop advertising atomic image support.
-- Enhancements to `MVKVector`, and set appropriate inline sizing usages.
-- `fetchDependencies`: build `spirv-tools` when attached via symlink.
 - vkSetMTLTextureMVK() function retains texture object.
+- Log to stderr instead of stdout.
+- `fetchDependencies`: build `spirv-tools` when attached via symlink.
+- Enhancements to `MVKVector`, and set appropriate inline sizing usages.
 - Update `VK_MVK_MOLTENVK_SPEC_VERSION` to 17.
 - Update to latest SPIRV-Cross version:
 	- MSL: Deal with resource name aliasing.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index 4c6e8a0..0049e43 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -694,6 +694,10 @@
 		_metalFeatures.arrayOfSamplers = true;
 	}
 
+	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) {
+		_metalFeatures.layeredRendering = true;
+	}
+
 #endif
 
 #if MVK_MACOS
@@ -731,6 +735,10 @@
 
 #endif
 
+    if ( [_mtlDevice respondsToSelector: @selector(maxBufferLength)] ) {
+        _metalFeatures.maxMTLBufferSize = _mtlDevice.maxBufferLength;
+    }
+
     for (uint32_t sc = VK_SAMPLE_COUNT_1_BIT; sc <= VK_SAMPLE_COUNT_64_BIT; sc <<= 1) {
         if ([_mtlDevice supportsTextureSampleCount: mvkSampleCountFromVkSampleCountFlagBits((VkSampleCountFlagBits)sc)]) {
             _metalFeatures.supportedSampleCounts |= sc;
@@ -760,7 +768,9 @@
     _features.shaderStorageBufferArrayDynamicIndexing = true;
     _features.shaderClipDistance = true;
     _features.shaderInt16 = true;
-	_features.multiDrawIndirect = true;
+    _features.multiDrawIndirect = true;
+    _features.variableMultisampleRate = true;
+    _features.inheritedQueries = true;
 
 	_features.shaderSampledImageArrayDynamicIndexing = _metalFeatures.arrayOfTextures;
 	_features.shaderStorageImageArrayDynamicIndexing = _metalFeatures.arrayOfTextures;
@@ -780,11 +790,11 @@
         _features.occlusionQueryPrecise = true;
     }
 
-  if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v4] ) {
+	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v4] ) {
 		_features.dualSrcBlend = true;
 	}
 
-  if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily2_v4] ) {
+	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily2_v4] ) {
 		_features.depthClamp = true;
 	}
   
@@ -873,8 +883,8 @@
 //    VkBool32    sparseResidency8Samples;
 //    VkBool32    sparseResidency16Samples;
 //    VkBool32    sparseResidencyAliased;
-//    VkBool32    variableMultisampleRate;
-//    VkBool32    inheritedQueries;
+//    VkBool32    variableMultisampleRate;                      // done
+//    VkBool32    inheritedQueries;                             // done
 //} VkPhysicalDeviceFeatures;
 
 /** Initializes the physical device properties of this instance. */
@@ -900,7 +910,16 @@
 #endif
 
     _properties.limits.maxFragmentOutputAttachments = _properties.limits.maxColorAttachments;
-    _properties.limits.maxFragmentDualSrcAttachments = _properties.limits.maxFragmentOutputAttachments;
+#if MVK_IOS
+    if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily1_v4] ) {
+        _properties.limits.maxFragmentDualSrcAttachments = 1;
+    } else {
+        _properties.limits.maxFragmentDualSrcAttachments = 0;
+    }
+#endif
+#if MVK_MACOS
+    _properties.limits.maxFragmentDualSrcAttachments = 1;
+#endif
 
 	_properties.limits.framebufferColorSampleCounts = _metalFeatures.supportedSampleCounts;
 	_properties.limits.framebufferDepthSampleCounts = _metalFeatures.supportedSampleCounts;
@@ -917,15 +936,11 @@
 	_properties.limits.maxImageDimensionCube = _metalFeatures.maxTextureDimension;
 	_properties.limits.maxFramebufferWidth = _metalFeatures.maxTextureDimension;
 	_properties.limits.maxFramebufferHeight = _metalFeatures.maxTextureDimension;
-#if MVK_IOS
-	if ( [_mtlDevice supportsFeatureSet: MTLFeatureSet_iOS_GPUFamily5_v1] ) {
+	if ( _metalFeatures.layeredRendering ) {
 		_properties.limits.maxFramebufferLayers = 256;
 	} else {
 		_properties.limits.maxFramebufferLayers = 1;
 	}
-#else
-	_properties.limits.maxFramebufferLayers = 256;
-#endif
 
     _properties.limits.maxViewportDimensions[0] = _metalFeatures.maxTextureDimension;
     _properties.limits.maxViewportDimensions[1] = _metalFeatures.maxTextureDimension;
@@ -1016,7 +1031,7 @@
     _properties.limits.lineWidthRange[1] = 1;
     _properties.limits.pointSizeGranularity = 1;
 
-    _properties.limits.standardSampleLocations = VK_FALSE;
+    _properties.limits.standardSampleLocations = VK_TRUE;
     _properties.limits.strictLines = VK_FALSE;
 
 	VkExtent3D wgSize = mvkVkExtent3DFromMTLSize(_mtlDevice.maxThreadsPerThreadgroup);