Skip to content

feature(opencl): enable bindless image support for OpenCL frontend - #956

Open
juanchuletas wants to merge 4 commits into
intel:masterfrom
juanchuletas:bindless-images-ocl
Open

feature(opencl): enable bindless image support for OpenCL frontend#956
juanchuletas wants to merge 4 commits into
intel:masterfrom
juanchuletas:bindless-images-ocl

Conversation

@juanchuletas

Copy link
Copy Markdown

Enable BindlessHeapsHelper initialization for the OpenCL frontend by querying hardware capability via releaseHelper instead of returning false unconditionally in getGlobalBindlessHeapConfiguration.

Add opt-in bindless image creation through CL_MEM_BINDLESS_IMAGE_INTEL property. When set, Image::create allocates a bindless slot in the global Surface State Heap using the shared BindlessHeapsHelper infrastructure already used by the Level Zero frontend.

Signed-off-by: juan.garcia.cpp@gmail.com

Context

I am working on sycl_ext_oneapi_bindless_images in intel/llvm (PR #22257). The Unified Runtime OpenCL adapter returns UR_RESULT_ERROR_UNSUPPORTED_FEATURE for all bindless image entry points because the OpenCL has no bindless support.

This PR is the first step: enabling the shared BindlessHeapsHelper infrastructure for the OpenCL frontend and adding opt-in bindless slot allocation for images via CL_MEM_BINDLESS_IMAGE_INTEL.

Validated on Intel Arc A770:

  • Image creation with CL_MEM_BINDLESS_IMAGE_INTEL allocates a slot in the global SSH
  • Image creation without the property does not allocate a bindless slot
  • All existing ULTs pass

Remaining work:

Handle retrieval API so applications can query the bindless handle
Extension string registration is needed kind of cl_intel_bindless_images

Enable BindlessHeapsHelper initialization for the OpenCL frontend by
querying hardware capability via releaseHelper instead of returning
false unconditionally in getGlobalBindlessHeapConfiguration.

Add opt-in bindless image creation through CL_MEM_BINDLESS_IMAGE_INTEL
property. When set, Image::create allocates a bindless slot in the
global Surface State Heap using the shared BindlessHeapsHelper
infrastructure already used by the Level Zero frontend.

Signed-off-by: juan.garcia.cpp@gmail.com
…de for supported hardware

Enable getBindlessMode to query hardware capability instead of
defaulting to false. Add CL_IMAGE_BINDLESS_HANDLE_INTEL query key
to clGetImageInfo for retrieving the bindless handle from an image.

Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
Remove getBindlessMode check from createBindlessHeapsHelper so the
global Surface State Heap is created based on hardware capability
alone. Keep getBindlessMode returning false for OpenCL to preserve
normal bound-mode dispatch for all kernel arguments.

This allows bindless images to explicitly allocate slots in the
persistent heap via CL_MEM_BINDLESS_IMAGE_INTEL without breaking
existing kernel execution.

Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
Kernel::patchBindlessSurfaceStatesInCrossThreadData ran on every
dispatch and unconditionally re-patched the cross-thread-data offset
for any explicit arg with a valid bindless offset, using the local
per-dispatch Surface State Heap indexing scheme. For bindless images
this was overwriting the offset that setArgImageWithMipLevel had already
patched to point at the image's persistent slot in the global SSH,
so the shader always read whatever (uninitialized) data happened to
sit in the local SSH slot instead of the actual image descriptor.

Do not repatch image args whose bound cl_mem is a genuine
bindless image (CL_MEM_BINDLESS_IMAGE_INTEL), since those already
carry the correct address into their own persistent slot.

Signed-off-by: Juan Garcia <juan.garcia.cpp@gmail.com>
@juanchuletas

juanchuletas commented Aug 4, 2026

Copy link
Copy Markdown
Author

Update:
Bindless images now work e2e through the OpenCL backend,

Since the last update I added:

  • Handle retrieval via a new CL_IMAGE_BINDLESS_HANDLE_INTEL query on clGetImageInfo
  • Support for the existing -cl-intel-use-bindless-images and -cl-intel-use-bindless-advanced-mode compiler flags through clBuildProgram (previously rejected as unrecognized options)
  • The actual dispatch path changes needed for a bindless image argument to resolve correctly at runtime

The last part took a while to get right. Three issues had to be fixed together:

  1. The surface state descriptor was being built in the per-dispatch local SSH and then copied into the global SSH. The copy carried over address fields that were only valid in the local SSH context. Building the descriptor directly into the global SSH slot fixed this.
  2. patchBindlessSurfaceStatesInCrossThreadData was unconditionally re-patching every bindless-offset argument on each dispatch, including image arguments, which silently overwrote the correct global SSH offset that had just been set moments earlier. Bindless image arguments now get skipped in that pass since they are already patched correctly.

Tested with a small C program that creates a 1x1 bindless image with a known pixel, compiles a kernel with the bindless flags, and reads the pixel back through read_imagei using the image's handle. Comes back correct.

test_ocl_image_fetch.c

Still missing :

  • Unit tests for the dispatch path changes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant