|
| 1 | +// This test checks the SPIR-V output when compiling a library containing generics with embedded downstream IR. |
| 2 | + |
| 3 | +//TEST:SIMPLE(filecheck=CHECK): -o tests/library/export-library-generics-test.slang-module -target spirv -embed-downstream-ir -profile lib_6_6 -incomplete-library -dump-ir -verbose-paths |
| 4 | + |
| 5 | +module "export-library-generics"; |
| 6 | + |
| 7 | +public cbuffer Constants { |
| 8 | + public float x; |
| 9 | + public float y; |
| 10 | +} |
| 11 | + |
| 12 | +interface MyInterface |
| 13 | +{ |
| 14 | + int myMethod(int a); |
| 15 | +} |
| 16 | + |
| 17 | +struct MyType : MyInterface |
| 18 | +{ |
| 19 | + int myMethod(int a) |
| 20 | + { |
| 21 | + return a * 3; |
| 22 | + } |
| 23 | +} |
| 24 | + |
| 25 | +int genericFunc<T: MyInterface>(T arg) |
| 26 | +{ |
| 27 | + return arg.myMethod(3); |
| 28 | +} |
| 29 | + |
| 30 | +public int normalFuncUsesGeneric(int a) |
| 31 | +{ |
| 32 | + MyType obj; |
| 33 | + return genericFunc(obj); |
| 34 | +} |
| 35 | + |
| 36 | +public int normalFunc(int a, float b) |
| 37 | +{ |
| 38 | + return a - floor(b); |
| 39 | +} |
| 40 | + |
| 41 | +// CHECK:$ |
| 42 | +// CHECK:let %29 : CapabilitySet = capabilityConjunction(1 : Int, 3 : Int, 64 : Int) |
| 43 | +// CHECK:let %28 : CapabilitySet = capabilityConjunction(1 : Int, 3 : Int, 63 : Int) |
| 44 | +// CHECK:let %27 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 76 : Int) |
| 45 | +// CHECK:let %26 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 75 : Int) |
| 46 | +// CHECK:let %25 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 74 : Int) |
| 47 | +// CHECK:let %24 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 73 : Int) |
| 48 | +// CHECK:let %23 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 72 : Int) |
| 49 | +// CHECK:let %22 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 71 : Int) |
| 50 | +// CHECK:let %21 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 70 : Int) |
| 51 | +// CHECK:let %20 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 69 : Int) |
| 52 | +// CHECK:let %19 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 68 : Int) |
| 53 | +// CHECK:let %18 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 67 : Int) |
| 54 | +// CHECK:let %17 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 66 : Int) |
| 55 | +// CHECK:let %16 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 65 : Int) |
| 56 | +// CHECK:let %15 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 64 : Int) |
| 57 | +// CHECK:let %14 : CapabilitySet = capabilityConjunction(1 : Int, 2 : Int, 63 : Int) |
| 58 | +// CHECK:[public] |
| 59 | +// CHECK:[export("_STR29export_2Dxlibrary_2Dxgenerics30SLANG_ParameterGroup_Constants")] |
| 60 | +// CHECK:[nameHint("SLANG_ParameterGroup_Constants")] |
| 61 | +// CHECK:struct %SLANGx5FParameterGroupx5FConstants : Type |
| 62 | +// CHECK:{ |
| 63 | +// CHECK: field(%x, Float) |
| 64 | +// CHECK: field(%y, Float) |
| 65 | +// CHECK:} |
| 66 | +// CHECK:[public] |
| 67 | +// CHECK:[export("_SVR29export_2Dxlibrary_2Dxgenerics30SLANG_ParameterGroup_Constants1x")] |
| 68 | +// CHECK:[nameHint("x")] |
| 69 | +// CHECK:let %x : _ = key |
| 70 | +// CHECK:[public] |
| 71 | +// CHECK:[export("_SVR29export_2Dxlibrary_2Dxgenerics30SLANG_ParameterGroup_Constants1y")] |
| 72 | +// CHECK:[nameHint("y")] |
| 73 | +// CHECK:let %y : _ = key |
| 74 | +// CHECK:let %6 : witness_table_t(%x5Fx5FBuiltinFloatingPointType) = thisTypeWitness |
| 75 | +// CHECK:let %126 : _ = interface_req_entry(%127, witness_table_t(%x5Fx5FBuiltinRealType)) |
| 76 | +// CHECK:let %128 : _ = interface_req_entry(%7, witness_table_t(%IFloat)) |
| 77 | +// CHECK:let %129 : _ = interface_req_entry(%130, Func(this_type(%x5Fx5FBuiltinFloatingPointType))) |
| 78 | +// CHECK:[availableInDownstreamIR(6 : Int)] |
| 79 | +// CHECK:[treatAsDifferentiableDecoration] |
| 80 | +// CHECK:[constructor(true)] |
| 81 | +// CHECK:[method] |
| 82 | +// CHECK:[public] |
| 83 | +// CHECK:[export("_SR29export_2Dxlibrary_2Dxgenerics30SLANG_ParameterGroup_ConstantsR8_24xinitp2pi_fi_f")] |
| 84 | +// CHECK:[nameHint("SLANG_ParameterGroup_Constants.$init")] |
| 85 | +// CHECK:func %SLANGx5FParameterGroupx5FConstantsx5Fx24init : Func(%SLANGx5FParameterGroupx5FConstants, Float, Float) |
| 86 | +// CHECK:EmbeddedDownstreamIR(6 : Int, |
| 87 | +// CHECK:; SPIR-V |
| 88 | +// CHECK:; Version: 1.5 |
| 89 | +// CHECK:; Generator: Khronos; 40 |
| 90 | +// CHECK:; Bound: 61 |
| 91 | +// CHECK:; Schema: 0 |
| 92 | +// CHECK: OpCapability Linkage |
| 93 | +// CHECK: OpCapability Shader |
| 94 | +// CHECK: %44 = OpExtInstImport "GLSL.std.450" |
| 95 | +// CHECK: OpMemoryModel Logical GLSL450 |
| 96 | +// CHECK: OpSource Slang 1 |
| 97 | +// CHECK: OpName %SLANG_ParameterGroup_Constants "SLANG_ParameterGroup_Constants" |
| 98 | +// CHECK: OpMemberName %SLANG_ParameterGroup_Constants 0 "x" |
| 99 | +// CHECK: OpMemberName %SLANG_ParameterGroup_Constants 1 "y" |
| 100 | +// CHECK: OpName %x "x" |
| 101 | +// CHECK: OpName %y "y" |
| 102 | +// CHECK: OpName %SLANG_ParameterGroup_Constants__init "SLANG_ParameterGroup_Constants.$init" |
0 commit comments