In a renderpass, don't load or store memoryless attachments.

For memoryless attachments, setting renderpass load and store
actions to "load" and "store" triggers Metal validation errors.
Refactor determination of renderpass MTLLoadAction and MTLStoreAction.
For memoryless attachments, replace load with don't care,
and store with resolve or don't care.
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index ba91afb..12106ec 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -19,7 +19,9 @@
 Released TBD
 
 - Add support for `HDR10` colorspace via `VK_COLOR_SPACE_HDR10_HLG_EXT` and `VK_COLOR_SPACE_HDR10_ST2084_EXT`.
-- Always explicitly set `CAMetalLayer` colorspace property based on _Vulkan_ parameters, and don't rely on _Metal_ default values.
+- Always explicitly set `CAMetalLayer` colorspace property based on _Vulkan_ parameters, 
+  and don't rely on _Metal_ default values.
+- Avoid use of _Metal_ renderpass load and store actions on memoryless attachments.
 - Remove project qualifiers from references to `SPIRV-Cross` header files.
 - Add `MVKConfiguration::apiVersionToAdvertise` and `MVK_CONFIG_API_VERSION_TO_ADVERTISE` 
   env var to configure **MoltenVK** to advertise a particular _Vulkan_ version.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
index b340ce3..4a09569 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKRenderPass.mm
@@ -600,21 +600,21 @@
                                                                         bool hasResolveAttachment,
                                                                         bool isStencil,
                                                                         bool loadOverride) {
-
-    bool willClear = false;		// Assume the attachment won't be cleared
-
-    // Only allow clearing of entire attachment if we're actually rendering to the entire
-    // attachment AND we're in the first subpass.
-    if ( loadOverride && !isMemorylessAttachment ) {
-        mtlAttDesc.loadAction = MTLLoadActionLoad;
-    } else if ( isMemorylessAttachment || (isRenderingEntireAttachment && isFirstUseOfAttachment(subpass)) ) {
-        VkAttachmentLoadOp loadOp = isStencil ? _info.stencilLoadOp : _info.loadOp;
-        mtlAttDesc.loadAction = mvkMTLLoadActionFromVkAttachmentLoadOp(loadOp);
-        willClear = (loadOp == VK_ATTACHMENT_LOAD_OP_CLEAR);
+    // Only allow clearing of entire attachment if we're actually
+	// rendering to the entire attachment AND we're in the first subpass.
+	MTLLoadAction mtlLA;
+	if (loadOverride || !isRenderingEntireAttachment || !isFirstUseOfAttachment(subpass)) {
+		mtlLA = MTLLoadActionLoad;
     } else {
-        mtlAttDesc.loadAction = MTLLoadActionLoad;
+        VkAttachmentLoadOp loadOp = isStencil ? _info.stencilLoadOp : _info.loadOp;
+		mtlLA = mvkMTLLoadActionFromVkAttachmentLoadOp(loadOp);
     }
 
+	// Memoryless can be cleared, but can't be loaded, so force load to don't care.
+	if (isMemorylessAttachment && mtlLA == MTLLoadActionLoad) { mtlLA = MTLLoadActionDontCare; }
+
+	mtlAttDesc.loadAction = mtlLA;
+
     // If the device supports late-specified store actions, we'll use those, and then set them later.
     // That way, if we wind up doing a tessellated draw, we can set the store action to store then,
     // and then when the render pass actually ends, we can use the true store action.
@@ -623,7 +623,7 @@
     } else {
         mtlAttDesc.storeAction = getMTLStoreAction(subpass, isRenderingEntireAttachment, isMemorylessAttachment, hasResolveAttachment, isStencil, false);
     }
-    return willClear;
+    return (mtlLA == MTLLoadActionClear);
 }
 
 void MVKRenderPassAttachment::encodeStoreAction(MVKCommandEncoder* cmdEncoder,
@@ -687,19 +687,21 @@
 														  bool isStencil,
 														  bool storeOverride) {
     // If a resolve attachment exists, this attachment must resolve once complete.
-    // Otherwise only allow the attachment to be discarded if we're actually rendering
-    // to the entire attachment and we're in the last subpass.
     if (hasResolveAttachment && !_renderPass->getDevice()->_pMetalFeatures->combinedStoreResolveAction) {
         return MTLStoreActionMultisampleResolve;
     }
-    if ( storeOverride && !isMemorylessAttachment ) {
-        return hasResolveAttachment ? MTLStoreActionStoreAndMultisampleResolve : MTLStoreActionStore;
-    }
-    if ( isMemorylessAttachment || (isRenderingEntireAttachment && isLastUseOfAttachment(subpass)) ) {
-        VkAttachmentStoreOp storeOp = isStencil ? _info.stencilStoreOp : _info.storeOp;
-        return mvkMTLStoreActionFromVkAttachmentStoreOp(storeOp, hasResolveAttachment);
-    }
-    return hasResolveAttachment ? MTLStoreActionStoreAndMultisampleResolve : MTLStoreActionStore;
+	// Memoryless can't be stored.
+	if (isMemorylessAttachment) {
+		return hasResolveAttachment ? MTLStoreActionMultisampleResolve : MTLStoreActionDontCare;
+	}
+
+	// Only allow the attachment to be discarded if we're actually
+	// rendering to the entire attachment and we're in the last subpass.
+	if (storeOverride || !isRenderingEntireAttachment || !isLastUseOfAttachment(subpass)) {
+		return hasResolveAttachment ? MTLStoreActionStoreAndMultisampleResolve : MTLStoreActionStore;
+	}
+	VkAttachmentStoreOp storeOp = isStencil ? _info.stencilStoreOp : _info.storeOp;
+	return mvkMTLStoreActionFromVkAttachmentStoreOp(storeOp, hasResolveAttachment);
 }
 
 bool MVKRenderPassAttachment::shouldUseClearAttachment(MVKRenderSubpass* subpass) {
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
index 7cbc4fc..3545d6a 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
@@ -734,10 +734,9 @@
 
 MVK_PUBLIC_SYMBOL MTLStorageMode mvkMTLStorageModeFromVkMemoryPropertyFlags(VkMemoryPropertyFlags vkFlags) {
 
-	// If not visible to the host: Private
+	// If not visible to the host, use Private, or Memoryless if available and lazily allocated.
 	if ( !mvkAreAllFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) ) {
 #if MVK_APPLE_SILICON
-		// iOS: If lazily allocated, Memoryless
 		if (mvkAreAllFlagsEnabled(vkFlags, VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)) {
 			return MTLStorageModeMemoryless;
 		}