// 2D & 1D Array read
OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, float u, float v, uint sampler_offset);
-OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, float u, int i, uint sampler_offset);
OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, int u, int v, uint sampler_offset);
OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, float u, float v, uint sampler_offset);
-OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, float u, int i, uint sampler_offset);
OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, int u, int v, uint sampler_offset);
OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, float u, float v, uint sampler_offset);
-OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, float u, int i, uint sampler_offset);
OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, int u, int v, uint sampler_offset);
// 3D & 2D Array read
OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, float u, float v, float w, uint sampler_offset);
-OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, float u, float v, int i, uint sampler_offset);
OVERLOADABLE int4 __gen_ocl_read_imagei(uint surface_id, sampler_t sampler, int u, int v, int w, uint sampler_offset);
OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, float u, float v, float w, uint sampler_offset);
-OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, float u, float v, int i, uint sampler_offset);
OVERLOADABLE uint4 __gen_ocl_read_imageui(uint surface_id, sampler_t sampler, int u, int v, int w, uint sampler_offset);
OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, float u, float v, float w, uint sampler_offset);
-OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, float u, float v, int i, uint sampler_offset);
OVERLOADABLE float4 __gen_ocl_read_imagef(uint surface_id, sampler_t sampler, int u, int v, int w, uint sampler_offset);
// 1D write
int __gen_ocl_get_image_channel_data_type(uint surface_id);
int __gen_ocl_get_image_channel_order(uint surface_id);
int __gen_ocl_get_image_depth(uint surface_id);
+/* The printf function. */
+int __gen_ocl_printf_stub(const char * format, ...);
+/* The printf function. */
+/* From LLVM 3.5, c string are all in constant address space */
+#if 100*__clang_major__ + __clang_minor__ < 305
+int __gen_ocl_printf_stub(const char * format, ...);
+#else
+int __gen_ocl_printf_stub(constant char * format, ...);
+#endif
+#define printf __gen_ocl_printf_stub
// 2D 3D Image Common Macro
#ifdef GEN7_SAMPLER_CLAMP_BORDER_WORKAROUND
#define GET_IMAGE(cl_image, surface_id) \
uint surface_id = (uint)cl_image
+INLINE_OVERLOADABLE float __gen_compute_array_index(const float index, image1d_array_t image)
+{
+ GET_IMAGE(image, surface_id);
+ float array_size = __gen_ocl_get_image_depth(surface_id);
+ return clamp(rint(index), 0.f, array_size - 1.f);
+}
+
+INLINE_OVERLOADABLE float __gen_compute_array_index(float index, image2d_array_t image)
+{
+ GET_IMAGE(image, surface_id);
+ float array_size = __gen_ocl_get_image_depth(surface_id);
+ return clamp(rint(index), 0.f, array_size - 1.f);
+}
+
+INLINE_OVERLOADABLE int __gen_compute_array_index(int index, image1d_array_t image)
+{
+ GET_IMAGE(image, surface_id);
+ int array_size = __gen_ocl_get_image_depth(surface_id);
+ return clamp(index, 0, array_size - 1);
+}
+
+INLINE_OVERLOADABLE int __gen_compute_array_index(int index, image2d_array_t image)
+{
+ GET_IMAGE(image, surface_id);
+ int array_size = __gen_ocl_get_image_depth(surface_id);
+ return clamp(index, 0, array_size - 1);
+}
-#define DECL_READ_IMAGE0(int_clamping_fix, \
+#define DECL_READ_IMAGE0(int_clamping_fix, \
image_type, type, suffix, coord_type, n) \
INLINE_OVERLOADABLE type read_image ##suffix(image_type cl_image, \
const sampler_t sampler, \
coord_type coord) \
{ \
GET_IMAGE(cl_image, surface_id); \
+ GET_IMAGE_ARRAY_SIZE(cl_image, coord, int, ai); \
if (int_clamping_fix && \
((sampler & __CLK_ADDRESS_MASK) == CLK_ADDRESS_CLAMP) && \
((sampler & __CLK_FILTER_MASK) == CLK_FILTER_NEAREST)) \
return __gen_ocl_read_image ##suffix( \
- EXPEND_READ_COORD(surface_id, sampler, coord), 1); \
+ EXPEND_READ_COORD(surface_id, sampler, coord)); \
return __gen_ocl_read_image ##suffix( \
- EXPEND_READ_COORD(surface_id, sampler, (float)coord), 0);\
+ EXPEND_READ_COORDF(surface_id, sampler, coord), 0); \
}
#define DECL_READ_IMAGE1(float_coord_rounding_fix, int_clamping_fix, \
coord_type coord) \
{ \
GET_IMAGE(cl_image, surface_id); \
+ GET_IMAGE_ARRAY_SIZE(cl_image, coord, float, ai) \
coord_type tmpCoord = coord; \
if (float_coord_rounding_fix | int_clamping_fix) { \
if (((sampler & __CLK_ADDRESS_MASK) == CLK_ADDRESS_CLAMP) \
} else \
intCoord = tmpCoord; \
return __gen_ocl_read_image ##suffix( \
- EXPEND_READ_COORD1(surface_id, sampler, intCoord), 1);\
+ EXPEND_READ_COORDI(surface_id, sampler, intCoord));\
} \
} \
} \
return __gen_ocl_read_image ##suffix( \
- EXPEND_READ_COORD(surface_id, sampler, tmpCoord), 0);\
+ EXPEND_READ_COORDF(surface_id, sampler, tmpCoord), 0);\
}
#define DECL_READ_IMAGE_NOSAMPLER(image_type, type, suffix, coord_type, n) \
coord_type coord) \
{ \
GET_IMAGE(cl_image, surface_id); \
+ GET_IMAGE_ARRAY_SIZE(cl_image, coord, int, ai) \
return __gen_ocl_read_image ##suffix( \
- EXPEND_READ_COORD(surface_id, \
+ EXPEND_READ_COORDF(surface_id, \
CLK_NORMALIZED_COORDS_FALSE \
| CLK_ADDRESS_NONE \
- | CLK_FILTER_NEAREST, (float)coord), 0); \
+ | CLK_FILTER_NEAREST, (float)coord), 0); \
}
#define DECL_WRITE_IMAGE(image_type, type, suffix, coord_type) \
DECL_WRITE_IMAGE(image_type, type, suffix, int) \
DECL_WRITE_IMAGE(image_type, type, suffix, float)
-#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord
-#define EXPEND_READ_COORD1(id, sampler, coord) id, sampler, (int)(coord < 0 ? -1 : coord)
+#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord, 1
+#define EXPEND_READ_COORDF(id, sampler, coord) id, sampler, (float)coord
+#define EXPEND_READ_COORDI(id, sampler, coord) id, sampler, (int)(coord < 0 ? -1 : coord), 1
#define DENORMALIZE_COORD(id, dstCoord, srcCoord) dstCoord = srcCoord * __gen_ocl_get_image_width(id);
#define EXPEND_WRITE_COORD(id, coord, color) id, coord, color
-
-#define OUT_OF_BOX(coord, surface, normalized) \
- (coord < 0 || \
- ((normalized == 0) \
- && (coord >= __gen_ocl_get_image_width(surface))) \
- || ((normalized != 0) && (coord > 0x1p0)))
+#define GET_IMAGE_ARRAY_SIZE(a,b,c,d)
#define FIXUP_FLOAT_COORD(tmpCoord) \
{ \
DECL_IMAGE_INFO_COMMON(image1d_t)
#undef EXPEND_READ_COORD
-#undef EXPEND_READ_COORD1
+#undef EXPEND_READ_COORDF
+#undef EXPEND_READ_COORDI
#undef DENORMALIZE_COORD
#undef EXPEND_WRITE_COORD
-#undef OUT_OF_BOX
#undef FIXUP_FLOAT_COORD
#undef DECL_IMAGE
// End of 1D
DECL_WRITE_IMAGE(image_type, type, suffix, int ## n) \
DECL_WRITE_IMAGE(image_type, type, suffix, float ## n)
// 2D
-#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, coord.s1
-#define EXPEND_READ_COORD1(id, sampler, coord) id, sampler, (int)(coord.s0 < 0 ? -1 : coord.s0), \
- (int)(coord.s1 < 0 ? -1 : coord.s1)
+#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, coord.s1, 1
+#define EXPEND_READ_COORDF(id, sampler, coord) id, sampler, (float)coord.s0, (float)coord.s1
+#define EXPEND_READ_COORDI(id, sampler, coord) id, sampler, (int)(coord.s0 < 0 ? -1 : coord.s0), \
+ (int)(coord.s1 < 0 ? -1 : coord.s1), 1
#define DENORMALIZE_COORD(id, dstCoord, srcCoord) dstCoord.x = srcCoord.x * __gen_ocl_get_image_width(id); \
dstCoord.y = srcCoord.y * __gen_ocl_get_image_height(id);
#define EXPEND_WRITE_COORD(id, coord, color) id, coord.s0, coord.s1, color
-#define OUT_OF_BOX(coord, surface, normalized) \
- (coord.s0 < 0 || coord.s1 < 0 || \
- ((normalized == 0) \
- && (coord.s0 >= __gen_ocl_get_image_width(surface) \
- || coord.s1 >= __gen_ocl_get_image_height(surface))) \
- || ((normalized != 0) && (coord.s0 > 0x1p0 || coord.s1 > 0x1p0)))
-
#define FIXUP_FLOAT_COORD(tmpCoord) \
{ \
if (tmpCoord.s0 < 0 && tmpCoord.s0 > -0x1p-20f) \
DECL_IMAGE(0, image2d_t, float4, f, 2)
// 1D Array
+#undef GET_IMAGE_ARRAY_SIZE
+#undef EXPEND_READ_COORD
+#undef EXPEND_READ_COORDF
+#undef EXPEND_READ_COORDI
+#undef DENORMALIZE_COORD
+#undef EXPEND_WRITE_COORD
+#undef FIXUP_FLOAT_COORD
+
+#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, (int)0, ai, 2
+#define EXPEND_READ_COORDF(id, sampler, coord) id, sampler, (float)coord.s0, (float)ai
+#define EXPEND_READ_COORDI(id, sampler, coord) id, sampler, (int)(coord.s0 < 0 ? -1 : coord.s0), 0, (int)ai, 2
+#define DENORMALIZE_COORD(id, dstCoord, srcCoord) dstCoord.x = srcCoord.x * __gen_ocl_get_image_width(id);
+#define EXPEND_WRITE_COORD(id, coord, color) id, coord.s0, __gen_compute_array_index(coord.s1, cl_image), color
+#define GET_IMAGE_ARRAY_SIZE(image, coord, coord_type, ai) \
+ coord_type ai = __gen_compute_array_index(coord.s1, image);
+
+#define FIXUP_FLOAT_COORD(tmpCoord) \
+ { \
+ if (tmpCoord.s0 < 0 && tmpCoord.s0 > -0x1p-20f) \
+ tmpCoord.s0 += -0x1p-9; \
+ }
+
DECL_IMAGE(GEN_FIX_1, image1d_array_t, int4, i, 2)
DECL_IMAGE(GEN_FIX_1, image1d_array_t, uint4, ui, 2)
DECL_IMAGE(0, image1d_array_t, float4, f, 2)
}
#undef EXPEND_READ_COORD
-#undef EXPEND_READ_COORD1
+#undef EXPEND_READ_COORDI
+#undef EXPEND_READ_COORDF
#undef DENORMALIZE_COORD
#undef EXPEND_WRITE_COORD
-#undef OUT_OF_BOX
#undef FIXUP_FLOAT_COORD
+#undef GET_IMAGE_ARRAY_SIZE
// End of 2D and 1D Array
// 3D
-#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, coord.s1, coord.s2
-#define EXPEND_READ_COORD1(id, sampler, coord) id, sampler, (int) (coord.s0 < 0 ? -1 : coord.s0), \
- (int)(coord.s1 < 0 ? -1 : coord.s1), (int)(coord.s2 < 0 ? -1 : coord.s2)
+#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, coord.s1, coord.s2, 1
+#define EXPEND_READ_COORDF(id, sampler, coord) id, sampler, (float)coord.s0, (float)coord.s1, (float)coord.s2
+#define EXPEND_READ_COORDI(id, sampler, coord) id, sampler, (int) (coord.s0 < 0 ? -1 : coord.s0), \
+ (int)(coord.s1 < 0 ? -1 : coord.s1), (int)(coord.s2 < 0 ? -1 : coord.s2), 1
#define DENORMALIZE_COORD(id, dstCoord, srcCoord) dstCoord.x = srcCoord.x * __gen_ocl_get_image_width(id); \
dstCoord.y = srcCoord.y * __gen_ocl_get_image_height(id); \
dstCoord.z = srcCoord.z * __gen_ocl_get_image_depth(id);
#define EXPEND_WRITE_COORD(id, coord, color) id, coord.s0, coord.s1, coord.s2, color
-#define OUT_OF_BOX(coord, surface, normalized) \
- (coord.s0 < 0 || coord.s1 < 0 || coord.s2 < 0 || \
- ((normalized == 0) \
- && (coord.s0 >= __gen_ocl_get_image_width(surface) \
- || coord.s1 >= __gen_ocl_get_image_height(surface) \
- || coord.s2 >= __gen_ocl_get_image_depth(surface))) \
- || ((normalized != 0) \
- &&(coord.s0 > 1 || coord.s1 > 1 || coord.s2 > 1)))
#define FIXUP_FLOAT_COORD(tmpCoord) \
{ \
if (tmpCoord.s2 < 0 && tmpCoord.s2 > -0x1p-20) \
tmpCoord.s2 += -0x1p-9; \
}
+#define GET_IMAGE_ARRAY_SIZE(a,b,c,d)
DECL_IMAGE(GEN_FIX_1, image3d_t, int4, i, 4)
DECL_IMAGE(GEN_FIX_1, image3d_t, uint4, ui, 4)
DECL_IMAGE(GEN_FIX_1, image3d_t, uint4, ui, 3)
DECL_IMAGE(0, image3d_t, float4, f, 3)
+#undef EXPEND_READ_COORD
+#undef EXPEND_READ_COORDF
+#undef EXPEND_READ_COORDI
+#undef DENORMALIZE_COORD
+#undef EXPEND_WRITE_COORD
+#undef FIXUP_FLOAT_COORD
+#undef GET_IMAGE_ARRAY_SIZE
+
+#define EXPEND_READ_COORD(id, sampler, coord) id, sampler, coord.s0, coord.s1, ai, 1
+#define EXPEND_READ_COORDF(id, sampler, coord) id, sampler, (float)coord.s0, (float)coord.s1, (float)ai
+#define EXPEND_READ_COORDI(id, sampler, coord) id, sampler, (int) (coord.s0 < 0 ? -1 : coord.s0), \
+ (int)(coord.s1 < 0 ? -1 : coord.s1), (int)ai, 1
+#define DENORMALIZE_COORD(id, dstCoord, srcCoord) dstCoord.x = srcCoord.x * __gen_ocl_get_image_width(id); \
+ dstCoord.y = srcCoord.y * __gen_ocl_get_image_height(id);
+#define EXPEND_WRITE_COORD(id, coord, color) id, coord.s0, coord.s1, __gen_compute_array_index(coord.s2, cl_image), color
+
+#define FIXUP_FLOAT_COORD(tmpCoord) \
+ { \
+ if (tmpCoord.s0 < 0 && tmpCoord.s0 > -0x1p-20) \
+ tmpCoord.s0 += -0x1p-9; \
+ if (tmpCoord.s1 < 0 && tmpCoord.s1 > -0x1p-20) \
+ tmpCoord.s1 += -0x1p-9; \
+ }
+#define GET_IMAGE_ARRAY_SIZE(image, coord, coord_type, ai) \
+ coord_type ai = __gen_compute_array_index(coord.s2, image);
+
// 2D Array
DECL_IMAGE(GEN_FIX_1, image2d_array_t, int4, i, 4)
DECL_IMAGE(GEN_FIX_1, image2d_array_t, uint4, ui, 4)
}
#undef EXPEND_READ_COORD
-#undef EXPEND_READ_COORD1
+#undef EXPEND_READ_COORDF
+#undef EXPEND_READ_COORDI
#undef DENORMALIZE_COORD
#undef EXPEND_WRITE_COORD
-#undef OUT_OF_BOX
#undef FIXUP_FLOAT_COORD
+#undef GET_IMAGE_ARRAY_SIZE
// End of 3D and 2D Array
#undef DECL_IMAGE
#undef OVERLOADABLE
#undef INLINE
-/* The printf function. */
-/* From LLVM 3.5, c string are all in constant address space */
-#if 100*__clang_major__ + __clang_minor__ < 305
-int __gen_ocl_printf_stub(const char * format, ...);
-#else
-int __gen_ocl_printf_stub(constant char * format, ...);
-#endif
-#define printf __gen_ocl_printf_stub
-
#endif /* __GEN_OCL_STDLIB_H__ */