@@ -144,6 +144,7 @@ struct BuiltinTypeMethodBuilder {
144144 _2,
145145 _3,
146146 _4,
147+ _5,
147148 Handle = 128 ,
148149 CounterHandle,
149150 LastStmt
@@ -190,6 +191,9 @@ struct BuiltinTypeMethodBuilder {
190191 template <typename T>
191192 BuiltinTypeMethodBuilder &
192193 accessCounterHandleFieldOnResource (T ResourceRecord);
194+ template <typename ResourceT, typename ValueT>
195+ BuiltinTypeMethodBuilder &
196+ setCounterHandleFieldOnResource (ResourceT ResourceRecord, ValueT HandleValue);
193197 template <typename T> BuiltinTypeMethodBuilder &returnValue (T ReturnValue);
194198 BuiltinTypeMethodBuilder &returnThis ();
195199 BuiltinTypeDeclBuilder &finalize ();
@@ -205,6 +209,11 @@ struct BuiltinTypeMethodBuilder {
205209 if (!Method)
206210 createDecl ();
207211 }
212+
213+ template <typename ResourceT, typename ValueT>
214+ BuiltinTypeMethodBuilder &setFieldOnResource (ResourceT ResourceRecord,
215+ ValueT HandleValue,
216+ FieldDecl *HandleField);
208217};
209218
210219TemplateParameterListBuilder::~TemplateParameterListBuilder () {
@@ -592,13 +601,27 @@ template <typename ResourceT, typename ValueT>
592601BuiltinTypeMethodBuilder &
593602BuiltinTypeMethodBuilder::setHandleFieldOnResource (ResourceT ResourceRecord,
594603 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) {
595619 ensureCompleteDecl ();
596620
597621 Expr *ResourceExpr = convertPlaceholder (ResourceRecord);
598622 Expr *HandleValueExpr = convertPlaceholder (HandleValue);
599623
600624 ASTContext &AST = DeclBuilder.SemaRef .getASTContext ();
601- FieldDecl *HandleField = DeclBuilder.getResourceHandleField ();
602625 MemberExpr *HandleMemberExpr = MemberExpr::CreateImplicit (
603626 AST, ResourceExpr, false , HandleField, HandleField->getType (), VK_LValue,
604627 OK_Ordinary);
@@ -829,6 +852,18 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDefaultHandleConstructor() {
829852 .finalize ();
830853}
831854
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+
832867// Adds static method that initializes resource from binding:
833868//
834869// static Resource<T> __createFromBinding(unsigned registerNo,
@@ -903,6 +938,102 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCreateFromImplicitBinding() {
903938 .finalize ();
904939}
905940
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+
9061037BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addCopyConstructor () {
9071038 assert (!Record->isCompleteDefinition () && " record is already complete" );
9081039
@@ -1048,7 +1179,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addIncrementCounterMethod() {
10481179 return BuiltinTypeMethodBuilder (*this , " IncrementCounter" ,
10491180 SemaRef.getASTContext ().UnsignedIntTy )
10501181 .callBuiltin (" __builtin_hlsl_buffer_update_counter" , QualType (),
1051- PH::Handle , getConstantIntExpr (1 ))
1182+ PH::CounterHandle , getConstantIntExpr (1 ))
10521183 .finalize ();
10531184}
10541185
@@ -1057,7 +1188,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addDecrementCounterMethod() {
10571188 return BuiltinTypeMethodBuilder (*this , " DecrementCounter" ,
10581189 SemaRef.getASTContext ().UnsignedIntTy )
10591190 .callBuiltin (" __builtin_hlsl_buffer_update_counter" , QualType (),
1060- PH::Handle , getConstantIntExpr (-1 ))
1191+ PH::CounterHandle , getConstantIntExpr (-1 ))
10611192 .finalize ();
10621193}
10631194
@@ -1102,7 +1233,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addAppendMethod() {
11021233 return BuiltinTypeMethodBuilder (*this , " Append" , AST.VoidTy )
11031234 .addParam (" value" , ElemTy)
11041235 .callBuiltin (" __builtin_hlsl_buffer_update_counter" , AST.UnsignedIntTy ,
1105- PH::Handle , getConstantIntExpr (1 ))
1236+ PH::CounterHandle , getConstantIntExpr (1 ))
11061237 .callBuiltin (" __builtin_hlsl_resource_getpointer" ,
11071238 AST.getPointerType (AddrSpaceElemTy), PH::Handle,
11081239 PH::LastStmt)
@@ -1119,7 +1250,7 @@ BuiltinTypeDeclBuilder &BuiltinTypeDeclBuilder::addConsumeMethod() {
11191250 AST.getAddrSpaceQualType (ElemTy, LangAS::hlsl_device);
11201251 return BuiltinTypeMethodBuilder (*this , " Consume" , ElemTy)
11211252 .callBuiltin (" __builtin_hlsl_buffer_update_counter" , AST.UnsignedIntTy ,
1122- PH::Handle , getConstantIntExpr (-1 ))
1253+ PH::CounterHandle , getConstantIntExpr (-1 ))
11231254 .callBuiltin (" __builtin_hlsl_resource_getpointer" ,
11241255 AST.getPointerType (AddrSpaceElemTy), PH::Handle,
11251256 PH::LastStmt)
0 commit comments