summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--source/slang/emit.cpp31
-rw-r--r--source/slang/glsl.meta.slang.h2
-rw-r--r--source/slang/ir.cpp25
-rw-r--r--source/slang/slang.cpp1
-rw-r--r--tests/compute/generics-simple.slang26
-rw-r--r--tests/compute/generics-simple.slang.expected.txt4
-rw-r--r--tools/slang-test/main.cpp56
8 files changed, 127 insertions, 19 deletions
diff --git a/.gitignore b/.gitignore
index 26a5f0506..0be132a45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ intermediate/
*.expected
*.expected.png
*.actual.png
+*.actual.txt
# Files generated by other shader compilers
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 971f0345b..1b5db065f 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -5090,6 +5090,37 @@ emitDeclImpl(decl, nullptr);
EmitContext* context,
IRValue* inst)
{
+ // Don't emit semantics if we aren't translating down to HLSL
+ switch (context->shared->target)
+ {
+ case CodeGenTarget::HLSL:
+ break;
+
+ default:
+ return;
+ }
+
+ if(auto layoutDecoration = inst->findDecoration<IRLayoutDecoration>())
+ {
+ if(auto varLayout = layoutDecoration->layout.As<VarLayout>())
+ {
+ if(varLayout->flags & VarLayoutFlag::HasSemantic)
+ {
+ Emit(" : ");
+ emit(varLayout->semanticName);
+ if(varLayout->semanticIndex)
+ {
+ Emit(varLayout->semanticIndex);
+ }
+
+ return;
+ }
+ }
+ }
+
+ // TODO(tfoley): should we ever need to use the high-level declaration
+ // for this? It seems like the wrong approach...
+
auto decoration = inst->findDecoration<IRHighLevelDeclDecoration>();
if( decoration )
{
diff --git a/source/slang/glsl.meta.slang.h b/source/slang/glsl.meta.slang.h
index e43a51ea9..a4aade3c2 100644
--- a/source/slang/glsl.meta.slang.h
+++ b/source/slang/glsl.meta.slang.h
@@ -173,7 +173,7 @@ sb << "syntax patch : GLSLPatchModifier;\n";
// [GLSL 4.5] Interpolation Qualifiers
sb << "syntax smooth : SimpleModifier;\n";
sb << "syntax flat : SimpleModifier;\n";
-sb << "syntax noperspectie : SimpleModifier;\n";
+sb << "syntax noperspective : SimpleModifier;\n";
// [GLSL 4.3.2] Constant Qualifier
diff --git a/source/slang/ir.cpp b/source/slang/ir.cpp
index 5ace50397..4c01e4fc1 100644
--- a/source/slang/ir.cpp
+++ b/source/slang/ir.cpp
@@ -3094,6 +3094,31 @@ namespace Slang
clonedFunc,
entryPointLayout);
+ // We will also go on and attach layout information
+ // to the function parameters, so that we have it
+ // available directly on the parameters, rather
+ // than having to look it up on the original entry-point layout.
+ if( auto firstBlock = clonedFunc->getFirstBlock() )
+ {
+ UInt paramLayoutCount = entryPointLayout->fields.Count();
+ UInt paramCounter = 0;
+ for( auto pp = firstBlock->getFirstParam(); pp; pp = pp->getNextParam() )
+ {
+ UInt paramIndex = paramCounter++;
+ if( paramIndex < paramLayoutCount )
+ {
+ auto paramLayout = entryPointLayout->fields[paramIndex];
+ context->builder->addLayoutDecoration(
+ pp,
+ paramLayout);
+ }
+ else
+ {
+ SLANG_UNEXPECTED("too many parameters");
+ }
+ }
+ }
+
return clonedFunc;
}
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index dff322c29..da7601d41 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -918,6 +918,7 @@ SLANG_API int spCompile(
catch (...)
{
req->mSink.diagnose(Slang::SourceLoc(), Slang::Diagnostics::compilationAborted);
+ req->mDiagnosticOutput = req->mSink.outputBuffer.ProduceString();
return 1;
}
#else
diff --git a/tests/compute/generics-simple.slang b/tests/compute/generics-simple.slang
new file mode 100644
index 000000000..0002e444b
--- /dev/null
+++ b/tests/compute/generics-simple.slang
@@ -0,0 +1,26 @@
+//TEST(smoke,compute):COMPARE_COMPUTE:-xslang -use-ir
+
+// Confirm that generics syntax can be used in user
+// code and generates valid output.
+
+RWStructuredBuffer<float> outputBuffer;
+
+
+__generic<T>
+T test(T val)
+{
+ return val;
+}
+
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ uint tid = dispatchThreadID.x;
+
+ float inVal = float(tid);
+
+ float outVal = test<float>(inVal);
+
+ outputBuffer[tid] = outVal;
+} \ No newline at end of file
diff --git a/tests/compute/generics-simple.slang.expected.txt b/tests/compute/generics-simple.slang.expected.txt
new file mode 100644
index 000000000..fdaa30664
--- /dev/null
+++ b/tests/compute/generics-simple.slang.expected.txt
@@ -0,0 +1,4 @@
+0.0
+1.0
+2.0
+3.0 \ No newline at end of file
diff --git a/tools/slang-test/main.cpp b/tools/slang-test/main.cpp
index fb10d46f6..d85a3856b 100644
--- a/tools/slang-test/main.cpp
+++ b/tools/slang-test/main.cpp
@@ -752,6 +752,28 @@ TestResult runReflectionTest(TestInput& input)
return result;
}
+String getExpectedOutput(String const& outputStem)
+{
+ String expectedOutputPath = outputStem + ".expected";
+ String expectedOutput;
+ try
+ {
+ expectedOutput = Slang::File::ReadAllText(expectedOutputPath);
+ }
+ catch (Slang::IOException)
+ {
+ }
+
+ // If no expected output file was found, then we
+ // expect everything to be empty
+ if (expectedOutput.Length() == 0)
+ {
+ expectedOutput = "result code = 0\nstandard error = {\n}\nstandard output = {\n}\n";
+ }
+
+ return expectedOutput;
+}
+
TestResult runEvalTest(TestInput& input)
{
// We are going to load and evaluate the code
@@ -775,23 +797,7 @@ TestResult runEvalTest(TestInput& input)
}
String actualOutput = getOutput(spawner);
-
- String expectedOutputPath = outputStem + ".expected";
- String expectedOutput;
- try
- {
- expectedOutput = Slang::File::ReadAllText(expectedOutputPath);
- }
- catch (Slang::IOException)
- {
- }
-
- // If no expected output file was found, then we
- // expect everything to be empty
- if (expectedOutput.Length() == 0)
- {
- expectedOutput = "result code = 0\nstandard error = {\n}\nstandard output = {\n}\n";
- }
+ String expectedOutput = getExpectedOutput(outputStem);
TestResult result = kTestResult_Pass;
@@ -1135,6 +1141,19 @@ TestResult doComputeComparisonTestRunImpl(TestInput& input, const char * langOpt
return kTestResult_Fail;
}
+ auto actualOutput = getOutput(spawner);
+ auto expectedOutput = getExpectedOutput(outputStem);
+ if(actualOutput != expectedOutput)
+ {
+ String actualOutputPath = outputStem + ".actual";
+ Slang::File::WriteAllText(actualOutputPath, actualOutput);
+
+ maybeDumpOutput(expectedOutput, actualOutput);
+
+ return kTestResult_Fail;
+ }
+
+
// check against reference output
if (!File::Exists(outputStem + ".actual.txt"))
return kTestResult_Fail;
@@ -1358,14 +1377,15 @@ TestResult runTest(
{ "COMPARE_HLSL_RENDER", &runHLSLRenderComparisonTest },
{ "COMPARE_HLSL_CROSS_COMPILE_RENDER", &runHLSLCrossCompileRenderComparisonTest},
{ "COMPARE_HLSL_GLSL_RENDER", &runHLSLAndGLSLComparisonTest },
+ { "COMPARE_COMPUTE", &doSlangComputeComparisonTest},
#else
{ "COMPARE_HLSL", &skipTest },
{ "COMPARE_HLSL_RENDER", &skipTest },
{ "COMPARE_HLSL_CROSS_COMPILE_RENDER", &skipTest},
{ "COMPARE_HLSL_GLSL_RENDER", &skipTest },
+ { "COMPARE_COMPUTE", &skipTest},
#endif
{ "COMPARE_GLSL", &runGLSLComparisonTest },
- { "COMPARE_COMPUTE", &doSlangComputeComparisonTest},
{ "CROSS_COMPILE", &runCrossCompilerTest },
{ "EVAL", &runEvalTest },