gpt4 book ai didi

来自上一个子 channel 的 Vulkan 输入附件

转载 作者:行者123 更新时间:2023-12-05 00:55:09 25 4
gpt4 key购买 nike

我正在尝试使用在 subpass 0 中创建的颜色附件作为 subpass 1 中的输入附件。但是有一个我无法解决的问题。

我目前的问题如下,我尝试使用 VK_ATTACHMENT_LOAD_OP_CLEAR 在传递开始时清除附件 0但是给出了错误。

Cannot clear attachment 0 with invalid first layout VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.

这对我来说似乎很奇怪,附件 0 没有布局 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL直到 subpass 1 是输入附件,而当布局仍然是时清除应该已经发生 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL (AFAIK)。

我现在尝试在验证错误后继续运行,附件 0 被清除,这让我更加不确定。我显然可以忽略验证错误,但是可能会发生一些奇怪的事情,这可能会导致以后出现问题,所以我没有足够的信心忽略它。

这是将给出错误的最小代码:
VkAttachmentDescription attachments[1] {};
attachments[0].format = VK_FORMAT_R16G16B16A16_SFLOAT;
attachments[0].samples = VK_SAMPLE_COUNT_1_BIT;
attachments[0].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
attachments[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
attachments[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
attachments[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
attachments[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
attachments[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

VkAttachmentReference pass_0_ColorAttachments[1];
pass_0_ColorAttachments[0].attachment = 0;
pass_0_ColorAttachments[0].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;

VkAttachmentReference pass_1_InputAttachments[1];
pass_1_InputAttachments[0].attachment = 0;
pass_1_InputAttachments[0].layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;

VkSubpassDescription subpasses[2] {};

subpasses[0].colorAttachmentCount = 1;
subpasses[0].pColorAttachments = pass_0_ColorAttachments;
subpasses[0].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;

subpasses[1].inputAttachmentCount = 1;
subpasses[1].pInputAttachments = pass_1_InputAttachments;
subpasses[1].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;

VkSubpassDependency subpassDependancies[1] {};
subpassDependancies[0].srcSubpass = 0;
subpassDependancies[0].dstSubpass = 1;
subpassDependancies[0].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
subpassDependancies[0].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
subpassDependancies[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
subpassDependancies[0].dstAccessMask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
subpassDependancies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

VkRenderPassCreateInfo renderpassCreateInfo {};
renderpassCreateInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderpassCreateInfo.attachmentCount = 1;
renderpassCreateInfo.pAttachments = attachments;
renderpassCreateInfo.subpassCount = 2;
renderpassCreateInfo.pSubpasses = subpasses;
renderpassCreateInfo.dependencyCount = 1;
renderpassCreateInfo.pDependencies = subpassDependancies;

VkRenderPass renderPass;
vkCreateRenderPass(device, &renderpassCreateInfo, nullptr, &renderPass);

下一部分仅在无法指定时才相关 VK_ATTACHMENT_LOAD_OP_CLEAR对于首先用作颜色附件的附件,然后在以后的子 channel 中用作输入附件(我认为没有理由不可能,除非 vulkan 对每个子 channel 进行加载操作)。所以这是一个单独的问题。

我可以,而不是使用 VK_ATTACHMENT_LOAD_OP_CLEAR , 使用 vkCmdClearAttachments 手动清除附件并使用 VK_ATTACHMENT_LOAD_OP_DONT_CARE用于附件的负载操作。

我在调用 vkCmdClearAttachments 时遇到崩溃错误
我开始了命令缓冲区记录和渲染 channel ,在我调用的第一个子 channel 中:
VkClearAttachment clearAtts[] = {{VK_IMAGE_ASPECT_COLOR_BIT, 1, {0,0,0,0}}};
VkClearRect rect = {{{0,0}, {1,1}}, 0, 1};
vkCmdClearAttachments(vkCommandBuffer, 1, clearAtts, 1, &rect);
{1,1} 作为说明这不是问题的程度

最佳答案

您遇到了同样的问题 as was discovered here .这是 1.0.17 验证层中的一个错误。看起来current Github head有一个修复,但该修复不在 1.0.21 版本中。

但是你仍然需要修复下面的东西;)

subpassDependancies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT;


您不会将图像作为彩色附件阅读。您将把它作为输入附件来阅读。来自片段着色器。所以这意味着 VK_ACCESS_INPUT_ATTACHMENT_READ_BIT .

如果这修复了错误,那么我猜想验证层会被你奇怪的依赖访问掩码弄糊涂了。因此它无法在子 channel 0 和 1 之间建立有效的依赖链,因此认为子 channel 1 是第一个。

另外,您的 srcStageMaskdstStageMask位被过度指定。每个图形阶段都不会写入图像,并且每个图形阶段之后也不会访问它。您只将图像作为颜色附件写入,并且您只会在片段着色器中读取它。

所以你的 srcStageMask应该只是 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT ,以及您的 dstStageMask应该是 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT .

关于来自上一个子 channel 的 Vulkan 输入附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com