#include "compiler/translator/Compiler.h"
#include <sstream>
#include "angle_gl.h"
#include "common/BinaryStream.h"
#include "common/CompiledShaderState.h"
#include "common/PackedEnums.h"
#include "common/angle_version_info.h"
#include "compiler/translator/CallDAG.h"
#include "compiler/translator/CollectVariables.h"
#include "compiler/translator/Initialize.h"
#include "compiler/translator/IsASTDepthBelowLimit.h"
#include "compiler/translator/OutputTree.h"
#include "compiler/translator/ParseContext.h"
#include "compiler/translator/ValidateBarrierFunctionCall.h"
#include "compiler/translator/ValidateClipCullDistance.h"
#include "compiler/translator/ValidateLimitations.h"
#include "compiler/translator/ValidateMaxParameters.h"
#include "compiler/translator/ValidateOutputs.h"
#include "compiler/translator/ValidateTypeSizeLimitations.h"
#include "compiler/translator/ValidateVaryingLocations.h"
#include "compiler/translator/VariablePacker.h"
#include "compiler/translator/tree_ops/ClampFragDepth.h"
#include "compiler/translator/tree_ops/ClampIndirectIndices.h"
#include "compiler/translator/tree_ops/ClampPointSize.h"
#include "compiler/translator/tree_ops/DeclareAndInitBuiltinsForInstancedMultiview.h"
#include "compiler/translator/tree_ops/DeferGlobalInitializers.h"
#include "compiler/translator/tree_ops/EmulateGLFragColorBroadcast.h"
#include "compiler/translator/tree_ops/EmulateMultiDrawShaderBuiltins.h"
#include "compiler/translator/tree_ops/FoldExpressions.h"
#include "compiler/translator/tree_ops/ForcePrecisionQualifier.h"
#include "compiler/translator/tree_ops/InitializeVariables.h"
#include "compiler/translator/tree_ops/MonomorphizeUnsupportedFunctions.h"
#include "compiler/translator/tree_ops/PruneEmptyCases.h"
#include "compiler/translator/tree_ops/PruneInfiniteLoops.h"
#include "compiler/translator/tree_ops/PruneNoOps.h"
#include "compiler/translator/tree_ops/RemoveArrayLengthMethod.h"
#include "compiler/translator/tree_ops/RemoveDynamicIndexing.h"
#include "compiler/translator/tree_ops/RemoveInvariantDeclaration.h"
#include "compiler/translator/tree_ops/RemoveUnreferencedVariables.h"
#include "compiler/translator/tree_ops/RescopeGlobalVariables.h"
#include "compiler/translator/tree_ops/RewritePixelLocalStorage.h"
#include "compiler/translator/tree_ops/SeparateDeclarations.h"
#include "compiler/translator/tree_ops/SeparateStructFromFunctionDeclarations.h"
#include "compiler/translator/tree_ops/SimplifyLoopConditions.h"
#include "compiler/translator/tree_ops/SplitSequenceOperator.h"
#include "compiler/translator/tree_ops/glsl/RegenerateStructNames.h"
#include "compiler/translator/tree_ops/glsl/RewriteRepeatedAssignToSwizzled.h"
#include "compiler/translator/tree_ops/glsl/ScalarizeVecAndMatConstructorArgs.h"
#include "compiler/translator/tree_ops/glsl/UseInterfaceBlockFields.h"
#include "compiler/translator/tree_ops/glsl/apple/AddAndTrueToLoopCondition.h"
#include "compiler/translator/tree_ops/glsl/apple/RewriteDoWhile.h"
#include "compiler/translator/tree_ops/glsl/apple/UnfoldShortCircuitAST.h"
#include "compiler/translator/tree_util/BuiltIn.h"
#include "compiler/translator/tree_util/IntermNodePatternMatcher.h"
#include "compiler/translator/tree_util/ReplaceShadowingVariables.h"
#include "compiler/translator/tree_util/ReplaceVariable.h"
#include "compiler/translator/util.h"
#if defined(ANGLE_FUZZER_CORPUS_OUTPUT_DIR)
# include "common/hash_utils.h"
# include "common/mathutil.h"
#endif
namespace sh
{
namespace
{
bool IsTopLevelNodeUnusedFunction(const CallDAG &callDag,
const std::vector<TFunctionMetadata> &metadata,
TIntermNode *node,
const TFunction **functionOut)
{ … }
#if defined(ANGLE_FUZZER_CORPUS_OUTPUT_DIR)
void DumpFuzzerCase(char const *const *shaderStrings,
size_t numStrings,
uint32_t type,
uint32_t spec,
uint32_t output,
const ShCompileOptions &options)
{
ShaderDumpHeader header{};
header.type = type;
header.spec = spec;
header.output = output;
memcpy(&header.basicCompileOptions, &options, offsetof(ShCompileOptions, metal));
static_assert(offsetof(ShCompileOptions, metal) <= sizeof(header.basicCompileOptions));
memcpy(&header.metalCompileOptions, &options.metal, sizeof(options.metal));
static_assert(sizeof(options.metal) <= sizeof(header.metalCompileOptions));
memcpy(&header.plsCompileOptions, &options.pls, sizeof(options.pls));
static_assert(sizeof(options.pls) <= sizeof(header.plsCompileOptions));
size_t contentsLength = sizeof(header) + 1;
for (size_t i = 0; i < numStrings; i++)
{
contentsLength += strlen(shaderStrings[i]);
}
std::vector<uint8_t> contents(rx::roundUp<size_t>(contentsLength, 4), 0);
memcpy(&contents[0], &header, sizeof(header));
uint8_t *data = &contents[sizeof(header)];
for (size_t i = 0; i < numStrings; i++)
{
auto length = strlen(shaderStrings[i]);
memcpy(data, shaderStrings[i], length);
data += length;
}
auto hash = angle::ComputeGenericHash(contents.data(), contents.size());
std::ostringstream o = sh::InitializeStream<std::ostringstream>();
o << ANGLE_FUZZER_CORPUS_OUTPUT_DIR << std::hex << std::setw(16) << std::setfill('0') << hash
<< ".sample";
std::string s = o.str();
FILE *f = fopen(s.c_str(), "w");
fwrite(contents.data(), sizeof(char), contentsLength, f);
fclose(f);
}
#endif
}
bool IsGLSL130OrNewer(ShShaderOutput output)
{ … }
bool IsGLSL420OrNewer(ShShaderOutput output)
{ … }
bool IsGLSL410OrOlder(ShShaderOutput output)
{ … }
bool RemoveInvariant(sh::GLenum shaderType,
int shaderVersion,
ShShaderOutput outputType,
const ShCompileOptions &compileOptions)
{ … }
size_t GetGlobalMaxTokenSize(ShShaderSpec spec)
{ … }
int GetMaxUniformVectorsForShaderType(GLenum shaderType, const ShBuiltInResources &resources)
{ … }
namespace
{
class [[nodiscard]] TScopedPoolAllocator
{ … };
class [[nodiscard]] TScopedSymbolTableLevel
{ … };
int GetMaxShaderVersionForSpec(ShShaderSpec spec)
{ … }
bool ValidateFragColorAndFragData(GLenum shaderType,
int shaderVersion,
const TSymbolTable &symbolTable,
TDiagnostics *diagnostics)
{ … }
}
TShHandleBase::TShHandleBase()
{ … }
TShHandleBase::~TShHandleBase()
{ … }
TCompiler::TCompiler(sh::GLenum type, ShShaderSpec spec, ShShaderOutput output)
: … { … }
TCompiler::~TCompiler() { … }
bool TCompiler::isHighPrecisionSupported() const
{ … }
bool TCompiler::shouldRunLoopAndIndexingValidation(const ShCompileOptions &compileOptions) const
{ … }
bool TCompiler::shouldLimitTypeSizes() const
{ … }
bool TCompiler::Init(const ShBuiltInResources &resources)
{ … }
TIntermBlock *TCompiler::compileTreeForTesting(const char *const shaderStrings[],
size_t numStrings,
const ShCompileOptions &compileOptions)
{ … }
TIntermBlock *TCompiler::compileTreeImpl(const char *const shaderStrings[],
size_t numStrings,
const ShCompileOptions &compileOptions)
{ … }
bool TCompiler::checkShaderVersion(TParseContext *parseContext)
{ … }
void TCompiler::setASTMetadata(const TParseContext &parseContext)
{ … }
unsigned int TCompiler::getSharedMemorySize() const
{ … }
bool TCompiler::getShaderBinary(const ShHandle compilerHandle,
const char *const shaderStrings[],
size_t numStrings,
const ShCompileOptions &compileOptions,
ShaderBinaryBlob *const binaryOut)
{ … }
bool TCompiler::validateAST(TIntermNode *root)
{ … }
bool TCompiler::disableValidateFunctionCall()
{ … }
void TCompiler::restoreValidateFunctionCall(bool enable)
{ … }
bool TCompiler::disableValidateVariableReferences()
{ … }
void TCompiler::restoreValidateVariableReferences(bool enable)
{ … }
void TCompiler::enableValidateNoMoreTransformations()
{ … }
bool TCompiler::checkAndSimplifyAST(TIntermBlock *root,
const TParseContext &parseContext,
const ShCompileOptions &compileOptions)
{ … }
bool TCompiler::postParseChecks(const TParseContext &parseContext)
{ … }
bool TCompiler::compile(const char *const shaderStrings[],
size_t numStrings,
const ShCompileOptions &compileOptionsIn)
{ … }
bool TCompiler::initBuiltInSymbolTable(const ShBuiltInResources &resources)
{ … }
void TCompiler::setResourceString()
{ … }
void TCompiler::collectInterfaceBlocks()
{ … }
void TCompiler::clearResults()
{ … }
bool TCompiler::initCallDag(TIntermNode *root)
{ … }
bool TCompiler::checkCallDepth()
{ … }
bool TCompiler::tagUsedFunctions()
{ … }
void TCompiler::internalTagUsedFunction(size_t index)
{ … }
bool TCompiler::pruneUnusedFunctions(TIntermBlock *root)
{ … }
bool TCompiler::limitExpressionComplexity(TIntermBlock *root)
{ … }
bool TCompiler::initializeGLPosition(TIntermBlock *root)
{ … }
bool TCompiler::useAllMembersInUnusedStandardAndSharedBlocks(TIntermBlock *root)
{ … }
bool TCompiler::initializeOutputVariables(TIntermBlock *root)
{ … }
const TExtensionBehavior &TCompiler::getExtensionBehavior() const
{ … }
const char *TCompiler::getSourcePath() const
{ … }
const ShBuiltInResources &TCompiler::getResources() const
{ … }
const BuiltInFunctionEmulator &TCompiler::getBuiltInFunctionEmulator() const
{ … }
bool TCompiler::isVaryingDefined(const char *varyingName)
{ … }
}