if(first_block.used && first_block.binding==ReflectData::PUSH_CONSTANT)
{
const UniformBlock &pc_block = *first_block.block;
- vk.CmdPushConstants(command_buffer, self.shprog->layout_handle, VK_SHADER_STAGE_ALL,
+ vk.CmdPushConstants(command_buffer, self.shprog->layout_handle, self.shprog->stage_flags,
pc_block.get_offset(), pc_block.get_data_size(), pc_block.get_data_pointer());
}
}
VulkanProgram::VulkanProgram(VulkanProgram &&other):
device(other.device),
n_stages(other.n_stages),
+ stage_flags(other.stage_flags),
creation_info(move(other.creation_info)),
desc_set_layout_handles(move(other.desc_set_layout_handles)),
layout_handle(other.layout_handle)
i = 0;
for(const SpirVModule::EntryPoint &e: entry_points)
{
+ unsigned stage_bit = get_vulkan_stage(e.stage);
+ stage_flags |= stage_bit;
+
stage_infos[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
- stage_infos[i].stage = static_cast<VkShaderStageFlagBits>(get_vulkan_stage(e.stage));
+ stage_infos[i].stage = static_cast<VkShaderStageFlagBits>(stage_bit);
stage_infos[i].module = handle_cast<::VkShaderModule>(mod.handle);
strcpy(name_ptr, e.name.c_str());
stage_infos[i].pName = name_ptr;
}
VkPushConstantRange push_const_range = { };
- push_const_range.stageFlags = VK_SHADER_STAGE_ALL;
+ push_const_range.stageFlags = stage_flags;
push_const_range.offset = 0;
push_const_range.size = (push_const_block ? push_const_block->data_size : 0);