Я вот не пойму - есть reneder pass, у которого на входе куча аттачментов, и которые потом используются в разных пайплайнах. Ок - я могу задать каждому аттачменту его конечный layout, соответствующий требуемому в пайплайне, но как я могу для каждого аттачмента индивидуально задать srcStage, srcAccess, dstStage, dstAccess? Неужели единственный вариант - это задать общий VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT в dependencies или вообще сделать dependenciesCount=0 и после и перед рендер пассом вручную натыкать барьеров?
BingoBongo
> Неужели единственный вариант - это задать общий
> VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
сам-то как думаешь? собственно, из-за этого люди и плюхаются со всеми render graph'ами.
Suslik
> сам-то как думаешь?
Лучший ответ!
BingoBongo
> или вообще сделать dependenciesCount=0 и после и перед рендер пассом вручную натыкать барьеров?
наверное лучше так
BingoBongo
> наверное лучше так
Почему? Я попробовал так для каждого рендерпасса (в каждом 1 сабпасс):
VkSubpassDependency dependency[2]; dependency[0].srcSubpass = VK_SUBPASS_EXTERNAL; dependency[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT ; dependency[0].srcAccessMask = 0; dependency[0].dstSubpass = 0; dependency[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dependency[0].dependencyFlags = 0; dependency[1].srcSubpass = 0; dependency[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; dependency[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; dependency[1].dstSubpass = VK_SUBPASS_EXTERNAL; dependency[1].dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; dependency[1].dstAccessMask = 0; dependency[1].dependencyFlags = 0; VkRenderPassCreateInfo renderPassInfo = {}; renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderPassInfo.attachmentCount = (uint32)attachmentDescriptions.size(); renderPassInfo.pAttachments = attachmentDescriptions.data(); renderPassInfo.subpassCount = 1; renderPassInfo.pSubpasses = &subpass; renderPassInfo.dependencyCount = 2; renderPassInfo.pDependencies = dependency;
Это будет работать сильно медленнее, чем расставленные вручную барьеры или какая проблема?
BingoBongo
> Это будет работать сильно медленнее, чем расставленные вручную барьеры или
> какая проблема?
кто-то проверял и не заметил разницы производительности между барьерами отдельно и барьерами внутри subpass dependencies. если сабпасс всего 1, то нет смысла пользоваться subpass dependencies вместо барьеров.
BingoBongo
> dependency[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT ;
> dependency[1].dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
разумеется, барьерами предполагается пользоваться не так.
ребят, хочу заказать себе книжку по вулкану, она на рус. языке и 2017г, важный вопрос, не сильно ли с этого времени поменялся вулкан, актуальной ли будет книга.
MAMOHT-92
> актуальной ли будет книга
да. ничего критически важного с тех времен не появилось.
Ну основа вулкана осталась та же, но может способ объяснения всего этого поменялся.
Тексом вообще не просто все это объяснить, тут нужны картинки, гифки, примеры.
Как это понять? Что может быть неправильно?
Validation layer: number of elements inside built in block differ between stages shader (vertex shader 1 vs geometry shader 4)
Там и кода-то почти нет, что новой версии компилятора не нравится?
// Vert ////////////////////////////////////////////////////////////////////////////// #version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable layout (location = 0) in vec3 inPos; out gl_PerVertex { vec4 gl_Position; }; layout(push_constant) uniform PushConsts { mat4 depthMVP; float index; } pushConsts; void main() { gl_Position = pushConsts.depthMVP * vec4(inPos, 1.0); } // Geom ////////////////////////////////////////////////////////////////////////////// #version 450 layout (triangles) in; layout (triangle_strip, max_vertices = 3) out; layout(push_constant) uniform PushConsts { mat4 depthMVP; int index; } pushConsts; void main() { gl_Layer = pushConsts.index; gl_Position = gl_in[0].gl_Position; EmitVertex(); gl_Position = gl_in[1].gl_Position; EmitVertex(); gl_Position = gl_in[2].gl_Position; EmitVertex(); EndPrimitive(); }
MikeNew
> float index;
MikeNew
> int index;
innuendo
> MikeNew
> > float index;
> MikeNew
> > int index;
Если бы все было так просто.
Поправил - не помогло.
Такая же ошибка вылазит с вертексными и теселяционными шейдерами. Этот был взят для примера как самый простейший - связи между шейдерами нет почти, кроме той что по дефолту.
Баг новой версии вулкана?
MikeNew
> #extension GL_ARB_shading_language_420pack : enable
что это такое? почему оно в одном шейдере есть а в другом нету?
Suslik
> что это такое? почему оно в одном шейдере есть а в другом нету?
Это так, небольшой бардак. :)
Я это тоже проверял (только что еще раз перепроверил, на всякий случай), включал и выключал одновременно в обоих шейдерах - все равно эта ошибка.
Я уже начал посматривать в сторону настроек конвейера, хотя они не должны иметь отношения к этой ошибке.
Предыдущая версия сдк у меня была весенняя какая-то, там такой ошибки не было.
А что значат цифры 1 и 4 в (vertex shader 1 vs geometry shader 4)?