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