Derive MVKCmdBeginRenderPass attachment count and imageless status once.
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
index 621bc70..d18f519 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.h
@@ -66,7 +66,9 @@
public:
VkResult setContent(MVKCommandBuffer* cmdBuff,
const VkRenderPassBeginInfo* pRenderPassBegin,
- const VkSubpassBeginInfo* pSubpassBeginInfo);
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ uint32_t attachmentCount,
+ bool isImageless);
void encode(MVKCommandEncoder* cmdEncoder) override;
diff --git a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
index 151952f..d043874 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
+++ b/MoltenVK/MoltenVK/Commands/MVKCmdRenderPass.mm
@@ -47,7 +47,9 @@
template <size_t N_CV, size_t N_A>
VkResult MVKCmdBeginRenderPass<N_CV, N_A>::setContent(MVKCommandBuffer* cmdBuff,
const VkRenderPassBeginInfo* pRenderPassBegin,
- const VkSubpassBeginInfo* pSubpassBeginInfo) {
+ const VkSubpassBeginInfo* pSubpassBeginInfo,
+ uint32_t attachmentCount,
+ bool isImageless) {
MVKCmdBeginRenderPassBase::setContent(cmdBuff, pRenderPassBegin, pSubpassBeginInfo);
// Add clear values
@@ -58,26 +60,26 @@
_clearValues.push_back(pRenderPassBegin->pClearValues[i]);
}
+ // Add attachments
_attachments.clear(); // Clear for reuse
- bool imageless = false;
- 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]);
+ _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;
}
- imageless = true;
- break;
}
- default:
- break;
- }
- }
-
- if (!imageless) {
- for(uint32_t i = 0; i < _framebuffer->getAttachmentCount(); i++) {
- _attachments.push_back((MVKImageView*)_framebuffer->getAttachment(i));
+ } else {
+ for(uint32_t attIdx = 0; attIdx < attachmentCount; attIdx++) {
+ _attachments.push_back((MVKImageView*)_framebuffer->getAttachment(attIdx));
}
}
diff --git a/MoltenVK/MoltenVK/Vulkan/vulkan.mm b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
index f63434b..ab959e2 100644
--- a/MoltenVK/MoltenVK/Vulkan/vulkan.mm
+++ b/MoltenVK/MoltenVK/Vulkan/vulkan.mm
@@ -1900,23 +1900,31 @@
const VkSubpassBeginInfo* pSubpassBeginInfo) {
uint32_t attachmentCount = 0;
+ bool isImageless = false;
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;
break;
}
default:
break;
}
}
+ if ( !isImageless ) {
+ auto* mvkFB = (MVKFramebuffer*)pRenderPassBegin->framebuffer;
+ attachmentCount = mvkFB ? (uint32_t)mvkFB->getAttachmentCount() : 0;
+ }
MVKAddCmdFrom5Thresholds(BeginRenderPass,
pRenderPassBegin->clearValueCount, 1, 2,
attachmentCount, 0, 1, 2,
commandBuffer,
pRenderPassBegin,
- pSubpassBeginInfo);
+ pSubpassBeginInfo,
+ attachmentCount,
+ isImageless);
}
MVK_PUBLIC_SYMBOL void vkCmdBeginRenderPass(