2016-07-18 7 views
4

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?

+0

Konnten Sie Code schreiben, der kompilieren kann? Weil Sie eine Variable 'subpass1' deklariert haben, sprechen Sie über eine nicht deklarierte Variable' subpass'. –

+0

Entschuldigung, mein Fehler – hidayat

+0

Das war nicht der einzige Ort. Bitte kopieren Sie es direkt aus Ihrem Quellcode. –

Antwort

3

Es scheint ein Fehler in den Schichten zu sein, die einfach nicht überprüfen, welche Nutzung ist zuerst (es wahrscheinlich in 1.0.17 SDK eingeführt wurde - 1.0.13 sollte dies nicht melden ...): https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/sdk-1.0.17/layers/core_validation.cpp#L8557

spec Zitat:

der erste Einsatz einer Befestigungs muss kein Layout gleich VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL spezifizieren oder VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL wenn der Anhang spezifiziert, dass die loadOpVK_ATTACHMENT_LOAD_OP_CLEAR ist. [...]

+0

Es heißt: die erste Verwendung verwenden ...., ist es im zweiten Subpass, den ich verwende VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, im ersten Subpass das Layout ist VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL – hidayat

+0

Ja, Die Ebene scheint die erste Verwendung nicht zu unterscheiden (sie iteriert über alle Unterpässe). Ich frage mich, warum der '0'-Anhang nicht gemeldet wurde. Funktioniert Ihre App trotz der gemeldeten Fehler? – krOoze

+0

Ich habe nicht den letzten Teil der Anwendung fertig, aber ich werde bald, und vielleicht ist es eine Validierung Fehler :) – hidayat

Verwandte Themen