Cycles: Make all #include statements relative to cycles source directory
[blender.git] / intern / cycles / device / device_multi.cpp
index 434d0085d39333377d0c1ec94769794c783a1e90..624260a81c80346de0ddabbf908aaf37b464273d 100644 (file)
 #include <stdlib.h>
 #include <sstream>
 
-#include "device.h"
-#include "device_intern.h"
-#include "device_network.h"
+#include "device/device.h"
+#include "device/device_intern.h"
+#include "device/device_network.h"
 
-#include "buffers.h"
+#include "render/buffers.h"
 
-#include "util_foreach.h"
-#include "util_list.h"
-#include "util_logging.h"
-#include "util_map.h"
-#include "util_time.h"
+#include "util/util_foreach.h"
+#include "util/util_list.h"
+#include "util/util_logging.h"
+#include "util/util_map.h"
+#include "util/util_time.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -51,7 +51,7 @@ public:
                Device *device;
 
                foreach(DeviceInfo& subinfo, info.multi_devices) {
-                       device = Device::create(subinfo, stats, background);
+                       device = Device::create(subinfo, sub_stats_, background);
                        devices.push_back(SubDevice(device));
                }
 
@@ -89,6 +89,14 @@ public:
                return error_msg;
        }
 
+       virtual bool show_samples() const
+       {
+               if(devices.size() > 1) {
+                       return false;
+               }
+               return devices.front().device->show_samples();
+       }
+
        bool load_kernels(const DeviceRequestedFeatures& requested_features)
        {
                foreach(SubDevice& sub, devices)
@@ -98,15 +106,16 @@ public:
                return true;
        }
 
-       void mem_alloc(device_memory& mem, MemoryType type)
+       void mem_alloc(const char *name, device_memory& mem, MemoryType type)
        {
                foreach(SubDevice& sub, devices) {
                        mem.device_pointer = 0;
-                       sub.device->mem_alloc(mem, type);
+                       sub.device->mem_alloc(name, mem, type);
                        sub.ptr_map[unique_ptr] = mem.device_pointer;
                }
 
                mem.device_pointer = unique_ptr++;
+               stats.mem_alloc(mem.device_size);
        }
 
        void mem_copy_to(device_memory& mem)
@@ -153,6 +162,7 @@ public:
        void mem_free(device_memory& mem)
        {
                device_ptr tmp = mem.device_pointer;
+               stats.mem_free(mem.device_size);
 
                foreach(SubDevice& sub, devices) {
                        mem.device_pointer = sub.ptr_map[tmp];
@@ -175,7 +185,9 @@ public:
                       interpolation,
                       ExtensionType extension)
        {
-               VLOG(1) << "Texture allocate: " << name << ", " << mem.memory_size() << " bytes.";
+               VLOG(1) << "Texture allocate: " << name << ", "
+                       << string_human_readable_number(mem.memory_size()) << " bytes. ("
+                       << string_human_readable_size(mem.memory_size()) << ")";
 
                foreach(SubDevice& sub, devices) {
                        mem.device_pointer = 0;
@@ -184,11 +196,13 @@ public:
                }
 
                mem.device_pointer = unique_ptr++;
+               stats.mem_alloc(mem.device_size);
        }
 
        void tex_free(device_memory& mem)
        {
                device_ptr tmp = mem.device_pointer;
+               stats.mem_free(mem.device_size);
 
                foreach(SubDevice& sub, devices) {
                        mem.device_pointer = sub.ptr_map[tmp];
@@ -334,6 +348,9 @@ public:
                foreach(SubDevice& sub, devices)
                        sub.device->task_cancel();
        }
+
+protected:
+       Stats sub_stats_;
 };
 
 Device *device_multi_create(DeviceInfo& info, Stats &stats, bool background)
@@ -341,120 +358,5 @@ Device *device_multi_create(DeviceInfo& info, Stats &stats, bool background)
        return new MultiDevice(info, stats, background);
 }
 
-static bool device_multi_add(vector<DeviceInfo>& devices, DeviceType type, bool with_display, bool with_advanced_shading, const char *id_fmt, int num)
-{
-       DeviceInfo info;
-
-       /* create map to find duplicate descriptions */
-       map<string, int> dupli_map;
-       map<string, int>::iterator dt;
-       int num_added = 0, num_display = 0;
-
-       info.advanced_shading = with_advanced_shading;
-       info.pack_images = false;
-       info.has_bindless_textures = true;
-
-       foreach(DeviceInfo& subinfo, devices) {
-               if(subinfo.type == type) {
-                       if(subinfo.advanced_shading != info.advanced_shading)
-                               continue;
-                       if(subinfo.display_device) {
-                               if(with_display)
-                                       num_display++;
-                               else
-                                       continue;
-                       }
-
-                       string key = subinfo.description;
-
-                       if(dupli_map.find(key) == dupli_map.end())
-                               dupli_map[key] = 1;
-                       else
-                               dupli_map[key]++;
-
-                       info.multi_devices.push_back(subinfo);
-                       if(subinfo.display_device)
-                               info.display_device = true;
-                       info.pack_images = info.pack_images || subinfo.pack_images;
-                       info.has_bindless_textures = info.has_bindless_textures && subinfo.has_bindless_textures;
-                       num_added++;
-               }
-       }
-
-       if(num_added <= 1 || (with_display && num_display == 0))
-               return false;
-
-       /* generate string */
-       stringstream desc;
-       vector<string> last_tokens;
-       bool first = true;
-
-       for(dt = dupli_map.begin(); dt != dupli_map.end(); dt++) {
-               if(!first) desc << " + ";
-               first = false;
-
-               /* get name and count */
-               string name = dt->first;
-               int count = dt->second;
-
-               /* strip common prefixes */
-               vector<string> tokens;
-               string_split(tokens, dt->first);
-
-               if(tokens.size() > 1) {
-                       int i;
-
-                       for(i = 0; i < tokens.size() && i < last_tokens.size(); i++)
-                               if(tokens[i] != last_tokens[i])
-                                       break;
-
-                       name = "";
-                       for(; i < tokens.size(); i++) {
-                               name += tokens[i];
-                               if(i != tokens.size() - 1)
-                                       name += " ";
-                       }
-               }
-
-               last_tokens = tokens;
-
-               /* add */
-               if(count > 1)
-                       desc << name << " (" << count << "x)";
-               else
-                       desc << name;
-       }
-
-       /* add info */
-       info.type = DEVICE_MULTI;
-       info.description = desc.str();
-       info.id = string_printf(id_fmt, num);
-       info.display_device = with_display;
-       info.num = 0;
-
-       if(with_display)
-               devices.push_back(info);
-       else
-               devices.insert(devices.begin(), info);
-       
-       return true;
-}
-
-void device_multi_info(vector<DeviceInfo>& devices)
-{
-       int num = 0;
-
-       if(!device_multi_add(devices, DEVICE_CUDA, false, true, "CUDA_MULTI_%d", num++))
-               device_multi_add(devices, DEVICE_CUDA, false, false, "CUDA_MULTI_%d", num++);
-       if(!device_multi_add(devices, DEVICE_CUDA, true, true, "CUDA_MULTI_%d", num++))
-               device_multi_add(devices, DEVICE_CUDA, true, false, "CUDA_MULTI_%d", num++);
-
-       num = 0;
-       if(!device_multi_add(devices, DEVICE_OPENCL, false, true, "OPENCL_MULTI_%d", num++))
-               device_multi_add(devices, DEVICE_OPENCL, false, false, "OPENCL_MULTI_%d", num++);
-       if(!device_multi_add(devices, DEVICE_OPENCL, true, true, "OPENCL_MULTI_%d", num++))
-               device_multi_add(devices, DEVICE_OPENCL, true, false, "OPENCL_MULTI_%d", num++);
-}
-
 CCL_NAMESPACE_END