Skip to content
This repository has been archived by the owner on Apr 28, 2023. It is now read-only.

Commit

Permalink
Shaders generated with ShaderFX Var or Input have stable hash so the …
Browse files Browse the repository at this point in the history
…shader cache works with them. #274
  • Loading branch information
tebjan committed Nov 20, 2020
1 parent 1a80511 commit a50ae1d
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 12 deletions.
Expand Up @@ -24,8 +24,8 @@ public override ShaderSource GenerateShaderSource(ShaderGeneratorContext context

var mixin = shaderClassSource.CreateMixin();

mixin.AddComposition(Value, "Value", context, baseKeys);
mixin.AddComposition(Before, "Before", context, baseKeys);
mixin.AddComposition(Value, "Value", context, baseKeys);

return mixin;
}
Expand Down
Expand Up @@ -20,7 +20,7 @@ public Delegate1In1Out(Var<TIn> arg, Var<TOut> result, IComputeVoid body)
if (body != null)
{
Inputs = new[]
{
{
new KeyValuePair<string, IComputeNode>("Body", body)
};
}
Expand Down
Expand Up @@ -19,7 +19,7 @@ public GetVar(Var<T> var, bool evaluateChildren = true)

public Var<T> Var { get; }

string VarName => Var?.VarName ?? "NoVar";
string VarName => Var?.VarNameWithID ?? "NoVar";

public override IEnumerable<IComputeNode> GetChildren(object context = null)
{
Expand Down
53 changes: 44 additions & 9 deletions packages/VL.Stride.Runtime/src/Shaders/ShaderFX/Variable/Var.cs
Expand Up @@ -15,7 +15,15 @@ namespace VL.Stride.Shaders.ShaderFX
/// <seealso cref="IComputeVoid" />
public class Var<T> : ComputeNode<T>, IComputeVoid
{
static ulong VarIDCounter;
static readonly PropertyKey<int> VarIDCounter = new PropertyKey<int>("Var.VarIDCounter", typeof(int), DefaultValueMetadata.Static(0, keepDefaultValue: true));
private readonly string varName;

static int GetAndIncIDCount(ShaderGeneratorContext context)
{
var result = context.Tags.Get(VarIDCounter);
context.Tags.Set(VarIDCounter, result + 1);
return result;
}

public Var(IComputeValue<T> value, string name)
: this(value, null, name)
Expand All @@ -29,37 +37,64 @@ public Var(IComputeValue<T> value, Var<T> var = null, string varName = "Var", st
{
if (var != null) //re-assign existing var
{
VarName = var.VarName;
appendID = false;
SemanticName = var.SemanticName;
}
else
{
createVar = true;
VarName = appendID ? varName + "_" + (++VarIDCounter) : varName;
SemanticName = semanticName;
}

ExistingVar = var;
AppendID = appendID;
Value = value;
}

[DataMemberIgnore]
public Var<T> ExistingVar { get; }

public IComputeValue<T> Value { get; }

public string VarName { get; }
public string VarName => ExistingVar?.VarNameWithID ?? varName;

public string VarNameWithID
{
get
{
if (!compiled)
throw new System.Exception("Var not yet compiled");
return varNameWithID;
}

protected set => varNameWithID = value;
}

public bool AppendID { get; }

public string SemanticName { get; }

bool createVar;

private string varNameWithID;
private bool compiled;

public override IEnumerable<IComputeNode> GetChildren(object context = null)
{
return ReturnIfNotNull(Value);
}

public override ShaderSource GenerateShaderSource(ShaderGeneratorContext context, MaterialComputeColorKeys baseKeys)
{
var shaderSource = SemanticName != null ?
GetShaderSourceForType<T>("AssignSemantic", VarName, SemanticName)
: GetShaderSourceForType<T>("AssignVar", VarName);
VarNameWithID = VarName;

if (AppendID)
VarNameWithID = VarName + "_" + GetAndIncIDCount(context);

compiled = true;

var shaderSource = SemanticName != null ?
GetShaderSourceForType<T>("AssignSemantic", VarNameWithID, SemanticName)
: GetShaderSourceForType<T>("AssignVar", VarNameWithID);

var mixin = shaderSource.CreateMixin();

Expand All @@ -70,7 +105,7 @@ public override ShaderSource GenerateShaderSource(ShaderGeneratorContext context

public override string ToString()
{
return string.Format("{0} {1}", createVar ? "": "Assign", VarName);
return string.Format("{0} {1}", createVar ? "" : "Assign", VarName);
}
}
}

0 comments on commit a50ae1d

Please sign in to comment.