@@ -860,6 +860,37 @@ class PipelineMaker {
860860 modules_.emplace_back (info);
861861 }
862862
863+ struct SpecEntry {
864+ uint32_t constantID;
865+ uint32_t value;
866+ };
867+ // / Add a shader module with specialized constants to the pipeline.
868+ void shader (vk::ShaderStageFlagBits stage, vku::ShaderModule &shader,
869+ std::initializer_list<SpecEntry> specEntries,
870+ const char *entryPoint = " main" ) {
871+ auto data = std::unique_ptr<SpecData>{new SpecData};
872+ uint32_t offset = 0 ;
873+ data->data_size_ = specEntries.size ()*sizeof (uint32_t );
874+ data->data_ = std::unique_ptr<char []>(new char [data->data_size_ ]);
875+ for (auto &entry : specEntries) {
876+ data->specializationMapEntries_ .emplace_back (
877+ entry.constantID , offset, sizeof (uint32_t ));
878+ *reinterpret_cast <int32_t *>(data->data_ .get () + offset) = entry.value ;
879+ offset += sizeof (uint32_t );
880+ }
881+ data->specializationInfo_ .mapEntryCount = specEntries.size ();
882+ data->specializationInfo_ .pMapEntries = data->specializationMapEntries_ .data ();
883+ data->specializationInfo_ .dataSize = data->data_size_ ;
884+ data->specializationInfo_ .pData = data->data_ .get ();
885+ vk::PipelineShaderStageCreateInfo info{};
886+ info.module = shader.module ();
887+ info.pName = entryPoint;
888+ info.stage = stage;
889+ info.pSpecializationInfo = &data->specializationInfo_ ;
890+ modules_.emplace_back (info);
891+ moduleSpecializations_.emplace_back (std::move (data));
892+ }
893+
863894 // / Add a blend state to the pipeline for one colour attachment.
864895 // / If you don't do this, a default is used.
865896 void colorBlend (const vk::PipelineColorBlendAttachmentState &state) {
@@ -1012,6 +1043,13 @@ class PipelineMaker {
10121043 vk::PipelineColorBlendStateCreateInfo colorBlendState_;
10131044 std::vector<vk::PipelineColorBlendAttachmentState> colorBlendAttachments_;
10141045 std::vector<vk::PipelineShaderStageCreateInfo> modules_;
1046+ struct SpecData {
1047+ vk::SpecializationInfo specializationInfo_;
1048+ std::vector<vk::SpecializationMapEntry> specializationMapEntries_;
1049+ std::unique_ptr<char []> data_;
1050+ size_t data_size_;
1051+ };
1052+ std::vector<std::unique_ptr<SpecData>> moduleSpecializations_;
10151053 std::vector<vk::VertexInputAttributeDescription> vertexAttributeDescriptions_;
10161054 std::vector<vk::VertexInputBindingDescription> vertexBindingDescriptions_;
10171055 std::vector<vk::DynamicState> dynamicState_;
0 commit comments