diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2018-04-11 16:18:29 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-04-11 16:18:29 -0700 |
| commit | baf194e7456ba4568dcf11249896af35b3ce18cc (patch) | |
| tree | f75e20db450100d41bfa9c384a8bab0fdc28a749 /tests/bindings | |
| parent | 6322983fa4dc84ef1e9dd8fad54d4c1580436e67 (diff) | |
Introduce an IR-level type system (#481)
* Introduce an IR-level type system
Up to this point, the Slang IR has used the front-end type system to represent types in the IR.
As a result (but ultimately more importantly) the IR representation of generics and specialization has used AST-level concepts embedded in the IR.
For example, to express the specialization of `vector<T,N>` to a concrete type `float` for `T`, we needed an IR operation that could represent the specialization, with operands that somehow represented the type argument `float`.
The whole thing was very complicated.
The big idea of this change is to introduce a new representation in which types in the IR are just ordinary instructions, so that using them as operands makes sense. The hierarchy of IR types closely mirrors the AST-side hierarchy for now, and that will probably be something we should maintain going forward.
In order to make these changes work, though, I also had to do major overhauls of things like the way substitutions are performed, how we check interface conformances, the way lookup through interface types is done, etc. etc. This is a big change, and unfortunately any attempt to summarize it in the commit message wouldn't do it justice.
* Fix 64-bit build warning
* Fix up some clang warnings/errors
Diffstat (limited to 'tests/bindings')
| -rw-r--r-- | tests/bindings/array-of-struct-of-resource.hlsl | 6 | ||||
| -rw-r--r-- | tests/bindings/binding0.hlsl | 8 | ||||
| -rw-r--r-- | tests/bindings/binding1.hlsl | 19 | ||||
| -rw-r--r-- | tests/bindings/explicit-binding.hlsl | 20 | ||||
| -rw-r--r-- | tests/bindings/glsl-parameter-blocks.slang | 3 | ||||
| -rw-r--r-- | tests/bindings/glsl-parameter-blocks.slang.glsl | 41 | ||||
| -rw-r--r-- | tests/bindings/multi-file-extra.hlsl | 32 | ||||
| -rw-r--r-- | tests/bindings/multi-file.hlsl | 66 | ||||
| -rw-r--r-- | tests/bindings/multiple-parameter-blocks.slang | 2 | ||||
| -rw-r--r-- | tests/bindings/packoffset.hlsl | 13 | ||||
| -rw-r--r-- | tests/bindings/parameter-blocks.slang | 6 | ||||
| -rw-r--r-- | tests/bindings/resources-in-cbuffer.hlsl | 32 | ||||
| -rw-r--r-- | tests/bindings/targets-and-uavs-structure.hlsl | 5 | ||||
| -rw-r--r-- | tests/bindings/targets-and-uavs.hlsl | 7 |
14 files changed, 212 insertions, 48 deletions
diff --git a/tests/bindings/array-of-struct-of-resource.hlsl b/tests/bindings/array-of-struct-of-resource.hlsl index 71492ef49..8ba71c7a3 100644 --- a/tests/bindings/array-of-struct-of-resource.hlsl +++ b/tests/bindings/array-of-struct-of-resource.hlsl @@ -27,11 +27,15 @@ float4 main() : SV_Target #else +#define a _SV04testL0 +#define b _SV04testL1 +#define s _SV01s + Texture2D a[2]; Texture2D b[2]; SamplerState s; -float4 main() : SV_Target +float4 main() : SV_TARGET { return use(a[0],s) + use(b[0],s) diff --git a/tests/bindings/binding0.hlsl b/tests/bindings/binding0.hlsl index 9ca092562..fcd7e7b54 100644 --- a/tests/bindings/binding0.hlsl +++ b/tests/bindings/binding0.hlsl @@ -8,6 +8,12 @@ #define R(X) /**/ #else #define R(X) X + +#define C _SV022SLANG_parameterGroup_C +#define t _SV01t +#define s _SV01s +#define c _SV022SLANG_ParameterGroup_C1c + #endif float4 use(float4 val) { return val; }; @@ -21,7 +27,7 @@ cbuffer C R(: register(b0)) float c; } -float4 main() : SV_Target +float4 main() : SV_TARGET { return use(t,s) + use(c); }
\ No newline at end of file diff --git a/tests/bindings/binding1.hlsl b/tests/bindings/binding1.hlsl index 879a19816..adc06edaa 100644 --- a/tests/bindings/binding1.hlsl +++ b/tests/bindings/binding1.hlsl @@ -15,15 +15,22 @@ #define R(X) /**/ #else #define R(X) X + +#define tB _SV02tB +#define sB _SV02sB + +#define C1 _SV023SLANG_parameterGroup_C1 +#define c1 _SV023SLANG_ParameterGroup_C12c1 + #endif float4 use(float4 val) { return val; }; float4 use(Texture2D t, SamplerState s) { return t.Sample(s, 0.0); } -Texture2D t0 R(: register(t0)); -Texture2D t1 R(: register(t1)); -SamplerState s0 R(: register(s0)); -SamplerState s1 R(: register(s1)); +Texture2D tA R(: register(t0)); +Texture2D tB R(: register(t1)); +SamplerState sA R(: register(s0)); +SamplerState sB R(: register(s1)); cbuffer C0 R(: register(b0)) { @@ -35,7 +42,7 @@ cbuffer C1 R(: register(b1)) float c1; } -float4 main() : SV_Target +float4 main() : SV_TARGET { - return use(t1,s1) + use(c1); + return use(tB,sB) + use(c1); }
\ No newline at end of file diff --git a/tests/bindings/explicit-binding.hlsl b/tests/bindings/explicit-binding.hlsl index 313f5a091..758be959b 100644 --- a/tests/bindings/explicit-binding.hlsl +++ b/tests/bindings/explicit-binding.hlsl @@ -7,6 +7,24 @@ #define R(X) /**/ #else #define R(X) X + +#define CA _SV023SLANG_parameterGroup_CA +#define ca _SV023SLANG_ParameterGroup_CA2ca + +#define CB _SV023SLANG_parameterGroup_CB +#define cb _SV023SLANG_ParameterGroup_CB2cb + +#define CC _SV023SLANG_parameterGroup_CC +#define cc _SV023SLANG_ParameterGroup_CC2cc + +#define sa _SV02sa +#define sb _SV02sb +#define sc _SV02sc + +#define ta _SV02ta +#define tb _SV02tb +#define tc _SV02tc + #endif float4 use(float4 val) { return val; }; @@ -46,7 +64,7 @@ cbuffer CC : register(b9) float cc; } -float4 main() : SV_Target +float4 main() : SV_TARGET { // Go ahead and use everything in this case: return use(ta, sa) + use(ca) diff --git a/tests/bindings/glsl-parameter-blocks.slang b/tests/bindings/glsl-parameter-blocks.slang index 48eacbb0f..d356df775 100644 --- a/tests/bindings/glsl-parameter-blocks.slang +++ b/tests/bindings/glsl-parameter-blocks.slang @@ -1,9 +1,6 @@ #version 450 core //TEST:CROSS_COMPILE: -profile ps_5_0 -entry main -target spirv-assembly -// Note: disabled because the translation of `Texture2D.Sample()` -// requires handling of local variables with resource types in the IR. - struct Test { float4 a; diff --git a/tests/bindings/glsl-parameter-blocks.slang.glsl b/tests/bindings/glsl-parameter-blocks.slang.glsl index d05eea485..b65ee0e49 100644 --- a/tests/bindings/glsl-parameter-blocks.slang.glsl +++ b/tests/bindings/glsl-parameter-blocks.slang.glsl @@ -1,39 +1,56 @@ //TEST_IGNORE_FILE: #version 450 core -struct _ST04Test +#define Test _ST04Test +#define a _SV04Test1a + +#define gTest _SV05gTestL0 +#define gTest_t _SV05gTestL1 +#define gTest_s _SV05gTestL2 + +#define ParameterBlock_gTest _S1 + +#define main_result _S2 +#define uv _S3 + +#define temp_uv _S4 +#define temp_a _S5 +#define temp_sample _S6 +#define temp_add _S7 + +struct Test { vec4 a; }; layout(binding = 0, set = 1) -uniform _S1 +uniform ParameterBlock_gTest { - _ST04Test _SV05gTestL0; + Test gTest; }; layout(binding = 1, set = 1) -uniform texture2D _SV05gTestL1; +uniform texture2D gTest_t; layout(binding = 2, set = 1) -uniform sampler _SV05gTestL2; +uniform sampler gTest_s; layout(location = 0) -out vec4 _S2; +out vec4 main_result; layout(location = 0) -in vec2 _S3; +in vec2 uv; void main() { - vec2 _S4 = _S3; + vec2 temp_uv = uv; - vec4 _S5 = _SV05gTestL0.a; + vec4 temp_a = gTest.a; - vec4 _S6 = texture(sampler2D(_SV05gTestL1, _SV05gTestL2), _S4); + vec4 temp_sample = texture(sampler2D(gTest_t, gTest_s), temp_uv); - vec4 _S7 = _S5 + _S6; - _S2 = _S7; + vec4 temp_add = temp_a + temp_sample; + main_result = temp_add; return; } diff --git a/tests/bindings/multi-file-extra.hlsl b/tests/bindings/multi-file-extra.hlsl index 7852d7c48..8bf8be414 100644 --- a/tests/bindings/multi-file-extra.hlsl +++ b/tests/bindings/multi-file-extra.hlsl @@ -9,6 +9,36 @@ #define R(X) /**/ #else #define R(X) X + +#define sharedC _SV028SLANG_parameterGroup_sharedC +#define sharedCA _SV028SLANG_ParameterGroup_sharedC8sharedCA +#define sharedCB _SV028SLANG_ParameterGroup_sharedC8sharedCB +#define sharedCC _SV028SLANG_ParameterGroup_sharedC8sharedCC +#define sharedCD _SV028SLANG_ParameterGroup_sharedC8sharedCD + +#define vertexC _SV028SLANG_parameterGroup_vertexC +#define vertexCA _SV028SLANG_ParameterGroup_vertexC8vertexCA +#define vertexCB _SV028SLANG_ParameterGroup_vertexC8vertexCB +#define vertexCC _SV028SLANG_ParameterGroup_vertexC8vertexCC +#define vertexCD _SV028SLANG_ParameterGroup_vertexC8vertexCD + +#define fragmentC _SV030SLANG_parameterGroup_fragmentC +#define fragmentCA _SV030SLANG_ParameterGroup_fragmentC10fragmentCA +#define fragmentCB _SV030SLANG_ParameterGroup_fragmentC10fragmentCB +#define fragmentCC _SV030SLANG_ParameterGroup_fragmentC10fragmentCC +#define fragmentCD _SV030SLANG_ParameterGroup_fragmentC10fragmentCD + +#define sharedS _SV07sharedS +#define sharedT _SV07sharedT +#define sharedTV _SV08sharedTV +#define sharedTF _SV08sharedTF + +#define vertexS _SV07vertexS +#define vertexT _SV07vertexT + +#define fragmentS _SV09fragmentS +#define fragmentT _SV09fragmentT + #endif float4 use(float val) { return val; }; @@ -48,7 +78,7 @@ Texture2D sharedTV R(: register(t2)); Texture2D sharedTF R(: register(t3)); -float4 main() : SV_Target +float4 main() : SV_TARGET { // Go ahead and use everything here, just to make sure things got placed correctly return use(sharedT, sharedS) diff --git a/tests/bindings/multi-file.hlsl b/tests/bindings/multi-file.hlsl index 4038ea3ca..bc00b0f69 100644 --- a/tests/bindings/multi-file.hlsl +++ b/tests/bindings/multi-file.hlsl @@ -10,6 +10,36 @@ #define R(X) /**/ #else #define R(X) X + +#define sharedC _SV028SLANG_parameterGroup_sharedC +#define sharedCA _SV028SLANG_ParameterGroup_sharedC8sharedCA +#define sharedCB _SV028SLANG_ParameterGroup_sharedC8sharedCB +#define sharedCC _SV028SLANG_ParameterGroup_sharedC8sharedCC +#define sharedCD _SV028SLANG_ParameterGroup_sharedC8sharedCD + +#define vertexC _SV028SLANG_parameterGroup_vertexC +#define vertexCA _SV028SLANG_ParameterGroup_vertexC8vertexCA +#define vertexCB _SV028SLANG_ParameterGroup_vertexC8vertexCB +#define vertexCC _SV028SLANG_ParameterGroup_vertexC8vertexCC +#define vertexCD _SV028SLANG_ParameterGroup_vertexC8vertexCD + +#define fragmentC _SV030SLANG_parameterGroup_fragmentC +#define fragmentCA _SV030SLANG_ParameterGroup_fragmentC10fragmentCA +#define fragmentCB _SV030SLANG_ParameterGroup_fragmentC10fragmentCB +#define fragmentCC _SV030SLANG_ParameterGroup_fragmentC10fragmentCC +#define fragmentCD _SV030SLANG_ParameterGroup_fragmentC10fragmentCD + +#define sharedS _SV07sharedS +#define sharedT _SV07sharedT +#define sharedTV _SV08sharedTV +#define sharedTF _SV08sharedTF + +#define vertexS _SV07vertexS +#define vertexT _SV07vertexT + +#define fragmentS _SV09fragmentS +#define fragmentT _SV09fragmentT + #endif float4 use(float val) { return val; }; @@ -18,8 +48,8 @@ float4 use(float3 val) { return float4(val,0.0); }; float4 use(float4 val) { return val; }; float4 use(Texture2D t, SamplerState s) { - // This is the vertex shader, so we can't do implicit-gradient sampling - return t.SampleGrad(s, 0.0, 0.0, 0.0); + // This is the vertex shader, so we can't do implicit-gradient sampling + return t.SampleGrad(s, 0.0, 0.0, 0.0); } // Start with some parameters that will appear in both shaders @@ -27,10 +57,10 @@ Texture2D sharedT R(: register(t0)); SamplerState sharedS R(: register(s0)); cbuffer sharedC R(: register(b0)) { - float3 sharedCA R(: packoffset(c0)); - float sharedCB R(: packoffset(c0.w)); - float3 sharedCC R(: packoffset(c1)); - float2 sharedCD R(: packoffset(c2)); + float3 sharedCA R(: packoffset(c0)); + float sharedCB R(: packoffset(c0.w)); + float3 sharedCC R(: packoffset(c1)); + float2 sharedCD R(: packoffset(c2)); } // Then some parameters specific to this shader @@ -41,10 +71,10 @@ Texture2D vertexT R(: register(t1)); SamplerState vertexS R(: register(s1)); cbuffer vertexC R(: register(b1)) { - float3 vertexCA R(: packoffset(c0)); - float vertexCB R(: packoffset(c0.w)); - float3 vertexCC R(: packoffset(c1)); - float2 vertexCD R(: packoffset(c2)); + float3 vertexCA R(: packoffset(c0)); + float vertexCB R(: packoffset(c0.w)); + float3 vertexCC R(: packoffset(c1)); + float2 vertexCD R(: packoffset(c2)); } // And end with some shared parameters again @@ -52,13 +82,13 @@ Texture2D sharedTV R(: register(t2)); Texture2D sharedTF R(: register(t3)); -float4 main() : SV_Position +float4 main() : SV_POSITION { - // Go ahead and use everything here, just to make sure things got placed correctly - return use(sharedT, sharedS) - + use(sharedCD) - + use(vertexT, vertexS) - + use(vertexCD) - + use(sharedTV, vertexS) - ; + // Go ahead and use everything here, just to make sure things got placed correctly + return use(sharedT, sharedS) + + use(sharedCD) + + use(vertexT, vertexS) + + use(vertexCD) + + use(sharedTV, vertexS) + ; }
\ No newline at end of file diff --git a/tests/bindings/multiple-parameter-blocks.slang b/tests/bindings/multiple-parameter-blocks.slang index 2b0a38c1c..96a78316a 100644 --- a/tests/bindings/multiple-parameter-blocks.slang +++ b/tests/bindings/multiple-parameter-blocks.slang @@ -37,7 +37,7 @@ Texture2D _SV02p1L0 : register(t0, space1); Texture2D _SV02p1L1[4] : register(t1, space1); SamplerState _SV02p1L2 : register(s0, space1); -float4 main(float v : V) : SV_Target +float4 main(float v : V) : SV_TARGET { return use(_SV01pL0, _SV01pL2) + use(_SV01pL1[int(v)], _SV01pL2) diff --git a/tests/bindings/packoffset.hlsl b/tests/bindings/packoffset.hlsl index 69cebdc40..5b8650a9b 100644 --- a/tests/bindings/packoffset.hlsl +++ b/tests/bindings/packoffset.hlsl @@ -7,6 +7,17 @@ #define R(X) /**/ #else #define R(X) X + +#define CA _SV023SLANG_parameterGroup_CAL0 +#define ca _SV023SLANG_ParameterGroup_CA2ca +#define cb _SV023SLANG_ParameterGroup_CA2cb +#define cc _SV023SLANG_ParameterGroup_CA2cc +#define cd _SV023SLANG_ParameterGroup_CA2cd +#define ce _SV023SLANG_ParameterGroup_CA2ce + +#define ta _SV023SLANG_parameterGroup_CAL1 +#define sa _SV023SLANG_parameterGroup_CAL2 + #endif float4 use(float val) { return val; }; @@ -27,7 +38,7 @@ cbuffer CA R(: register(b0)) SamplerState sa R(: register(s0)); } -float4 main() : SV_Target +float4 main() : SV_TARGET { // Go ahead and use everything in this case: return use(ta, sa) diff --git a/tests/bindings/parameter-blocks.slang b/tests/bindings/parameter-blocks.slang index ae5d9a647..62503e49b 100644 --- a/tests/bindings/parameter-blocks.slang +++ b/tests/bindings/parameter-blocks.slang @@ -26,11 +26,15 @@ float4 main(float v : V) : SV_Target #else +#define t _SV01pL0 +#define ta _SV01pL1 +#define s _SV01pL2 + Texture2D t : register(t0, space0); Texture2D ta[4] : register(t1, space0); SamplerState s : register(s0, space0); -float4 main(float v : V) : SV_Target +float4 main(float v : V) : SV_TARGET { return use(ta[int(v)], s) + use(t, s); diff --git a/tests/bindings/resources-in-cbuffer.hlsl b/tests/bindings/resources-in-cbuffer.hlsl index 647e64c32..5706bd39c 100644 --- a/tests/bindings/resources-in-cbuffer.hlsl +++ b/tests/bindings/resources-in-cbuffer.hlsl @@ -8,6 +8,36 @@ #define R(X) /**/ #else #define R(X) X + +#define CA _SV023SLANG_parameterGroup_CAL0 +#define caa _SV023SLANG_ParameterGroup_CA3caa +#define cab _SV023SLANG_ParameterGroup_CA3cab +#define cac _SV023SLANG_ParameterGroup_CA3cac +#define cad _SV023SLANG_ParameterGroup_CA3cad +#define cae _SV023SLANG_ParameterGroup_CA3cae +#define ta _SV023SLANG_parameterGroup_CAL1 +#define sa _SV023SLANG_parameterGroup_CAL2 + +#define CB _SV023SLANG_parameterGroup_CBL0 +#define cba _SV023SLANG_ParameterGroup_CB3cba +#define cbb _SV023SLANG_ParameterGroup_CB3cbb +#define cbc _SV023SLANG_ParameterGroup_CB3cbc +#define cbd _SV023SLANG_ParameterGroup_CB3cbd +#define cbe _SV023SLANG_ParameterGroup_CB3cbe +#define tbx _SV023SLANG_parameterGroup_CBL1 +#define tby _SV023SLANG_parameterGroup_CBL2 +#define sb _SV023SLANG_parameterGroup_CBL3 + +#define CC _SV023SLANG_parameterGroup_CCL0 +#define cca _SV023SLANG_ParameterGroup_CC3cca +#define ccb _SV023SLANG_ParameterGroup_CC3ccb +#define ccc _SV023SLANG_ParameterGroup_CC3ccc +#define ccd _SV023SLANG_ParameterGroup_CC3ccd +#define cce _SV023SLANG_ParameterGroup_CC3cce +#define tc _SV023SLANG_parameterGroup_CCL1 +#define scx _SV023SLANG_parameterGroup_CCL2 +#define scy _SV023SLANG_parameterGroup_CCL3 + #endif float4 use(float val) { return val; }; @@ -54,7 +84,7 @@ cbuffer CC R(: register(b2)) SamplerState scy R(: register(s3)); } -float4 main() : SV_Target +float4 main() : SV_TARGET { // Go ahead and use everything in this case: return use(ta, sa) diff --git a/tests/bindings/targets-and-uavs-structure.hlsl b/tests/bindings/targets-and-uavs-structure.hlsl index 6c9ee0340..359083069 100644 --- a/tests/bindings/targets-and-uavs-structure.hlsl +++ b/tests/bindings/targets-and-uavs-structure.hlsl @@ -7,6 +7,11 @@ #define R(X) /**/ #else #define R(X) X + +#define Foo _ST03Foo +#define v _SV03Foo1v +#define fooBuffer _SV09fooBuffer + #endif float4 use(float val) { return val; }; diff --git a/tests/bindings/targets-and-uavs.hlsl b/tests/bindings/targets-and-uavs.hlsl index ad0d84e5c..24efa418c 100644 --- a/tests/bindings/targets-and-uavs.hlsl +++ b/tests/bindings/targets-and-uavs.hlsl @@ -9,6 +9,11 @@ #define R(X) /**/ #else #define R(X) X + +#define Foo _ST03Foo +#define v _SV03Foo1v +#define fooBuffer _SV09fooBuffer + #endif float4 use(float val) { return val; }; @@ -22,7 +27,7 @@ struct Foo { float2 v; }; // This should be allocated a register *after* the render target RWStructuredBuffer<Foo> fooBuffer R(: register(u1)); -float4 main() : SV_Target +float4 main() : SV_TARGET { return use(fooBuffer[12].v); }
\ No newline at end of file |
