diff options
author | Thomas Dinges <blender@dingto.org> | 2016-05-19 13:47:41 +0300 |
---|---|---|
committer | Thomas Dinges <blender@dingto.org> | 2016-05-19 14:14:37 +0300 |
commit | c9f1ed1e4c22728b1f711656ab4de56c11c65e35 (patch) | |
tree | d64b736497f386827ef327d8b35fd5d9ce91588a /intern/cycles/kernel/kernel_compat_cuda.h | |
parent | 03f846ea12ba38d4686edfeef01a571329bd9385 (diff) |
Cycles: Add support for bindless textures.
This adds support for CUDA Texture objects (also known as Bindless textures) for Kepler GPUs (Geforce 6xx and above).
This is used for all 2D/3D textures, data still uses arrays as before.
User benefits:
* No more limits of image textures on Kepler.
We had 5 float4 and 145 byte4 slots there before, now we have 1024 float4 and 1024 byte4.
This can be extended further if we need to (just change the define).
* Single channel textures slots (byte and float) are now supported on Kepler as well (1024 slots for each type).
ToDo / Issues:
* 3D textures don't work yet, at least don't show up during render. I have no idea whats wrong yet.
* Dynamically allocate bindless_mapping array?
I hope Fermi still works fine, but that should be tested on a Fermi card before pushing to master.
Part of my GSoC 2016.
Reviewers: sergey, #cycles, brecht
Subscribers: swerner, jtheninja, brecht, sergey
Differential Revision: https://developer.blender.org/D1999
Diffstat (limited to 'intern/cycles/kernel/kernel_compat_cuda.h')
-rw-r--r-- | intern/cycles/kernel/kernel_compat_cuda.h | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/intern/cycles/kernel/kernel_compat_cuda.h b/intern/cycles/kernel/kernel_compat_cuda.h index d10d3255e1b..42314756f02 100644 --- a/intern/cycles/kernel/kernel_compat_cuda.h +++ b/intern/cycles/kernel/kernel_compat_cuda.h @@ -67,20 +67,29 @@ typedef texture<uchar4, 2, cudaReadModeNormalizedFloat> texture_image_uchar4; /* Macros to handle different memory storage on different devices */ -/* In order to use full 6GB of memory on Titan cards, use arrays instead - * of textures. On earlier cards this seems slower, but on Titan it is - * actually slightly faster in tests. */ +/* On Fermi cards (4xx and 5xx), we use regular textures for both data and images. + * On Kepler (6xx) and above, we use Bindless Textures for images and arrays for data. + * + * Arrays are necessary in order to use the full VRAM on newer cards, and it's slightly faster. + * Using Arrays on Fermi turned out to be slower.*/ + +/* Fermi */ #if __CUDA_ARCH__ < 300 # define __KERNEL_CUDA_TEX_STORAGE__ -#endif - -#ifdef __KERNEL_CUDA_TEX_STORAGE__ # define kernel_tex_fetch(t, index) tex1Dfetch(t, index) + +# define kernel_tex_image_interp(t, x, y) tex2D(t, x, y) +# define kernel_tex_image_interp_3d(t, x, y, z) tex3D(t, x, y, z) + +/* Kepler */ #else # define kernel_tex_fetch(t, index) t[(index)] + +# define kernel_tex_image_interp_float4(t, x, y) tex2D<float4>(t, x, y) +# define kernel_tex_image_interp_float(t, x, y) tex2D<float>(t, x, y) +# define kernel_tex_image_interp_3d_float4(t, x, y, z) tex3D<float4>(t, x, y, z) +# define kernel_tex_image_interp_3d_float(t, x, y, z) tex3D<float>(t, x, y, z) #endif -#define kernel_tex_image_interp(t, x, y) tex2D(t, x, y) -#define kernel_tex_image_interp_3d(t, x, y, z) tex3D(t, x, y, z) #define kernel_data __data |