diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-02 16:02:49 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-02 16:03:12 +0300 |
commit | 4174e533c001367b0ef391b72baa5b07cb517ce8 (patch) | |
tree | a18112243e6a2c894d4421926cbc5394b54240a5 /intern/cycles/device/device_cuda.cpp | |
parent | fc8f428224a8e77ba66394ad8238a406fa24ee3a (diff) |
Cycles: Cache split kernels in CUDA device
This way we don't re-load kernels for every sample in the viewport.
Additionally, we don't risk global size changed inbetween of samples.
Diffstat (limited to 'intern/cycles/device/device_cuda.cpp')
-rw-r--r-- | intern/cycles/device/device_cuda.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index ef283c9d455..acfb3e1d8f4 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -119,6 +119,7 @@ public: int cuDevId; int cuDevArchitecture; bool first_error; + CUDASplitKernel *split_kernel; struct PixelMem { GLuint cuPBO; @@ -221,6 +222,8 @@ public: cuDevice = 0; cuContext = 0; + split_kernel = NULL; + need_bindless_mapping = false; /* intialize */ @@ -260,6 +263,8 @@ public: { task_pool.stop(); + delete split_kernel; + if(info.has_bindless_textures) { tex_free(bindless_mapping); } @@ -1336,12 +1341,14 @@ public: requested_features.max_closure = 64; } - CUDASplitKernel split_kernel(this); - split_kernel.load_kernels(requested_features); + if(split_kernel == NULL) { + split_kernel = new CUDASplitKernel(this); + split_kernel->load_kernels(requested_features); + } while(task->acquire_tile(this, tile)) { device_memory void_buffer; - split_kernel.path_trace(task, tile, void_buffer, void_buffer); + split_kernel->path_trace(task, tile, void_buffer, void_buffer); task->release_tile(tile); |