2016-07-18 11 views
4

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でありますか?

+0

コンパイルできるコードを投稿できますか?変数 'subpass1'を宣言したので、宣言されていない変数' subpass'について話します。 –

+0

申し訳ありませんが、私の間違い – hidayat

+0

それは唯一の場所ではありませんでした。ソースコードから直接コピーしてください。 –

答えて

3

単に最初にされた使用方法をチェックしていない層のバグ、のようです(これはおそらく、1.0.17 SDKで導入されました - ... 1.0.13は、このことを報告してはならない): https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/sdk-1.0.17/layers/core_validation.cpp#L8557

スペック引用:添付ファイルがloadOpVK_ATTACHMENT_LOAD_OP_CLEARであることを指定している場合

アタッチメントの最初の使用はVK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL又はVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALに等しいレイアウトを指定してはなりません。 [...]

+0

最初の使用では....最初のサブパスでVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMALを使用している2番目のサブパスで、レイアウトはVK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL – hidayat

+0

です。レイヤーは最初の使用を区別していないようです(すべてのサブパスで繰り返されます)。私はなぜ '0'の添付ファイルが報告されなかったのだろうと思う。報告されたエラーにもかかわらずあなたのアプリは動作しますか? – krOoze

+0

私はアプリケーションの最後の部分を終了していませんが、私はまもなくその検証バグになります:) – hidayat

関連する問題