2つの単純なサブパスを実行しようとしています。第2のサブパスは、最初のサブパスに依存します。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));
私は最初のサブパスと2番目のサブパスの間に依存関係があります。仕様は言う:
アタッチメントは、それは論理的にそれが使用されている最初の subpassの開始時にクリアされ、
VK_ATTACHMENT_LOAD_OP_CLEAR
負荷 操作を指定している場合。
添付ファイルが使用される最初のサブパスの開始時にのみ消去されます。また、それらの間に依存関係があるため、2番目のサブパスではクリアしないでください。アタッチメントは> loadOpがVK_ATTACHMENT_LOAD_OP_CLEARあること を指定している場合
アタッチメントの最初の使用は VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL又はVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALに等しいレイアウトを指定してはなりません。 [...]
私は検証層からこのエラーを取得する:
Cannot clear attachment 0 with invalid first layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
しかしVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
レイアウトが第二subpassではなく、最初の1でありますか?
コンパイルできるコードを投稿できますか?変数 'subpass1'を宣言したので、宣言されていない変数' subpass'について話します。 –
申し訳ありませんが、私の間違い – hidayat
それは唯一の場所ではありませんでした。ソースコードから直接コピーしてください。 –