Pass attachments to MVKBeginRenderPass::setContents() as an MVKArrayRef.

MVKBeginRenderPass::setContents() use MVKSmallVector::assign()
to add attachments and clear colors.
MVKFramebuffer add getAttachments() and remove getAttachment()
and getAttachmentCount().
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
index d18f519..cc9af1e 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
@@ -67,8 +67,7 @@
 	VkResult setContent(MVKCommandBuffer* cmdBuff,
 						const VkRenderPassBeginInfo* pRenderPassBegin,
 						const VkSubpassBeginInfo* pSubpassBeginInfo,
-						uint32_t attachmentCount,
-						bool isImageless);
+						MVKArrayRef<MVKImageView*> attachments);
 
 	void encode(MVKCommandEncoder* cmdEncoder) override;
 
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
index d043874..98ba2c1 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
@@ -48,40 +48,12 @@
 VkResult MVKCmdBeginRenderPass<N_CV, N_A>::setContent(MVKCommandBuffer* cmdBuff,
 													  const VkRenderPassBeginInfo* pRenderPassBegin,
 													  const VkSubpassBeginInfo* pSubpassBeginInfo,
-													  uint32_t attachmentCount,
-													  bool isImageless) {
+													  MVKArrayRef<MVKImageView*> attachments) {
 	MVKCmdBeginRenderPassBase::setContent(cmdBuff, pRenderPassBegin, pSubpassBeginInfo);
 
-	// Add clear values
-	uint32_t cvCnt = pRenderPassBegin->clearValueCount;
-	_clearValues.clear();	// Clear for reuse
-	_clearValues.reserve(cvCnt);
-	for (uint32_t i = 0; i < cvCnt; i++) {
-		_clearValues.push_back(pRenderPassBegin->pClearValues[i]);
-	}
-
-	// Add attachments
-	_attachments.clear();	// Clear for reuse
-	_attachments.reserve(attachmentCount);
-	if (isImageless) {
-		for (auto* next = (const VkBaseInStructure*)pRenderPassBegin->pNext; next; next = next->pNext) {
-			switch (next->sType) {
-				case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
-					const auto* pAttachmentBegin = (VkRenderPassAttachmentBeginInfo*)next;
-					for(uint32_t i = 0; i < pAttachmentBegin->attachmentCount; i++) {
-						_attachments.push_back((MVKImageView*)pAttachmentBegin->pAttachments[i]);
-					}
-					break;
-				}
-				default:
-					break;
-			}
-		}
-	} else {
-		for(uint32_t attIdx = 0; attIdx < attachmentCount; attIdx++) {
-			_attachments.push_back((MVKImageView*)_framebuffer->getAttachment(attIdx));
-		}
-	}
+	_attachments.assign(attachments.begin(), attachments.end());
+	_clearValues.assign(pRenderPassBegin->pClearValues,
+						pRenderPassBegin->pClearValues + pRenderPassBegin->clearValueCount);
 
 	return VK_SUCCESS;
 }
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
index 32cd5dd..928da95 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKFramebuffer.h
@@ -37,15 +37,13 @@
 	VkDebugReportObjectTypeEXT getVkDebugReportObjectType() override { return VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT; }
 
 	/** Returns the dimensions of this framebuffer. */
-	inline VkExtent2D getExtent2D() { return _extent; }
+	VkExtent2D getExtent2D() { return _extent; }
 
 	/** Returns the layers covered by this framebuffer. */
-	inline uint32_t getLayerCount() { return _layerCount; }
+	uint32_t getLayerCount() { return _layerCount; }
 
-	/** Returns the attachment at the specified index.  */
-	inline MVKImageView* getAttachment(uint32_t index) { return _attachments[index]; }
-	
-	inline size_t getAttachmentCount() {return _attachments.size(); }
+	/** Returns the attachments.  */
+	MVKArrayRef<MVKImageView*> getAttachments() { return _attachments.contents(); }
 
 #pragma mark Construction
 
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index ab959e2..b8bf7be 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -1899,32 +1899,29 @@
 	const VkRenderPassBeginInfo*				pRenderPassBegin,
 	const VkSubpassBeginInfo*					pSubpassBeginInfo) {
 
-	uint32_t attachmentCount = 0;
-	bool isImageless = false;
+	VkRenderPassAttachmentBeginInfo* pAttachmentBegin = nullptr;
 	for (const auto* next = (VkBaseInStructure*)pRenderPassBegin->pNext; next; next = next->pNext) {
 		switch(next->sType) {
 			case VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO: {
-				auto* pAttachmentBegin = (VkRenderPassAttachmentBeginInfo*)next;
-				attachmentCount = pAttachmentBegin->attachmentCount;
-				isImageless = true;
+				pAttachmentBegin = (VkRenderPassAttachmentBeginInfo*)next;
 				break;
 			}
 			default:
 				break;
 		}
 	}
-	if ( !isImageless ) {
-		auto* mvkFB = (MVKFramebuffer*)pRenderPassBegin->framebuffer;
-		attachmentCount = mvkFB ? (uint32_t)mvkFB->getAttachmentCount() : 0;
-	}
+	auto attachments = (pAttachmentBegin
+						? MVKArrayRef<MVKImageView*>((MVKImageView**)pAttachmentBegin->pAttachments,
+													 pAttachmentBegin->attachmentCount)
+						: ((MVKFramebuffer*)pRenderPassBegin->framebuffer)->getAttachments());
+	
 	MVKAddCmdFrom5Thresholds(BeginRenderPass,
 							 pRenderPassBegin->clearValueCount, 1, 2,
-							 attachmentCount, 0, 1, 2,
+							 attachments.size, 0, 1, 2,
 							 commandBuffer,
 							 pRenderPassBegin,
 							 pSubpassBeginInfo,
-							 attachmentCount,
-							 isImageless);
+							 attachments);
 }
 
 MVK_PUBLIC_SYMBOL void vkCmdBeginRenderPass(