Blender  V2.93
device_split_kernel.h
Go to the documentation of this file.
1 /*
2  * Copyright 2011-2016 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 #ifndef __DEVICE_SPLIT_KERNEL_H__
18 #define __DEVICE_SPLIT_KERNEL_H__
19 
20 #include "device/device.h"
21 #include "render/buffers.h"
22 
24 
25 /* When allocate global memory in chunks. We may not be able to
26  * allocate exactly "CL_DEVICE_MAX_MEM_ALLOC_SIZE" bytes in chunks;
27  * Since some bytes may be needed for aligning chunks of memory;
28  * This is the amount of memory that we dedicate for that purpose.
29  */
30 #define DATA_ALLOCATION_MEM_FACTOR 5000000 // 5MB
31 
32 /* Types used for split kernel */
33 
35  public:
36  size_t global_size[2];
37  size_t local_size[2];
38 
39  KernelDimensions(size_t global_size_[2], size_t local_size_[2])
40  {
41  memcpy(global_size, global_size_, sizeof(global_size));
42  memcpy(local_size, local_size_, sizeof(local_size));
43  }
44 };
45 
47  public:
49  {
50  }
51 
52  /* enqueue the kernel, returns false if there is an error */
53  virtual bool enqueue(const KernelDimensions &dim, device_memory &kg, device_memory &data) = 0;
54 };
55 
57  private:
58  Device *device;
59 
60  SplitKernelFunction *kernel_path_init;
61  SplitKernelFunction *kernel_scene_intersect;
62  SplitKernelFunction *kernel_lamp_emission;
63  SplitKernelFunction *kernel_do_volume;
64  SplitKernelFunction *kernel_queue_enqueue;
65  SplitKernelFunction *kernel_indirect_background;
66  SplitKernelFunction *kernel_shader_setup;
67  SplitKernelFunction *kernel_shader_sort;
68  SplitKernelFunction *kernel_shader_eval;
69  SplitKernelFunction *kernel_holdout_emission_blurring_pathtermination_ao;
70  SplitKernelFunction *kernel_subsurface_scatter;
71  SplitKernelFunction *kernel_direct_lighting;
72  SplitKernelFunction *kernel_shadow_blocked_ao;
73  SplitKernelFunction *kernel_shadow_blocked_dl;
74  SplitKernelFunction *kernel_enqueue_inactive;
75  SplitKernelFunction *kernel_next_iteration_setup;
76  SplitKernelFunction *kernel_indirect_subsurface;
77  SplitKernelFunction *kernel_buffer_update;
78  SplitKernelFunction *kernel_adaptive_stopping;
79  SplitKernelFunction *kernel_adaptive_filter_x;
80  SplitKernelFunction *kernel_adaptive_filter_y;
81  SplitKernelFunction *kernel_adaptive_adjust_samples;
82 
83  /* Global memory variables [porting]; These memory is used for
84  * co-operation between different kernels; Data written by one
85  * kernel will be available to another kernel via this global
86  * memory.
87  */
88  device_only_memory<uchar> split_data;
89  device_vector<uchar> ray_state;
91  queue_index; /* Array of size num_queues that tracks the size of each queue. */
92 
93  /* Flag to make sceneintersect and lampemission kernel use queues. */
94  device_only_memory<char> use_queues_flag;
95 
96  /* Approximate time it takes to complete one sample */
97  double avg_time_per_sample;
98 
99  /* Work pool with respect to each work group. */
100  device_only_memory<unsigned int> work_pool_wgs;
101 
102  /* Cached kernel-dependent data, initialized once. */
103  bool kernel_data_initialized;
104  size_t local_size[2];
105  size_t global_size[2];
106 
107  public:
108  explicit DeviceSplitKernel(Device *device);
109  virtual ~DeviceSplitKernel();
110 
111  bool load_kernels(const DeviceRequestedFeatures &requested_features);
112  bool path_trace(DeviceTask &task,
113  RenderTile &rtile,
114  device_memory &kgbuffer,
116 
119  size_t num_threads) = 0;
122  uint64_t max_buffer_size);
123 
125  RenderTile &rtile,
126  int num_global_elements,
127  device_memory &kernel_globals,
128  device_memory &kernel_data_,
129  device_memory &split_data,
130  device_memory &ray_state,
131  device_memory &queue_index,
132  device_memory &use_queues_flag,
133  device_memory &work_pool_wgs) = 0;
134 
135  virtual SplitKernelFunction *get_split_kernel_function(const string &kernel_name,
136  const DeviceRequestedFeatures &) = 0;
140  DeviceTask &task) = 0;
141 };
142 
144 
145 #endif /* __DEVICE_SPLIT_KERNEL_H__ */
virtual bool enqueue_split_kernel_data_init(const KernelDimensions &dim, RenderTile &rtile, int num_global_elements, device_memory &kernel_globals, device_memory &kernel_data_, device_memory &split_data, device_memory &ray_state, device_memory &queue_index, device_memory &use_queues_flag, device_memory &work_pool_wgs)=0
virtual SplitKernelFunction * get_split_kernel_function(const string &kernel_name, const DeviceRequestedFeatures &)=0
size_t max_elements_for_max_buffer_size(device_memory &kg, device_memory &data, uint64_t max_buffer_size)
virtual int2 split_kernel_local_size()=0
bool load_kernels(const DeviceRequestedFeatures &requested_features)
bool path_trace(DeviceTask &task, RenderTile &rtile, device_memory &kgbuffer, device_memory &kernel_data)
virtual uint64_t state_buffer_size(device_memory &kg, device_memory &data, size_t num_threads)=0
DeviceSplitKernel(Device *device)
virtual int2 split_kernel_global_size(device_memory &kg, device_memory &data, DeviceTask &task)=0
Definition: device.h:293
KernelDimensions(size_t global_size_[2], size_t local_size_[2])
virtual bool enqueue(const KernelDimensions &dim, device_memory &kg, device_memory &data)=0
#define kernel_data
#define CCL_NAMESPACE_END
struct blender::compositor::@172::@174 task
unsigned __int64 uint64_t
Definition: stdint.h:93