[Bf-blender-cvs] [f5e37af5a8f] master: Cycles/OpenCL: Remove NULL PTR Workaround

Jeroen Bakker noreply at git.blender.org
Wed Dec 11 12:02:02 CET 2019


Commit: f5e37af5a8fda50b4664bc29e9856847f1e12f89
Author: Jeroen Bakker
Date:   Tue Dec 10 16:45:18 2019 +0100
Branches: master
https://developer.blender.org/rBf5e37af5a8fda50b4664bc29e9856847f1e12f89

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

===================================================================

M	intern/cycles/device/opencl/memory_manager.cpp
M	intern/cycles/device/opencl/opencl.h
M	intern/cycles/device/opencl/opencl_split.cpp

===================================================================

diff --git a/intern/cycles/device/opencl/memory_manager.cpp b/intern/cycles/device/opencl/memory_manager.cpp
index f85aadce1c2..06d4746a86e 100644
--- a/intern/cycles/device/opencl/memory_manager.cpp
+++ b/intern/cycles/device/opencl/memory_manager.cpp
@@ -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);
     }
   }
 }
diff --git a/intern/cycles/device/opencl/opencl.h b/intern/cycles/device/opencl/opencl.h
index 82b961b8de7..61b1e3e3b6b 100644
--- a/intern/cycles/device/opencl/opencl.h
+++ b/intern/cycles/device/opencl/opencl.h
@@ -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;
diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp
index eea5cf2fb8a..76f9ce7a18f 100644
--- a/intern/cycles/device/opencl/opencl_split.cpp
+++ b/intern/cycles/device/opencl/opencl_split.cpp
@@ -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));



More information about the Bf-blender-cvs mailing list