@@ -767,23 +767,25 @@ Register SPIRVGlobalRegistry::buildGlobalVariable(
767767
768768static std::string GetSpirvImageTypeName (const SPIRVType *Type,
769769 MachineIRBuilder &MIRBuilder,
770- const std::string &Prefix);
770+ const std::string &Prefix,
771+ SPIRVGlobalRegistry &GR);
771772
772773static std::string buildSpirvTypeName (const SPIRVType *Type,
773- MachineIRBuilder &MIRBuilder) {
774+ MachineIRBuilder &MIRBuilder,
775+ SPIRVGlobalRegistry &GR) {
774776 switch (Type->getOpcode ()) {
775777 case SPIRV::OpTypeSampledImage: {
776- return GetSpirvImageTypeName (Type, MIRBuilder, " sampled_image_" );
778+ return GetSpirvImageTypeName (Type, MIRBuilder, " sampled_image_" , GR );
777779 }
778780 case SPIRV::OpTypeImage: {
779- return GetSpirvImageTypeName (Type, MIRBuilder, " image_" );
781+ return GetSpirvImageTypeName (Type, MIRBuilder, " image_" , GR );
780782 }
781783 case SPIRV::OpTypeArray: {
782784 MachineRegisterInfo *MRI = MIRBuilder.getMRI ();
783785 Register ElementTypeReg = Type->getOperand (1 ).getReg ();
784786 auto *ElementType = MRI->getUniqueVRegDef (ElementTypeReg);
785787 uint32_t ArraySize = getArrayComponentCount (MRI, Type);
786- return (buildSpirvTypeName (ElementType, MIRBuilder) + Twine (" [" ) +
788+ return (buildSpirvTypeName (ElementType, MIRBuilder, GR ) + Twine (" [" ) +
787789 Twine (ArraySize) + Twine (" ]" ))
788790 .str ();
789791 }
@@ -795,17 +797,35 @@ static std::string buildSpirvTypeName(const SPIRVType *Type,
795797 if (Type->getOperand (2 ).getImm ())
796798 return (" i" + Twine (Type->getOperand (1 ).getImm ())).str ();
797799 return (" u" + Twine (Type->getOperand (1 ).getImm ())).str ();
800+ case SPIRV::OpTypePointer: {
801+ uint32_t StorageClass = GR.getPointerStorageClass (Type);
802+ SPIRVType *PointeeType = GR.getPointeeType (Type);
803+ return (" p_" + Twine (StorageClass) + Twine (" _" ) +
804+ buildSpirvTypeName (PointeeType, MIRBuilder, GR))
805+ .str ();
806+ }
807+ case SPIRV::OpTypeStruct: {
808+ std::string TypeName = " {" ;
809+ for (uint32_t I = 2 ; I < Type->getNumOperands (); ++I) {
810+ SPIRVType *MemberType =
811+ GR.getSPIRVTypeForVReg (Type->getOperand (I).getReg ());
812+ TypeName = ' _' + buildSpirvTypeName (MemberType, MIRBuilder, GR);
813+ }
814+ return TypeName + " }" ;
815+ }
798816 default :
799817 llvm_unreachable (" Trying to the the name of an unknown type." );
800818 }
801819}
802820
803821static std::string GetSpirvImageTypeName (const SPIRVType *Type,
804822 MachineIRBuilder &MIRBuilder,
805- const std::string &Prefix) {
823+ const std::string &Prefix,
824+ SPIRVGlobalRegistry &GR) {
806825 Register SampledTypeReg = Type->getOperand (1 ).getReg ();
807826 auto *SampledType = MIRBuilder.getMRI ()->getUniqueVRegDef (SampledTypeReg);
808- std::string TypeName = Prefix + buildSpirvTypeName (SampledType, MIRBuilder);
827+ std::string TypeName =
828+ Prefix + buildSpirvTypeName (SampledType, MIRBuilder, GR);
809829 for (uint32_t I = 2 ; I < Type->getNumOperands (); ++I) {
810830 TypeName = (TypeName + ' _' + Twine (Type->getOperand (I).getImm ())).str ();
811831 }
@@ -815,20 +835,19 @@ static std::string GetSpirvImageTypeName(const SPIRVType *Type,
815835Register SPIRVGlobalRegistry::getOrCreateGlobalVariableWithBinding (
816836 const SPIRVType *VarType, uint32_t Set, uint32_t Binding,
817837 MachineIRBuilder &MIRBuilder) {
818- SPIRVType *VarPointerTypeReg = getOrCreateSPIRVPointerType (
819- VarType, MIRBuilder, SPIRV::StorageClass::UniformConstant);
820838 Register VarReg =
821839 MIRBuilder.getMRI ()->createVirtualRegister (&SPIRV::iIDRegClass);
822840
823841 // TODO: The name should come from the llvm-ir, but how that name will be
824842 // passed from the HLSL to the backend has not been decided. Using this place
825843 // holder for now.
826- std::string Name = (" __resource_" + buildSpirvTypeName (VarType, MIRBuilder) +
827- " _" + Twine (Set) + " _" + Twine (Binding))
828- .str ();
829- buildGlobalVariable (VarReg, VarPointerTypeReg, Name, nullptr ,
830- SPIRV::StorageClass::UniformConstant, nullptr , false ,
831- false , SPIRV::LinkageType::Import, MIRBuilder, false );
844+ std::string Name =
845+ (" __resource_" + buildSpirvTypeName (VarType, MIRBuilder, *this ) + " _" +
846+ Twine (Set) + " _" + Twine (Binding))
847+ .str ();
848+ buildGlobalVariable (VarReg, VarType, Name, nullptr ,
849+ getPointerStorageClass (VarType), nullptr , false , false ,
850+ SPIRV::LinkageType::Import, MIRBuilder, false );
832851
833852 buildOpDecorate (VarReg, MIRBuilder, SPIRV::Decoration::DescriptorSet, {Set});
834853 buildOpDecorate (VarReg, MIRBuilder, SPIRV::Decoration::Binding, {Binding});
@@ -842,14 +861,23 @@ SPIRVType *SPIRVGlobalRegistry::getOpTypeArray(uint32_t NumElems,
842861 assert ((ElemType->getOpcode () != SPIRV::OpTypeVoid) &&
843862 " Invalid array element type" );
844863 SPIRVType *SpvTypeInt32 = getOrCreateSPIRVIntegerType (32 , MIRBuilder);
845- Register NumElementsVReg =
846- buildConstantInt (NumElems, MIRBuilder, SpvTypeInt32, EmitIR);
847- return createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
848- return MIRBuilder.buildInstr (SPIRV::OpTypeArray)
849- .addDef (createTypeVReg (MIRBuilder))
850- .addUse (getSPIRVTypeID (ElemType))
851- .addUse (NumElementsVReg);
852- });
864+
865+ if (NumElems != 0 ) {
866+ Register NumElementsVReg =
867+ buildConstantInt (NumElems, MIRBuilder, SpvTypeInt32, EmitIR);
868+ return createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
869+ return MIRBuilder.buildInstr (SPIRV::OpTypeArray)
870+ .addDef (createTypeVReg (MIRBuilder))
871+ .addUse (getSPIRVTypeID (ElemType))
872+ .addUse (NumElementsVReg);
873+ });
874+ } else {
875+ return createOpType (MIRBuilder, [&](MachineIRBuilder &MIRBuilder) {
876+ return MIRBuilder.buildInstr (SPIRV::OpTypeRuntimeArray)
877+ .addDef (createTypeVReg (MIRBuilder))
878+ .addUse (getSPIRVTypeID (ElemType));
879+ });
880+ }
853881}
854882
855883SPIRVType *SPIRVGlobalRegistry::getOpTypeOpaque (const StructType *Ty,
@@ -1296,6 +1324,32 @@ SPIRVGlobalRegistry::getPointerStorageClass(const SPIRVType *Type) const {
12961324 Type->getOperand (1 ).getImm ());
12971325}
12981326
1327+ SPIRVType *SPIRVGlobalRegistry::getOrCreateVulkanBufferType (
1328+ MachineIRBuilder &MIRBuilder, Type *ElemType,
1329+ SPIRV::StorageClass::StorageClass SC, bool IsWritable, bool EmitIr) {
1330+ auto Key = SPIRV::irhandle_vkbuffer (ElemType, SC, IsWritable);
1331+ if (const MachineInstr *MI = findMI (Key, &MIRBuilder.getMF ()))
1332+ return MI;
1333+
1334+ auto *T = StructType::create (ElemType);
1335+ auto *BlockType =
1336+ getOrCreateSPIRVType (T, MIRBuilder, SPIRV::AccessQualifier::None, EmitIr);
1337+
1338+ buildOpDecorate (BlockType->defs ().begin ()->getReg (), MIRBuilder,
1339+ SPIRV::Decoration::Block, {});
1340+ buildOpMemberDecorate (BlockType->defs ().begin ()->getReg (), MIRBuilder,
1341+ SPIRV::Decoration::Offset, 0 , {0 });
1342+
1343+ if (!IsWritable) {
1344+ buildOpMemberDecorate (BlockType->defs ().begin ()->getReg (), MIRBuilder,
1345+ SPIRV::Decoration::NonWritable, 0 , {});
1346+ }
1347+
1348+ SPIRVType *R = getOrCreateSPIRVPointerType (BlockType, MIRBuilder, SC);
1349+ add (Key, R);
1350+ return R;
1351+ }
1352+
12991353SPIRVType *SPIRVGlobalRegistry::getOrCreateOpTypeImage (
13001354 MachineIRBuilder &MIRBuilder, SPIRVType *SampledType, SPIRV::Dim::Dim Dim,
13011355 uint32_t Depth, uint32_t Arrayed, uint32_t Multisampled, uint32_t Sampled,
0 commit comments