Pioneer
Loading...
Searching...
No Matches
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
16namespace 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
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;
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
Shader()
Definition Shader.cpp:26
const std::vector< PushConstantData > & GetPushConstantBindings() const
Definition Shader.h:87
const std::vector< BufferBindingData > & GetBufferBindings() const
Definition Shader.h:91
size_t GetConstantStorageSize() const
Definition Shader.h:85
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
const std::string & GetString(size_t name) const
Definition Shader.h:93
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
const std::vector< TextureBindingData > & GetTextureBindings() const
Definition Shader.h:82
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