#ifndef COMMON_COMPILEDSHADERSTATE_H_
#define COMMON_COMPILEDSHADERSTATE_H_
#include "common/BinaryStream.h"
#include "common/Optional.h"
#include "common/PackedEnums.h"
#include <GLSLANG/ShaderLang.h>
#include <GLSLANG/ShaderVars.h>
#include <memory>
#include <string>
namespace sh
{
struct BlockMemberInfo;
using CompilerMetadataFlags = angle::PackedEnumBitSet<sh::MetadataFlags, uint32_t>;
}
namespace gl
{
using SpecConstUsageBits = angle::PackedEnumBitSet<sh::vk::SpecConstUsage, uint32_t>;
void WriteShaderVar(gl::BinaryOutputStream *stream, const sh::ShaderVariable &var);
void LoadShaderVar(gl::BinaryInputStream *stream, sh::ShaderVariable *var);
void WriteShInterfaceBlock(gl::BinaryOutputStream *stream, const sh::InterfaceBlock &block);
void LoadShInterfaceBlock(gl::BinaryInputStream *stream, sh::InterfaceBlock *block);
bool CompareShaderVar(const sh::ShaderVariable &x, const sh::ShaderVariable &y);
std::string JoinShaderSources(GLsizei count, const char *const *string, const GLint *length);
struct CompiledShaderState
{
CompiledShaderState(gl::ShaderType shaderType);
~CompiledShaderState();
void buildCompiledShaderState(const ShHandle compilerHandle,
ShShaderOutput outputType);
void buildPassthroughCompiledShaderState(std::shared_ptr<const std::string> inputShaderSource);
void serialize(gl::BinaryOutputStream &stream) const;
void deserialize(gl::BinaryInputStream &stream);
bool hasValidGeometryShaderInputPrimitiveType() const
{
return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderInputPrimitiveType];
}
bool hasValidGeometryShaderOutputPrimitiveType() const
{
return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderOutputPrimitiveType];
}
bool hasValidGeometryShaderMaxVertices() const
{
return metadataFlags[sh::MetadataFlags::HasValidGeometryShaderMaxVertices];
}
const gl::ShaderType shaderType;
int shaderVersion;
std::shared_ptr<const std::string> translatedSource;
sh::BinaryBlob compiledBinary;
sh::WorkGroupSize localSize;
std::vector<sh::ShaderVariable> inputVaryings;
std::vector<sh::ShaderVariable> outputVaryings;
std::vector<sh::ShaderVariable> uniforms;
std::vector<sh::InterfaceBlock> uniformBlocks;
std::vector<sh::InterfaceBlock> shaderStorageBlocks;
std::vector<sh::ShaderVariable> allAttributes;
std::vector<sh::ShaderVariable> activeAttributes;
std::vector<sh::ShaderVariable> activeOutputVariables;
sh::CompilerMetadataFlags metadataFlags;
gl::BlendEquationBitSet advancedBlendEquations;
SpecConstUsageBits specConstUsageBits;
int numViews;
gl::PrimitiveMode geometryShaderInputPrimitiveType;
gl::PrimitiveMode geometryShaderOutputPrimitiveType;
GLint geometryShaderMaxVertices;
int geometryShaderInvocations;
int tessControlShaderVertices;
GLenum tessGenMode;
GLenum tessGenSpacing;
GLenum tessGenVertexOrder;
GLenum tessGenPointMode;
std::vector<ShPixelLocalStorageFormat> pixelLocalStorageFormats;
};
using SharedCompiledShaderState = std::shared_ptr<CompiledShaderState>;
}
#endif