sead
Loading...
Searching...
No Matches
aglShaderProgram.h
Go to the documentation of this file.
1#pragma once
2
3#include <common/aglDisplayList.h>
4#include <common/aglResShaderSymbol.h>
5#include <common/aglResShaderVariation.h>
6#include <common/aglShader.h>
7#include <common/aglShaderLocation.h>
8#include <container/seadBuffer.h>
9#include <container/seadSafeArray.h>
10#include <prim/seadBitFlag.h>
11#include <prim/seadNamable.h>
12
13namespace agl {
14
16{
17public:
18 static const s32 cVariationMacroMax = 1024;
19 static const s32 cVariationValueMax = 1024;
20
21 static void changeShaderMode(ShaderMode mode);
22
23public:
25 virtual ~ShaderProgram();
26
28 {
29 return mVariationID;
30 }
31
33 {
34 return mDisplayList;
35 }
36
38 {
39 return mDisplayList;
40 }
41
42 const sead::SafeString& getName() const
43 {
44 return mpSharedData->getName();
45 }
46
48 {
49 return mpSharedData->mResShaderSymbolArray[type];
50 }
51
53 {
54 mpSharedData->mResShaderSymbolArray[type] = array;
55 }
56
58 {
59 mpSharedData->mResShaderVariationDefaultArray = array;
60 }
61
62 void initialize(const sead::SafeString& name, sead::Heap* heap);
63
64 void createVariationBuffer(s32 macro_num, sead::Heap* heap);
65
66 void createVariationMacro(s32 index, const sead::SafeString& name, const sead::SafeString& id, s32 value_num, sead::Heap* heap);
67 void setVariationMacroValue(s32 macro_index, s32 value_index, const sead::SafeString& value);
68
69 void createVariation(sead::Heap* heap);
70
71 ShaderMode activate(ShaderMode current_mode = cShaderMode_Invalid, bool use_dl = true) const;
72
74 const Shader* getShader(ShaderType type) const;
75
76#ifdef cafe
82
84 {
85 validate_();
86 return mVertexShader.getBinary();
87 }
88
94
96 {
97 validate_();
99 }
100
106
108 {
109 validate_();
110 return mGeometryShader.getBinary();
111 }
112#endif // cafe
113
114 void createAttribute(s32 num, sead::Heap* heap = nullptr);
115 void setAttributeName(s32 index, const sead::SafeString& name);
116
117 void createUniform(s32 num, sead::Heap* heap = nullptr);
118 void setUniformName(s32 index, const sead::SafeString& name);
119
120 void createUniformBlock(s32 num, sead::Heap* heap = nullptr);
121 void setUniformBlockName(s32 index, const sead::SafeString& name);
122
123 void createSamplerLocation(s32 num, sead::Heap* heap = nullptr);
124 void setSamplerLocationName(s32 index, const sead::SafeString& name);
125
126 u32 setUpAllVariation(); // I don't know the actual return type
128
129 s32 getVariationNum() const;
131
132 s32 searchVariationShaderProgramIndex(s32 macro_num, const char* const* macro_array, const char* const* value_array) const;
133
134 ShaderProgram* getVariation(s32 index);
135 const ShaderProgram* getVariation(s32 index) const;
136
137 const ShaderProgram* searchVariationShaderProgram(s32 macro_num, const char* const* macro_array, const char* const* value_array) const
138 {
139 s32 index = searchVariationShaderProgramIndex(macro_num, macro_array, value_array);
140 return getVariation(index);
141 }
142
143 const sead::SafeString& searchVariationMacroName(const sead::SafeString& id) const;
144
145 s32 getVariationMacroValueVariationNum(s32 macro_index) const;
146
147 u32 updateVariation(s32 index) // I don't know the actual name
148 {
149 ShaderProgram* program = getVariation(index);
150 program->mFlag.set(8 | 2);
151 return program->validate_();
152 }
153
154 const AttributeLocation& getAttributeLocation(s32 index) const { return mAttributeLocation[index]; }
155 const UniformLocation& getUniformLocation(s32 index) const { return mUniformLocation[index]; }
156 const UniformBlockLocation& getUniformBlockLocation(s32 index) const { return mUniformBlockLocation[index]; }
157 const SamplerLocation& getSamplerLocation(s32 index) const { return mSamplerLocation[index]; }
158
160 {
161 validate_();
162 return mAttributeLocation[index];
163 }
164
166 {
167 validate_();
168 return mUniformLocation[index];
169 }
170
172 {
173 validate_();
174 return mUniformBlockLocation[index];
175 }
176
178 {
179 validate_();
180 return mSamplerLocation[index];
181 }
182
183 void updateAttributeLocation() const;
184 void updateUniformLocation() const;
185 void updateUniformBlockLocation() const;
186 void updateSamplerLocation() const;
187
188 void dump() const;
189
190 void cleanUp();
191
192 void destroyAttribute();
193 void destroyUniform();
194 void destroyUniformBlock();
196
197private:
198 u32 validate_() const;
199 u32 forceValidate_() const;
200
201 void setUpForVariation_() const;
202
203 void setShaderGX2_() const;
204
205 class SharedData;
206 class VariationBuffer;
207
208private:
210 {
212 virtual ~VariationBuffer();
213
214 void initialize(ShaderProgram* program, s32 macro_num, sead::Heap* heap);
215
216 void createMacro(s32 index, const sead::SafeString& name, const sead::SafeString& id, s32 value_num, sead::Heap* heap);
217 void setMacroValue(s32 macro_index, s32 value_index, const sead::SafeString& value);
218
219 s32 searchShaderProgramIndex(s32 macro_num, const char* const* macro_array, const char* const* value_array, s32 index) const;
220
221 const sead::SafeString& searchMacroName(const sead::SafeString& id) const;
222
223 void create(sead::Heap* heap);
224
225 s32 getMacroAndValueArray(s32 index, const char** macro_array, const char** value_array) const;
226 s32 getMacroValueIndexArray(s32 index, s32* value_index_array) const;
227 s32 calcVariationIndex(const s32* value_index_array) const;
228
229 s32 getMacroValueVariationNum(s32 macro_index) const
230 {
231 return mMacroData[macro_index].mValueVariationNum;
232 }
233
235 {
239 u16 mValueVariationNum; // Number of variations using *succeeding* macros (i.e., ignoring preceding macros), if value of this macro is fixed.
240 // i.e., In a matrix where variations are the rows, macros are the columns, and a cell would be a macro's value
241 // in a certain variation, this field is the number a macro's value occurs before the next value in the macro's column.
242
243 friend class VariationBuffer;
244 };
245 static_assert(sizeof(MacroData) == 0x1C, "agl::ShaderProgram::VariationBuffer::MacroData size mismatch");
246
250
251 friend class ShaderProgram;
252 friend class SharedData;
253 };
254 static_assert(sizeof(VariationBuffer) == 0x18, "agl::ShaderProgram::VariationBuffer size mismatch");
255
267 static_assert(sizeof(SharedData) == 0x2C, "agl::ShaderProgram::SharedData size mismatch");
268
271
272private:
284};
285static_assert(sizeof(ShaderProgram) == 0x60, "agl::ShaderProgram size mismatch");
286
287}
Definition aglShaderLocation.h:157
Definition aglDisplayList.h:12
Definition aglShader.h:75
Definition aglShader.h:106
Definition aglResShaderSymbol.h:57
Definition aglShaderLocation.h:127
Definition aglShaderProgram.h:257
VariationBuffer * mpVariationBuffer
Definition aglShaderProgram.h:259
ShaderProgram * mpOriginal
Definition aglShaderProgram.h:258
u32 _10
Definition aglShaderProgram.h:260
u32 _28
Definition aglShaderProgram.h:263
sead::UnsafeArray< ResShaderSymbolArray, cShaderSymbolType_Num > mResShaderSymbolArray
Definition aglShaderProgram.h:262
ResShaderVariationArray mResShaderVariationDefaultArray
Definition aglShaderProgram.h:261
Definition aglShaderProgram.h:235
sead::SafeString mID
Definition aglShaderProgram.h:237
u16 mValueVariationNum
Definition aglShaderProgram.h:239
sead::SafeString mName
Definition aglShaderProgram.h:236
sead::Buffer< sead::SafeString > mValue
Definition aglShaderProgram.h:238
Definition aglShaderProgram.h:210
s32 getMacroValueIndexArray(s32 index, s32 *value_index_array) const
Definition aglShaderProgram.cpp:749
void create(sead::Heap *heap)
Definition aglShaderProgram.cpp:712
s32 getMacroValueVariationNum(s32 macro_index) const
Definition aglShaderProgram.h:229
s32 searchShaderProgramIndex(s32 macro_num, const char *const *macro_array, const char *const *value_array, s32 index) const
Definition aglShaderProgram.cpp:665
sead::Buffer< ShaderProgram > mProgram
Definition aglShaderProgram.h:248
void setMacroValue(s32 macro_index, s32 value_index, const sead::SafeString &value)
Definition aglShaderProgram.cpp:660
s32 getMacroAndValueArray(s32 index, const char **macro_array, const char **value_array) const
Definition aglShaderProgram.cpp:728
void initialize(ShaderProgram *program, s32 macro_num, sead::Heap *heap)
Definition aglShaderProgram.cpp:645
ShaderProgram * mpOriginal
Definition aglShaderProgram.h:247
s32 calcVariationIndex(const s32 *value_index_array) const
Definition aglShaderProgram.cpp:765
void createMacro(s32 index, const sead::SafeString &name, const sead::SafeString &id, s32 value_num, sead::Heap *heap)
Definition aglShaderProgram.cpp:651
sead::Buffer< MacroData > mMacroData
Definition aglShaderProgram.h:249
VariationBuffer()
Definition aglShaderProgram.cpp:629
virtual ~VariationBuffer()
Definition aglShaderProgram.cpp:635
const sead::SafeString & searchMacroName(const sead::SafeString &id) const
Definition aglShaderProgram.cpp:703
Definition aglShaderProgram.h:16
void destroyUniformBlock()
Definition aglShaderProgram.cpp:605
void setResShaderSymbolArray(ShaderSymbolType type, const ResShaderSymbolArray &array)
Definition aglShaderProgram.h:52
ShaderProgram()
Definition aglShaderProgram.cpp:17
VariationBuffer * getVariation_()
Definition aglShaderProgram.h:269
s32 searchVariationShaderProgramIndex(s32 macro_num, const char *const *macro_array, const char *const *value_array) const
Definition aglShaderProgram.cpp:305
const ShaderProgram * searchVariationShaderProgram(s32 macro_num, const char *const *macro_array, const char *const *value_array) const
Definition aglShaderProgram.h:137
static const s32 cVariationValueMax
Definition aglShaderProgram.h:19
const DisplayList & getDisplayList() const
Definition aglShaderProgram.h:37
s32 getVariationMacroValueVariationNum(s32 macro_index) const
Definition aglShaderProgram.cpp:347
void initialize(const sead::SafeString &name, sead::Heap *heap)
Definition aglShaderProgram.cpp:48
const SamplerLocation & getSamplerLocation(s32 index) const
Definition aglShaderProgram.h:157
void cleanUp()
Definition aglShaderProgram.cpp:575
DisplayList mDisplayList
Definition aglShaderProgram.h:275
u32 setUpAllVariation()
Definition aglShaderProgram.cpp:248
ShaderMode activate(ShaderMode current_mode=cShaderMode_Invalid, bool use_dl=true) const
Definition aglShaderProgram.cpp:88
void createVariationBuffer(s32 macro_num, sead::Heap *heap)
Definition aglShaderProgram.cpp:61
GeometryShader mGeometryShader
Definition aglShaderProgram.h:282
sead::Buffer< UniformLocation > mUniformLocation
Definition aglShaderProgram.h:277
const AttributeLocation & getAttributeLocation(s32 index) const
Definition aglShaderProgram.h:154
const UniformLocation & getUniformLocationValidate(s32 index) const
Definition aglShaderProgram.h:165
sead::BitFlag8 mFlag
Definition aglShaderProgram.h:273
void createUniform(s32 num, sead::Heap *heap=nullptr)
Definition aglShaderProgram.cpp:167
void destroyUniform()
Definition aglShaderProgram.cpp:593
const VariationBuffer * getVariation_() const
Definition aglShaderProgram.h:270
SharedData * mpSharedData
Definition aglShaderProgram.h:283
const SamplerLocation & getSamplerLocationValidate(s32 index) const
Definition aglShaderProgram.h:177
const Shader * getShader(ShaderType type) const
Definition aglShaderProgram.cpp:125
void setShaderGX2_() const
Definition aglShaderProgram.cpp:561
DisplayList & getDisplayList()
Definition aglShaderProgram.h:32
void setVariationMacroValue(s32 macro_index, s32 value_index, const sead::SafeString &value)
Definition aglShaderProgram.cpp:72
s32 getVariationID() const
Definition aglShaderProgram.h:27
Shader * getShader(ShaderType type)
Definition aglShaderProgram.cpp:110
u16 mVariationID
Definition aglShaderProgram.h:274
sead::Buffer< SamplerLocation > mSamplerLocation
Definition aglShaderProgram.h:279
void updateUniformLocation() const
Definition aglShaderProgram.cpp:362
FragmentShader mFragmentShader
Definition aglShaderProgram.h:281
void updateSamplerLocation() const
Definition aglShaderProgram.cpp:374
static const s32 cVariationMacroMax
Definition aglShaderProgram.h:18
void setAttributeName(s32 index, const sead::SafeString &name)
Definition aglShaderProgram.cpp:154
void setUpForVariation_() const
Definition aglShaderProgram.cpp:531
const ShaderProgram * getVariation(s32 index) const
Definition aglShaderProgram.cpp:326
void createSamplerLocation(s32 num, sead::Heap *heap=nullptr)
Definition aglShaderProgram.cpp:221
void createUniformBlock(s32 num, sead::Heap *heap=nullptr)
Definition aglShaderProgram.cpp:194
const UniformBlockLocation & getUniformBlockLocation(s32 index) const
Definition aglShaderProgram.h:156
static void changeShaderMode(ShaderMode mode)
Definition aglShaderProgram.cpp:12
void updateUniformBlockLocation() const
Definition aglShaderProgram.cpp:368
void createVariation(sead::Heap *heap)
Definition aglShaderProgram.cpp:77
sead::Buffer< UniformBlockLocation > mUniformBlockLocation
Definition aglShaderProgram.h:278
const UniformBlockLocation & getUniformBlockLocationValidate(s32 index) const
Definition aglShaderProgram.h:171
const AttributeLocation & getAttributeLocationValidate(s32 index) const
Definition aglShaderProgram.h:159
VertexShader mVertexShader
Definition aglShaderProgram.h:280
void setUniformName(s32 index, const sead::SafeString &name)
Definition aglShaderProgram.cpp:181
void setSamplerLocationName(s32 index, const sead::SafeString &name)
Definition aglShaderProgram.cpp:235
void reserveSetUpAllVariation()
Definition aglShaderProgram.cpp:273
void setUniformBlockName(s32 index, const sead::SafeString &name)
Definition aglShaderProgram.cpp:208
void createVariationMacro(s32 index, const sead::SafeString &name, const sead::SafeString &id, s32 value_num, sead::Heap *heap)
Definition aglShaderProgram.cpp:67
void createAttribute(s32 num, sead::Heap *heap=nullptr)
Definition aglShaderProgram.cpp:140
const sead::SafeString & getName() const
Definition aglShaderProgram.h:42
const sead::SafeString & searchVariationMacroName(const sead::SafeString &id) const
Definition aglShaderProgram.cpp:338
virtual ~ShaderProgram()
Definition aglShaderProgram.cpp:32
void destroyAttribute()
Definition aglShaderProgram.cpp:581
s32 getVariationMacroNum() const
Definition aglShaderProgram.cpp:296
void setResShaderVariationDefaultArray(const ResShaderVariationArray &array)
Definition aglShaderProgram.h:57
void updateAttributeLocation() const
Definition aglShaderProgram.cpp:356
u32 updateVariation(s32 index)
Definition aglShaderProgram.h:147
const UniformLocation & getUniformLocation(s32 index) const
Definition aglShaderProgram.h:155
const ResShaderSymbolArray & getResShaderSymbolArray(ShaderSymbolType type) const
Definition aglShaderProgram.h:47
ShaderProgram * getVariation(s32 index)
Definition aglShaderProgram.cpp:314
sead::Buffer< AttributeLocation > mAttributeLocation
Definition aglShaderProgram.h:276
void destroySamplerLocation()
Definition aglShaderProgram.cpp:617
s32 getVariationNum() const
Definition aglShaderProgram.cpp:287
u32 forceValidate_() const
Definition aglShaderProgram.cpp:456
void dump() const
Definition aglShaderProgram.cpp:380
u32 validate_() const
Definition aglShaderProgram.cpp:445
Definition aglShader.h:14
Definition aglShaderLocation.h:97
Definition aglShaderLocation.h:40
Definition aglShader.h:44
Definition seadBuffer.h:13
Definition seadHeap.h:23
Definition seadNamable.h:9
const SafeString & getName() const
Definition seadNamable.h:26
Definition seadSafeArray.h:257
Definition aglDisplayList.cpp:5
ShaderType
Definition aglShaderEnum.h:10
ResArray< ResShaderVariation > ResShaderVariationArray
Definition aglResShaderVariation.h:31
ShaderMode
Definition aglShaderEnum.h:27
@ cShaderMode_Invalid
Definition aglShaderEnum.h:31
ShaderSymbolType
Definition aglShaderEnum.h:18
@ cShaderSymbolType_Num
Definition aglShaderEnum.h:23
Definition seadAssert.h:44
SafeStringBase< char > SafeString
Definition seadSafeString.h:409
BitFlag< u8 > BitFlag8
Definition seadBitFlag.h:123