diff options
author | Brecht Van Lommel <brecht@blender.org> | 2021-11-05 23:01:23 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2021-11-06 00:04:36 +0300 |
commit | 97ff37bf54474efbce39653a1387ad55091d4964 (patch) | |
tree | 58ff9592807dbd98d126b179627e5c56f5309956 /intern/cycles/device | |
parent | d1a9425a2fde32b6786b333ab55661da507e818b (diff) |
Cycles: perform CPU film reading in the kernel, to use AVX2 half conversion
Adds a bunch of CPU kernel function to process on row of pixels, and use those
instead of calling unoptimized implementations.
Fixes T92598
Diffstat (limited to 'intern/cycles/device')
-rw-r--r-- | intern/cycles/device/cpu/device_impl.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/device/cpu/device_impl.h | 3 | ||||
-rw-r--r-- | intern/cycles/device/cpu/kernel.cpp | 19 | ||||
-rw-r--r-- | intern/cycles/device/cpu/kernel.h | 37 | ||||
-rw-r--r-- | intern/cycles/device/device.cpp | 8 | ||||
-rw-r--r-- | intern/cycles/device/device.h | 2 |
6 files changed, 63 insertions, 14 deletions
diff --git a/intern/cycles/device/cpu/device_impl.cpp b/intern/cycles/device/cpu/device_impl.cpp index d494b40f71d..68dec7f0af2 100644 --- a/intern/cycles/device/cpu/device_impl.cpp +++ b/intern/cycles/device/cpu/device_impl.cpp @@ -68,7 +68,8 @@ CPUDevice::CPUDevice(const DeviceInfo &info_, Stats &stats_, Profiler &profiler_ { /* Pick any kernel, all of them are supposed to have same level of microarchitecture * optimization. */ - VLOG(1) << "Using " << kernels.integrator_init_from_camera.get_uarch_name() << " CPU kernels."; + VLOG(1) << "Using " << get_cpu_kernels().integrator_init_from_camera.get_uarch_name() + << " CPU kernels."; if (info.cpu_threads == 0) { info.cpu_threads = TaskScheduler::num_threads(); @@ -296,11 +297,6 @@ void CPUDevice::build_bvh(BVH *bvh, Progress &progress, bool refit) Device::build_bvh(bvh, progress, refit); } -const CPUKernels *CPUDevice::get_cpu_kernels() const -{ - return &kernels; -} - void CPUDevice::get_cpu_kernel_thread_globals( vector<CPUKernelThreadGlobals> &kernel_thread_globals) { diff --git a/intern/cycles/device/cpu/device_impl.h b/intern/cycles/device/cpu/device_impl.h index 553728ccc3b..90d217bb624 100644 --- a/intern/cycles/device/cpu/device_impl.h +++ b/intern/cycles/device/cpu/device_impl.h @@ -57,8 +57,6 @@ class CPUDevice : public Device { RTCDevice embree_device; #endif - CPUKernels kernels; - CPUDevice(const DeviceInfo &info_, Stats &stats_, Profiler &profiler_); ~CPUDevice(); @@ -90,7 +88,6 @@ class CPUDevice : public Device { void build_bvh(BVH *bvh, Progress &progress, bool refit) override; - virtual const CPUKernels *get_cpu_kernels() const override; virtual void get_cpu_kernel_thread_globals( vector<CPUKernelThreadGlobals> &kernel_thread_globals) override; virtual void *get_cpu_osl_memory() override; diff --git a/intern/cycles/device/cpu/kernel.cpp b/intern/cycles/device/cpu/kernel.cpp index 3b253c094fd..91c472d41e8 100644 --- a/intern/cycles/device/cpu/kernel.cpp +++ b/intern/cycles/device/cpu/kernel.cpp @@ -26,6 +26,9 @@ CCL_NAMESPACE_BEGIN KERNEL_NAME_EVAL(cpu_avx, name), KERNEL_NAME_EVAL(cpu_avx2, name) #define REGISTER_KERNEL(name) name(KERNEL_FUNCTIONS(name)) +#define REGISTER_KERNEL_FILM_CONVERT(name) \ + film_convert_##name(KERNEL_FUNCTIONS(film_convert_##name)), \ + film_convert_half_rgba_##name(KERNEL_FUNCTIONS(film_convert_half_rgba_##name)) CPUKernels::CPUKernels() : /* Integrator. */ @@ -50,11 +53,25 @@ CPUKernels::CPUKernels() REGISTER_KERNEL(adaptive_sampling_filter_x), REGISTER_KERNEL(adaptive_sampling_filter_y), /* Cryptomatte. */ - REGISTER_KERNEL(cryptomatte_postprocess) + REGISTER_KERNEL(cryptomatte_postprocess), + /* Film Convert. */ + REGISTER_KERNEL_FILM_CONVERT(depth), + REGISTER_KERNEL_FILM_CONVERT(mist), + REGISTER_KERNEL_FILM_CONVERT(sample_count), + REGISTER_KERNEL_FILM_CONVERT(float), + REGISTER_KERNEL_FILM_CONVERT(light_path), + REGISTER_KERNEL_FILM_CONVERT(float3), + REGISTER_KERNEL_FILM_CONVERT(motion), + REGISTER_KERNEL_FILM_CONVERT(cryptomatte), + REGISTER_KERNEL_FILM_CONVERT(shadow_catcher), + REGISTER_KERNEL_FILM_CONVERT(shadow_catcher_matte_with_shadow), + REGISTER_KERNEL_FILM_CONVERT(combined), + REGISTER_KERNEL_FILM_CONVERT(float4) { } #undef REGISTER_KERNEL +#undef REGISTER_KERNEL_FILM_CONVERT #undef KERNEL_FUNCTIONS CCL_NAMESPACE_END diff --git a/intern/cycles/device/cpu/kernel.h b/intern/cycles/device/cpu/kernel.h index 5beeaf148a1..406bd07ab3d 100644 --- a/intern/cycles/device/cpu/kernel.h +++ b/intern/cycles/device/cpu/kernel.h @@ -17,11 +17,13 @@ #pragma once #include "device/cpu/kernel_function.h" +#include "util/half.h" #include "util/types.h" CCL_NAMESPACE_BEGIN struct KernelGlobalsCPU; +struct KernelFilmConvert; struct IntegratorStateCPU; struct TileInfo; @@ -102,6 +104,41 @@ class CPUKernels { CryptomattePostprocessFunction cryptomatte_postprocess; + /* Film Convert. */ + using FilmConvertFunction = CPUKernelFunction<void (*)(const KernelFilmConvert *kfilm_convert, + const float *buffer, + float *pixel, + const int width, + const int buffer_stride, + const int pixel_stride)>; + using FilmConvertHalfRGBAFunction = + CPUKernelFunction<void (*)(const KernelFilmConvert *kfilm_convert, + const float *buffer, + half4 *pixel, + const int width, + const int buffer_stride)>; + +#define KERNEL_FILM_CONVERT_FUNCTION(name) \ + FilmConvertFunction film_convert_##name; \ + FilmConvertHalfRGBAFunction film_convert_half_rgba_##name; + + KERNEL_FILM_CONVERT_FUNCTION(depth) + KERNEL_FILM_CONVERT_FUNCTION(mist) + KERNEL_FILM_CONVERT_FUNCTION(sample_count) + KERNEL_FILM_CONVERT_FUNCTION(float) + + KERNEL_FILM_CONVERT_FUNCTION(light_path) + KERNEL_FILM_CONVERT_FUNCTION(float3) + + KERNEL_FILM_CONVERT_FUNCTION(motion) + KERNEL_FILM_CONVERT_FUNCTION(cryptomatte) + KERNEL_FILM_CONVERT_FUNCTION(shadow_catcher) + KERNEL_FILM_CONVERT_FUNCTION(shadow_catcher_matte_with_shadow) + KERNEL_FILM_CONVERT_FUNCTION(combined) + KERNEL_FILM_CONVERT_FUNCTION(float4) + +#undef KERNEL_FILM_CONVERT_FUNCTION + CPUKernels(); }; diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index 69e959b6f7b..63d0a49d3eb 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -23,6 +23,7 @@ #include "device/queue.h" #include "device/cpu/device.h" +#include "device/cpu/kernel.h" #include "device/cuda/device.h" #include "device/dummy/device.h" #include "device/hip/device.h" @@ -363,10 +364,11 @@ unique_ptr<DeviceQueue> Device::gpu_queue_create() return nullptr; } -const CPUKernels *Device::get_cpu_kernels() const +const CPUKernels &Device::get_cpu_kernels() { - LOG(FATAL) << "Device does not support CPU kernels."; - return nullptr; + /* Initialize CPU kernels once and reuse. */ + static CPUKernels kernels; + return kernels; } void Device::get_cpu_kernel_thread_globals( diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h index 3cb177adde7..65188459c2c 100644 --- a/intern/cycles/device/device.h +++ b/intern/cycles/device/device.h @@ -180,7 +180,7 @@ class Device { * These may not be used on GPU or multi-devices. */ /* Get CPU kernel functions for native instruction set. */ - virtual const CPUKernels *get_cpu_kernels() const; + static const CPUKernels &get_cpu_kernels(); /* Get kernel globals to pass to kernels. */ virtual void get_cpu_kernel_thread_globals( vector<CPUKernelThreadGlobals> & /*kernel_thread_globals*/); |