Browse Source

Detect StructuredBuffers that are used indirectly, but not in the top-level function.

Eric Mellino 7 years ago
parent
commit
fab524daa3

+ 1 - 0
src/ShaderGen.Tests/ShaderGeneratorTests.cs

@@ -48,6 +48,7 @@ namespace ShaderGen.Tests
             yield return new object[] { null, "TestShaders.ExpressionBodiedMethods.ExpressionBodyWithReturn" };
             yield return new object[] { null, "TestShaders.ExpressionBodiedMethods.ExpressionBodyWithoutReturn" };
             yield return new object[] { "TestShaders.StructuredBufferTestShader.VS", null };
+            yield return new object[] { null, "TestShaders.StructuredBufferTestShader.FS"};
             yield return new object[] { null, "TestShaders.DepthTextureSamplerFragment.FS" };
             yield return new object[] { null, "TestShaders.Enums.FS" };
             yield return new object[] { "TestShaders.VertexWithStructuredBuffer.VS", null };

+ 11 - 0
src/ShaderGen.Tests/TestAssets/StructuredBufferTestShader.cs

@@ -24,6 +24,17 @@ namespace TestShaders
             return output;
         }
 
+        [FragmentShader]
+        public Vector4 FS(VertexOutput input)
+        {
+            Vector4 ret = new Vector4(
+                StructuredInput[0].M11,
+                StructuredInput[2].M12,
+                StructuredInput[2].M13,
+                StructuredInput[3].M14);
+            return ret;
+        }
+
         public struct VertexOutput
         {
             [VertexSemantic(SemanticType.SystemPosition)]

+ 6 - 1
src/ShaderGen.Tests/TestAssets/VertexWithStructuredBuffer.cs

@@ -11,8 +11,13 @@ namespace TestShaders
         public SystemPosition4 VS()
         {
             SystemPosition4 output;
-            output.Position = Vectors[ShaderBuiltins.VertexID];
+            output.Position = UseStructuredBufferIndirect(ShaderBuiltins.VertexID);
             return output;
         }
+
+        public Vector4 UseStructuredBufferIndirect(uint id)
+        {
+            return Vectors[id];
+        }
     }
 }

+ 9 - 2
src/ShaderGen/Glsl/Glsl330Backend.cs

@@ -1,4 +1,5 @@
 using System.Diagnostics;
+using System.Linq;
 using System.Text;
 using Microsoft.CodeAnalysis;
 
@@ -17,10 +18,16 @@ namespace ShaderGen.Glsl
                 .Replace("+", "_");
         }
 
-        protected override void WriteVersionHeader(ShaderFunction function, StringBuilder sb)
+        protected override void WriteVersionHeader(
+            ShaderFunction function,
+            ShaderFunctionAndMethodDeclarationSyntax[] orderedFunctions,
+            StringBuilder sb)
         {
+            bool anyUsesStructuredBuffer = function.UsesStructuredBuffer
+                || orderedFunctions.Any(i => i.Function.UsesStructuredBuffer);
+
             string version = (function.Type == ShaderFunctionType.ComputeEntryPoint
-                           || function.UsesStructuredBuffer) ? "430" : "330 core";
+                           || anyUsesStructuredBuffer) ? "430" : "330 core";
             sb.AppendLine($"#version {version}");
             sb.AppendLine();
             sb.AppendLine($"struct SamplerDummy {{ int _dummyValue; }};");

+ 4 - 1
src/ShaderGen/Glsl/Glsl450Backend.cs

@@ -17,7 +17,10 @@ namespace ShaderGen.Glsl
                 .Replace("+", "_");
         }
 
-        protected override void WriteVersionHeader(ShaderFunction function, StringBuilder sb)
+        protected override void WriteVersionHeader(
+            ShaderFunction function,
+            ShaderFunctionAndMethodDeclarationSyntax[] orderedFunctions,
+            StringBuilder sb)
         {
             sb.AppendLine("#version 450");
             sb.AppendLine("#extension GL_ARB_separate_shader_objects : enable");

+ 5 - 2
src/ShaderGen/Glsl/GlslBackendBase.cs

@@ -133,7 +133,7 @@ namespace ShaderGen.Glsl
 
             // Append version last because it relies on information from parsing the shader.
             StringBuilder versionSB = new StringBuilder();
-            WriteVersionHeader(function, versionSB);
+            WriteVersionHeader(function, entryPoint.OrderedFunctionList, versionSB);
 
             sb.Insert(0, versionSB.ToString());
 
@@ -393,7 +393,10 @@ namespace ShaderGen.Glsl
             "input", "output",
         };
 
-        protected abstract void WriteVersionHeader(ShaderFunction function, StringBuilder sb);
+        protected abstract void WriteVersionHeader(
+            ShaderFunction function,
+            ShaderFunctionAndMethodDeclarationSyntax[] orderedFunctions,
+            StringBuilder sb);
         protected abstract void WriteUniform(StringBuilder sb, ResourceDefinition rd);
         protected abstract void WriteSampler(StringBuilder sb, ResourceDefinition rd);
         protected abstract void WriteSamplerComparison(StringBuilder sb, ResourceDefinition rd);

+ 9 - 2
src/ShaderGen/Glsl/GlslEs300Backend.cs

@@ -1,4 +1,5 @@
 using System.Diagnostics;
+using System.Linq;
 using System.Text;
 using Microsoft.CodeAnalysis;
 
@@ -17,10 +18,16 @@ namespace ShaderGen.Glsl
                 .Replace("+", "_");
         }
 
-        protected override void WriteVersionHeader(ShaderFunction function, StringBuilder sb)
+        protected override void WriteVersionHeader(
+            ShaderFunction function,
+            ShaderFunctionAndMethodDeclarationSyntax[] orderedFunctions,
+            StringBuilder sb)
         {
+            bool anyUsesStructuredBuffer = function.UsesStructuredBuffer
+                || orderedFunctions.Any(i => i.Function.UsesStructuredBuffer);
+
             bool useVersion320 = function.UsesTexture2DMS;
-            bool useVersion310 = function.UsesStructuredBuffer;
+            bool useVersion310 = anyUsesStructuredBuffer;
             string versionNumber = useVersion320 ? "320" :
                                    useVersion310 ? "310" : "300";
             string version = $"{versionNumber} es";