@@ -144,6 +144,7 @@ struct BuiltinTypeMethodBuilder {
144
144
_2,
145
145
_3,
146
146
_4,
147
+ _5,
147
148
Handle = 128 ,
148
149
CounterHandle,
149
150
LastStmt
@@ -190,6 +191,9 @@ struct BuiltinTypeMethodBuilder {
190
191
template <typename T>
191
192
BuiltinTypeMethodBuilder &
192
193
accessCounterHandleFieldOnResource (T ResourceRecord);
194
+ template <typename ResourceT, typename ValueT>
195
+ BuiltinTypeMethodBuilder &
196
+ setCounterHandleFieldOnResource (ResourceT ResourceRecord, ValueT HandleValue);
193
197
template <typename T> BuiltinTypeMethodBuilder &returnValue (T ReturnValue);
194
198
BuiltinTypeMethodBuilder &returnThis ();
195
199
BuiltinTypeDeclBuilder &finalize ();
@@ -205,6 +209,11 @@ struct BuiltinTypeMethodBuilder {
205
209
if (!Method)
206
210
createDecl ();
207
211
}
212
+
213
+ template <typename ResourceT, typename ValueT>
214
+ BuiltinTypeMethodBuilder &setFieldOnResource (ResourceT ResourceRecord,
215
+ ValueT HandleValue,
216
+ FieldDecl *HandleField);
208
217
};
209
218
210
219
TemplateParameterListBuilder::~TemplateParameterListBuilder () {
@@ -592,13 +601,27 @@ template <typename ResourceT, typename ValueT>
592
601
BuiltinTypeMethodBuilder &
593
602
BuiltinTypeMethodBuilder::setHandleFieldOnResource (ResourceT ResourceRecord,
594
603
ValueT HandleValue) {
604
+ return setFieldOnResource (ResourceRecord, HandleValue,
605
+ DeclBuilder.getResourceHandleField ());
606
+ }
607
+
608
+ template <typename ResourceT, typename ValueT>
609
+ BuiltinTypeMethodBuilder &
610
+ BuiltinTypeMethodBuilder::setCounterHandleFieldOnResource (
611
+ ResourceT ResourceRecord, ValueT HandleValue) {
612
+ return setFieldOnResource (ResourceRecord, HandleValue,
613
+ DeclBuilder.getResourceCounterHandleField ());
614
+ }
615
+
616
+ template <typename ResourceT, typename ValueT>
617
+ BuiltinTypeMethodBuilder &BuiltinTypeMethodBuilder::setFieldOnResource (
618
+ ResourceT ResourceRecord, ValueT HandleValue, FieldDecl *HandleField) {
595
619
ensureCompleteDecl ();
596
620
597
621
Expr *ResourceExpr = convertPlaceholder (ResourceRecord);
598
622
Expr *HandleValueExpr = convertPlaceholder (HandleValue);
599
623
600
624
ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
601
- FieldDecl *HandleField = DeclBuilder.getResourceHandleField ();
602
625
MemberExpr *HandleMemberExpr = MemberExpr::CreateImplicit (
603
626
AST, ResourceExpr, false , HandleField, HandleField->getType (), VK_LValue,
604
627
OK_Ordinary);
@@ -829,6 +852,18 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDefaultHandleConstructor() {
829
852
.finalize ();
830
853
}
831
854
855
+ BuiltinTypeDeclBuilder &
856
+ BuiltinTypeDeclBuilder::addStaticInitializationFunctions (bool HasCounter) {
857
+ if (HasCounter) {
858
+ addCreateFromBindingWithImplicitCounter ();
859
+ addCreateFromImplicitBindingWithImplicitCounter ();
860
+ } else {
861
+ addCreateFromBinding ();
862
+ addCreateFromImplicitBinding ();
863
+ }
864
+ return *this ;
865
+ }
866
+
832
867
// Adds static method that initializes resource from binding:
833
868
//
834
869
// static Resource<T> __createFromBinding(unsigned registerNo,
@@ -903,6 +938,102 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromImplicitBinding() {
903
938
.finalize ();
904
939
}
905
940
941
+ // Adds static method that initializes resource from binding:
942
+ //
943
+ // static Resource<T>
944
+ // __createFromBindingWithImplicitCounter(unsigned registerNo,
945
+ // unsigned spaceNo, int range,
946
+ // unsigned index, const char *name,
947
+ // unsigned counterOrderId) {
948
+ // Resource<T> tmp;
949
+ // tmp.__handle = __builtin_hlsl_resource_handlefrombinding(
950
+ // tmp.__handle, registerNo, spaceNo, range, index, name);
951
+ // tmp.__counter_handle =
952
+ // __builtin_hlsl_resource_counterhandlefromimplicitbinding(
953
+ // tmp.__handle, counterOrderId, spaceNo);
954
+ // return tmp;
955
+ // }
956
+ BuiltinTypeDeclBuilder &
957
+ BuiltinTypeDeclBuilder::addCreateFromBindingWithImplicitCounter () {
958
+ assert (!Record->isCompleteDefinition () && " record is already complete" );
959
+
960
+ using PH = BuiltinTypeMethodBuilder::PlaceHolder;
961
+ ASTContext &AST = SemaRef.getASTContext ();
962
+ QualType HandleType = getResourceHandleField ()->getType ();
963
+ QualType RecordType = AST.getTypeDeclType (cast<TypeDecl>(Record));
964
+ BuiltinTypeMethodBuilder::LocalVar TmpVar (" tmp" , RecordType);
965
+
966
+ return BuiltinTypeMethodBuilder (*this ,
967
+ " __createFromBindingWithImplicitCounter" ,
968
+ RecordType, false , false , SC_Static)
969
+ .addParam (" registerNo" , AST.UnsignedIntTy )
970
+ .addParam (" spaceNo" , AST.UnsignedIntTy )
971
+ .addParam (" range" , AST.IntTy )
972
+ .addParam (" index" , AST.UnsignedIntTy )
973
+ .addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
974
+ .addParam (" counterOrderId" , AST.UnsignedIntTy )
975
+ .declareLocalVar (TmpVar)
976
+ .accessHandleFieldOnResource (TmpVar)
977
+ .callBuiltin (" __builtin_hlsl_resource_handlefrombinding" , HandleType,
978
+ PH::LastStmt, PH::_0, PH::_1, PH::_2, PH::_3, PH::_4)
979
+ .setHandleFieldOnResource (TmpVar, PH::LastStmt)
980
+ .accessHandleFieldOnResource (TmpVar)
981
+ .callBuiltin (" __builtin_hlsl_resource_counterhandlefromimplicitbinding" ,
982
+ HandleType, PH::LastStmt, PH::_5, PH::_1)
983
+ .setCounterHandleFieldOnResource (TmpVar, PH::LastStmt)
984
+ .returnValue (TmpVar)
985
+ .finalize ();
986
+ }
987
+
988
+ // Adds static method that initializes resource from binding:
989
+ //
990
+ // static Resource<T>
991
+ // __createFromImplicitBindingWithImplicitCounter(unsigned orderId,
992
+ // unsigned spaceNo, int range,
993
+ // unsigned index,
994
+ // const char *name,
995
+ // unsigned counterOrderId) {
996
+ // Resource<T> tmp;
997
+ // tmp.__handle = __builtin_hlsl_resource_handlefromimplicitbinding(
998
+ // tmp.__handle, orderId, spaceNo, range, index, name);
999
+ // tmp.__counter_handle =
1000
+ // __builtin_hlsl_resource_counterhandlefromimplicitbinding(
1001
+ // tmp.__handle, counterOrderId, spaceNo);
1002
+ // return tmp;
1003
+ // }
1004
+ BuiltinTypeDeclBuilder &
1005
+ BuiltinTypeDeclBuilder::addCreateFromImplicitBindingWithImplicitCounter () {
1006
+ assert (!Record->isCompleteDefinition () && " record is already complete" );
1007
+
1008
+ using PH = BuiltinTypeMethodBuilder::PlaceHolder;
1009
+ ASTContext &AST = SemaRef.getASTContext ();
1010
+ QualType HandleType = getResourceHandleField ()->getType ();
1011
+ QualType RecordType = AST.getTypeDeclType (cast<TypeDecl>(Record));
1012
+ BuiltinTypeMethodBuilder::LocalVar TmpVar (" tmp" , RecordType);
1013
+
1014
+ return BuiltinTypeMethodBuilder (
1015
+ *this , " __createFromImplicitBindingWithImplicitCounter" ,
1016
+ RecordType, false , false , SC_Static)
1017
+ .addParam (" orderId" , AST.UnsignedIntTy )
1018
+ .addParam (" spaceNo" , AST.UnsignedIntTy )
1019
+ .addParam (" range" , AST.IntTy )
1020
+ .addParam (" index" , AST.UnsignedIntTy )
1021
+ .addParam (" name" , AST.getPointerType (AST.CharTy .withConst ()))
1022
+ .addParam (" counterOrderId" , AST.UnsignedIntTy )
1023
+ .declareLocalVar (TmpVar)
1024
+ .accessHandleFieldOnResource (TmpVar)
1025
+ .callBuiltin (" __builtin_hlsl_resource_handlefromimplicitbinding" ,
1026
+ HandleType, PH::LastStmt, PH::_0, PH::_1, PH::_2, PH::_3,
1027
+ PH::_4)
1028
+ .setHandleFieldOnResource (TmpVar, PH::LastStmt)
1029
+ .accessHandleFieldOnResource (TmpVar)
1030
+ .callBuiltin (" __builtin_hlsl_resource_counterhandlefromimplicitbinding" ,
1031
+ HandleType, PH::LastStmt, PH::_5, PH::_1)
1032
+ .setCounterHandleFieldOnResource (TmpVar, PH::LastStmt)
1033
+ .returnValue (TmpVar)
1034
+ .finalize ();
1035
+ }
1036
+
906
1037
BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyConstructor () {
907
1038
assert (!Record->isCompleteDefinition () && " record is already complete" );
908
1039
@@ -1048,7 +1179,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addIncrementCounterMethod() {
1048
1179
return BuiltinTypeMethodBuilder (*this , " IncrementCounter" ,
1049
1180
SemaRef.getASTContext ().UnsignedIntTy )
1050
1181
.callBuiltin (" __builtin_hlsl_buffer_update_counter" , QualType (),
1051
- PH::Handle , getConstantIntExpr (1 ))
1182
+ PH::CounterHandle , getConstantIntExpr (1 ))
1052
1183
.finalize ();
1053
1184
}
1054
1185
@@ -1057,7 +1188,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDecrementCounterMethod() {
1057
1188
return BuiltinTypeMethodBuilder (*this , " DecrementCounter" ,
1058
1189
SemaRef.getASTContext ().UnsignedIntTy )
1059
1190
.callBuiltin (" __builtin_hlsl_buffer_update_counter" , QualType (),
1060
- PH::Handle , getConstantIntExpr (-1 ))
1191
+ PH::CounterHandle , getConstantIntExpr (-1 ))
1061
1192
.finalize ();
1062
1193
}
1063
1194
@@ -1102,7 +1233,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addAppendMethod() {
1102
1233
return BuiltinTypeMethodBuilder (*this , " Append" , AST.VoidTy )
1103
1234
.addParam (" value" , ElemTy)
1104
1235
.callBuiltin (" __builtin_hlsl_buffer_update_counter" , AST.UnsignedIntTy ,
1105
- PH::Handle , getConstantIntExpr (1 ))
1236
+ PH::CounterHandle , getConstantIntExpr (1 ))
1106
1237
.callBuiltin (" __builtin_hlsl_resource_getpointer" ,
1107
1238
AST.getPointerType (AddrSpaceElemTy), PH::Handle,
1108
1239
PH::LastStmt)
@@ -1119,7 +1250,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addConsumeMethod() {
1119
1250
AST.getAddrSpaceQualType (ElemTy, LangAS::hlsl_device);
1120
1251
return BuiltinTypeMethodBuilder (*this , " Consume" , ElemTy)
1121
1252
.callBuiltin (" __builtin_hlsl_buffer_update_counter" , AST.UnsignedIntTy ,
1122
- PH::Handle , getConstantIntExpr (-1 ))
1253
+ PH::CounterHandle , getConstantIntExpr (-1 ))
1123
1254
.callBuiltin (" __builtin_hlsl_resource_getpointer" ,
1124
1255
AST.getPointerType (AddrSpaceElemTy), PH::Handle,
1125
1256
PH::LastStmt)
0 commit comments