Skip to content

Commit 525781b

Browse files
NikitaRudenkoIntelvladimirlaz
authored andcommitted
Implement OpTypeBufferSurfaceINTEL according to the spec published at: #1612
1 parent bbefc42 commit 525781b

File tree

12 files changed

+188
-1
lines changed

12 files changed

+188
-1
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,12 @@ SPIRVToLLVM::transOCLPipeStorageTypeName(SPIRV::SPIRVTypePipeStorage *PST) {
442442
kSPIRVTypeName::PipeStorage;
443443
}
444444

445+
std::string SPIRVToLLVM::transVCTypeName(SPIRVTypeBufferSurfaceINTEL *PST) {
446+
if (PST->hasAccessQualifier())
447+
return VectorComputeUtil::getVCBufferSurfaceName(PST->getAccessQualifier());
448+
return VectorComputeUtil::getVCBufferSurfaceName();
449+
}
450+
445451
Type *SPIRVToLLVM::transType(SPIRVType *T, bool IsClassMember) {
446452
auto Loc = TypeMap.find(T);
447453
if (Loc != TypeMap.end())
@@ -530,6 +536,14 @@ Type *SPIRVToLLVM::transType(SPIRVType *T, bool IsClassMember) {
530536
// OpenCL Compiler does not use this instruction
531537
case OpTypeVmeImageINTEL:
532538
return nullptr;
539+
540+
case OpTypeBufferSurfaceINTEL: {
541+
auto PST = static_cast<SPIRVTypeBufferSurfaceINTEL *>(T);
542+
return mapType(T,
543+
getOrCreateOpaquePtrType(M, transVCTypeName(PST),
544+
SPIRAddressSpace::SPIRAS_Global));
545+
}
546+
533547
default: {
534548
auto OC = T->getOpCode();
535549
if (isOpaqueGenericTypeOpCode(OC) || isSubgroupAvcINTELTypeOpCode(OC)) {
@@ -3778,6 +3792,9 @@ bool SPIRVToLLVM::transOCLMetadata(SPIRVFunction *BF) {
37783792
if (F->getCallingConv() != CallingConv::SPIR_KERNEL)
37793793
return true;
37803794

3795+
if (BF->hasDecorate(DecorationVectorComputeFunctionINTEL))
3796+
return true;
3797+
37813798
// Generate metadata for kernel_arg_addr_space
37823799
addOCLKernelArgumentMetadata(
37833800
Context, SPIR_MD_KERNEL_ARG_ADDR_SPACE, BF, F,

llvm-spirv/lib/SPIRV/SPIRVReader.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class SPIRVToLLVM {
249249
std::string transOCLPipeStorageTypeName(SPIRV::SPIRVTypePipeStorage *PST);
250250
std::string transOCLImageTypeAccessQualifier(SPIRV::SPIRVTypeImage *ST);
251251
std::string transOCLPipeTypeAccessQualifier(SPIRV::SPIRVTypePipe *ST);
252+
std::string transVCTypeName(SPIRVTypeBufferSurfaceINTEL *PST);
252253

253254
Value *oclTransConstantSampler(SPIRV::SPIRVConstantSampler *BCS,
254255
BasicBlock *BB);

llvm-spirv/lib/SPIRV/SPIRVWriter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,13 @@ SPIRVType *LLVMToSPIRV::transType(Type *T) {
354354
return mapType(T, BM->addQueueType());
355355
}
356356
}
357+
if (BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_vector_compute)) {
358+
if (STName.startswith(kVCType::VCBufferSurface)) {
359+
// VCBufferSurface always have Access Qualifier
360+
auto Access = getAccessQualifier(STName);
361+
return mapType(T, BM->addBufferSurfaceINTELType(Access));
362+
}
363+
}
357364

358365
if (isPointerToOpaqueStructType(T)) {
359366
return mapType(

llvm-spirv/lib/SPIRV/VectorComputeUtil.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,13 @@ getVCGlobalVarAddressSpace(SPIRVStorageClassKind StorageClass) noexcept {
149149
}
150150
}
151151

152+
std::string getVCBufferSurfaceName() {
153+
return std::string(kVCType::VCBufferSurface) + kAccessQualPostfix::Type;
154+
}
155+
156+
std::string getVCBufferSurfaceName(SPIRVAccessQualifierKind Access) {
157+
return std::string(kVCType::VCBufferSurface) +
158+
getAccessQualifierPostfix(Access).str() + kAccessQualPostfix::Type;
159+
}
160+
152161
} // namespace VectorComputeUtil

llvm-spirv/lib/SPIRV/VectorComputeUtil.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ getVCGlobalVarStorageClass(SPIRAddressSpace AddressSpace) noexcept;
8787
SPIRAddressSpace
8888
getVCGlobalVarAddressSpace(SPIRVStorageClassKind StorageClass) noexcept;
8989

90+
std::string getVCBufferSurfaceName();
91+
std::string getVCBufferSurfaceName(SPIRVAccessQualifierKind Access);
92+
9093
} // namespace VectorComputeUtil
9194

9295
///////////////////////////////////////////////////////////////////////////////
@@ -109,6 +112,10 @@ const static char VCArgumentKind[] = "VCArgumentKind";
109112
const static char VCArgumentDesc[] = "VCArgumentDesc";
110113
} // namespace kVCMetadata
111114

115+
namespace kVCType {
116+
const static char VCBufferSurface[] = "intel.buffer";
117+
}
118+
112119
///////////////////////////////////////////////////////////////////////////////
113120
//
114121
// Map definitions

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVModule.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,8 @@ class SPIRVModuleImpl : public SPIRVModule {
247247
void createForwardPointers() override;
248248
SPIRVType *addSubgroupAvcINTELType(Op) override;
249249
SPIRVTypeVmeImageINTEL *addVmeImageINTELType(SPIRVTypeImage *T) override;
250+
SPIRVTypeBufferSurfaceINTEL *
251+
addBufferSurfaceINTELType(SPIRVAccessQualifierKind Access) override;
250252

251253
// Constant creation functions
252254
SPIRVInstruction *addBranchInst(SPIRVLabel *, SPIRVBasicBlock *) override;
@@ -921,6 +923,11 @@ SPIRVModuleImpl::addVmeImageINTELType(SPIRVTypeImage *T) {
921923
return addType(new SPIRVTypeVmeImageINTEL(this, getId(), T));
922924
}
923925

926+
SPIRVTypeBufferSurfaceINTEL *
927+
SPIRVModuleImpl::addBufferSurfaceINTELType(SPIRVAccessQualifierKind Access) {
928+
return addType(new SPIRVTypeBufferSurfaceINTEL(this, getId(), Access));
929+
}
930+
924931
SPIRVType *SPIRVModuleImpl::addSubgroupAvcINTELType(Op TheOpCode) {
925932
return addType(new SPIRVTypeSubgroupAvcINTEL(TheOpCode, this, getId()));
926933
}

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVModule.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class SPIRVInstTemplateBase;
8989
class SPIRVAsmTargetINTEL;
9090
class SPIRVAsmINTEL;
9191
class SPIRVAsmCallINTEL;
92+
class SPIRVTypeBufferSurfaceINTEL;
9293

9394
typedef SPIRVBasicBlock SPIRVLabel;
9495
struct SPIRVTypeImageDescriptor;
@@ -242,6 +243,8 @@ class SPIRVModule {
242243
virtual SPIRVTypePipe *addPipeType() = 0;
243244
virtual SPIRVType *addSubgroupAvcINTELType(Op) = 0;
244245
virtual SPIRVTypeVmeImageINTEL *addVmeImageINTELType(SPIRVTypeImage *) = 0;
246+
virtual SPIRVTypeBufferSurfaceINTEL *
247+
addBufferSurfaceINTELType(SPIRVAccessQualifierKind Access) = 0;
245248
virtual void createForwardPointers() = 0;
246249

247250
// Constants creation functions

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCode.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,13 @@ inline bool isSubgroupAvcINTELEvaluateOpcode(Op OpCode) {
196196
OC <= OpSubgroupAvcSicEvaluateWithMultiReferenceInterlacedINTEL);
197197
}
198198

199+
inline bool isVCOpCode(Op OpCode) { return OpCode == OpTypeBufferSurfaceINTEL; }
200+
199201
inline bool isTypeOpCode(Op OpCode) {
200202
unsigned OC = OpCode;
201203
return (OpTypeVoid <= OC && OC <= OpTypePipe) || OC == OpTypePipeStorage ||
202-
isSubgroupAvcINTELTypeOpCode(OpCode) || OC == OpTypeVmeImageINTEL;
204+
isSubgroupAvcINTELTypeOpCode(OpCode) || OC == OpTypeVmeImageINTEL ||
205+
isVCOpCode(OpCode);
203206
}
204207

205208
inline bool isSpecConstantOpCode(Op OpCode) {

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVOpCodeEnum.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,3 +529,4 @@ _SPIRV_OP(CrossWorkgroupCastToPtrINTEL, 5938)
529529
_SPIRV_OP(ReadPipeBlockingINTEL, 5946)
530530
_SPIRV_OP(WritePipeBlockingINTEL, 5947)
531531
_SPIRV_OP(FPGARegINTEL, 5949)
532+
_SPIRV_OP(TypeBufferSurfaceINTEL, 6086)

llvm-spirv/lib/SPIRV/libSPIRV/SPIRVType.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,51 @@ bool isType(const T1 *Ty, unsigned Bits = 0) {
829829
return static_cast<const T2 *>(Ty)->getBitWidth() == Bits;
830830
}
831831

832+
class SPIRVTypeBufferSurfaceINTEL : public SPIRVType {
833+
public:
834+
const static Op OC = OpTypeBufferSurfaceINTEL;
835+
const static SPIRVWord FixedWC = 2;
836+
SPIRVTypeBufferSurfaceINTEL(SPIRVModule *M, SPIRVId TheId,
837+
SPIRVAccessQualifierKind TheAccess)
838+
: SPIRVType(M, FixedWC + 1, OC, TheId), AccessKind(TheAccess) {
839+
validate();
840+
}
841+
SPIRVTypeBufferSurfaceINTEL(SPIRVModule *M, SPIRVId TheId)
842+
: SPIRVType(M, FixedWC, OC, TheId) {
843+
validate();
844+
}
845+
SPIRVTypeBufferSurfaceINTEL() : SPIRVType(OC) {}
846+
847+
SPIRVCapVec getRequiredCapability() const override {
848+
return getVec(CapabilityVectorComputeINTEL);
849+
}
850+
851+
llvm::Optional<ExtensionID> getRequiredExtension() const override {
852+
return {ExtensionID::SPV_INTEL_vector_compute};
853+
}
854+
855+
bool hasAccessQualifier() const { return AccessKind.hasValue(); }
856+
SPIRVAccessQualifierKind getAccessQualifier() const {
857+
assert(hasAccessQualifier());
858+
return AccessKind.getValue();
859+
}
860+
861+
protected:
862+
_SPIRV_DEF_ENCDEC2(Id, AccessKind)
863+
void validate() const override {
864+
assert(OpCode == OC);
865+
assert(WordCount == FixedWC + (AccessKind ? 1 : 0));
866+
}
867+
void setWordCount(SPIRVWord TheWC) override {
868+
if (TheWC > FixedWC)
869+
AccessKind = SPIRVAccessQualifierKind::AccessQualifierMax;
870+
WordCount = TheWC;
871+
}
872+
873+
private:
874+
llvm::Optional<SPIRVAccessQualifierKind> AccessKind;
875+
};
876+
832877
// SPV_INTEL_device_side_avc_motion_estimation extension types
833878
class SPIRVTypeVmeImageINTEL : public SPIRVType {
834879
public:

0 commit comments

Comments
 (0)