Cycles OpenCL: Split baking kernels in own program
Fix T61463. Before this patch baking was part of the base kernels. There
are 3 baking kernels that and all 3 uses shader evaluation. Only for one
of these kernels the functionality was wrapped in the __NO_BAKING__
compile directive.
When you start baking this leads to long compile times. By separating
in individual programs will reduce the compile times.
Also wrapped all baking kernels with __NO_BAKING__ to reduce the
compilation times.
Impact on compilation time
job | scene_name | previous | new | percentage
--------+-----------------+----------+-------+------------
T61463 | empty | 10.63 | 7.27 | 32%
T61463 | bmw | 17.91 | 14.24 | 20%
T61463 | fishycat | 19.57 | 15.08 | 23%
T61463 | barbershop | 54.10 | 48.18 | 11%
T61463 | classroom | 17.55 | 14.42 | 18%
T61463 | koro | 18.92 | 17.15 | 9%
T61463 | pavillion | 17.43 | 14.23 | 18%
T61463 | splash279 | 16.48 | 15.33 | 7%
T61463 | volume_emission | 36.22 | 34.19 | 6%
Impact on render time
job | scene_name | previous | new | percentage
--------+-----------------+----------+---------+------------
T61463 | empty | 21.06 | 20.54 | 2%
T61463 | bmw | 198.44 | 189.59 | 4%
T61463 | fishycat | 394.20 | 388.50 | 1%
T61463 | barbershop | 1188.16 | 1185.49 | 0%
T61463 | classroom | 341.08 | 339.27 | 1%
T61463 | koro | 472.43 | 360.70 | 24%
T61463 | pavillion | 905.77 | 902.14 | 0%
T61463 | splash279 | 55.26 | 54.92 | 1%
T61463 | volume_emission | 62.59 | 39.09 | 38%
I don't have a grounded explanation why koro and volume_emission is this much
faster; I have done several tests though...
Maniphest Tasks: T61463
Differential Revision: https://developer.blender.org/D4376
39 lines
923 B
Common Lisp
39 lines
923 B
Common Lisp
#include "kernel/kernel_compat_opencl.h"
|
|
#include "kernel/kernel_math.h"
|
|
#include "kernel/kernel_types.h"
|
|
#include "kernel/kernel_globals.h"
|
|
#include "kernel/kernel_color.h"
|
|
#include "kernel/kernels/opencl/kernel_opencl_image.h"
|
|
|
|
#include "kernel/kernel_path.h"
|
|
#include "kernel/kernel_path_branched.h"
|
|
|
|
#include "kernel/kernel_bake.h"
|
|
|
|
__kernel void kernel_ocl_bake(
|
|
ccl_constant KernelData *data,
|
|
ccl_global uint4 *input,
|
|
ccl_global float4 *output,
|
|
|
|
KERNEL_BUFFER_PARAMS,
|
|
|
|
int type, int filter, int sx, int sw, int offset, int sample)
|
|
{
|
|
KernelGlobals kglobals, *kg = &kglobals;
|
|
|
|
kg->data = data;
|
|
|
|
kernel_set_buffer_pointers(kg, KERNEL_BUFFER_ARGS);
|
|
kernel_set_buffer_info(kg);
|
|
|
|
int x = sx + ccl_global_id(0);
|
|
|
|
if(x < sx + sw) {
|
|
#ifdef __NO_BAKING__
|
|
output[x] = make_float4(0.0f, 0.0f, 0.0f, 0.0f);
|
|
#else
|
|
kernel_bake_evaluate(kg, input, output, (ShaderEvalType)type, filter, x, offset, sample);
|
|
#endif
|
|
}
|
|
}
|