12 #include <unordered_map>
13 #include <unordered_set>
18 #include <QtCore/QtGlobal>
20 #include <ShaderEnums.h>
24 static const uint32_t INVALID_SHADER = (uint32_t)-1;
25 static const uint32_t INVALID_PROGRAM = (uint32_t)-1;
27 const std::vector<uint32_t>& startupPrograms();
28 const std::vector<uint32_t>& allShaders();
36 const std::vector<Dialect>& allDialects();
37 const std::string& dialectPath(Dialect dialect);
44 const std::vector<Variant>& allVariants();
46 static const uint32_t NUM_VARIANTS = 2;
48 using Binary = std::vector<uint8_t>;
49 using String = std::string;
54 std::size_t operator()(T t)
const
56 return static_cast<std::size_t
>(t);
61 using LocationMap = std::unordered_map<std::string, int32_t>;
62 using ValidSet = std::unordered_set<int32_t>;
64 void parse(
const std::string& json);
65 void merge(
const Reflection& reflection);
67 bool validInput(int32_t location)
const {
return validLocation(validInputs, location); }
68 bool validOutput(int32_t location)
const {
return validLocation(validOutputs, location); }
69 bool validTexture(int32_t location)
const {
return validLocation(validTextures, location); }
70 bool validUniform(int32_t location)
const {
return validLocation(validUniforms, location); }
71 bool validUniformBuffer(int32_t location)
const {
return validLocation(validUniformBuffers, location); }
72 bool validResourceBuffer(int32_t location)
const {
return validLocation(validResourceBuffers, location); }
81 LocationMap uniformBuffers;
84 LocationMap resourceBuffers;
89 size_t descriptorCount()
const {
90 return textures.size() + uniformBuffers.size() + resourceBuffers.size();
93 static std::vector<std::string> getNames(
const LocationMap& locations);
97 bool validLocation(
const ValidSet& locations, int32_t location)
const {
98 return locations.contains(location);
103 ValidSet validInputs;
104 ValidSet validOutputs;
105 ValidSet validTextures;
106 ValidSet validUniformBuffers;
107 ValidSet validResourceBuffers;
108 ValidSet validUniforms;
111 struct DialectVariantSource {
119 Reflection reflection;
121 bool valid()
const {
return !scribe.empty(); }
124 struct DialectSource {
125 std::unordered_map<Variant, DialectVariantSource, EnumClassHash> variantSources;
129 using Pointer = std::shared_ptr<Source>;
131 Source& operator=(
const Source& other);
133 uint32_t
id{ INVALID_SHADER };
139 Reflection reflection;
142 std::unordered_map<Dialect, DialectSource, EnumClassHash> dialectSources;
145 std::unordered_map<std::string, std::string> replacements;
147 String getSource(Dialect dialect, Variant variant)
const;
148 const Reflection& getReflection(Dialect dialect, Variant variant)
const;
149 bool valid()
const {
return !dialectSources.empty(); }
150 static Source generate(
const std::string& glsl) {
throw std::runtime_error(
"Implement me"); }
151 static const Source& get(uint32_t shaderId);
155 Source(
const Source& other) =
delete;
157 static Source::Pointer loadSource(uint32_t shaderId) ;
159 bool doReplacement(String& source)
const;
160 const DialectVariantSource& getDialectVariantSource(Dialect dialect, Variant variant)
const;
164 inline uint32_t getVertexId(uint32_t programId) {
165 return (programId >> 16) & UINT16_MAX;
168 inline uint32_t getFragmentId(uint32_t programId) {
169 return programId & UINT16_MAX;
172 inline uint32_t makeProgramId(uint32_t vertexId, uint32_t fragmentId) {
173 return (vertexId << 16) | fragmentId;