xref: /aosp_15_r20/external/angle/src/common/CompiledShaderState.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // CompiledShaderState.h:
7*8975f5c5SAndroid Build Coastguard Worker //   Defines a struct containing any data that is needed to build
8*8975f5c5SAndroid Build Coastguard Worker //   a CompiledShaderState from a TCompiler.
9*8975f5c5SAndroid Build Coastguard Worker //
10*8975f5c5SAndroid Build Coastguard Worker 
11*8975f5c5SAndroid Build Coastguard Worker #ifndef COMMON_COMPILEDSHADERSTATE_H_
12*8975f5c5SAndroid Build Coastguard Worker #define COMMON_COMPILEDSHADERSTATE_H_
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "common/BinaryStream.h"
15*8975f5c5SAndroid Build Coastguard Worker #include "common/Optional.h"
16*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h"
17*8975f5c5SAndroid Build Coastguard Worker 
18*8975f5c5SAndroid Build Coastguard Worker #include <GLSLANG/ShaderLang.h>
19*8975f5c5SAndroid Build Coastguard Worker #include <GLSLANG/ShaderVars.h>
20*8975f5c5SAndroid Build Coastguard Worker 
21*8975f5c5SAndroid Build Coastguard Worker #include <memory>
22*8975f5c5SAndroid Build Coastguard Worker #include <string>
23*8975f5c5SAndroid Build Coastguard Worker 
24*8975f5c5SAndroid Build Coastguard Worker namespace sh
25*8975f5c5SAndroid Build Coastguard Worker {
26*8975f5c5SAndroid Build Coastguard Worker struct BlockMemberInfo;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker using CompilerMetadataFlags = angle::PackedEnumBitSet<sh::MetadataFlags, uint32_t>;
29*8975f5c5SAndroid Build Coastguard Worker }  // namespace sh
30*8975f5c5SAndroid Build Coastguard Worker 
31*8975f5c5SAndroid Build Coastguard Worker namespace gl
32*8975f5c5SAndroid Build Coastguard Worker {
33*8975f5c5SAndroid Build Coastguard Worker 
34*8975f5c5SAndroid Build Coastguard Worker // @todo this type is also defined in compiler/Compiler.h and libANGLE/renderer_utils.h. Move this
35*8975f5c5SAndroid Build Coastguard Worker // to a single common definition?
36*8975f5c5SAndroid Build Coastguard Worker using SpecConstUsageBits = angle::PackedEnumBitSet<sh::vk::SpecConstUsage, uint32_t>;
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker // Helper functions for serializing shader variables
39*8975f5c5SAndroid Build Coastguard Worker void WriteShaderVar(gl::BinaryOutputStream *stream, const sh::ShaderVariable &var);
40*8975f5c5SAndroid Build Coastguard Worker void LoadShaderVar(gl::BinaryInputStream *stream, sh::ShaderVariable *var);
41*8975f5c5SAndroid Build Coastguard Worker 
42*8975f5c5SAndroid Build Coastguard Worker void WriteShInterfaceBlock(gl::BinaryOutputStream *stream, const sh::InterfaceBlock &block);
43*8975f5c5SAndroid Build Coastguard Worker void LoadShInterfaceBlock(gl::BinaryInputStream *stream, sh::InterfaceBlock *block);
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
46*8975f5c5SAndroid Build Coastguard Worker 
47*8975f5c5SAndroid Build Coastguard Worker struct CompiledShaderState
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker     CompiledShaderState(gl::ShaderType shaderType);
50*8975f5c5SAndroid Build Coastguard Worker     ~CompiledShaderState();
51*8975f5c5SAndroid Build Coastguard Worker 
52*8975f5c5SAndroid Build Coastguard Worker     void buildCompiledShaderState(const ShHandle compilerHandle, const bool isBinaryOutput);
53*8975f5c5SAndroid Build Coastguard Worker 
54*8975f5c5SAndroid Build Coastguard Worker     void serialize(gl::BinaryOutputStream &stream) const;
55*8975f5c5SAndroid Build Coastguard Worker     void deserialize(gl::BinaryInputStream &stream);
56*8975f5c5SAndroid Build Coastguard Worker 
hasValidGeometryShaderInputPrimitiveTypeCompiledShaderState57*8975f5c5SAndroid Build Coastguard Worker     bool hasValidGeometryShaderInputPrimitiveType() const
58*8975f5c5SAndroid Build Coastguard Worker     {
59*8975f5c5SAndroid Build Coastguard Worker         return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderInputPrimitiveType];
60*8975f5c5SAndroid Build Coastguard Worker     }
hasValidGeometryShaderOutputPrimitiveTypeCompiledShaderState61*8975f5c5SAndroid Build Coastguard Worker     bool hasValidGeometryShaderOutputPrimitiveType() const
62*8975f5c5SAndroid Build Coastguard Worker     {
63*8975f5c5SAndroid Build Coastguard Worker         return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderOutputPrimitiveType];
64*8975f5c5SAndroid Build Coastguard Worker     }
hasValidGeometryShaderMaxVerticesCompiledShaderState65*8975f5c5SAndroid Build Coastguard Worker     bool hasValidGeometryShaderMaxVertices() const
66*8975f5c5SAndroid Build Coastguard Worker     {
67*8975f5c5SAndroid Build Coastguard Worker         return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderMaxVertices];
68*8975f5c5SAndroid Build Coastguard Worker     }
69*8975f5c5SAndroid Build Coastguard Worker 
70*8975f5c5SAndroid Build Coastguard Worker     const gl::ShaderType shaderType;
71*8975f5c5SAndroid Build Coastguard Worker 
72*8975f5c5SAndroid Build Coastguard Worker     int shaderVersion;
73*8975f5c5SAndroid Build Coastguard Worker     std::string translatedSource;
74*8975f5c5SAndroid Build Coastguard Worker     sh::BinaryBlob compiledBinary;
75*8975f5c5SAndroid Build Coastguard Worker     sh::WorkGroupSize localSize;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> inputVaryings;
78*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> outputVaryings;
79*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> uniforms;
80*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::InterfaceBlock> uniformBlocks;
81*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::InterfaceBlock> shaderStorageBlocks;
82*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> allAttributes;
83*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> activeAttributes;
84*8975f5c5SAndroid Build Coastguard Worker     std::vector<sh::ShaderVariable> activeOutputVariables;
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker     sh::CompilerMetadataFlags metadataFlags;
87*8975f5c5SAndroid Build Coastguard Worker     gl::BlendEquationBitSet advancedBlendEquations;
88*8975f5c5SAndroid Build Coastguard Worker     SpecConstUsageBits specConstUsageBits;
89*8975f5c5SAndroid Build Coastguard Worker 
90*8975f5c5SAndroid Build Coastguard Worker     // GL_OVR_multiview / GL_OVR_multiview2
91*8975f5c5SAndroid Build Coastguard Worker     int numViews;
92*8975f5c5SAndroid Build Coastguard Worker 
93*8975f5c5SAndroid Build Coastguard Worker     // Geometry Shader
94*8975f5c5SAndroid Build Coastguard Worker     gl::PrimitiveMode geometryShaderInputPrimitiveType;
95*8975f5c5SAndroid Build Coastguard Worker     gl::PrimitiveMode geometryShaderOutputPrimitiveType;
96*8975f5c5SAndroid Build Coastguard Worker     GLint geometryShaderMaxVertices;
97*8975f5c5SAndroid Build Coastguard Worker     int geometryShaderInvocations;
98*8975f5c5SAndroid Build Coastguard Worker 
99*8975f5c5SAndroid Build Coastguard Worker     // Tessellation Shader
100*8975f5c5SAndroid Build Coastguard Worker     int tessControlShaderVertices;
101*8975f5c5SAndroid Build Coastguard Worker     GLenum tessGenMode;
102*8975f5c5SAndroid Build Coastguard Worker     GLenum tessGenSpacing;
103*8975f5c5SAndroid Build Coastguard Worker     GLenum tessGenVertexOrder;
104*8975f5c5SAndroid Build Coastguard Worker     GLenum tessGenPointMode;
105*8975f5c5SAndroid Build Coastguard Worker 
106*8975f5c5SAndroid Build Coastguard Worker     // ANGLE_shader_pixel_local_storage: A mapping from binding index to the PLS uniform format at
107*8975f5c5SAndroid Build Coastguard Worker     // that index.
108*8975f5c5SAndroid Build Coastguard Worker     std::vector<ShPixelLocalStorageFormat> pixelLocalStorageFormats;
109*8975f5c5SAndroid Build Coastguard Worker };
110*8975f5c5SAndroid Build Coastguard Worker 
111*8975f5c5SAndroid Build Coastguard Worker using SharedCompiledShaderState = std::shared_ptr<CompiledShaderState>;
112*8975f5c5SAndroid Build Coastguard Worker }  // namespace gl
113*8975f5c5SAndroid Build Coastguard Worker 
114*8975f5c5SAndroid Build Coastguard Worker #endif  // COMMON_COMPILEDSHADERSTATE_H_
115