OROCHI
 
Loading...
Searching...
No Matches
GxShaderLanguage.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_CORE_NAMESPACE_BEGIN()
14class GxResCellSheetCsv;
15//===========================================================================
17//===========================================================================
19{
20 //-------------------------------------------------------------
22 //-------------------------------------------------------------
24public:
25 GX_RTTI_CLASS(GxShaderLanguage, GxClassBase)
26 //GX_PROHIBIT_CLASS_BASE(GxShaderLanguage)
27
28 // TODO: 可変長配列
29 static constexpr u32 PARAMETER_COUNT_MAX = 64;
30 static constexpr u32 FUNCTIONS_COUNT_MAX = 64;
31 static constexpr u32 PASS_COUNT_MAX = 64;
32
34 enum class PARAMETER_TYPE : u16
35 {
36 UNKNOWN,
37 BOOL,
38 INT,
39 INT2,
40 INT3,
41 INT4,
42 FLOAT,
43 FLOAT2,
44 FLOAT22,
45 FLOAT23,
46 FLOAT24,
47 FLOAT3,
48 FLOAT32,
49 FLOAT33,
50 FLOAT34,
51 FLOAT4,
52 FLOAT42,
53 FLOAT43,
54 FLOAT44,
55 HALF,
56 HALF2,
57 HALF22,
58 HALF23,
59 HALF24,
60 HALF3,
61 HALF32,
62 HALF33,
63 HALF34,
64 HALF4,
65 HALF42,
66 HALF43,
67 HALF44,
68 SAMPLER,
69 COUNT_MAX,
70 };
71
74 {
76 GxParameterDefaultValue(void) { _float[0] = _float[1] = _float[2] = _float[3] = 0.0f; }
77
78 f32 _float[4];
79 };
80
81#if GX_DEVELOP
83 struct GxParameter
84 {
85 GX_CHAR _name[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
86 GX_CHAR _virtualName[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
87 PARAMETER_TYPE _type;
88 };
89
91 struct GxFunction
92 {
93 GX_CHAR _name[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
94 GX_CHAR _virtualName[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
95 };
96
98 struct GxFunctions
99 {
100 GX_CHAR _name[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
101 GX_CHAR _virtualName[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
102 GxFunction _function[FUNCTIONS_COUNT_MAX];
103 u32 _functionCount;
104 GX_ENUM _gxEnum[FUNCTIONS_COUNT_MAX];
105 };
106
108 struct GxParameterAnnotation
109 {
110 GxString _uiLabel;
111 };
112
113protected:
115 struct GxSemanticsInfo
116 {
117 GX_CHAR _name[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
118 PARAMETER_TYPE _type;
119 };
120
122 struct GxPassInfo
123 {
124 GX_CHAR _name[GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
125 b32 _isNative;
126 GX_CHAR _entryPoint[static_cast<u32>(RENDER_SHADER::MAX)][GxShaderCompiler::GxConstantRegisterElement::PARAMETER_NAME_MAX];
127 GxShaderCompiler::COMPILE_SHADER _shaderType[static_cast<u32>(RENDER_SHADER::MAX)];
128 };
129
131 //-----------------------------------------------------------
133 //-----------------------------------------------------------
135public:
137 GxShaderLanguage(void);
139 GxShaderLanguage(const GxShaderLanguage& language);
140
142 //-------------------------------------------------------------
144 //-------------------------------------------------------------
146
148 b32 initialize(GX_CSTR shaderSource);
150 b32 initialize(GX_CSTR shaderSource, const GxCallback::GxHandlerBase& handler, GX_CSTR shaderPath = nullptr);
151
153 //-------------------------------------------------------------
155 //-------------------------------------------------------------
157public:
159 void Copy(const GxShaderLanguage &);
161 GX_HANDLE getProgramFunctionsHandleByName(GX_CSTR name) const;
163 GX_HANDLE getMaterialFunctionsHandleByName(GX_CSTR name) const;
164
166 GX_HANDLE getProgramFunctionsHandleByVirtualName(GX_CSTR name) const;
168 GX_HANDLE getMaterialFunctionsHandleByVirtualName(GX_CSTR name) const;
169
171 GX_CSTR getProgramFunctionsName(GX_HANDLE handle) const;
173 GX_CSTR getMaterialFunctionsName(GX_HANDLE handle) const;
174
176 GX_CSTR getProgramFunctionsVirtualName(GX_HANDLE handle) const;
178 GX_CSTR getMaterialFunctionsVirtualName(GX_HANDLE handle) const;
179
181 GX_CSTR getProgramFunctionsValueName(GX_HANDLE handle, u32 value) const;
183 GX_CSTR getMaterialFunctionsValueName(GX_HANDLE handle, u32 value) const;
184
186 GX_CSTR getProgramFunctionsValueVirtualName(GX_HANDLE handle, u32 value) const;
188 GX_CSTR getMaterialFunctionsValueVirtualName(GX_HANDLE handle, u32 value) const;
189
191 u32 getProgramFunctionsValueByName(GX_HANDLE handle, GX_CSTR name) const;
193 u32 getMaterialFunctionsValueByName(GX_HANDLE handle, GX_CSTR name) const;
194
196 u32 getProgramFunctionsValueByVirtualName(GX_HANDLE handle, GX_CSTR name) const;
198 u32 getMaterialFunctionsValueByVirtualName(GX_HANDLE handle, GX_CSTR name) const;
199
201 const GX_ENUM* getProgramFunctionsValueGxEnum(GX_HANDLE handle) const;
203 const GX_ENUM* getMaterialFunctionsValueGxEnum(GX_HANDLE handle) const;
204
206 void setProgramFunctions(GX_HANDLE handle, u32 value);
208 void setMaterialFunctions(GX_HANDLE handle, u32 value);
209
211 constexpr u32 getProgramFunctionsCount(void) const { return _programFunctionsCount; }
213 constexpr u32 getMaterialFunctionsCount(void) const { return _materialFunctionsCount; }
214
216 u32 getProgramFunctionsValueCount(GX_HANDLE handle) const;
218 u32 getMaterialFunctionsValueCount(GX_HANDLE handle) const;
219
221 GX_HANDLE getProgramParameterHandleByName(GX_CSTR name) const;
223 GX_HANDLE getMaterialParameterHandleByName(GX_CSTR name) const;
224
226 GX_HANDLE getProgramParameterHandleByVirtualName(GX_CSTR name) const;
228 GX_HANDLE getMaterialParameterHandleByVirtualName(GX_CSTR name) const;
229
231 GX_CSTR getProgramParameterName(GX_HANDLE handle) const;
233 GX_CSTR getMaterialParameterName(GX_HANDLE handle) const;
234
236 GX_CSTR getProgramParameterVirtualName(GX_HANDLE handle) const;
238 GX_CSTR getMaterialParameterVirtualName(GX_HANDLE handle) const;
239
241 PARAMETER_TYPE getProgramParameterType(GX_HANDLE handle) const;
243 PARAMETER_TYPE getMaterialParameterType(GX_HANDLE handle) const;
244
246 GxParameterAnnotation getMaterialParameterAnnotation(GX_HANDLE handle) const;
248 const GxParameterDefaultValue& getMaterialParameterDefaultValue(GX_HANDLE handle) const;
249
251 constexpr u32 getProgramParameterCount(void) const { return _programParameterCount; }
253 constexpr u32 getMaterialParameterCount(void) const { return _materialParameterCount; }
254
256 void setPass(u32 value);
258 constexpr u32 getPassCount(void) const { return _passCount; }
260 u32 getPassByName(GX_CSTR name) const;
262 GX_CSTR getPassName(u32 pass) const;
264 constexpr GxShaderCompiler::COMPILE_SHADER getShaderType(RENDER_SHADER renderShader, u32 pass) const {return _passInfo[pass]._shaderType[static_cast<u32>(renderShader)]; }
265#if GX_SHADER_DEBUG
267 constexpr GX_CSTR getShaderPath(void) const { return _shaderPath; }
268#endif //GX_SHADER_DEBUG
269
271 //-------------------------------------------------------------
273 //-------------------------------------------------------------
275
277 void setupCompile(void);
278
280 b32 compileVertexShader(GxShaderCompiler& shaderCompiler);
281
283 b32 compilePixelShader(GxShaderCompiler& shaderCompiler);
284#if GX_ENABLE_TESSELLATION
286 b32 compileHullShader(GxShaderCompiler& shaderCompiler);
287
289 b32 compileDomainShader(GxShaderCompiler& shaderCompiler);
290#endif //GX_ENABLE_TESSELLATION
291#if GX_ENABLE_COMPUTE_SHADER
293 b32 compileComputeShader(GxShaderCompiler& shaderCompiler);
294#endif // GX_ENABLE_COMPUTE_SHADER
295
296protected:
298 void executeInclude(void);
300 void replaceDefineConstant(void);
302 void executeProgramDefine(void);
304 void executeMaterialDefine(void);
306 void executeDefine(GX_CSTR defineString, GxParameter* pParameter, GxFunctions* pFunctions, u32& parameterCount, u32& functionsCount);
308 void parseVertexInput(void);
310 void parseInterpolator(void);
312 void parseTechnique(void);
314 void parseAnnotationAndDefaultValue(void);
316 void proxyVertexShader(GxString& outputString, u32 outputSemantics);
317
319 void replaceFunction(GxString& program, const GxFunctions* pFunctions, const u8* pFunctionsValue, u32 functionsCount);
320
322 void removeUnusedFunctions(GxString& program, GX_CSTR entryPoint, GX_CSTR escapeFunction = nullptr);
324 b32 removeUnusedFunction(GxString& program, GX_CSTR functionName, b32 isForce = false);
326 void removeUnusedConstValues(GxString& program);
327
329 static void* allocateCompilerMemory(size_t size);
331 static void freeCompilerMemory(void* pAddress);
332
334 s32 defaultIncludeCallback(void* pSource, void* pArgument);
336 void getVertexShader(GxString& vertexShader, const GxString& program);
338 void getPixelShader(GxString& pixelShader, const GxString& program);
339#if GX_ENABLE_TESSELLATION
341 void getHullShader(GxString& hullShader, const GxString& program);
343 void getDomainShader(GxString& domainShader, const GxString& program);
344#endif //GX_ENABLE_TESSELLATION
345#if GX_USE_OPENGL
346public:
348 static RENDER_SEMANTICS getRenderSemanticsGLSL(const GxString& text);
350 static void replaceSemanticsGLSL(GxString& buffer);
351private:
353 void removeFunction(GxString& src, GX_CSTR entryPoint);
354#endif //GX_USE_OPENGL
355public:
357 void warningShaderInfo(void);
359 static void eraseComment(GxString& buffer);
361 static void replaceSpace(GxString& buffer);
362protected:
364 void getFunctionInfoStr(const GxFunctions* pFunctions, const u8* pFunctionsValue, u32 functionsCount, GxString& outString);
366 void writeFunctionInfo(const GxFunctions* pFunctions, const u8* pFunctionsValue, u32 functionsCount, GxResCellSheetCsv* pResource, u32& positionRow);
368 void saveShaderInfo(GxResCellSheetCsv* pResource, const GxString& path);
370 b32 askContinueCompile(GX_CSTR message);
371
373 //-------------------------------------------------------------
375 //-------------------------------------------------------------
377protected:
378 GxString _buffer;
379 GxParameter _programParameter[PARAMETER_COUNT_MAX];
380 GxParameter _materialParameter[PARAMETER_COUNT_MAX];
381 GxFunctions _programFunctions[FUNCTIONS_COUNT_MAX];
382 GxFunctions _materialFunctions[FUNCTIONS_COUNT_MAX];
383 u8 _programFunctionsValue[FUNCTIONS_COUNT_MAX];
384 u8 _materialFunctionsValue[FUNCTIONS_COUNT_MAX];
385 GxParameterAnnotation _materialParameterAnnotation[PARAMETER_COUNT_MAX];
386 GxParameterDefaultValue _materialParameterDefaultValue[PARAMETER_COUNT_MAX];
387 u32 _programParameterCount;
388 u32 _materialParameterCount;
389 u32 _programFunctionsCount;
390 u32 _materialFunctionsCount;
391 GxString _compileProgram;
392 GxCallback::GxHandlerBase _includeCallbackHandler;
393 GxSemanticsInfo _vertexInputInfo[static_cast<s32>(RENDER_SEMANTICS::MAX)];
394 GxSemanticsInfo _interpolatorInfo[static_cast<s32>(RENDER_SEMANTICS::MAX)];
395 GxPassInfo _passInfo[PASS_COUNT_MAX];
396 u32 _passCount;
397 u32 _pass;
398 b32 _findVertexInput;
399 GX_CSTR _shaderPath;
400
402#endif // GX_DEVELOP
403};
404
405GX_CORE_NAMESPACE_END()
u32 GX_HANDLE
ハンドル
Definition GxDefine.h:214
RENDER_SEMANTICS
セマンティックス
Definition GxRender.h:234
@ MAX
定義数
@ HALF4
4D f16 (v, v, v, v) に展開される
@ FLOAT3
3D f32 (f, f, f, 1) に展開される
@ HALF2
2D f16 (v, v, 0, 1) に展開される
@ FLOAT2
2D f32 (f, f, 0, 1) に展開される
@ FLOAT4
4D f32 (f, f, f, f) に展開される
@ UNKNOWN
未定義
RENDER_SHADER
Definition GxRender.h:75
@ MAX
定義数
ハンドラ基本クラス
Definition GxCallback.h:27
オブジェクト基底クラス
Definition GxBase.h:88
関数型情報
Definition GxFunction.h:18
メタシェーダ言語クラス
Definition GxShaderLanguage.h:19
PARAMETER_TYPE
パラメータの種類
Definition GxShaderLanguage.h:35
GUI用
Definition GxDefine.h:194
デフォルト値構造体
Definition GxShaderLanguage.h:74
GxParameterDefaultValue(void)
デフォルトコンストラクタ
Definition GxShaderLanguage.h:76
文字列型クラス
Definition GxString.h:18
32bitブーリアン
Definition GxDefine.h:173