1 #ifndef _VKPROGRAMS_HPP 2 #define _VKPROGRAMS_HPP 3 /*------------------------------------------------------------------------- 4 * Vulkan CTS Framework 5 * -------------------- 6 * 7 * Copyright (c) 2015 Google Inc. 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief Program utilities. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "vkDefs.hpp" 27 #include "vkRef.hpp" 28 #include "vkSpirVProgram.hpp" 29 #include "vkShaderProgram.hpp" 30 31 #include "deUniquePtr.hpp" 32 #include "deSTLUtil.hpp" 33 34 #include <vector> 35 #include <map> 36 37 namespace vk 38 { 39 40 enum ProgramFormat 41 { 42 PROGRAM_FORMAT_SPIRV = 0, 43 44 PROGRAM_FORMAT_LAST 45 }; 46 47 class ProgramBinary 48 { 49 public: 50 ProgramBinary (ProgramFormat format, size_t binarySize, const deUint8* binary); 51 52 ProgramFormat getFormat (void) const { return m_format; } 53 size_t getSize (void) const { return m_binary.size(); } 54 const deUint8* getBinary (void) const { return m_binary.empty() ? DE_NULL : &m_binary[0]; } 55 56 private: 57 const ProgramFormat m_format; 58 const std::vector<deUint8> m_binary; 59 }; 60 61 struct BinaryBuildOptions 62 { 63 }; 64 65 template<typename Program, typename BuildOptions> 66 class ProgramCollection 67 { 68 public: 69 ProgramCollection (void); 70 ProgramCollection (const BuildOptions defaultBuildOptions); 71 ~ProgramCollection (void); 72 73 void clear (void); 74 75 Program& add (const std::string& name); 76 Program& add (const std::string& name, const BuildOptions* buildOptions); 77 void add (const std::string& name, de::MovePtr<Program>& program); 78 79 bool contains (const std::string& name) const; 80 const Program& get (const std::string& name) const; 81 82 class Iterator 83 { 84 private: 85 typedef typename std::map<std::string, Program*>::const_iterator IteratorImpl; 86 87 public: 88 explicit Iterator (const IteratorImpl& i) : m_impl(i) {} 89 90 Iterator& operator++ (void) { ++m_impl; return *this; } 91 const Program& operator* (void) const { return getProgram(); } 92 93 const std::string& getName (void) const { return m_impl->first; } 94 const Program& getProgram (void) const { return *m_impl->second; } 95 96 bool operator== (const Iterator& other) const { return m_impl == other.m_impl; } 97 bool operator!= (const Iterator& other) const { return m_impl != other.m_impl; } 98 99 private: 100 101 IteratorImpl m_impl; 102 }; 103 104 Iterator begin (void) const { return Iterator(m_programs.begin()); } 105 Iterator end (void) const { return Iterator(m_programs.end()); } 106 107 bool empty (void) const { return m_programs.empty(); } 108 109 private: 110 typedef std::map<std::string, Program*> ProgramMap; 111 112 ProgramMap m_programs; 113 BuildOptions m_defaultBuildOptions; 114 }; 115 116 template<typename Program, typename BuildOptions> 117 ProgramCollection<Program, BuildOptions>::ProgramCollection (void) 118 { 119 } 120 121 template<typename Program, typename BuildOptions> 122 ProgramCollection<Program, BuildOptions>::ProgramCollection (const BuildOptions defaultBuildOptions) 123 : m_programs() 124 , m_defaultBuildOptions(defaultBuildOptions) 125 { 126 } 127 128 template<typename Program, typename BuildOptions> 129 ProgramCollection<Program, BuildOptions>::~ProgramCollection (void) 130 { 131 clear(); 132 } 133 134 template<typename Program, typename BuildOptions> 135 void ProgramCollection<Program, BuildOptions>::clear (void) 136 { 137 for (typename ProgramMap::const_iterator i = m_programs.begin(); i != m_programs.end(); ++i) 138 delete i->second; 139 m_programs.clear(); 140 } 141 142 template<typename Program, typename BuildOptions> 143 Program& ProgramCollection<Program, BuildOptions>::add (const std::string& name) 144 { 145 DE_ASSERT(!contains(name)); 146 de::MovePtr<Program> prog = de::newMovePtr<Program>(); 147 prog->buildOptions = m_defaultBuildOptions; 148 m_programs[name] = prog.get(); 149 prog.release(); 150 return *m_programs[name]; 151 } 152 153 template<typename Program, typename BuildOptions> 154 Program& ProgramCollection<Program, BuildOptions>::add (const std::string& name, const BuildOptions* buildOptions) 155 { 156 Program& program = add(name); 157 158 if (buildOptions != DE_NULL) 159 program << *buildOptions; 160 161 return program; 162 } 163 164 template<typename Program, typename BuildOptions> 165 void ProgramCollection<Program, BuildOptions>::add (const std::string& name, de::MovePtr<Program>& program) 166 { 167 DE_ASSERT(!contains(name)); 168 m_programs[name] = program.get(); 169 program.release(); 170 } 171 172 template<typename Program, typename BuildOptions> 173 bool ProgramCollection<Program, BuildOptions>::contains (const std::string& name) const 174 { 175 return de::contains(m_programs, name); 176 } 177 178 template<typename Program, typename BuildOptions> 179 const Program& ProgramCollection<Program, BuildOptions>::get (const std::string& name) const 180 { 181 DE_ASSERT(contains(name)); 182 return *m_programs.find(name)->second; 183 } 184 185 typedef ProgramCollection<GlslSource, ShaderBuildOptions> GlslSourceCollection; 186 typedef ProgramCollection<HlslSource, ShaderBuildOptions> HlslSourceCollection; 187 typedef ProgramCollection<SpirVAsmSource, SpirVAsmBuildOptions> SpirVAsmCollection; 188 189 struct SourceCollections 190 { 191 SourceCollections (const deUint32 usedVulkanVersion_, 192 const ShaderBuildOptions& glslBuildOptions, 193 const ShaderBuildOptions& hlslBuildOptions, 194 const SpirVAsmBuildOptions& spirVAsmBuildOptions) 195 : usedVulkanVersion(usedVulkanVersion_) 196 , glslSources(glslBuildOptions) 197 , hlslSources(hlslBuildOptions) 198 , spirvAsmSources(spirVAsmBuildOptions) 199 { 200 } 201 202 deUint32 usedVulkanVersion; 203 GlslSourceCollection glslSources; 204 HlslSourceCollection hlslSources; 205 SpirVAsmCollection spirvAsmSources; 206 }; 207 208 typedef ProgramCollection<ProgramBinary, BinaryBuildOptions> BinaryCollection; 209 210 ProgramBinary* buildProgram (const GlslSource& program, glu::ShaderProgramInfo* buildInfo, const tcu::CommandLine& commandLine); 211 ProgramBinary* buildProgram (const HlslSource& program, glu::ShaderProgramInfo* buildInfo, const tcu::CommandLine& commandLine); 212 ProgramBinary* assembleProgram (const vk::SpirVAsmSource& program, SpirVProgramInfo* buildInfo, const tcu::CommandLine& commandLine); 213 void disassembleProgram (const ProgramBinary& program, std::ostream* dst); 214 bool validateProgram (const ProgramBinary& program, std::ostream* dst, const SpirvValidatorOptions&); 215 216 Move<VkShaderModule> createShaderModule (const DeviceInterface& deviceInterface, VkDevice device, const ProgramBinary& binary, VkShaderModuleCreateFlags flags); 217 218 glu::ShaderType getGluShaderType (VkShaderStageFlagBits shaderStage); 219 VkShaderStageFlagBits getVkShaderStage (glu::ShaderType shaderType); 220 221 vk::SpirvVersion getMaxSpirvVersionForAsm (const deUint32 vulkanVersion); 222 vk::SpirvVersion getMaxSpirvVersionForGlsl (const deUint32 vulkanVersion); 223 vk::SpirvVersion getBaselineSpirvVersion (const deUint32 vulkanVersion); 224 SpirvVersion extractSpirvVersion (const ProgramBinary& binary); 225 std::string getSpirvVersionName (const SpirvVersion spirvVersion); 226 SpirvVersion& operator++ (SpirvVersion& spirvVersion); 227 228 } // vk 229 230 #endif // _VKPROGRAMS_HPP 231