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(