Cycles: merge of changes from tomato branch.
[blender-staging.git] / intern / cycles / device / device.h
1 /*
2  * Copyright 2011, Blender Foundation.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  */
18
19 #ifndef __DEVICE_H__
20 #define __DEVICE_H__
21
22 #include <stdlib.h>
23
24 #include "device_memory.h"
25 #include "device_task.h"
26
27 #include "util_list.h"
28 #include "util_string.h"
29 #include "util_thread.h"
30 #include "util_types.h"
31 #include "util_vector.h"
32
33 CCL_NAMESPACE_BEGIN
34
35 class Progress;
36 class RenderTile;
37
38 /* Device Types */
39
40 enum DeviceType {
41         DEVICE_NONE,
42         DEVICE_CPU,
43         DEVICE_OPENCL,
44         DEVICE_CUDA,
45         DEVICE_NETWORK,
46         DEVICE_MULTI
47 };
48
49 class DeviceInfo {
50 public:
51         DeviceType type;
52         string description;
53         string id;
54         int num;
55         bool display_device;
56         bool advanced_shading;
57         bool pack_images;
58         vector<DeviceInfo> multi_devices;
59
60         DeviceInfo()
61         {
62                 type = DEVICE_CPU;
63                 id = "CPU";
64                 num = 0;
65                 display_device = false;
66                 advanced_shading = true;
67                 pack_images = false;
68         }
69 };
70
71 /* Device */
72
73 class Device {
74 protected:
75         Device() {}
76
77         bool background;
78         string error_msg;
79
80 public:
81         virtual ~Device() {}
82
83         /* info */
84         DeviceInfo info;
85         virtual const string& error_message() { return error_msg; }
86
87         /* regular memory */
88         virtual void mem_alloc(device_memory& mem, MemoryType type) = 0;
89         virtual void mem_copy_to(device_memory& mem) = 0;
90         virtual void mem_copy_from(device_memory& mem,
91                 int y, int w, int h, int elem) = 0;
92         virtual void mem_zero(device_memory& mem) = 0;
93         virtual void mem_free(device_memory& mem) = 0;
94
95         /* constant memory */
96         virtual void const_copy_to(const char *name, void *host, size_t size) = 0;
97
98         /* texture memory */
99         virtual void tex_alloc(const char *name, device_memory& mem,
100                 bool interpolation = false, bool periodic = false) {};
101         virtual void tex_free(device_memory& mem) {};
102
103         /* pixel memory */
104         virtual void pixels_alloc(device_memory& mem);
105         virtual void pixels_copy_from(device_memory& mem, int y, int w, int h);
106         virtual void pixels_free(device_memory& mem);
107
108         /* open shading language, only for CPU device */
109         virtual void *osl_memory() { return NULL; }
110
111         /* load/compile kernels, must be called before adding tasks */ 
112         virtual bool load_kernels(bool experimental) { return true; }
113
114         /* tasks */
115         virtual void task_add(DeviceTask& task) = 0;
116         virtual void task_wait() = 0;
117         virtual void task_cancel() = 0;
118         
119         /* opengl drawing */
120         virtual void draw_pixels(device_memory& mem, int y, int w, int h,
121                 int dy, int width, int height, bool transparent);
122
123 #ifdef WITH_NETWORK
124         /* networking */
125         void server_run();
126 #endif
127
128         /* multi device */
129         virtual void map_tile(Device *sub_device, RenderTile& tile) {}
130         virtual int device_number(Device *sub_device) { return 0; }
131
132         /* static */
133         static Device *create(DeviceInfo& info, bool background = true, int threads = 0);
134
135         static DeviceType type_from_string(const char *name);
136         static string string_from_type(DeviceType type);
137         static vector<DeviceType>& available_types();
138         static vector<DeviceInfo>& available_devices();
139 };
140
141 CCL_NAMESPACE_END
142
143 #endif /* __DEVICE_H__ */
144