7ef74a79834ebba263d97e1450b5d439db0cd3af
[blender-staging.git] / intern / cycles / device / opencl / memory_manager.h
1 /*
2  * Copyright 2011-2017 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #pragma once
18
19 #include "device/device.h"
20
21 #include "util/util_map.h"
22 #include "util/util_vector.h"
23 #include "util/util_string.h"
24
25 #include "clew.h"
26
27 CCL_NAMESPACE_BEGIN
28
29 class OpenCLDeviceBase;
30
31 class MemoryManager {
32 public:
33         static const int NUM_DEVICE_BUFFERS = 8;
34
35         struct BufferDescriptor {
36                 uint device_buffer;
37                 cl_ulong offset;
38         };
39
40 private:
41         struct DeviceBuffer;
42
43         struct Allocation {
44                 device_memory *mem;
45
46                 DeviceBuffer *device_buffer;
47                 size_t size; /* Size of actual allocation, may be larger than requested. */
48
49                 BufferDescriptor desc;
50
51                 bool needs_copy_to_device;
52
53                 Allocation() : mem(NULL), device_buffer(NULL), size(0), needs_copy_to_device(false)
54                 {
55                 }
56         };
57
58         struct DeviceBuffer {
59                 device_memory *buffer;
60                 vector<Allocation*> allocations;
61                 size_t size; /* Size of all allocations. */
62
63                 DeviceBuffer()
64                 : buffer(NULL), size(0)
65                 {
66                 }
67
68                 ~DeviceBuffer()
69                 {
70                         delete buffer;
71                         buffer = NULL;
72                 }
73
74                 void add_allocation(Allocation& allocation);
75
76                 void update_device_memory(OpenCLDeviceBase *device);
77
78                 void free(OpenCLDeviceBase *device);
79         };
80
81         OpenCLDeviceBase *device;
82
83         DeviceBuffer device_buffers[NUM_DEVICE_BUFFERS];
84
85         typedef unordered_map<string, Allocation> AllocationsMap;
86         AllocationsMap allocations;
87
88         bool need_update;
89
90         DeviceBuffer* smallest_device_buffer();
91
92 public:
93         MemoryManager(OpenCLDeviceBase *device);
94
95         void free(); /* Free all memory. */
96
97         void alloc(const char *name, device_memory& mem);
98         bool free(device_memory& mem);
99
100         BufferDescriptor get_descriptor(string name);
101
102         void update_device_memory();
103         void set_kernel_arg_buffers(cl_kernel kernel, cl_uint *narg);
104 };
105
106 CCL_NAMESPACE_END
107