Ich versuche, zwei einfache Subpässe zu machen, wobei der zweite eine Abhängigkeit von dem ersten hat.Layout-Übergang zwischen mehreren Unterpässen in Vulkan
//subpass 1
VkAttachmentReference colorReferences = { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
VkSubpassDescription subpass1 = {};
subpass1.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass1.pColorAttachments = &colorReferences;
subpass1.colorAttachmentCount = 1;
//subpass 2
VkAttachmentReference inputRefernce = { 0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
VkSubpassDescription subpass2 = {};
subpass2.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass2.inputAttachmentCount = 1;
subpass2.pInputAttachments = &inputRefernce;
//Render pass
VkAttachmentDescription attachmentDescs = {};
attachmentDescs.samples = VK_SAMPLE_COUNT_1_BIT;
attachmentDescs.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attachmentDescs.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachmentDescs.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
attachmentDescs.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
attachmentDescs.format = VK_FORMAT_R16G16B16A16_SFLOAT;
attachmentDescs.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
attachmentDescs.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
VkSubpassDependency dependency = {};
dependency.srcSubpass = 0;
dependency.dstSubpass = 1;
dependency.srcStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
dependency.dstStageMask = VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT;
dependency.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependency.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
VkSubpassDescription subpasses[2] = { subpass1, subpass2 };
VkRenderPassCreateInfo renderPassInfo = {};
renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderPassInfo.pAttachments = &attachmentDescs;
renderPassInfo.attachmentCount = 1;
renderPassInfo.subpassCount = 2;
renderPassInfo.pSubpasses = subpasses;
renderPassInfo.dependencyCount = 1;
renderPassInfo.pDependencies = &dependency;
vkUtils::checkResult(vkCreateRenderPass(_context->device, &renderPassInfo, nullptr, &_renderPass));
Ich habe eine Abhängigkeit zwischen dem ersten und dem zweiten Subpass. Die Spezifikation sagt:
Wenn eine Anlage den
VK_ATTACHMENT_LOAD_OP_CLEAR
Last Betrieb gibt, dann wird es logisch zu Beginn der ersten subpass gelöscht werden, in dem es verwendet wird.
Es wird nur beim Start des ersten Subpasses gelöscht, wenn der Anhang verwendet wird. Und da zwischen ihnen eine Abhängigkeit besteht, sollte sie im zweiten Subpass nicht gelöscht werden.
Der erste Einsatz einer Befestigungs angeben muss kein Layout gleich VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL oder VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL Wenn der Anhang gibt an, dass der> loadOp VK_ATTACHMENT_LOAD_OP_CLEAR ist. [...]
Ich erhalte diese Fehler aus der Validierungsschicht:
Cannot clear attachment 0 with invalid first layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
Aber das VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
Layout ist in der zweiten subpass, nicht die erste?
Konnten Sie Code schreiben, der kompilieren kann? Weil Sie eine Variable 'subpass1' deklariert haben, sprechen Sie über eine nicht deklarierte Variable' subpass'. –
Entschuldigung, mein Fehler – hidayat
Das war nicht der einzige Ort. Bitte kopieren Sie es direkt aus Ihrem Quellcode. –