Cycles: svn merge -r41225:41232 ^/trunk/blender
[blender.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
26 #include "util_string.h"
27 #include "util_thread.h"
28 #include "util_types.h"
29 #include "util_vector.h"
30
31 CCL_NAMESPACE_BEGIN
32
33 class Progress;
34
35 enum DeviceType {
36         DEVICE_NONE,
37         DEVICE_CPU,
38         DEVICE_OPENCL,
39         DEVICE_CUDA,
40         DEVICE_NETWORK,
41         DEVICE_MULTI
42 };
43
44 enum MemoryType {
45         MEM_READ_ONLY,
46         MEM_WRITE_ONLY,
47         MEM_READ_WRITE
48 };
49
50 /* Device Task */
51
52 class DeviceTask {
53 public:
54         typedef enum { PATH_TRACE, TONEMAP, DISPLACE } Type;
55         Type type;
56
57         int x, y, w, h;
58         device_ptr rng_state;
59         device_ptr rgba;
60         device_ptr buffer;
61         int sample;
62         int resolution;
63
64         device_ptr displace_input;
65         device_ptr displace_offset;
66         int displace_x, displace_w;
67
68         DeviceTask(Type type = PATH_TRACE);
69         void split(ThreadQueue<DeviceTask>& tasks, int num);
70 };
71
72 /* Device */
73
74 class Device {
75 protected:
76         Device() {}
77
78         bool background;
79
80 public:
81         virtual ~Device() {}
82
83         virtual bool support_full_kernel() = 0;
84
85         /* info */
86         virtual string description() = 0;
87
88         /* regular memory */
89         virtual void mem_alloc(device_memory& mem, MemoryType type) = 0;
90         virtual void mem_copy_to(device_memory& mem) = 0;
91         virtual void mem_copy_from(device_memory& mem,
92                 size_t offset, size_t size) = 0;
93         virtual void mem_zero(device_memory& mem) = 0;
94         virtual void mem_free(device_memory& mem) = 0;
95
96         /* constant memory */
97         virtual void const_copy_to(const char *name, void *host, size_t size) = 0;
98
99         /* texture memory */
100         virtual void tex_alloc(const char *name, device_memory& mem,
101                 bool interpolation = false, bool periodic = false) {};
102         virtual void tex_free(device_memory& mem) {};
103
104         /* pixel memory */
105         virtual void pixels_alloc(device_memory& mem);
106         virtual void pixels_copy_from(device_memory& mem, int y, int w, int h);
107         virtual void pixels_free(device_memory& mem);
108
109         /* open shading language, only for CPU device */
110         virtual void *osl_memory() { return NULL; }
111
112         /* load/compile kernels, must be called before adding tasks */ 
113         virtual bool load_kernels() { return true; }
114
115         /* tasks */
116         virtual void task_add(DeviceTask& task) = 0;
117         virtual void task_wait() = 0;
118         virtual void task_cancel() = 0;
119         
120         /* opengl drawing */
121         virtual void draw_pixels(device_memory& mem, int y, int w, int h,
122                 int width, int height, bool transparent);
123
124 #ifdef WITH_NETWORK
125         /* networking */
126         void server_run();
127 #endif
128
129         /* static */
130         static Device *create(DeviceType type, bool background = true, int threads = 0);
131
132         static DeviceType type_from_string(const char *name);
133         static string string_from_type(DeviceType type);
134         static vector<DeviceType> available_types();
135 };
136
137 CCL_NAMESPACE_END
138
139 #endif /* __DEVICE_H__ */
140