diff options
author | Thomas Dinges <blender@dingto.org> | 2016-05-09 13:51:42 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2016-05-11 22:58:34 +0300 |
commit | 4a4f043bc4235c046d2b58e00f2b80665ded11bf (patch) | |
tree | 58f68254573aece49f2b6ab67ffcb8ba1fc9c08f /intern/cycles/kernel/kernels/cpu | |
parent | 544b76ac9cf79bcc64b9f8248984f1d408d32eb8 (diff) |
Cycles: Add support for single channel float textures on CPU.
Until now, single channel textures were packed into a float4, wasting 3 floats per pixel. Memory usage of such textures is now reduced by 3/4.
Voxel Attributes such as density, flame and heat benefit from this, but also Bumpmaps with one channel.
This commit also includes some cleanup and code deduplication for image loading.
Example Smoke render from Cosmos Laundromat: http://www.pasteall.org/pic/show.php?id=102972
Memory here went down from ~600MB to ~300MB.
Reviewers: #cycles, brecht
Differential Revision: https://developer.blender.org/D1981
Diffstat (limited to 'intern/cycles/kernel/kernels/cpu')
-rw-r--r-- | intern/cycles/kernel/kernels/cpu/kernel.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/intern/cycles/kernel/kernels/cpu/kernel.cpp b/intern/cycles/kernel/kernels/cpu/kernel.cpp index e7d0d8a0408..960012e95e3 100644 --- a/intern/cycles/kernel/kernels/cpu/kernel.cpp +++ b/intern/cycles/kernel/kernels/cpu/kernel.cpp @@ -106,10 +106,26 @@ void kernel_tex_copy(KernelGlobals *kg, tex->extension = extension; } } + else if(strstr(name, "__tex_image_float")) { + texture_image_float *tex = NULL; + int id = atoi(name + strlen("__tex_image_float_")); + int array_index = id - TEX_IMAGE_FLOAT_START_CPU; + + if(array_index >= 0 && array_index < TEX_NUM_FLOAT_IMAGES_CPU) { + tex = &kg->texture_float_images[array_index]; + } + + if(tex) { + tex->data = (float*)mem; + tex->dimensions_set(width, height, depth); + tex->interpolation = interpolation; + tex->extension = extension; + } + } else if(strstr(name, "__tex_image_byte4")) { texture_image_uchar4 *tex = NULL; int id = atoi(name + strlen("__tex_image_byte4_")); - int array_index = id - TEX_NUM_FLOAT4_IMAGES_CPU; + int array_index = id - TEX_IMAGE_BYTE4_START_CPU; if(array_index >= 0 && array_index < TEX_NUM_BYTE4_IMAGES_CPU) { tex = &kg->texture_byte4_images[array_index]; |