Cycles/OpenCL: Remove NULL PTR Workaround
In the current OpenCL implementation we have a work-around for platforms that didn't support NULL pointers. We used to replace all NULLs and empty arrays with a pointer to a single byte on the OpenCL Device. During investigation of {T65924} it was asked to remove this work-around for testing. This change improves the render times. SCENE | BEFORE | AFTER --------------------+--------+------- bmw27 | 108 | 89 barbershop_interior | 867 | 673 classroom | 270 | 173 fishy_cat | 244 | 196 koro | 249 | 207 pavillon_barcelona | 582 | 414 Note that this change does not fix T65924 it just improves the rendering performance for OpenCL. We haven't tested this patch on all platforms so we should keep an eye out on the tracker. Reviewed By: sergey Differential Revision: https://developer.blender.org/D6391
This commit is contained in:
parent
57d2d8ac05
commit
f5e37af5a8
Notes:
blender-bot
2023-02-14 06:57:56 +01:00
Referenced by issue #65924, Cycles Render Crash Windows/AMD RX Vega
|
@ -251,7 +251,7 @@ void MemoryManager::set_kernel_arg_buffers(cl_kernel kernel, cl_uint *narg)
|
|||
device->kernel_set_args(kernel, (*narg)++, *device_buffer.buffer);
|
||||
}
|
||||
else {
|
||||
device->kernel_set_args(kernel, (*narg)++, device->null_mem);
|
||||
device->kernel_set_args(kernel, (*narg)++, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -381,7 +381,6 @@ class OpenCLDevice : public Device {
|
|||
|
||||
ConstMemMap const_mem_map;
|
||||
MemMap mem_map;
|
||||
device_ptr null_mem;
|
||||
|
||||
bool device_initialized;
|
||||
string platform_name;
|
||||
|
|
|
@ -611,7 +611,6 @@ OpenCLDevice::OpenCLDevice(DeviceInfo &info, Stats &stats, Profiler &profiler, b
|
|||
cdDevice = NULL;
|
||||
cxContext = NULL;
|
||||
cqCommandQueue = NULL;
|
||||
null_mem = 0;
|
||||
device_initialized = false;
|
||||
textures_need_update = true;
|
||||
use_preview_kernels = !background;
|
||||
|
@ -662,12 +661,6 @@ OpenCLDevice::OpenCLDevice(DeviceInfo &info, Stats &stats, Profiler &profiler, b
|
|||
return;
|
||||
}
|
||||
|
||||
null_mem = (device_ptr)clCreateBuffer(cxContext, CL_MEM_READ_ONLY, 1, NULL, &ciErr);
|
||||
if (opencl_error(ciErr)) {
|
||||
opencl_error("OpenCL: Error creating memory buffer for NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Allocate this right away so that texture_info
|
||||
* is placed at offset 0 in the device memory buffers. */
|
||||
texture_info.resize(1);
|
||||
|
@ -689,9 +682,6 @@ OpenCLDevice::~OpenCLDevice()
|
|||
|
||||
memory_manager.free();
|
||||
|
||||
if (null_mem)
|
||||
clReleaseMemObject(CL_MEM_PTR(null_mem));
|
||||
|
||||
ConstMemMap::iterator mt;
|
||||
for (mt = const_mem_map.begin(); mt != const_mem_map.end(); mt++) {
|
||||
delete mt->second;
|
||||
|
@ -962,7 +952,7 @@ void OpenCLDevice::mem_alloc(device_memory &mem)
|
|||
opencl_assert_err(ciErr, "clCreateBuffer");
|
||||
}
|
||||
else {
|
||||
mem.device_pointer = null_mem;
|
||||
mem.device_pointer = 0;
|
||||
}
|
||||
|
||||
stats.mem_alloc(size);
|
||||
|
@ -1084,7 +1074,7 @@ void OpenCLDevice::mem_free(device_memory &mem)
|
|||
}
|
||||
else {
|
||||
if (mem.device_pointer) {
|
||||
if (mem.device_pointer != null_mem) {
|
||||
if (mem.device_pointer != 0) {
|
||||
opencl_assert(clReleaseMemObject(CL_MEM_PTR(mem.device_pointer)));
|
||||
}
|
||||
mem.device_pointer = 0;
|
||||
|
@ -1120,7 +1110,7 @@ device_ptr OpenCLDevice::mem_alloc_sub_ptr(device_memory &mem, int offset, int s
|
|||
|
||||
void OpenCLDevice::mem_free_sub_ptr(device_ptr device_pointer)
|
||||
{
|
||||
if (device_pointer && device_pointer != null_mem) {
|
||||
if (device_pointer != 0) {
|
||||
opencl_assert(clReleaseMemObject(CL_MEM_PTR(device_pointer)));
|
||||
}
|
||||
}
|
||||
|
@ -1239,8 +1229,7 @@ void OpenCLDevice::set_kernel_arg_mem(cl_kernel kernel, cl_uint *narg, const cha
|
|||
ptr = CL_MEM_PTR(i->second);
|
||||
}
|
||||
else {
|
||||
/* work around NULL not working, even though the spec says otherwise */
|
||||
ptr = CL_MEM_PTR(null_mem);
|
||||
ptr = 0;
|
||||
}
|
||||
|
||||
opencl_assert(clSetKernelArg(kernel, (*narg)++, sizeof(ptr), (void *)&ptr));
|
||||
|
|
Loading…
Reference in New Issue