diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2018-11-29 07:48:38 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-29 07:48:38 -0800 |
| commit | e5cc4660c634a0dd35a9813e03192d380f253332 (patch) | |
| tree | bcd7395a1d602faf3bad7209b7422677e723a837 /tests/reflection/structured-buffer.slang | |
| parent | c3c34bf4ca78caff285fbf5f24c5f355ca040bd1 (diff) | |
Fix uses of dynamic_cast on types in reflection API (#731)
The `Type` infrastructure uses a class hierarchy, but blindly `dynamic_cast`ing to a desired case doesn't always give the expected result, because a `Type` could represent a `typedef` (a `NamedExpressionType`) that itself resolves to, e.g, a vector type (a `VectorExpressionType`). In that case a `dynamic_cast<VectorExpressionType*>(someType)` would fail, even though the type logically represents a vector. The `Type::As<T>()` method is designed to handle this case, by "looking through" simple `typedef`s to get at the real definition of a type.
The fix in this case is to use `Type::As<T>()` at various points in the reflection code (`reflection.cpp`) instead of `dynamic_cast`.
This problem surfaced with a `StructuredBuffer<float2>` not reflecting correctly, because the element type (`float2`) is actually a `typedef` (for `vector<float,2>`), so I've included a test case that stresses that case. Getting the right output in the test required tweaking the `slang-reflection-test` tool to produce additional output for resource types (currently narrowed down to only affect structured buffers to avoid large diffs in expected test outputs).
Diffstat (limited to 'tests/reflection/structured-buffer.slang')
| -rw-r--r-- | tests/reflection/structured-buffer.slang | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/tests/reflection/structured-buffer.slang b/tests/reflection/structured-buffer.slang new file mode 100644 index 000000000..491d61486 --- /dev/null +++ b/tests/reflection/structured-buffer.slang @@ -0,0 +1,19 @@ +//TEST:REFLECTION:-profile ps_4_0 -target hlsl + +// Confirm that we reflect the contents of structure-buffer types correctly. + +struct S +{ + float2 a; + float b; + uint c; +}; + +StructuredBuffer<uint> x; +StructuredBuffer<float2> y; +StructuredBuffer<S> z; + +float4 main() : SV_Target +{ + return x[0] + y[0].xyxy + z[0].a.xyxy; +}
\ No newline at end of file |
