Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Dinges <blender@dingto.org>2016-05-19 13:47:41 +0300
committerThomas Dinges <blender@dingto.org>2016-05-19 14:14:37 +0300
commitc9f1ed1e4c22728b1f711656ab4de56c11c65e35 (patch)
treed64b736497f386827ef327d8b35fd5d9ce91588a /intern/cycles/kernel/geom
parent03f846ea12ba38d4686edfeef01a571329bd9385 (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/geom')
-rw-r--r--intern/cycles/kernel/geom/geom_volume.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/intern/cycles/kernel/geom/geom_volume.h b/intern/cycles/kernel/geom/geom_volume.h
index ef02c01dec6..2044aafc877 100644
--- a/intern/cycles/kernel/geom/geom_volume.h
+++ b/intern/cycles/kernel/geom/geom_volume.h
@@ -29,7 +29,7 @@ CCL_NAMESPACE_BEGIN
/* Return position normalized to 0..1 in mesh bounds */
-#ifdef __KERNEL_GPU__
+#if defined(__KERNEL_GPU__) && __CUDA_ARCH__ < 300
ccl_device float4 volume_image_texture_3d(int id, float x, float y, float z)
{
float4 r;
@@ -65,7 +65,13 @@ ccl_device float volume_attribute_float(KernelGlobals *kg, const ShaderData *sd,
{
float3 P = volume_normalized_position(kg, sd, sd->P);
#ifdef __KERNEL_GPU__
+# if __CUDA_ARCH__ >= 300
+ CUtexObject tex = kernel_tex_fetch(__bindless_mapping, id);
+ float f = kernel_tex_image_interp_3d_float(tex, P.x, P.y, P.z);
+ float4 r = make_float4(f, f, f, 1.0);
+# else
float4 r = volume_image_texture_3d(id, P.x, P.y, P.z);
+# endif
#else
float4 r;
if(sd->flag & SD_VOLUME_CUBIC)
@@ -84,7 +90,12 @@ ccl_device float3 volume_attribute_float3(KernelGlobals *kg, const ShaderData *s
{
float3 P = volume_normalized_position(kg, sd, sd->P);
#ifdef __KERNEL_GPU__
+# if __CUDA_ARCH__ >= 300
+ CUtexObject tex = kernel_tex_fetch(__bindless_mapping, id);
+ float4 r = kernel_tex_image_interp_3d_float4(tex, P.x, P.y, P.z);
+# else
float4 r = volume_image_texture_3d(id, P.x, P.y, P.z);
+# endif
#else
float4 r;
if(sd->flag & SD_VOLUME_CUBIC)