Skip to content

Commit 83cf0db

Browse files
aratajewigcbot
authored andcommitted
Support KHR SPIRV Friendly IR for SPV_INTEL_media_block_io
This change introduces support for Khronos SPIRV Friendly IR for the following opcodes: -SubgroupImageMediaBlockReadINTEL -SubgroupImageMediaBlockWriteINTEL
1 parent ed71be1 commit 83cf0db

File tree

5 files changed

+80
-69
lines changed

5 files changed

+80
-69
lines changed

IGC/AdaptorOCL/SPIRV/SPIRVInternal.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -470,16 +470,10 @@ _SPIRV_OP(OpJointMatrixMadINTEL)
470470
_SPIRV_OP(OpJointMatrixSUMadINTEL)
471471
_SPIRV_OP(OpJointMatrixUSMadINTEL)
472472
_SPIRV_OP(OpJointMatrixUUMadINTEL)
473-
#undef _SPIRV_OP
474-
475-
#define _SPIRV_OP(x, y) add(Op##y, #x);
476473
// Intel media_block_io builtins
477-
_SPIRV_OP(intel_sub_group_media_block_read, SubgroupImageMediaBlockReadINTEL)
478-
_SPIRV_OP(intel_sub_group_media_block_write, SubgroupImageMediaBlockWriteINTEL)
479-
#undef _SPIRV_OP
480-
474+
_SPIRV_OP(OpSubgroupImageMediaBlockReadINTEL)
475+
_SPIRV_OP(OpSubgroupImageMediaBlockWriteINTEL)
481476
// VME
482-
#define _SPIRV_OP(x) add(x, #x);
483477
_SPIRV_OP(OpVmeImageINTEL)
484478
// Initialization phase functions
485479
_SPIRV_OP(OpSubgroupAvcImeInitializeINTEL)

IGC/AdaptorOCL/SPIRV/SPIRVReader.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4202,7 +4202,9 @@ SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI, BasicBlock *BB) {
42024202
OC != OpImageQuerySamples &&
42034203
OC != OpVmeImageINTEL &&
42044204
OC != OpSampledImage &&
4205-
OC != OpImageSampleExplicitLod);
4205+
OC != OpImageSampleExplicitLod &&
4206+
OC != OpSubgroupImageMediaBlockReadINTEL &&
4207+
OC != OpSubgroupImageMediaBlockWriteINTEL);
42064208

42074209
if (convertImageToI64)
42084210
{
@@ -4281,7 +4283,8 @@ SPIRVToLLVM::transSPIRVBuiltinFromInst(SPIRVInstruction *BI, BasicBlock *BB) {
42814283
OC == OpSubgroupBlockReadINTEL ||
42824284
OC == OpSubgroupImageBlockReadINTEL ||
42834285
OC == OpImageRead ||
4284-
OC == OpImageSampleExplicitLod)
4286+
OC == OpImageSampleExplicitLod ||
4287+
OC == OpSubgroupImageMediaBlockReadINTEL)
42854288
{
42864289
hasReturnTypeInTypeList = true;
42874290
}

IGC/AdaptorOCL/SPIRV/SPIRVUtil.cpp

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -264,51 +264,7 @@ isFunctionBuiltin(llvm::Function* F) {
264264

265265
std::string
266266
getSPIRVBuiltinName(Op OC, SPIRVInstruction *BI, std::vector<Type*> ArgTypes, std::string suffix) {
267-
std::string name = "";
268-
bool hasI32Postfix = false;
269-
270-
if (OC == OpSubgroupImageMediaBlockReadINTEL || OC == OpSubgroupImageMediaBlockWriteINTEL) {
271-
std::stringstream tmpName;
272-
SPIRVType *DataTy = nullptr;
273-
switch (OC) {
274-
case OpSubgroupImageMediaBlockReadINTEL:
275-
tmpName << OCLSPIRVBuiltinMap::map(OC);
276-
DataTy = BI->getType();
277-
hasI32Postfix = true;
278-
break;
279-
case OpSubgroupImageMediaBlockWriteINTEL:
280-
tmpName << OCLSPIRVBuiltinMap::map(OC);
281-
DataTy = (*BI->getOperands().rbegin())->getType();
282-
hasI32Postfix = true;
283-
break;
284-
default:
285-
tmpName << OCLSPIRVBuiltinMap::map(OC);
286-
}
287-
if (DataTy) {
288-
if (DataTy->getBitWidth() == 8) {
289-
tmpName << "_uc";
290-
}
291-
else if (DataTy->getBitWidth() == 16) {
292-
tmpName << "_us";
293-
}
294-
else if (DataTy->getBitWidth() == 32 && hasI32Postfix) {
295-
tmpName << "_ui";
296-
}
297-
else if (DataTy->getBitWidth() == 64) {
298-
tmpName << "_ul";
299-
}
300-
301-
if (DataTy->isTypeVector()) {
302-
if (unsigned ComponentCount = DataTy->getVectorComponentCount())
303-
tmpName << ComponentCount;
304-
}
305-
}
306-
name = tmpName.str();
307-
}
308-
else
309-
{
310-
name = OCLSPIRVBuiltinMap::map(OC);
311-
}
267+
std::string name = OCLSPIRVBuiltinMap::map(OC);
312268

313269
if (!name.empty()) {
314270
name = name + suffix;

IGC/BiFModule/Implementation/group.cl

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,6 +1929,78 @@ DEF_INTEL_SUB_GROUP_BLOCK_WRITE_IMAGE(ulong4, v4i64, __builtin_IB_simd_media_blo
19291929
DEF_INTEL_SUB_GROUP_BLOCK_WRITE_IMAGE(ulong8, v8i64, __builtin_IB_simd_media_block_write_8_l)
19301930
#endif // cl_intel_subgroups_long
19311931

1932+
// OpSubgroupImageMediaBlockReadINTEL
1933+
//
1934+
// Reads a block of data from a 2D region of the specified 'Image'.
1935+
1936+
#define DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(TYPE, TYPE_ABBR) \
1937+
TYPE SPIRV_OVERLOADABLE SPIRV_BUILTIN(SubgroupImageMediaBlockReadINTEL, _##TYPE_ABBR##_img2d_ro_v2i32_i32_i32, _R##TYPE)( \
1938+
global Img2d_ro* image, int2 coord, int width, int height) \
1939+
{ \
1940+
int id = (int)__builtin_astype(image, global void*); \
1941+
return as_##TYPE(__builtin_IB_media_block_read_u##TYPE(id, coord, width, height)); \
1942+
} \
1943+
TYPE SPIRV_OVERLOADABLE SPIRV_BUILTIN(SubgroupImageMediaBlockReadINTEL, _##TYPE_ABBR##_img2d_rw_v2i32_i32_i32, _R##TYPE)( \
1944+
global Img2d_rw* image, int2 coord, int width, int height) \
1945+
{ \
1946+
int id = (int)__builtin_astype(image, global void*); \
1947+
return as_##TYPE(__builtin_IB_media_block_read_u##TYPE(id, coord, width, height)); \
1948+
}
1949+
1950+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(char, i8)
1951+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(char2, v2i8)
1952+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(char4, v4i8)
1953+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(char8, v8i8)
1954+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(char16, v16i8)
1955+
1956+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(short, i16)
1957+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(short2, v2i16)
1958+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(short4, v4i16)
1959+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(short8, v8i16)
1960+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(short16, v16i16)
1961+
1962+
// Integer block reads don't have 16 element version.
1963+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(int, i32)
1964+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(int2, v2i32)
1965+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(int4, v4i32)
1966+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_READ_IMAGE(int8, v8i32)
1967+
1968+
// OpSubgroupImageMediaBlockWriteINTEL
1969+
//
1970+
// Writes a block of data into a 2D region of the specified 'Image'.
1971+
1972+
#define DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(TYPE, TYPE_ABBR) \
1973+
void SPIRV_OVERLOADABLE SPIRV_BUILTIN(SubgroupImageMediaBlockWriteINTEL, _img2d_wo_v2i32_i32_i32_##TYPE_ABBR, )( \
1974+
global Img2d_wo* image, int2 coord, int width, int height, TYPE data) \
1975+
{ \
1976+
int id = (int)__builtin_astype(image, global void*); \
1977+
__builtin_IB_media_block_write_u##TYPE(id, coord, width, height, as_u##TYPE(data)); \
1978+
} \
1979+
void SPIRV_OVERLOADABLE SPIRV_BUILTIN(SubgroupImageMediaBlockWriteINTEL, _img2d_rw_v2i32_i32_i32_##TYPE_ABBR, )( \
1980+
global Img2d_rw* image, int2 coord, int width, int height, TYPE data) \
1981+
{ \
1982+
int id = (int)__builtin_astype(image, global void*); \
1983+
__builtin_IB_media_block_write_u##TYPE(id, coord, width, height, as_u##TYPE(data)); \
1984+
}
1985+
1986+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(char, i8)
1987+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(char2, v2i8)
1988+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(char4, v4i8)
1989+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(char8, v8i8)
1990+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(char16, v16i8)
1991+
1992+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(short, i16)
1993+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(short2, v2i16)
1994+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(short4, v4i16)
1995+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(short8, v8i16)
1996+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(short16, v16i16)
1997+
1998+
// Integer block writes don't have 16 element version.
1999+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(int, i32)
2000+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(int2, v2i32)
2001+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(int4, v4i32)
2002+
DEF_INTEL_SUB_GROUP_MEDIA_BLOCK_WRITE_IMAGE(int8, v8i32)
2003+
19322004
// Ballot Functions
19332005

19342006
uint intel_sub_group_ballot(bool p)

IGC/BiFModule/Languages/OpenCL/IBiF_Sub_Groups.cl

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -528,13 +528,6 @@ TYPE##LEN intel_sub_group_media_block_read_##TYPE_POSTFIX##LEN( \
528528
int id = (int)__builtin_astype(image, global void*); \
529529
return __builtin_IB_media_block_read_##TYPE##LEN( \
530530
id, src_offset, width, height); \
531-
} \
532-
TYPE##LEN __builtin_spirv_intel_sub_group_media_block_read_ \
533-
##TYPE_POSTFIX##LEN##_i64_v2i32_i32_i32( \
534-
ulong image, int2 src_offset, int width, int height) \
535-
{ \
536-
return __builtin_IB_media_block_read_##TYPE##LEN( \
537-
image, src_offset, width, height); \
538531
}
539532

540533
#if SUPPORT_ACCESS_QUAL_OVERLOAD
@@ -565,13 +558,6 @@ void intel_sub_group_media_block_write_##TYPE_POSTFIX##LEN( \
565558
int id = (int)__builtin_astype(image, global void*); \
566559
__builtin_IB_media_block_write_##TYPE##LEN( \
567560
id, src_offset, width, height, pixels); \
568-
} \
569-
void __builtin_spirv_intel_sub_group_media_block_write_ \
570-
##TYPE_POSTFIX##LEN##_i64_v2i32_i32_i32_##TYPE_ABBR( \
571-
ulong image, int2 src_offset, int width, int height, TYPE##LEN pixels) \
572-
{ \
573-
__builtin_IB_media_block_write_##TYPE##LEN( \
574-
image, src_offset, width, height, pixels); \
575561
}
576562

577563
#if SUPPORT_ACCESS_QUAL_OVERLOAD

0 commit comments

Comments
 (0)