Pioneer
Shader.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #pragma once
5 
6 #include "OpenGLLibs.h"
7 #include "Uniform.h"
8 #include "graphics/Material.h"
9 #include "graphics/Texture.h"
10 #include "graphics/Types.h"
11 
12 #include <map>
13 #include <string>
14 #include <vector>
15 
16 namespace Graphics {
17  namespace OGL {
18 
19  struct ShaderException {};
20 
22  size_t name;
23  uint32_t index;
24  // uniform location attribute
25  GLuint binding;
26  // Offset of the given push constant in the binary blob of constant data
27  uint32_t offset;
28  // Data format of this specific push constant
30  };
31 
33  size_t name;
34  uint32_t index;
35  // texture unit location
36  GLuint binding;
37  // Data format of this texture sampler binding (e.g. sampler2d)
39  };
40 
42  size_t name;
43  uint32_t index;
44  // uniform location attribute
45  GLuint binding;
46  // reserved for future implementation (e.g. size / binding set)
47  uint32_t _unused;
48  };
49 
50  struct ProgramDef {
51  std::string name;
52  std::string vertexShader;
53  std::string fragmentShader;
54  std::string defines;
55  };
56 
57  class Program;
58 
59  /*
60  * The Shader serves as a reflection interface to a compiled shader pipeline / material.
61  * It's responsible for storing the names, locations, and types of the graphics API's
62  * data interface with the renderer.
63  *
64  * It's responsible for selecting the correct Program when rendering, based on runtime
65  * renderer state (e.g. number of lights, render quality settings, etc.)
66  */
67  class Shader {
68  public:
69  static constexpr GLuint InvalidBinding = UINT32_MAX;
70 
71  Shader();
72  Shader(const std::string &name);
73  virtual ~Shader();
74 
75  void Reload();
76 
78  uint32_t GetNumVariants() const { return m_variants.size(); }
79 
80  TextureBindingData GetTextureBindingInfo(size_t name) const;
81  size_t GetNumTextureBindings() const { return m_textureBindingInfo.size(); }
82  const std::vector<TextureBindingData> &GetTextureBindings() const { return m_textureBindingInfo; }
83 
84  PushConstantData GetPushConstantInfo(size_t name) const;
85  size_t GetConstantStorageSize() const { return m_constantStorageSize; }
86  size_t GetNumPushConstants() const { return m_pushConstantInfo.size(); }
87  const std::vector<PushConstantData> &GetPushConstantBindings() const { return m_pushConstantInfo; }
88 
89  BufferBindingData GetBufferBindingInfo(size_t name) const;
90  size_t GetNumBufferBindings() const { return m_bufferBindingInfo.size(); }
91  const std::vector<BufferBindingData> &GetBufferBindings() const { return m_bufferBindingInfo; }
92 
93  const std::string &GetString(size_t name) const { return m_nameMap.at(name); }
94 
95  protected:
96  friend class Program;
97 
98  std::string GetProgramDefines(const MaterialDescriptor &desc);
100 
101  size_t AddTextureBinding(const std::string &name, TextureType type, uint32_t binding);
102  size_t AddConstantBinding(const std::string &name, ConstantDataFormat format, uint32_t binding);
103  size_t AddBufferBinding(const std::string &name, uint32_t binding);
104 
105  protected:
108  std::vector<std::pair<MaterialDescriptor, Program *>> m_variants;
109 
110  std::vector<TextureBindingData> m_textureBindingInfo;
111  std::vector<PushConstantData> m_pushConstantInfo;
112  std::vector<BufferBindingData> m_bufferBindingInfo;
113 
114  std::map<size_t, std::string> m_nameMap;
115  };
116 
117  } // namespace OGL
118 } // namespace Graphics
Definition: Material.h:60
Definition: Program.h:25
Definition: Shader.h:67
const std::vector< PushConstantData > & GetPushConstantBindings() const
Definition: Shader.h:87
const std::string & GetString(size_t name) const
Definition: Shader.h:93
const std::vector< BufferBindingData > & GetBufferBindings() const
Definition: Shader.h:91
Shader()
Definition: Shader.cpp:26
size_t GetConstantStorageSize() const
Definition: Shader.h:85
const std::vector< TextureBindingData > & GetTextureBindings() const
Definition: Shader.h:82
std::vector< PushConstantData > m_pushConstantInfo
Definition: Shader.h:111
uint32_t m_constantStorageSize
Definition: Shader.h:107
std::string GetProgramDefines(const MaterialDescriptor &desc)
Definition: Shader.cpp:134
std::vector< std::pair< MaterialDescriptor, Program * > > m_variants
Definition: Shader.h:108
std::vector< BufferBindingData > m_bufferBindingInfo
Definition: Shader.h:112
std::map< size_t, std::string > m_nameMap
Definition: Shader.h:114
size_t GetNumBufferBindings() const
Definition: Shader.h:90
std::vector< TextureBindingData > m_textureBindingInfo
Definition: Shader.h:110
static constexpr GLuint InvalidBinding
Definition: Shader.h:69
Program * LoadProgram(const MaterialDescriptor &desc)
Definition: Shader.cpp:126
void Reload()
Definition: Shader.cpp:109
size_t AddBufferBinding(const std::string &name, uint32_t binding)
Definition: Shader.cpp:230
TextureBindingData GetTextureBindingInfo(size_t name) const
Definition: Shader.cpp:273
ProgramDef m_programDef
Definition: Shader.h:106
size_t AddTextureBinding(const std::string &name, TextureType type, uint32_t binding)
Definition: Shader.cpp:238
size_t AddConstantBinding(const std::string &name, ConstantDataFormat format, uint32_t binding)
Definition: Shader.cpp:246
Program * GetProgramForDesc(const MaterialDescriptor &desc)
Definition: Shader.cpp:96
PushConstantData GetPushConstantInfo(size_t name) const
Definition: Shader.cpp:281
BufferBindingData GetBufferBindingInfo(size_t name) const
Definition: Shader.cpp:289
size_t GetNumPushConstants() const
Definition: Shader.h:86
uint32_t GetNumVariants() const
Definition: Shader.h:78
size_t GetNumTextureBindings() const
Definition: Shader.h:81
virtual ~Shader()
Definition: Shader.cpp:88
Definition: Background.h:14
TextureType
Definition: Texture.h:38
ConstantDataFormat
Definition: Types.h:55
Definition: Shader.h:41
size_t name
Definition: Shader.h:42
GLuint binding
Definition: Shader.h:45
uint32_t index
Definition: Shader.h:43
uint32_t _unused
Definition: Shader.h:47
Definition: Shader.h:50
std::string name
Definition: Shader.h:51
std::string fragmentShader
Definition: Shader.h:53
std::string vertexShader
Definition: Shader.h:52
std::string defines
Definition: Shader.h:54
Definition: Shader.h:21
ConstantDataFormat format
Definition: Shader.h:29
uint32_t offset
Definition: Shader.h:27
uint32_t index
Definition: Shader.h:23
GLuint binding
Definition: Shader.h:25
size_t name
Definition: Shader.h:22
Definition: Shader.h:19
Definition: Shader.h:32
GLuint binding
Definition: Shader.h:36
TextureType format
Definition: Shader.h:38
size_t name
Definition: Shader.h:33
uint32_t index
Definition: Shader.h:34