Shader Object: Sample mask difference
spencer-lunarg opened this issue · 0 comments
spencer-lunarg commented
I was running the following test
TEST_F(PositiveGpuAVDescriptorIndexing, SharedPipelineLayoutSubsetGraphicsShaderObject2) {
SetTargetApiVersion(VK_API_VERSION_1_2);
AddRequiredExtensions(VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME);
AddRequiredExtensions(VK_EXT_SHADER_OBJECT_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::dynamicRendering);
AddRequiredFeature(vkt::Feature::shaderObject);
AddRequiredFeature(vkt::Feature::descriptorBindingStorageBufferUpdateAfterBind);
RETURN_IF_SKIP(Init());
InitDynamicRenderTarget();
VkDescriptorBindingFlags binding_flags = VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT;
VkDescriptorSetLayoutBindingFlagsCreateInfo flags_create_info = vku::InitStructHelper();
flags_create_info.bindingCount = 1;
flags_create_info.pBindingFlags = &binding_flags;
const VkDescriptorSetLayoutBinding binding{0, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_ALL, nullptr};
vkt::DescriptorSetLayout dsl_1(*m_device, binding, VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT,
&flags_create_info);
std::array set_layouts = {dsl_1.handle(), dsl_1.handle()};
VkPipelineLayoutCreateInfo pipeline_layout_ci = vku::InitStructHelper();
pipeline_layout_ci.pSetLayouts = set_layouts.data();
pipeline_layout_ci.setLayoutCount = 2;
const vkt::PipelineLayout pipeline_layout_2(*m_device, pipeline_layout_ci);
;
char const *vs_source_2 = R"glsl(
#version 450
layout(set = 0, binding = 0) buffer foo_0 { int a; };
layout(set = 1, binding = 0) buffer foo_1 { int b; };
void main() {
a = b;
}
)glsl";
const std::vector<uint32_t> vs_spv_2 = GLSLToSPV(VK_SHADER_STAGE_VERTEX_BIT, vs_source_2);
VkShaderCreateInfoEXT vs_ci_2 = ShaderCreateInfo(vs_spv_2, VK_SHADER_STAGE_VERTEX_BIT, 2, set_layouts.data(), 0, nullptr);
const vkt::Shader vs_2(*m_device, vs_ci_2);
static const char fs_source_2[] = R"glsl(
#version 460
layout(set = 0, binding = 0) buffer foo_0 { int a; };
layout(set = 1, binding = 0) buffer foo_1 { int b; };
void main() {}
)glsl";
const std::vector<uint32_t> fs_spv_2 = GLSLToSPV(VK_SHADER_STAGE_FRAGMENT_BIT, fs_source_2);
VkShaderCreateInfoEXT fs_ci_2 = ShaderCreateInfo(fs_spv_2, VK_SHADER_STAGE_FRAGMENT_BIT, 2, set_layouts.data(), 0, nullptr);
const vkt::Shader fs_2(*m_device, fs_ci_2);
const std::array<VkShaderStageFlagBits, 5> stages = {{VK_SHADER_STAGE_VERTEX_BIT, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, VK_SHADER_STAGE_GEOMETRY_BIT,
VK_SHADER_STAGE_FRAGMENT_BIT}};
const std::array<VkShaderEXT, 5> shaders_2 = {{vs_2.handle(), VK_NULL_HANDLE, VK_NULL_HANDLE, VK_NULL_HANDLE,fs_2.handle()}};
VkDescriptorPoolSize pool_size = {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 2};
VkDescriptorPoolCreateInfo ds_pool_ci = vku::InitStructHelper();
ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT;
ds_pool_ci.maxSets = 2;
ds_pool_ci.poolSizeCount = 1;
ds_pool_ci.pPoolSizes = &pool_size;
vkt::DescriptorPool pool(*m_device, ds_pool_ci);
VkDescriptorSetAllocateInfo allocate_info = vku::InitStructHelper();
allocate_info.descriptorPool = pool.handle();
allocate_info.descriptorSetCount = 2;
allocate_info.pSetLayouts = set_layouts.data();
std::array<VkDescriptorSet, 2> descriptor_sets{};
vk::AllocateDescriptorSets(device(), &allocate_info, descriptor_sets.data());
vkt::Buffer buffer(*m_device, 32, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
VkDescriptorBufferInfo buffer_info = {buffer.handle(), 0, VK_WHOLE_SIZE};
VkWriteDescriptorSet descriptor_writes[2];
descriptor_writes[0] = vku::InitStructHelper();
descriptor_writes[0].dstSet = descriptor_sets[0];
descriptor_writes[0].dstBinding = 0;
descriptor_writes[0].descriptorCount = 1;
descriptor_writes[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
descriptor_writes[0].pBufferInfo = &buffer_info;
descriptor_writes[1] = descriptor_writes[0];
descriptor_writes[1].dstSet = descriptor_sets[1];
vk::UpdateDescriptorSets(device(), 2, descriptor_writes, 0, nullptr);
VkCommandBufferBeginInfo begin_info = vku::InitStructHelper();
m_commandBuffer->begin(&begin_info);
m_commandBuffer->BeginRenderingColor(GetDynamicRenderTarget(), GetRenderTargetArea());
vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout_2.handle(), 0, 2,
descriptor_sets.data(), 0, nullptr);
vk::CmdBindShadersEXT(m_commandBuffer->handle(), size32(stages), stages.data(), shaders_2.data());
SetDefaultDynamicStatesAll(m_commandBuffer->handle());
vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
m_commandBuffer->EndRendering();
m_commandBuffer->end();
m_default_queue->Submit(*m_commandBuffer);
m_default_queue->Wait();
}
and I see the following VVL error from the output of the Shader Object layer
Validation Error: [ VUID-VkGraphicsPipelineCreateInfo-pLibraries-06634 ] | MessageID = 0xf8ff56c9 | vkCreateGraphicsPipelines(): pCreateInfos[0] Fragment Shader and Fragment Output Interface were created with different VkPipelineMultisampleStateCreateInfo.Fragment Shader pMultisampleState:
pNext: (nil)
rasterizationSamples: VK_SAMPLE_COUNT_1_BIT
sampleShadingEnable: 0
minSampleShading: 0.000000
pSampleMask: (nil)
alphaToCoverageEnable: 0
alphaToOneEnable: 0
Fragment Output Interface pMultisampleState:
pNext: (nil)
rasterizationSamples: VK_SAMPLE_COUNT_1_BIT
sampleShadingEnable: 0
minSampleShading: 0.000000
pSampleMask: 0x5e5bfa0a2c20
alphaToCoverageEnable: 0
alphaToOneEnable: 0