[Bf-blender-cvs] [95ef995] soc-2016-cycles_images: Only have one bindless_mapping vector, and also load textures for shader() kernel.

Thomas Dinges noreply at git.blender.org
Thu May 19 01:49:02 CEST 2016


Commit: 95ef9953706c80b0cfbdfe39cd96bcf000717792
Author: Thomas Dinges
Date:   Thu May 19 01:48:21 2016 +0200
Branches: soc-2016-cycles_images
https://developer.blender.org/rB95ef9953706c80b0cfbdfe39cd96bcf000717792

Only have one bindless_mapping vector, and also load textures for shader() kernel.

This fixes float4 textures \o/

===================================================================

M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/kernel/kernel_textures.h

===================================================================

diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index c28c41e..0e629ec 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -99,8 +99,7 @@ public:
 	map<device_ptr, PixelMem> pixel_mem_map;
 
 	/* Bindless Textures */
-	CUtexObject bindless_mapping[4096];
-	device_vector<uint> bindless_mapping_device;
+	device_vector<uint> bindless_mapping;
 	bool sync_bindless_mapping;
 
 	CUdeviceptr cuda_device_ptr(device_ptr mem)
@@ -223,7 +222,7 @@ public:
 	{
 		task_pool.stop();
 
-		tex_free(bindless_mapping_device);
+		tex_free(bindless_mapping);
 
 		cuda_assert(cuCtxDestroy(cuContext));
 	}
@@ -402,6 +401,14 @@ public:
 		return (result == CUDA_SUCCESS);
 	}
 
+	void load_bindless_mapping()
+	{
+		if(sync_bindless_mapping) {
+			tex_alloc("__bindless_mapping", bindless_mapping, INTERPOLATION_NONE, EXTENSION_REPEAT, 0);
+			sync_bindless_mapping = false;
+		}
+	}
+
 	void mem_alloc(device_memory& mem, MemoryType /*type*/)
 	{
 		cuda_push_context();
@@ -670,7 +677,9 @@ public:
 
 				CUtexObject tex = 0;
 				cuda_assert(cuTexObjectCreate(&tex, &resDesc, &texDesc, NULL));
-				bindless_mapping[flat_slot] = tex;
+				if(flat_slot >= bindless_mapping.size())
+					bindless_mapping.resize(4096); /*TODO(dingto): Make this a variable */
+				bindless_mapping.get_data()[flat_slot] = (uint)tex;
 
 				sync_bindless_mapping = true;
 			}
@@ -732,16 +741,7 @@ public:
 			return;
 
 		/* Upload bindless_mapping vector */
-		if(cuDevArchitecture >= 300) {
-			if(sync_bindless_mapping) {
-				uint *tmp = bindless_mapping_device.resize(4096);
-				for(size_t i = 0; i < 4096; i++) {
-					tmp[i] = (uint)bindless_mapping[i];
-				}
-				tex_alloc("__bindless_mapping", bindless_mapping_device, INTERPOLATION_NONE, EXTENSION_REPEAT, 0);
-				sync_bindless_mapping = false;
-			}
-		}
+		load_bindless_mapping();
 
 		cuda_push_context();
 
@@ -857,6 +857,9 @@ public:
 		if(have_error())
 			return;
 
+		/* Upload bindless_mapping vector */
+		load_bindless_mapping();
+
 		cuda_push_context();
 
 		CUfunction cuShader;
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index 285da14..f2467d5 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -176,7 +176,9 @@ KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_091)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_byte4_092)
 
 /* bindless textures */
+#if defined(__KERNEL_CUDA__) && __CUDA_ARCH__ >= 300
 KERNEL_TEX(uint, texture_uint, __bindless_mapping)
+#endif
 
 /* packed image (opencl) */
 KERNEL_TEX(uchar4, texture_uchar4, __tex_image_byte4_packed)




More information about the Bf-blender-cvs mailing list