@@ -14,6 +14,15 @@ __generic<T>
14
14
__intrinsic_op($(kIROp_StructuredBufferGetDimensions ))
15
15
uint2 __structuredBufferGetDimensions(ConsumeStructuredBuffer< T> buffer);
16
16
17
+ __intrinsic_op($(kIROp_StructuredBufferGetDimensions ))
18
+ uint2 __structuredBufferGetDimensions< T> (StructuredBuffer < T> buffer);
19
+
20
+ __intrinsic_op($(kIROp_StructuredBufferGetDimensions ))
21
+ uint2 __structuredBufferGetDimensions< T> (RWStructuredBuffer < T> buffer);
22
+
23
+ __intrinsic_op($(kIROp_StructuredBufferGetDimensions ))
24
+ uint2 __structuredBufferGetDimensions< T> (RasterizerOrderedStructuredBuffer< T> buffer);
25
+
17
26
__generic < T>
18
27
__magic_type(HLSLAppendStructuredBufferType)
19
28
__intrinsic_type($(kIROp_HLSLAppendStructuredBufferType ))
@@ -37,35 +46,61 @@ __magic_type(HLSLByteAddressBufferType)
37
46
__intrinsic_type($(kIROp_HLSLByteAddressBufferType ))
38
47
struct ByteAddressBuffer
39
48
{
40
- __target_intrinsic (glsl, " $1 = $0._data.length() * 4" )
41
49
[__readNone]
42
- void GetDimensions(
43
- out uint dim);
50
+ __target_intrinsic (hlsl)
51
+ __target_intrinsic (cpp)
52
+ __target_intrinsic (cuda)
53
+ [__unsafeForceInlineEarly]
54
+ void GetDimensions(out uint dim);
55
+
56
+ [__unsafeForceInlineEarly]
57
+ __specialized_for_target(spirv)
58
+ __specialized_for_target(glsl)
59
+ void GetDimensions(out uint dim)
60
+ {
61
+ dim = __structuredBufferGetDimensions(__getEquivalentStructuredBuffer< uint > (this )).x * 4 ;
62
+ }
44
63
45
- __target_intrinsic (glsl, " $0._data[$1/4]" )
46
64
[__readNone]
47
- uint Load(int location);
65
+ [ForceInline]
66
+ __target_intrinsic (hlsl)
67
+ uint Load(int location)
68
+ {
69
+ return __byteAddressBufferLoad< uint > (this , location);
70
+ }
48
71
49
72
[__readNone]
50
73
uint Load(int location, out uint status);
51
74
52
- __target_intrinsic (glsl, " uvec2($0._data[$1/4], $0._data[$1/4+1])" )
53
75
[__readNone]
54
- uint2 Load2(int location);
76
+ [ForceInline]
77
+ __target_intrinsic (hlsl)
78
+ uint2 Load2(int location)
79
+ {
80
+ return __byteAddressBufferLoad< uint2 > (this , location);
81
+ }
55
82
56
83
[__readNone]
57
84
uint2 Load2(int location, out uint status);
58
85
59
- __target_intrinsic (glsl, " uvec3($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2])" )
60
86
[__readNone]
61
- uint3 Load3(int location);
87
+ [ForceInline]
88
+ __target_intrinsic (hlsl)
89
+ uint3 Load3(int location)
90
+ {
91
+ return __byteAddressBufferLoad< uint3 > (this , location);
92
+ }
62
93
63
94
[__readNone]
64
95
uint3 Load3(int location, out uint status);
65
96
66
- __target_intrinsic (glsl, " uvec4($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2], $0._data[$1/4+3])" )
67
97
[__readNone]
68
- uint4 Load4(int location);
98
+ [ForceInline]
99
+ __target_intrinsic (hlsl)
100
+ uint4 Load4(int location)
101
+ {
102
+ return __byteAddressBufferLoad< uint4 > (this , location);
103
+ }
69
104
70
105
[__readNone]
71
106
uint4 Load4(int location, out uint status);
@@ -244,11 +279,16 @@ __magic_type(HLSLStructuredBufferType)
244
279
__intrinsic_type($(kIROp_HLSLStructuredBufferType ))
245
280
struct StructuredBuffer
246
281
{
247
- __target_intrinsic (glsl, " $1 = $0._data.length(); $2 = 0" )
248
282
[__readNone]
283
+ [__unsafeForceInlineEarly]
249
284
void GetDimensions(
250
285
out uint numStructs,
251
- out uint stride);
286
+ out uint stride)
287
+ {
288
+ let rs = __structuredBufferGetDimensions(this );
289
+ numStructs = rs .x ;
290
+ stride = rs .y ;
291
+ }
252
292
253
293
__intrinsic_op($(kIROp_StructuredBufferLoad ))
254
294
__target_intrinsic (glsl, " $0._data[$1]" )
@@ -321,34 +361,56 @@ struct $(item.name)
321
361
// Note(tfoley): supports all operations from `ByteAddressBuffer`
322
362
// TODO(tfoley): can this be made a sub-type?
323
363
324
- __target_intrinsic (glsl, " $1 = $0._data.length() * 4" )
325
- void GetDimensions(
326
- out uint dim);
364
+ __target_intrinsic (hlsl)
365
+ __target_intrinsic (cpp)
366
+ __target_intrinsic (cuda)
367
+ [__unsafeForceInlineEarly]
368
+ void GetDimensions(out uint dim);
327
369
328
- __target_intrinsic (glsl, " $0._data[$1/4]" )
370
+ [__unsafeForceInlineEarly]
371
+ __specialized_for_target(spirv)
372
+ __specialized_for_target(glsl)
373
+ void GetDimensions(out uint dim)
374
+ {
375
+ dim = __structuredBufferGetDimensions(__getEquivalentStructuredBuffer< uint > (this )).x * 4 ;
376
+ }
377
+
378
+ __target_intrinsic (hlsl)
329
379
[__NoSideEffect]
330
- uint Load(int location);
380
+ uint Load(int location)
381
+ {
382
+ return __byteAddressBufferLoad< uint > (this , location);
383
+ }
331
384
332
385
[__NoSideEffect]
333
386
uint Load(int location, out uint status);
334
387
335
- __target_intrinsic (glsl, " uvec2($0._data[$1/4], $0._data[$1/4+1]) " )
388
+ __target_intrinsic (hlsl )
336
389
[__NoSideEffect]
337
- uint2 Load2(int location);
390
+ uint2 Load2(int location)
391
+ {
392
+ return __byteAddressBufferLoad< uint2 > (this , location);
393
+ }
338
394
339
395
[__NoSideEffect]
340
396
uint2 Load2(int location, out uint status);
341
397
342
- __target_intrinsic (glsl, " uvec3($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2]) " )
398
+ __target_intrinsic (hlsl )
343
399
[__NoSideEffect]
344
- uint3 Load3(int location);
400
+ uint3 Load3(int location)
401
+ {
402
+ return __byteAddressBufferLoad< uint3 > (this , location);
403
+ }
345
404
346
405
[__NoSideEffect]
347
406
uint3 Load3(int location, out uint status);
348
407
349
- __target_intrinsic (glsl, " uvec4($0._data[$1/4], $0._data[$1/4+1], $0._data[$1/4+2], $0._data[$1/4+3]) " )
408
+ __target_intrinsic (hlsl )
350
409
[__NoSideEffect]
351
- uint4 Load4(int location);
410
+ uint4 Load4(int location)
411
+ {
412
+ return __byteAddressBufferLoad< uint4 > (this , location);
413
+ }
352
414
353
415
[__NoSideEffect]
354
416
uint4 Load4(int location, out uint status);
@@ -689,25 +751,39 @@ ${{{{
689
751
UINT dest,
690
752
UINT value);
691
753
692
- __target_intrinsic (glsl, " $0._data[$1/4] = $2" )
754
+ __target_intrinsic (hlsl)
755
+ [ForceInline]
693
756
void Store(
694
757
uint address,
695
- uint value);
758
+ uint value)
759
+ {
760
+ __byteAddressBufferStore(this , address, value);
761
+ }
696
762
697
- __target_intrinsic (glsl, " $0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y" )
698
- void Store2(
699
- uint address,
700
- uint2 value);
763
+ __target_intrinsic (hlsl)
764
+ [ForceInline]
765
+ void Store2(uint address, uint2 value)
766
+ {
767
+ __byteAddressBufferStore(this , address, value);
768
+ }
701
769
702
- __target_intrinsic (glsl, " $0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y, $0._data[$1/4+2] = $2.z" )
770
+ __target_intrinsic (hlsl)
771
+ [ForceInline]
703
772
void Store3(
704
773
uint address,
705
- uint3 value);
774
+ uint3 value)
775
+ {
776
+ __byteAddressBufferStore(this , address, value);
777
+ }
706
778
707
- __target_intrinsic (glsl, " $0._data[$1/4] = $2.x, $0._data[$1/4+1] = $2.y, $0._data[$1/4+2] = $2.z, $0._data[$1/4+3] = $2.w" )
779
+ __target_intrinsic (hlsl)
780
+ [ForceInline]
708
781
void Store4(
709
782
uint address,
710
- uint4 value);
783
+ uint4 value)
784
+ {
785
+ __byteAddressBufferStore(this , address, value);
786
+ }
711
787
712
788
void Store< T> (int offset, T value)
713
789
{
@@ -738,10 +814,17 @@ struct $(item.name)
738
814
{
739
815
uint DecrementCounter();
740
816
741
- __target_intrinsic (glsl, " $1 = $0._data.length(); $2 = 0" )
817
+ [__readNone]
818
+ [__unsafeForceInlineEarly]
819
+ __target_intrinsic (hlsl)
742
820
void GetDimensions(
743
821
out uint numStructs,
744
- out uint stride);
822
+ out uint stride)
823
+ {
824
+ let rs = __structuredBufferGetDimensions(this );
825
+ numStructs = rs .x ;
826
+ stride = rs .y ;
827
+ }
745
828
746
829
uint IncrementCounter();
747
830
@@ -1850,6 +1933,12 @@ __generic<T : __BuiltinFloatingPointType> vector<T,4> dst(vector<T,4> x, vector<
1850
1933
__intrinsic_op($(kIROp_GetEquivalentStructuredBuffer ))
1851
1934
RWStructuredBuffer < T> __getEquivalentStructuredBuffer< T> (RWByteAddressBuffer b);
1852
1935
1936
+ __intrinsic_op($(kIROp_GetEquivalentStructuredBuffer ))
1937
+ StructuredBuffer < T> __getEquivalentStructuredBuffer< T> (ByteAddressBuffer b);
1938
+
1939
+ __intrinsic_op($(kIROp_GetEquivalentStructuredBuffer ))
1940
+ RasterizerOrderedStructuredBuffer< T> __getEquivalentStructuredBuffer< T> (RasterizerOrderedByteAddressBuffer b);
1941
+
1853
1942
// Error message
1854
1943
1855
1944
// void errorf( string format, ... );
0 commit comments