Skip to content

Commit c87a269

Browse files
committed
Fix #133953: Cycles oneAPI texture randomly renders black
* Do oneAPI copy optimization as part of host memory alloc and free, so it is properly released before host memory is freed. * Synchronize after loading texture info, like CUDA and HIP. https://projects.blender.org/blender/blender/pulls/134412
1 parent f99f958 commit c87a269

File tree

3 files changed

+34
-15
lines changed

3 files changed

+34
-15
lines changed

intern/cycles/device/oneapi/device_impl.cpp

+29-14
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,35 @@ void *OneapiDevice::kernel_globals_device_pointer()
379379
return kg_memory_device_;
380380
}
381381

382+
void *OneapiDevice::host_alloc(const MemoryType type, const size_t size)
383+
{
384+
void *host_pointer = GPUDevice::host_alloc(type, size);
385+
386+
# ifdef SYCL_EXT_ONEAPI_COPY_OPTIMIZE
387+
if (host_pointer) {
388+
/* Import host_pointer into USM memory for faster host<->device data transfers. */
389+
if (type == MEM_READ_WRITE || type == MEM_READ_ONLY) {
390+
sycl::queue *queue = reinterpret_cast<sycl::queue *>(device_queue_);
391+
sycl::ext::oneapi::experimental::prepare_for_device_copy(host_pointer, size, *queue);
392+
}
393+
}
394+
# endif
395+
396+
return host_pointer;
397+
}
398+
399+
void OneapiDevice::host_free(const MemoryType type, void *host_pointer, const size_t size)
400+
{
401+
# ifdef SYCL_EXT_ONEAPI_COPY_OPTIMIZE
402+
if (type == MEM_READ_WRITE || type == MEM_READ_ONLY) {
403+
sycl::queue *queue = reinterpret_cast<sycl::queue *>(device_queue_);
404+
sycl::ext::oneapi::experimental::release_from_device_copy(host_pointer, *queue);
405+
}
406+
# endif
407+
408+
GPUDevice::host_free(type, host_pointer, size);
409+
}
410+
382411
void OneapiDevice::mem_alloc(device_memory &mem)
383412
{
384413
if (mem.type == MEM_TEXTURE) {
@@ -394,14 +423,6 @@ void OneapiDevice::mem_alloc(device_memory &mem)
394423
<< string_human_readable_size(mem.memory_size()) << ")";
395424
}
396425
generic_alloc(mem);
397-
# ifdef SYCL_EXT_ONEAPI_COPY_OPTIMIZE
398-
/* Import host_pointer into USM memory for faster host<->device data transfers. */
399-
if (mem.type == MEM_READ_WRITE || mem.type == MEM_READ_ONLY) {
400-
sycl::queue *queue = reinterpret_cast<sycl::queue *>(device_queue_);
401-
sycl::ext::oneapi::experimental::prepare_for_device_copy(
402-
mem.host_pointer, mem.memory_size(), *queue);
403-
}
404-
# endif
405426
}
406427
}
407428

@@ -543,12 +564,6 @@ void OneapiDevice::mem_free(device_memory &mem)
543564
tex_free((device_texture &)mem);
544565
}
545566
else {
546-
# ifdef SYCL_EXT_ONEAPI_COPY_OPTIMIZE
547-
if (mem.type == MEM_READ_WRITE || mem.type == MEM_READ_ONLY) {
548-
sycl::queue *queue = reinterpret_cast<sycl::queue *>(device_queue_);
549-
sycl::ext::oneapi::experimental::release_from_device_copy(mem.host_pointer, *queue);
550-
}
551-
# endif
552567
generic_free(mem);
553568
}
554569
}

intern/cycles/device/oneapi/device_impl.h

+4
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ class OneapiDevice : public GPUDevice {
8888
void tex_copy_to(device_texture &mem);
8989
void tex_free(device_texture &mem);
9090

91+
/* Host side memory, override for more efficient copies. */
92+
void *host_alloc(const MemoryType type, const size_t size) override;
93+
void host_free(const MemoryType type, void *host_pointer, const size_t size) override;
94+
9195
/* Device side memory. */
9296
void get_device_memory_info(size_t &total, size_t &free) override;
9397
bool alloc_device(void *&device_pointer, const size_t size) override;

intern/cycles/device/oneapi/queue.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ bool OneapiDeviceQueue::enqueue(DeviceKernel kernel,
7272

7373
/* Update texture info in case memory moved to host. */
7474
if (oneapi_device_->load_texture_info()) {
75-
if (oneapi_device_->have_error()) {
75+
if (!synchronize()) {
7676
return false;
7777
}
7878
}

0 commit comments

Comments
 (0)