blob: 164e026ff25265a8e309e393a4b99c6bc37a8068 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSLAnalysis_DEFINED
#define SkSLAnalysis_DEFINED
#include "include/private/SkSLSampleMatrix.h"
#include "src/sksl/SkSLDefines.h"
namespace SkSL {
struct Expression;
struct Program;
struct ProgramElement;
struct Statement;
struct Variable;
/**
* Provides utilities for analyzing SkSL statically before it's composed into a full program.
*/
struct Analysis {
static SampleMatrix GetSampleMatrix(const Program& program, const Variable& fp);
static bool IsExplicitlySampled(const Program& program, const Variable& fp);
static bool ReferencesSampleCoords(const Program& program);
};
/**
* Utility class to visit every element, statement, and expression in an SkSL program IR.
* This is intended for simple analysis and accumulation, where custom visitation behavior is only
* needed for a limited set of expression kinds.
*
* Subclasses should override visitExpression/visitStatement/visitProgramElement as needed and
* intercept elements of interest. They can then invoke the base class's function to visit all
* sub expressions. They can also choose not to call the base function to arrest recursion, or
* implement custom recursion.
*
* The visit functions return a bool that determines how the default implementation recurses. Once
* any visit call returns true, the default behavior stops recursing and propagates true up the
* stack.
*/
class ProgramVisitor {
public:
virtual ~ProgramVisitor() { SkASSERT(!fProgram); }
bool visit(const Program&);
protected:
const Program& program() const {
SkASSERT(fProgram);
return *fProgram;
}
virtual bool visitExpression(const Expression&);
virtual bool visitStatement(const Statement&);
virtual bool visitProgramElement(const ProgramElement&);
private:
const Program* fProgram;
};
}
#endif