Rasagar/Library/PackageCache/com.unity.shadergraph/Editor/Data/Enumerations/Precision.cs

64 lines
2.6 KiB
C#
Raw Normal View History

2024-08-26 13:07:20 -07:00
using System;
namespace UnityEditor.ShaderGraph.Internal
{
// ------------------------------------------------------------------------------------------
//
// The general use of precision follows this data flow
//
// Precision -- user selectable precision setting on each node
// == apply precision inherit rules based on node inputs ==>
// GraphPrecision -- where "GraphPrecision.Graph" means use the graph default setting
// == fallback to graph defaults ==>
// GraphPrecision -- where "GraphPrecision.Graph" means it is switchable when in a subgraph
// == shadergraph concretization ==>
// ConcretePrecision -- the actual precision used by the node, half or single
//
// We could at some point separate the two GraphPrecision uses into separate enums,
// but they're close enough we're using one enum for both uses at the moment
//
// ------------------------------------------------------------------------------------------
// this is generally used for user-selectable precision
[Serializable]
enum Precision
{
Inherit, // automatically choose the precision based on the inputs
Single, // force single precision (float)
Half, // force half precision
Graph, // use the graph default (for subgraphs this will properly switch based on the subgraph node setting)
}
// this is used when calculating precision within a graph
// it basically represents the precision after applying the automatic inheritance rules
// but before applying the fallback to the graph default
// tracking this explicitly helps us build subgraph switchable precision behavior (any node using Graph can be switched)
public enum GraphPrecision
{
Single = 0, // the ordering is different here so we can use the min function to resolve inherit/automatic behavior
Graph = 1,
Half = 2
}
// this is the actual set of precisions we have, a shadergraph must resolve every node to one of these
// in subgraphs, this concrete precision is only used for preview, and may not represent the actual precision of those nodes
// when used in a shader graph
[Serializable]
public enum ConcretePrecision
{
Single,
Half,
}
// inherit(auto) rules for combining input types
// half + half ==> half
// single + single ==> single
// single + half ==> single
// single + graph ==> single
// half + graph ==> graph
// single + half + graph ==> single
//
// basically: take the min when arranged like so: single(0), graph(1), half(2)
}