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>& allPrograms();
28 const std::vector<uint32_t>& allShaders();
35 #elif defined(Q_OS_MAC)
45 extern const Dialect DEFAULT_DIALECT;
47 const std::vector<Dialect>& allDialects();
48 const std::string& dialectPath(Dialect dialect);
55 const std::vector<Variant>& allVariants();
57 static const uint32_t NUM_VARIANTS = 2;
59 using Binary = std::vector<uint8_t>;
60 using String = std::string;
65 std::size_t operator()(T t)
const
67 return static_cast<std::size_t
>(t);
72 using LocationMap = std::unordered_map<std::string, int32_t>;
73 using ValidSet = std::unordered_set<int32_t>;
75 void parse(
const std::string& json);
76 void merge(
const Reflection& reflection);
78 bool validInput(int32_t location)
const {
return validLocation(validInputs, location); }
79 bool validOutput(int32_t location)
const {
return validLocation(validOutputs, location); }
80 bool validTexture(int32_t location)
const {
return validLocation(validTextures, location); }
81 bool validUniform(int32_t location)
const {
return validLocation(validUniforms, location); }
82 bool validUniformBuffer(int32_t location)
const {
return validLocation(validUniformBuffers, location); }
83 bool validResourceBuffer(int32_t location)
const {
return validLocation(validResourceBuffers, location); }
92 LocationMap uniformBuffers;
95 LocationMap resourceBuffers;
100 static std::vector<std::string> getNames(
const LocationMap& locations);
104 bool validLocation(
const ValidSet& locations, int32_t location)
const {
105 return locations.count(location) != 0;
110 ValidSet validInputs;
111 ValidSet validOutputs;
112 ValidSet validTextures;
113 ValidSet validUniformBuffers;
114 ValidSet validResourceBuffers;
115 ValidSet validUniforms;
118 struct DialectVariantSource {
126 Reflection reflection;
128 bool valid()
const {
return !scribe.empty(); }
131 struct DialectSource {
132 std::unordered_map<Variant, DialectVariantSource, EnumClassHash> variantSources;
136 using Pointer = std::shared_ptr<Source>;
138 Source& operator=(
const Source& other);
140 uint32_t
id{ INVALID_SHADER };
146 std::unordered_map<Dialect, DialectSource, EnumClassHash> dialectSources;
149 std::unordered_map<std::string, std::string> replacements;
151 String getSource(Dialect dialect, Variant variant)
const;
152 const Reflection& getReflection(Dialect dialect, Variant variant)
const;
153 bool valid()
const {
return !dialectSources.empty(); }
154 static Source generate(
const std::string& glsl) {
throw std::runtime_error(
"Implement me"); }
155 static const Source& get(uint32_t shaderId);
159 Source(
const Source& other) =
delete;
161 static Source::Pointer loadSource(uint32_t shaderId) ;
163 bool doReplacement(String& source)
const;
164 const DialectVariantSource& getDialectVariantSource(Dialect dialect, Variant variant)
const;
168 inline uint32_t getVertexId(uint32_t programId) {
169 return (programId >> 16) & UINT16_MAX;
172 inline uint32_t getFragmentId(uint32_t programId) {
173 return programId & UINT16_MAX;