Skip to content

[SYCL][Ext][Bindless] Initial implementation of image spirv builtins on HIP #16439

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Feb 6, 2025
3 changes: 3 additions & 0 deletions libclc/libspirv/lib/amdgcn-amdhsa/SOURCES
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ atomic/atomic_sub.cl
atomic/atomic_store.cl
conversion/GenericCastToPtrExplicit.cl
synchronization/barrier.cl
images/image_common.cl
images/image.cl
images/image_array.cl
math/acos.cl
math/acosh.cl
math/asin.cl
Expand Down
531 changes: 531 additions & 0 deletions libclc/libspirv/lib/amdgcn-amdhsa/images/image.cl

Large diffs are not rendered by default.

525 changes: 525 additions & 0 deletions libclc/libspirv/lib/amdgcn-amdhsa/images/image_array.cl

Large diffs are not rendered by default.

159 changes: 159 additions & 0 deletions libclc/libspirv/lib/amdgcn-amdhsa/images/image_common.cl
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
#include "image_common.h"

#ifdef cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
#endif

// From
// https://github.com/ROCm/clr/tree/amd-staging/hipamd/include/hip/amd_detail/texture_fetch_functions.h
_CLC_CONST_AS const unsigned int SAMPLER_OBJECT_OFFSET_DWORD = 12;

// Using the builtin as_type() and as_typen() functions to reinterpret types.
// The restriction being is that element "type"s need to be of the same size.
#define _CLC_DEFINE_BUILTIN_CAST_VEC4_TO_VEC3(vec4_elem_t, to_t) \
_CLC_DEF to_t##3 __clc_cast_from_##vec4_elem_t##4_to_##to_t##3( \
vec4_elem_t##4 from) { \
vec4_elem_t##3 casted = as_##vec4_elem_t##3(from); \
return as_##to_t##3(casted); \
}
#define _CLC_DEFINE_BUILTIN_CAST_VEC4_TO_VEC2(vec4_elem_t, to_t) \
_CLC_DEF to_t##2 __clc_cast_from_##vec4_elem_t##4_to_##to_t##2( \
vec4_elem_t##4 from) { \
vec4_elem_t##4 casted = as_##vec4_elem_t##4(from); \
return as_##to_t##2((vec4_elem_t##2)(casted.x, casted.y)); \
}
#define _CLC_DEFINE_BUILTIN_CAST_VEC4_TO_SCALAR(vec4_elem_t, to_t) \
_CLC_DEF to_t __clc_cast_from_##vec4_elem_t##4_to_##to_t( \
vec4_elem_t##4 from) { \
vec4_elem_t##4 casted = as_##vec4_elem_t##4(from); \
return as_##to_t(casted.x); \
}
#define _CLC_DEFINE_BUILTIN_CAST_VEC3_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##3_to_##vec4_elem_t##4( \
from_t##3 from) { \
vec4_elem_t##3 casted = as_##vec4_elem_t##3(from); \
return as_##vec4_elem_t##4(casted); \
}
#define _CLC_DEFINE_BUILTIN_CAST_VEC2_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##2_to_##vec4_elem_t##4( \
from_t##2 from) { \
vec4_elem_t##2 casted = as_##vec4_elem_t##2(from); \
return (vec4_elem_t##4)(casted.x, casted.y, 0, 0); \
}
#define _CLC_DEFINE_BUILTIN_CAST_SCALAR_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##_to_##vec4_elem_t##4( \
from_t from) { \
vec4_elem_t casted = as_##vec4_elem_t(from); \
return (vec4_elem_t##4)(casted, 0, 0, 0); \
}

// Generic casts between builtin types.
#define _CLC_DEFINE_CAST_VEC4(vec4_elem_t, to_t) \
_CLC_DEF to_t##4 __clc_cast_from_##vec4_elem_t##4_to_##to_t##4( \
vec4_elem_t##4 from) { \
return (to_t##4)(from.x, from.y, from.z, from.w); \
}
#define _CLC_DEFINE_CAST_VEC4_TO_VEC3(vec4_elem_t, to_t) \
_CLC_DEF to_t##3 __clc_cast_from_##vec4_elem_t##4_to_##to_t##3( \
vec4_elem_t##4 from) { \
return (to_t##3)(from.x, from.y, from.z); \
}
#define _CLC_DEFINE_CAST_VEC4_TO_VEC2(vec4_elem_t, to_t) \
_CLC_DEF to_t##2 __clc_cast_from_##vec4_elem_t##4_to_##to_t##2( \
vec4_elem_t##4 from) { \
return (to_t##2)(from.x, from.y); \
}
#define _CLC_DEFINE_CAST_VEC4_TO_SCALAR(vec4_elem_t, to_t) \
_CLC_DEF to_t __clc_cast_from_##vec4_elem_t##4_to_##to_t( \
vec4_elem_t##4 from) { \
return (to_t)from.x; \
}
#define _CLC_DEFINE_CAST_VEC3_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##3_to_##vec4_elem_t##4( \
from_t##3 from) { \
return (vec4_elem_t##4)(from.x, from.y, from.z, 0); \
}
#define _CLC_DEFINE_CAST_VEC2_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##2_to_##vec4_elem_t##4( \
from_t##2 from) { \
return (vec4_elem_t##4)(from.x, from.y, 0, 0); \
}
#define _CLC_DEFINE_CAST_SCALAR_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DEF vec4_elem_t##4 __clc_cast_from_##from_t##_to_##vec4_elem_t##4( \
from_t from) { \
return (vec4_elem_t##4)(from, 0, 0, 0); \
}

// Helpers to extract N channel(s) from a four-channel (RGBA/XYZW) color type.

#define _CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(from_t, to_t) \
_CLC_DEFINE_CAST_VEC4(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_VEC4_TO_VEC3(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_VEC4_TO_VEC2(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_VEC4_TO_SCALAR(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_VEC2_TO_VEC4(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_VEC3_TO_VEC4(from_t, to_t) \
_CLC_DEFINE_BUILTIN_CAST_SCALAR_TO_VEC4(from_t, to_t)

#define _CLC_DEFINE_EXTRACT_COLOR_HELPERS(from_t, to_t) \
_CLC_DEFINE_CAST_VEC4(from_t, to_t) \
_CLC_DEFINE_CAST_VEC4_TO_VEC3(from_t, to_t) \
_CLC_DEFINE_CAST_VEC4_TO_VEC2(from_t, to_t) \
_CLC_DEFINE_CAST_VEC4_TO_SCALAR(from_t, to_t) \
_CLC_DEFINE_CAST_VEC2_TO_VEC4(from_t, to_t) \
_CLC_DEFINE_CAST_VEC3_TO_VEC4(from_t, to_t) \
_CLC_DEFINE_CAST_SCALAR_TO_VEC4(from_t, to_t)

// Define casts between supported builtin types for image color

_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, float)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, int)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(int, float)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, uint)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(uint, float)
#ifdef cl_khr_fp16
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, half)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, short)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(short, half)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, ushort)
_CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS(ushort, half)
#endif

_CLC_DEFINE_EXTRACT_COLOR_HELPERS(float, short)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(short, float)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(float, ushort)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(ushort, float)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(float, char)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(char, float)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(float, uchar)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(uchar, float)
#ifdef cl_khr_fp16
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(float, half)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(half, float)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(half, int)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(int, half)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(half, uint)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(uint, half)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(half, char)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(char, half)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(half, uchar)
_CLC_DEFINE_EXTRACT_COLOR_HELPERS(uchar, half)
#endif

#undef _CLC_DEFINE_EXTRACT_COLOR_HELPERS
#undef _CLC_DEFINE_EXTRACT_SAME_SIZE_COLOR_HELPERS

#undef _CLC_DEFINE_CAST_SCALAR_TO_VEC4
#undef _CLC_DEFINE_CAST_VEC2_TO_VEC4
#undef _CLC_DEFINE_CAST_VEC3_TO_VEC4
#undef _CLC_DEFINE_CAST_VEC4_TO_SCALAR
#undef _CLC_DEFINE_CAST_VEC4_TO_VEC3
#undef _CLC_DEFINE_CAST_VEC4_TO_VEC2
#undef _CLC_DEFINE_CAST_VEC4
#undef _CLC_DEFINE_BUILTIN_CAST_SCALAR_TO_VEC4
#undef _CLC_DEFINE_BUILTIN_CAST_VEC2_TO_VEC4
#undef _CLC_DEFINE_BUILTIN_VEC3_TO_VEC4
#undef _CLC_DEFINE_BUILTIN_VEC4_TO_SCALAR
#undef _CLC_DEFINE_BUILTIN_VEC4_TO_VEC3
#undef _CLC_DEFINE_BUILTIN_VEC4_TO_VEC2
#undef _CLC_DEFINE_BUILTIN_VEC4
164 changes: 164 additions & 0 deletions libclc/libspirv/lib/amdgcn-amdhsa/images/image_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
#ifndef CLC_SPIRV_IMAGE_COMMON
#define CLC_SPIRV_IMAGE_COMMON

#include <clc/clc.h>

#ifdef cl_khr_fp16
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
#endif

#ifdef _WIN32
#define _CLC_MANGLE_FUNC_IMG_HANDLE(namelength, name, prefix, postfix) \
_Z##namelength##name##prefix##y##postfix
#else
#define _CLC_MANGLE_FUNC_IMG_HANDLE(namelength, name, prefix, postfix) \
_Z##namelength##name##prefix##m##postfix
#endif

// The ockl functions/builtins we link against from the ROCm device libs expect
// resources to reside in constant address space.
#if __clang_major__ >= 8
#define _CLC_CONST_AS __constant
#elif __clang_major__ >= 7
#define _CLC_CONST_AS __attribute__((address_space(4)))
#else
#define _CLC_CONST_AS __attribute__((address_space(2)))
#endif

// From
// https://github.com/ROCm/clr/tree/amd-staging/hipamd/include/hip/amd_detail/texture_fetch_functions.h
// defined in "image_common.cl"
extern _CLC_CONST_AS const unsigned int SAMPLER_OBJECT_OFFSET_DWORD;

// Helpers for casting between two builtin vector types and/or scalar types.

// Using the builtin as_type() and as_typen() functions to reinterpret types.
// The restriction being is that element "type"s need to be of the same size.
#define _CLC_DECLARE_BUILTIN_CAST_VEC4_TO_VEC3(vec4_elem_t, to_t) \
_CLC_DECL to_t##3 __clc_cast_from_##vec4_elem_t##4_to_##to_t##3( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_BUILTIN_CAST_VEC4_TO_VEC2(vec4_elem_t, to_t) \
_CLC_DECL to_t##2 __clc_cast_from_##vec4_elem_t##4_to_##to_t##2( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_BUILTIN_CAST_VEC4_TO_SCALAR(vec4_elem_t, to_t) \
_CLC_DECL to_t __clc_cast_from_##vec4_elem_t##4_to_##to_t( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_BUILTIN_CAST_VEC3_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##3_to_##vec4_elem_t##4( \
from_t##3 from);

#define _CLC_DECLARE_BUILTIN_CAST_VEC2_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##2_to_##vec4_elem_t##4( \
from_t##2 from);

#define _CLC_DECLARE_BUILTIN_CAST_SCALAR_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##_to_##vec4_elem_t##4( \
from_t from);

// Generic casts between builtin types.
#define _CLC_DECLARE_CAST_VEC4(vec4_elem_t, to_t) \
_CLC_DECL to_t##4 __clc_cast_from_##vec4_elem_t##4_to_##to_t##4( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_CAST_VEC4_TO_VEC3(vec4_elem_t, to_t) \
_CLC_DECL to_t##3 __clc_cast_from_##vec4_elem_t##4_to_##to_t##3( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_CAST_VEC4_TO_VEC2(vec4_elem_t, to_t) \
_CLC_DECL to_t##2 __clc_cast_from_##vec4_elem_t##4_to_##to_t##2( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_CAST_VEC4_TO_SCALAR(vec4_elem_t, to_t) \
_CLC_DECL to_t __clc_cast_from_##vec4_elem_t##4_to_##to_t( \
vec4_elem_t##4 from);

#define _CLC_DECLARE_CAST_VEC3_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##3_to_##vec4_elem_t##4( \
from_t##3 from);

#define _CLC_DECLARE_CAST_VEC2_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##2_to_##vec4_elem_t##4( \
from_t##2 from);

#define _CLC_DECLARE_CAST_SCALAR_TO_VEC4(from_t, vec4_elem_t) \
_CLC_DECL vec4_elem_t##4 __clc_cast_from_##from_t##_to_##vec4_elem_t##4( \
from_t from);

// Helpers to extract N channel(s) from a four-channel (RGBA/XYZW) color type.

#define _CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(from_t, to_t) \
_CLC_DECLARE_CAST_VEC4(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_VEC4_TO_VEC3(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_VEC4_TO_VEC2(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_VEC4_TO_SCALAR(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_VEC2_TO_VEC4(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_VEC3_TO_VEC4(from_t, to_t) \
_CLC_DECLARE_BUILTIN_CAST_SCALAR_TO_VEC4(from_t, to_t)

#define _CLC_DECLARE_EXTRACT_COLOR_HELPERS(from_t, to_t) \
_CLC_DECLARE_CAST_VEC4(from_t, to_t) \
_CLC_DECLARE_CAST_VEC4_TO_VEC3(from_t, to_t) \
_CLC_DECLARE_CAST_VEC4_TO_VEC2(from_t, to_t) \
_CLC_DECLARE_CAST_VEC4_TO_SCALAR(from_t, to_t) \
_CLC_DECLARE_CAST_VEC2_TO_VEC4(from_t, to_t) \
_CLC_DECLARE_CAST_VEC3_TO_VEC4(from_t, to_t) \
_CLC_DECLARE_CAST_SCALAR_TO_VEC4(from_t, to_t)

// Define casts between supported builtin types for image color

_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, float)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, int)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(int, float)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(float, uint)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(uint, float)
#ifdef cl_khr_fp16
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, half)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, short)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(short, half)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(half, ushort)
_CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS(ushort, half)
#endif

_CLC_DECLARE_EXTRACT_COLOR_HELPERS(half, float)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(float, short)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(short, float)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(float, ushort)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(ushort, float)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(float, char)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(char, float)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(float, uchar)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(uchar, float)
#ifdef cl_khr_fp16
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(float, half)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(half, int)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(int, half)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(half, uint)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(uint, half)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(half, char)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(char, half)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(half, uchar)
_CLC_DECLARE_EXTRACT_COLOR_HELPERS(uchar, half)
#endif

#undef _CLC_DECLARE_EXTRACT_COLOR_HELPERS
#undef _CLC_DECLARE_EXTRACT_SAME_SIZE_COLOR_HELPERS

#undef _CLC_DECLARE_CAST_SCALAR_TO_VEC4
#undef _CLC_DECLARE_CAST_VEC2_TO_VEC4
#undef _CLC_DECLARE_CAST_VEC3_TO_VEC4
#undef _CLC_DECLARE_CAST_VEC4_TO_SCALAR
#undef _CLC_DECLARE_CAST_VEC4_TO_VEC3
#undef _CLC_DECLARE_CAST_VEC4_TO_VEC2
#undef _CLC_DECLARE_CAST_VEC4
#undef _CLC_DECLARE_BUILTIN_CAST_SCALAR_TO_VEC4
#undef _CLC_DECLARE_BUILTIN_CAST_VEC2_TO_VEC4
#undef _CLC_DECLARE_BUILTIN_VEC3_TO_VEC4
#undef _CLC_DECLARE_BUILTIN_VEC4_TO_SCALAR
#undef _CLC_DECLARE_BUILTIN_VEC4_TO_VEC3
#undef _CLC_DECLARE_BUILTIN_VEC4_TO_VEC2
#undef _CLC_DECLARE_BUILTIN_VEC4

#endif // CLC_SPIRV_IMAGE_COMMON
12 changes: 6 additions & 6 deletions sycl/cmake/modules/UnifiedRuntimeTag.cmake
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# commit 87d4a32666f2950e7cfa016ff181311c2e0ebbca
# Merge: f07688db 8e4b5c3d
# commit 0e6adfb64039d3dd5fc8363245fcac60cbdcb8bd
# Merge: 42044a83 d0c87169
# Author: Kenneth Benzie (Benie) <[email protected]>
# Date: Tue Feb 4 15:45:58 2025 +0000
# Merge pull request #2480 from ldorau/Add_UMF_CUDA_provider
# Use UMF CUDA memory provider in UR
set(UNIFIED_RUNTIME_TAG 87d4a32666f2950e7cfa016ff181311c2e0ebbca)
# Date: Wed Feb 5 15:39:15 2025 +0000
# Merge pull request #2496 from GeorgeWeb/georgi/bindless-hip
# [UR][Bindless] Initial implementation of bindless images for HIP
set(UNIFIED_RUNTIME_TAG 0e6adfb64039d3dd5fc8363245fcac60cbdcb8bd)
Original file line number Diff line number Diff line change
Expand Up @@ -2272,7 +2272,7 @@ void release_external_semaphore(external_semaphore semaphoreHandle,
```cpp
#include <sycl/sycl.hpp>

include::../../../test-e2e/bindless_images/examples/example_1_1D_read_write.cpp[lines=9..-1]
include::../../../test-e2e/bindless_images/examples/example_1_1D_read_write.cpp[lines=12..-1]
```

=== Reading from a dynamically sized array of 2D images
Expand All @@ -2288,30 +2288,30 @@ include::../../../test-e2e/bindless_images/examples/example_2_2D_dynamic_read.cp
```cpp
#include <sycl/sycl.hpp>

include::../../../test-e2e/bindless_images/examples/example_3_1D_mipmap_anisotropic_filtering_and_levels.cpp[lines=9..-1]
include::../../../test-e2e/bindless_images/examples/example_3_1D_mipmap_anisotropic_filtering_and_levels.cpp[lines=10..-1]
```

=== 1D image array read/write
```cpp
#include <sycl/sycl.hpp>

include::../../../test-e2e/bindless_images/examples/example_4_1D_array_read_write.cpp[lines=9..-1]
include::../../../test-e2e/bindless_images/examples/example_4_1D_array_read_write.cpp[lines=14..-1]
```

=== Sampling a cubemap

```c++
#include <sycl/sycl.hpp>

include::../../../test-e2e/bindless_images/examples/example_5_sample_cubemap.cpp[lines=9..-1]
include::../../../test-e2e/bindless_images/examples/example_5_sample_cubemap.cpp[lines=10..-1]
```

=== Using imported memory and semaphore objects

```c++
#include <sycl/sycl.hpp>

include::../../../test-e2e/bindless_images/examples/example_6_import_memory_and_semaphores.cpp[lines=8..-1]
include::../../../test-e2e/bindless_images/examples/example_6_import_memory_and_semaphores.cpp[lines=14..-1]
```

== Implementation notes
Expand Down
Loading