Skip to content

Commit 9935cdd

Browse files
layers: Add DGC Pipline Layout Compatible check
1 parent f3c3200 commit 9935cdd

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

layers/core_checks/cc_device_generated_commands.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,29 @@ bool CoreChecks::PreCallValidateUpdateIndirectExecutionSetPipelineEXT(
919919
"was %screated with StencilExportEXT, but the initialPipeline was %screated with StencilExportEXT.",
920920
ies_pipeline_stencil_export ? "" : "not ", initial_pipeline_stencil_export ? "" : "not ");
921921
}
922+
923+
const auto initial_pipeline_layout = initial_pipeline->PipelineLayoutState();
924+
const auto update_pipeline_layout = update_pipeline->PipelineLayoutState();
925+
if (initial_pipeline_layout && update_pipeline_layout) {
926+
const uint32_t set_count = (uint32_t)std::min(initial_pipeline_layout->set_compat_ids.size(),
927+
update_pipeline_layout->set_compat_ids.size());
928+
for (uint32_t set = 0; set < set_count; set++) {
929+
if (!IsPipelineLayoutSetCompatible(set, initial_pipeline_layout.get(), update_pipeline_layout.get())) {
930+
LogObjectList objlist(initial_pipeline->Handle(), initial_pipeline_layout->Handle(),
931+
update_pipeline->Handle(), update_pipeline_layout->Handle());
932+
LogError(
933+
"VUID-vkUpdateIndirectExecutionSetPipelineEXT-None-11039", objlist, set_write_loc.dot(Field::pipeline),
934+
"%s was created with a layout %s which is not compatible with the initialPipeline layout %s for set "
935+
"%" PRIu32 ".\n%s",
936+
FormatHandle(update_pipeline->VkHandle()).c_str(),
937+
FormatHandle(update_pipeline_layout->VkHandle()).c_str(),
938+
FormatHandle(initial_pipeline_layout->VkHandle()).c_str(), set,
939+
DescribePipelineLayoutSetNonCompatible(set, initial_pipeline_layout.get(), update_pipeline_layout.get())
940+
.c_str());
941+
break;
942+
}
943+
}
944+
}
922945
}
923946
}
924947

tests/unit/device_generated_commands.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -923,6 +923,55 @@ TEST_F(NegativeDeviceGeneratedCommands, UpdateIESPipelineShaderStages) {
923923
m_errorMonitor->VerifyFound();
924924
}
925925

926+
TEST_F(NegativeDeviceGeneratedCommands, UpdateIESPipelineCompatible) {
927+
RETURN_IF_SKIP(InitBasicDeviceGeneratedCommands());
928+
InitRenderTarget();
929+
930+
vkt::Buffer uniform_buffer(*m_device, 32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
931+
OneOffDescriptorSet descriptor_set_vert(m_device,
932+
{{0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_VERTEX_BIT, nullptr}});
933+
OneOffDescriptorSet descriptor_set_all(m_device, {{0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr}});
934+
descriptor_set_vert.WriteDescriptorBufferInfo(0, uniform_buffer.handle(), 0, VK_WHOLE_SIZE, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
935+
descriptor_set_vert.UpdateDescriptorSets();
936+
descriptor_set_all.WriteDescriptorBufferInfo(0, uniform_buffer.handle(), 0, VK_WHOLE_SIZE, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
937+
descriptor_set_all.UpdateDescriptorSets();
938+
939+
const vkt::PipelineLayout pipeline_layout_vert(*m_device, {&descriptor_set_vert.layout_});
940+
const vkt::PipelineLayout pipeline_layout_all(*m_device, {&descriptor_set_all.layout_});
941+
942+
char const *vs_source = R"glsl(
943+
#version 450
944+
layout(set = 0, binding = 0) buffer StorageBuffer {
945+
uint a;
946+
uint b;
947+
};
948+
void main() {
949+
a = b;
950+
}
951+
)glsl";
952+
VkShaderObj vs(this, vs_source, VK_SHADER_STAGE_VERTEX_BIT);
953+
954+
VkPipelineCreateFlags2CreateInfoKHR pipe_flags2 = vku::InitStructHelper();
955+
pipe_flags2.flags = VK_PIPELINE_CREATE_2_INDIRECT_BINDABLE_BIT_EXT;
956+
CreatePipelineHelper init_pipe(*this, &pipe_flags2);
957+
init_pipe.gp_ci_.layout = pipeline_layout_vert.handle();
958+
init_pipe.shader_stages_ = {vs.GetStageCreateInfo(), init_pipe.fs_->GetStageCreateInfo()};
959+
init_pipe.CreateGraphicsPipeline();
960+
vkt::IndirectExecutionSet exe_set(*m_device, init_pipe.Handle(), 1);
961+
962+
CreatePipelineHelper pipe(*this, &pipe_flags2);
963+
pipe.gp_ci_.layout = pipeline_layout_all.handle();
964+
pipe.shader_stages_ = {vs.GetStageCreateInfo(), pipe.fs_->GetStageCreateInfo()};
965+
pipe.CreateGraphicsPipeline();
966+
967+
VkWriteIndirectExecutionSetPipelineEXT write_exe_sets = vku::InitStructHelper();
968+
write_exe_sets.index = 0;
969+
write_exe_sets.pipeline = pipe.Handle();
970+
m_errorMonitor->SetDesiredError("VUID-vkUpdateIndirectExecutionSetPipelineEXT-None-11039");
971+
vk::UpdateIndirectExecutionSetPipelineEXT(device(), exe_set.handle(), 1, &write_exe_sets);
972+
m_errorMonitor->VerifyFound();
973+
}
974+
926975
TEST_F(NegativeDeviceGeneratedCommands, UpdateIESMixShaderObjectPipeline) {
927976
AddRequiredExtensions(VK_EXT_SHADER_OBJECT_EXTENSION_NAME);
928977
AddRequiredFeature(vkt::Feature::shaderObject);

0 commit comments

Comments
 (0)