Skip to content

Commit 7e85c4e

Browse files
wenju-heigcbot
authored andcommitted
Add SYCL bindless ImageReadLod builtins with integer coord
SYCL fetch_image applied to sampled_image is implemented with these new builtins. Sampler should be ignored. Therefore, builtins are implemented with __builtin_IB_OCL_*d_ld* since __builtin_IB_get_address_mode and __builtin_IB_is_normalized_coords are resolved to 0 for SYCL bindless image. This PR is for SYCL bindless image end2end tests: fetch_1D_USM.cpp, fetch_2D.cpp, fetch_2D_USM.cpp and fetch_3D.cpp in sampled_fetch folder.
1 parent 7aeef7b commit 7e85c4e

File tree

1 file changed

+62
-16
lines changed

1 file changed

+62
-16
lines changed

IGC/BiFModule/Implementation/images.cl

Lines changed: 62 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ __spirv_Sampler __translate_sampler_initializer(uint sampler)
2727
return __builtin_astype((ulong)sampler, __spirv_Sampler);
2828
}
2929

30+
#ifdef __IGC_BUILD__
31+
__attribute__((inline)) float4 __flush_denormals(float4 in)
32+
{
33+
//temporary fix, since SKL+ support denormal values we need to flush those values to zero after LOAD instructions.
34+
//AND r6, r8, 0x807fffff;
35+
//UCMP.eq p0, r6, r8;
36+
//(p0) AND r8, r8, 0x80000000;
37+
int4 floatDenorm = (int4)0x807fffff;
38+
int4 signBit = (int4)0x80000000;
39+
float4 temp = as_float4(as_int4(in) & floatDenorm);
40+
return (as_int4(temp) == as_int4(in)) ? as_float4(as_int4(in) & signBit) : in;
41+
}
42+
#endif
43+
3044
// Image Instructions
3145

3246
// ImageSampleExplicitLod samples an image using an explicit level of detail.
@@ -403,8 +417,18 @@ float4 SPIRV_OVERLOADABLE SPIRV_BUILTIN(ImageSampleExplicitLod, _v4f32_img1d_ro_
403417

404418
float4 SPIRV_OVERLOADABLE SPIRV_BUILTIN(ImageSampleExplicitLod, _v4f32_img1d_ro_i32_i32_f32, _Rfloat4)(__spirv_SampledImage_1D SampledImage, int Coordinate, int ImageOperands, float Lod)
405419
{
406-
float floatCoords = convert_float(Coordinate);
407-
return SPIRV_BUILTIN(ImageSampleExplicitLod, _v4f32_img1d_ro_f32_i32_f32, _Rfloat4)(SampledImage, floatCoords, ImageOperands, Lod);
420+
int image_id = (int)__builtin_IB_get_image(SampledImage);
421+
int sampler_id = (int)__builtin_IB_get_sampler(SampledImage);
422+
if ((__builtin_IB_get_address_mode(sampler_id) & 0x07) == CLK_ADDRESS_CLAMP_TO_EDGE)
423+
{
424+
float floatCoords = convert_float((Coordinate));
425+
return __builtin_IB_OCL_1d_sample_l(image_id, sampler_id, floatCoords, Lod);
426+
}
427+
else
428+
{
429+
float4 res = __builtin_IB_OCL_1d_ld(image_id, Coordinate, 0);
430+
return __flush_denormals(res);
431+
}
408432
}
409433

410434
uint4 OVERLOADABLE __spirv_ImageSampleExplicitLod_Ruint4(__spirv_SampledImage_1D SampledImage, float Coordinate, int ImageOperands, float Lod)
@@ -991,6 +1015,10 @@ float4 SPIRV_OVERLOADABLE SPIRV_BUILTIN(ImageSampleExplicitLod, _v4f32_img2d_arr
9911015

9921016
#define DEF_SYCL_BINDLESS_SAMPLED_IMAGE_EXPLICIT_LOD_S_C_TY(DIM, COORD_DIM, RET_TYPE, LOAD_TYPE) \
9931017
RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate, int ImageOperands, float Lod) \
1018+
{ \
1019+
return convert_##RET_TYPE##4(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod)); \
1020+
} \
1021+
RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands, float Lod) \
9941022
{ \
9951023
return convert_##RET_TYPE##4(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod)); \
9961024
}
@@ -1026,31 +1054,63 @@ RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_S
10261054
{ \
10271055
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(Image, Coordinate, ImageOperands, DefaultLod); \
10281056
} \
1057+
RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands) \
1058+
{ \
1059+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(Image, Coordinate, ImageOperands, DefaultLod); \
1060+
} \
10291061
RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate) \
10301062
{ \
10311063
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(Image, Coordinate, DefaultImageOperands, DefaultLod); \
10321064
} \
1065+
RET_TYPE##4 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate) \
1066+
{ \
1067+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##4(Image, Coordinate, DefaultImageOperands, DefaultLod); \
1068+
} \
10331069
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate, int ImageOperands, float Lod) \
10341070
{ \
10351071
return convert_##RET_TYPE##2(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod).xy); \
10361072
} \
1073+
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands, float Lod) \
1074+
{ \
1075+
return convert_##RET_TYPE##2(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod).xy); \
1076+
} \
10371077
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate, int ImageOperands) \
10381078
{ \
10391079
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(Image, Coordinate, ImageOperands, DefaultLod); \
10401080
} \
1081+
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands) \
1082+
{ \
1083+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(Image, Coordinate, ImageOperands, DefaultLod); \
1084+
} \
10411085
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate) \
10421086
{ \
10431087
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(Image, Coordinate, DefaultImageOperands, DefaultLod); \
10441088
} \
1089+
RET_TYPE##2 OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate) \
1090+
{ \
1091+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE##2(Image, Coordinate, DefaultImageOperands, DefaultLod); \
1092+
} \
10451093
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate, int ImageOperands, float Lod) \
10461094
{ \
10471095
return convert_##RET_TYPE(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod).x); \
10481096
} \
1097+
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands, float Lod) \
1098+
{ \
1099+
return convert_##RET_TYPE(__spirv_ImageSampleExplicitLod_R##LOAD_TYPE(Image, Coordinate, ImageOperands, Lod).x); \
1100+
} \
10491101
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate, int ImageOperands) \
10501102
{ \
10511103
return __spirv_ImageSampleExplicitLod_R##RET_TYPE(Image, Coordinate, ImageOperands, DefaultLod); \
10521104
} \
1105+
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate, int ImageOperands) \
1106+
{ \
1107+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE(Image, Coordinate, ImageOperands, DefaultLod); \
1108+
} \
10531109
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, float##COORD_DIM Coordinate) \
1110+
{ \
1111+
return __spirv_ImageSampleExplicitLod_R##RET_TYPE(Image, Coordinate, DefaultImageOperands, DefaultLod); \
1112+
} \
1113+
RET_TYPE OVERLOADABLE __spirv_ImageSampleExplicitLod_R##RET_TYPE(__spirv_SampledImage_##DIM##D Image, int##COORD_DIM Coordinate) \
10541114
{ \
10551115
return __spirv_ImageSampleExplicitLod_R##RET_TYPE(Image, Coordinate, DefaultImageOperands, DefaultLod); \
10561116
}
@@ -1110,20 +1170,6 @@ DEF_SYCL_BINDLESS_SAMPLED_IMAGE_EXPLICIT_LOD_DX_DY_HALF(1, )
11101170

11111171
// Image Read
11121172

1113-
#ifdef __IGC_BUILD__
1114-
__attribute__((inline)) float4 __flush_denormals(float4 in)
1115-
{
1116-
//temporary fix, since SKL+ support denormal values we need to flush those values to zero after LOAD instructions.
1117-
//AND r6, r8, 0x807fffff;
1118-
//UCMP.eq p0, r6, r8;
1119-
//(p0) AND r8, r8, 0x80000000;
1120-
int4 floatDenorm = (int4)0x807fffff;
1121-
int4 signBit = (int4)0x80000000;
1122-
float4 temp = as_float4(as_int4(in) & floatDenorm);
1123-
return (as_int4(temp) == as_int4(in)) ? as_float4(as_int4(in) & signBit) : in;
1124-
}
1125-
#endif
1126-
11271173
#define DEF_IMAGE_READ_2D(ACC_QUAL) \
11281174
uint4 OVERLOADABLE __spirv_ImageRead_Ruint4(global Img2d_##ACC_QUAL* Image, int2 Coordinate) \
11291175
{ \

0 commit comments

Comments
 (0)