layers: Stop false positive for PushConstant spec const
diff --git a/layers/core_checks/cc_shader.cpp b/layers/core_checks/cc_shader.cpp
index f0d65f5..970d76b 100644
--- a/layers/core_checks/cc_shader.cpp
+++ b/layers/core_checks/cc_shader.cpp
@@ -224,6 +224,11 @@
const EntryPoint &entrypoint) const {
bool skip = false;
+ // TODO - Workaround for https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/5911
+ if (module_state.static_data_.has_specialization_constants) {
+ return skip;
+ }
+
const VkShaderStageFlagBits stage = entrypoint.stage;
const auto push_constant_variable = entrypoint.push_constant_variable;
if (!push_constant_variable) {
diff --git a/tests/positive/shader_push_constants.cpp b/tests/positive/shader_push_constants.cpp
index f3f0dab..c07a68d 100644
--- a/tests/positive/shader_push_constants.cpp
+++ b/tests/positive/shader_push_constants.cpp
@@ -746,8 +746,8 @@
m_commandBuffer->end();
}
-TEST_F(PositiveShaderPushConstants, SpecConstantSize) {
- TEST_DESCRIPTION("Use SpecConstant to adjust size of Push Constant Block");
+TEST_F(PositiveShaderPushConstants, SpecConstantSizeDefault) {
+ TEST_DESCRIPTION("Use SpecConstant to adjust size of Push Constant Block, but use default value");
ASSERT_NO_FATAL_FAILURE(Init());
const char *cs_source = R"glsl(
@@ -771,4 +771,46 @@
pipe.InitState();
pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {}, {push_constant_range});
pipe.CreateComputePipeline();
+}
+
+TEST_F(PositiveShaderPushConstants, SpecConstantSizeSet) {
+ TEST_DESCRIPTION("Use SpecConstant to adjust size of Push Constant Block");
+ ASSERT_NO_FATAL_FAILURE(Init());
+
+ const char *cs_source = R"glsl(
+ #version 460
+ layout (constant_id = 0) const int my_array_size = 256;
+ layout (push_constant) uniform my_buf {
+ float my_array[my_array_size];
+ } pc;
+
+ void main() {
+ float a = pc.my_array[0];
+ }
+ )glsl";
+
+ // Setting makes the VkPushConstantRange valid
+ uint32_t data = 1;
+
+ VkSpecializationMapEntry entry;
+ entry.constantID = 0;
+ entry.offset = 0;
+ entry.size = sizeof(uint32_t);
+
+ VkSpecializationInfo specialization_info = {};
+ specialization_info.mapEntryCount = 1;
+ specialization_info.pMapEntries = &entry;
+ specialization_info.dataSize = sizeof(uint32_t);
+ specialization_info.pData = &data;
+
+ VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_COMPUTE_BIT, 0, 16};
+ const VkPipelineLayoutObj pipeline_layout(m_device, {}, {push_constant_range});
+
+ CreateComputePipelineHelper pipe(*this);
+ pipe.InitInfo();
+ pipe.cs_.reset(
+ new VkShaderObj(this, cs_source, VK_SHADER_STAGE_COMPUTE_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL, &specialization_info));
+ pipe.InitState();
+ pipe.pipeline_layout_ = VkPipelineLayoutObj(m_device, {}, {push_constant_range});
+ pipe.CreateComputePipeline();
}
\ No newline at end of file