yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
7349dc5cf
master
1//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj 2//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -vk -shaderobj 3//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -cpu -shaderobj 4 5//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer 6RWStructuredBuffer<int> outputBuffer; 7 8interface IReleaseable 9{ 10 [mutating] 11 void release(); 12} 13 14struct Container<K, V> 15 where optional K : IReleaseable 16 where optional V : IReleaseable 17{ 18 K k[2]; 19 V v[2]; 20 21 [mutating] 22 void erase(int index) 23 { 24 if (K is IReleaseable) 25 k[index].release(); 26 if (V is IReleaseable) 27 v[index].release(); 28 } 29} 30 31struct HeavyEntry: IReleaseable 32{ 33 int index; 34 int value; 35 36 [mutating] 37 void release() 38 { 39 outputBuffer[index] = value; 40 } 41}; 42 43struct LightEntry 44{ 45 int value; 46}; 47 48[numthreads(1, 1, 1)] 49void computeMain(int3 dispatchThreadID: SV_DispatchThreadID) 50{ 51 { // Neither is IReleaseable 52 var c = Container<LightEntry, LightEntry>(); 53 c.k[0] = LightEntry(1); 54 c.k[1] = LightEntry(2); 55 c.v[0] = LightEntry(3); 56 c.v[1] = LightEntry(4); 57 c.erase(0); 58 c.erase(1); 59 } 60 { // K is IReleaseable 61 var c = Container<HeavyEntry, LightEntry>(); 62 c.k[0] = HeavyEntry(0,1); 63 c.k[1] = HeavyEntry(1,2); 64 c.v[0] = LightEntry(3); 65 c.v[1] = LightEntry(4); 66 // CHECK: 1 67 c.erase(0); 68 // CHECK-NEXT: 2 69 c.erase(1); 70 } 71 { // V is IReleaseable 72 var c = Container<LightEntry, HeavyEntry>(); 73 c.k[0] = LightEntry(1); 74 c.k[1] = LightEntry(2); 75 c.v[0] = HeavyEntry(2,3); 76 c.v[1] = HeavyEntry(3,4); 77 // CHECK-NEXT: 3 78 c.erase(0); 79 // CHECK-NEXT: 4 80 c.erase(1); 81 } 82 { // K and V are IReleaseable 83 var c = Container<HeavyEntry, HeavyEntry>(); 84 c.k[0] = HeavyEntry(4,5); 85 c.k[1] = HeavyEntry(6,7); 86 c.v[0] = HeavyEntry(5,6); 87 c.v[1] = HeavyEntry(7,8); 88 // CHECK-NEXT: 5 89 // CHECK-NEXT: 6 90 c.erase(0); 91 // CHECK-NEXT: 7 92 // CHECK-NEXT: 8 93 c.erase(1); 94 } 95}