1 | // |
---|---|
2 | // Copyright 2022 The ANGLE Project Authors. All rights reserved. |
3 | // Use of this source code is governed by a BSD-style license that can be |
4 | // found in the LICENSE file. |
5 | // |
6 | // CompiledShaderState.h: |
7 | // Defines a struct containing any data that is needed to build |
8 | // a ShaderState from a TCompiler. |
9 | // |
10 | |
11 | #ifndef COMMON_COMPILEDSHADERSTATE_H_ |
12 | #define COMMON_COMPILEDSHADERSTATE_H_ |
13 | |
14 | #include "common/BinaryStream.h" |
15 | #include "common/Optional.h" |
16 | #include "common/PackedEnums.h" |
17 | |
18 | #include <GLSLANG/ShaderLang.h> |
19 | #include <GLSLANG/ShaderVars.h> |
20 | |
21 | #include <string> |
22 | |
23 | namespace sh |
24 | { |
25 | struct BlockMemberInfo; |
26 | } |
27 | |
28 | namespace gl |
29 | { |
30 | |
31 | // @todo this type is also defined in compiler/Compiler.h and libANGLE/renderer_utils.h. Move this |
32 | // to a single common definition? |
33 | using SpecConstUsageBits = angle::PackedEnumBitSet<sh::vk::SpecConstUsage, uint32_t>; |
34 | |
35 | // Helper functions for serializing shader variables |
36 | void WriteShaderVar(gl::BinaryOutputStream *stream, const sh::ShaderVariable &var); |
37 | void LoadShaderVar(gl::BinaryInputStream *stream, sh::ShaderVariable *var); |
38 | |
39 | void WriteShInterfaceBlock(gl::BinaryOutputStream *stream, const sh::InterfaceBlock &block); |
40 | void LoadShInterfaceBlock(gl::BinaryInputStream *stream, sh::InterfaceBlock *block); |
41 | |
42 | bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y); |
43 | |
44 | struct CompiledShaderState |
45 | { |
46 | CompiledShaderState(gl::ShaderType shaderType); |
47 | ~CompiledShaderState(); |
48 | |
49 | void buildCompiledShaderState(const ShHandle compilerHandle, const bool isBinaryOutput); |
50 | |
51 | void serialize(gl::BinaryOutputStream &stream) const; |
52 | void deserialize(gl::BinaryInputStream &stream); |
53 | |
54 | const gl::ShaderType shaderType; |
55 | |
56 | int shaderVersion; |
57 | std::string translatedSource; |
58 | sh::BinaryBlob compiledBinary; |
59 | sh::WorkGroupSize localSize; |
60 | |
61 | std::vector<sh::ShaderVariable> inputVaryings; |
62 | std::vector<sh::ShaderVariable> outputVaryings; |
63 | std::vector<sh::ShaderVariable> uniforms; |
64 | std::vector<sh::InterfaceBlock> uniformBlocks; |
65 | std::vector<sh::InterfaceBlock> shaderStorageBlocks; |
66 | std::vector<sh::ShaderVariable> allAttributes; |
67 | std::vector<sh::ShaderVariable> activeAttributes; |
68 | std::vector<sh::ShaderVariable> activeOutputVariables; |
69 | |
70 | bool hasClipDistance; |
71 | bool hasDiscard; |
72 | bool enablesPerSampleShading; |
73 | gl::BlendEquationBitSet advancedBlendEquations; |
74 | SpecConstUsageBits specConstUsageBits; |
75 | |
76 | // GL_OVR_multiview / GL_OVR_multiview2 |
77 | int numViews; |
78 | |
79 | // Geometry Shader |
80 | Optional<gl::PrimitiveMode> geometryShaderInputPrimitiveType; |
81 | Optional<gl::PrimitiveMode> geometryShaderOutputPrimitiveType; |
82 | Optional<GLint> geometryShaderMaxVertices; |
83 | int geometryShaderInvocations; |
84 | |
85 | // Tessellation Shader |
86 | int tessControlShaderVertices; |
87 | GLenum tessGenMode; |
88 | GLenum tessGenSpacing; |
89 | GLenum tessGenVertexOrder; |
90 | GLenum tessGenPointMode; |
91 | }; |
92 | } // namespace gl |
93 | |
94 | #endif // COMMON_COMPILEDSHADERSTATE_H_ |
95 |