Blender V4.3
vk_device.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include "BLI_utility_mixins.hh"
12#include "BLI_vector.hh"
13
16#include "vk_buffer.hh"
17#include "vk_common.hh"
18#include "vk_debug.hh"
21#include "vk_pipeline_pool.hh"
22#include "vk_resource_pool.hh"
23#include "vk_samplers.hh"
24
25namespace blender::gpu {
26class VKBackend;
27
36
42
47 bool shader_output_layer = false;
48
49 struct {
54 bool r8g8b8 = false;
56
63
69};
70
75 static constexpr uint32_t resource_pools_count = 3;
76
77 public:
79 pthread_t thread_id;
87 std::array<VKResourcePool, resource_pools_count> resource_pools;
88
98
99 VKThreadData(VKDevice &device, pthread_t thread_id);
100 void deinit(VKDevice &device);
101
106 {
107 if (resource_pool_index >= resource_pools.size()) {
108 return resource_pools[0];
109 }
111 }
112
115 {
118 }
119 else {
120 resource_pool_index = (resource_pool_index + 1) % resource_pools_count;
121 }
122 }
123};
124
125class VKDevice : public NonCopyable {
126 private:
128 VkInstance vk_instance_ = VK_NULL_HANDLE;
129 VkPhysicalDevice vk_physical_device_ = VK_NULL_HANDLE;
130 VkDevice vk_device_ = VK_NULL_HANDLE;
131 uint32_t vk_queue_family_ = 0;
132 VkQueue vk_queue_ = VK_NULL_HANDLE;
133 std::mutex *queue_mutex_ = nullptr;
134
135 VKSamplers samplers_;
136 VKDescriptorSetLayouts descriptor_set_layouts_;
137
148
150 VmaAllocator mem_allocator_ = VK_NULL_HANDLE;
151
153 VkPhysicalDeviceProperties vk_physical_device_properties_ = {};
154 VkPhysicalDeviceDriverProperties vk_physical_device_driver_properties_ = {};
155 VkPhysicalDeviceMemoryProperties vk_physical_device_memory_properties_ = {};
157 VkPhysicalDeviceFeatures vk_physical_device_features_ = {};
158 VkPhysicalDeviceVulkan11Features vk_physical_device_vulkan_11_features_ = {};
159 VkPhysicalDeviceVulkan12Features vk_physical_device_vulkan_12_features_ = {};
160 Array<VkExtensionProperties> device_extensions_;
161
163 debug::VKDebuggingTools debugging_tools_;
164
165 /* Workarounds */
166 VKWorkarounds workarounds_;
167
168 std::string glsl_patch_;
169 Vector<VKThreadData *> thread_data_;
170
171 public:
177
181 struct {
182 /* Extension: VK_KHR_dynamic_rendering */
183 PFN_vkCmdBeginRendering vkCmdBeginRendering = nullptr;
184 PFN_vkCmdEndRendering vkCmdEndRendering = nullptr;
185
186 /* Extension: VK_EXT_debug_utils */
187 PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabel = nullptr;
188 PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabel = nullptr;
189 PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectName = nullptr;
190 PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessenger = nullptr;
191 PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessenger = nullptr;
193
194 VkPhysicalDevice physical_device_get() const
195 {
196 return vk_physical_device_;
197 }
198
199 const VkPhysicalDeviceProperties &physical_device_properties_get() const
200 {
201 return vk_physical_device_properties_;
202 }
203
204 const VkPhysicalDeviceFeatures &physical_device_features_get() const
205 {
206 return vk_physical_device_features_;
207 }
208
209 const VkPhysicalDeviceVulkan11Features &physical_device_vulkan_11_features_get() const
210 {
211 return vk_physical_device_vulkan_11_features_;
212 }
213
214 const VkPhysicalDeviceVulkan12Features &physical_device_vulkan_12_features_get() const
215 {
216 return vk_physical_device_vulkan_12_features_;
217 }
218
219 VkInstance instance_get() const
220 {
221 return vk_instance_;
222 };
223
224 VkDevice vk_handle() const
225 {
226 return vk_device_;
227 }
228
229 VkQueue queue_get() const
230 {
231 return vk_queue_;
232 }
233 std::mutex &queue_mutex_get()
234 {
235 return *queue_mutex_;
236 }
237
239 {
240 return vk_queue_family_;
241 }
242
243 VmaAllocator mem_allocator_get() const
244 {
245 return mem_allocator_;
246 }
247
249 {
250 return descriptor_set_layouts_;
251 }
252
254 {
255 return debugging_tools_;
256 }
257
259 {
260 return debugging_tools_;
261 }
262
263 const VKSamplers &samplers() const
264 {
265 return samplers_;
266 }
267
268 bool is_initialized() const;
269 void init(void *ghost_context);
270 void reinit();
271 void deinit();
272
275 std::string vendor_name() const;
276 std::string driver_version() const;
277
284 bool supports_extension(const char *extension_name) const;
285
287 {
288 return workarounds_;
289 }
290
291 const char *glsl_patch_get() const;
292 void init_glsl_patch();
293
294 /* -------------------------------------------------------------------- */
302
316
317 void context_register(VKContext &context);
318 void context_unregister(VKContext &context);
320
321 void memory_statistics_get(int *r_total_mem_kb, int *r_free_mem_kb) const;
322 static void debug_print(std::ostream &os, const VKDiscardPool &discard_pool);
323 void debug_print();
324
327 private:
328 void init_physical_device_properties();
329 void init_physical_device_memory_properties();
330 void init_physical_device_features();
331 void init_physical_device_extensions();
332 void init_debug_callbacks();
333 void init_memory_allocator();
337 void init_functions();
338
342 void init_dummy_buffer();
343
344 /* During initialization the backend requires access to update the workarounds. */
345 friend VKBackend;
346};
347
348} // namespace blender::gpu
eGPUDriverType
eGPUDeviceType
void init()
VKPipelinePool pipelines
Definition vk_device.hh:174
render_graph::VKResourceStateTracker resources
Definition vk_device.hh:172
const VkPhysicalDeviceFeatures & physical_device_features_get() const
Definition vk_device.hh:204
PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectName
Definition vk_device.hh:189
VmaAllocator mem_allocator_get() const
Definition vk_device.hh:243
VKDescriptorSetLayouts & descriptor_set_layouts_get()
Definition vk_device.hh:248
VkQueue queue_get() const
Definition vk_device.hh:229
VkDevice vk_handle() const
Definition vk_device.hh:224
bool supports_extension(const char *extension_name) const
Definition vk_device.cc:176
const VkPhysicalDeviceProperties & physical_device_properties_get() const
Definition vk_device.hh:199
const VKSamplers & samplers() const
Definition vk_device.hh:263
std::string vendor_name() const
Definition vk_device.cc:324
std::string driver_version() const
Definition vk_device.cc:351
std::mutex & queue_mutex_get()
Definition vk_device.hh:233
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessenger
Definition vk_device.hh:190
const uint32_t queue_family_get() const
Definition vk_device.hh:238
VKDiscardPool orphaned_data
Definition vk_device.hh:173
debug::VKDebuggingTools & debugging_tools_get()
Definition vk_device.hh:253
VKThreadData & current_thread_data()
Definition vk_device.cc:383
eGPUDriverType driver_type() const
Definition vk_device.cc:298
VKDiscardPool & discard_pool_for_current_thread()
Definition vk_device.cc:399
const char * glsl_patch_get() const
Definition vk_device.cc:250
const debug::VKDebuggingTools & debugging_tools_get() const
Definition vk_device.hh:258
void context_register(VKContext &context)
Definition vk_device.cc:414
bool is_initialized() const
Definition vk_device.cc:70
VkPhysicalDevice physical_device_get() const
Definition vk_device.hh:194
const VKWorkarounds & workarounds_get() const
Definition vk_device.hh:286
PFN_vkCmdEndDebugUtilsLabelEXT vkCmdEndDebugUtilsLabel
Definition vk_device.hh:188
VkInstance instance_get() const
Definition vk_device.hh:219
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessenger
Definition vk_device.hh:191
void context_unregister(VKContext &context)
Definition vk_device.cc:419
const VkPhysicalDeviceVulkan12Features & physical_device_vulkan_12_features_get() const
Definition vk_device.hh:214
PFN_vkCmdBeginDebugUtilsLabelEXT vkCmdBeginDebugUtilsLabel
Definition vk_device.hh:187
void memory_statistics_get(int *r_total_mem_kb, int *r_free_mem_kb) const
Definition vk_device.cc:428
PFN_vkCmdBeginRendering vkCmdBeginRendering
Definition vk_device.hh:183
struct blender::gpu::VKDevice::@670 functions
const VkPhysicalDeviceVulkan11Features & physical_device_vulkan_11_features_get() const
Definition vk_device.hh:209
Span< std::reference_wrapper< VKContext > > contexts_get() const
Definition vk_device.cc:423
PFN_vkCmdEndRendering vkCmdEndRendering
Definition vk_device.hh:184
eGPUDeviceType device_type() const
Definition vk_device.cc:266
std::array< VKResourcePool, resource_pools_count > resource_pools
Definition vk_device.hh:87
VKThreadData(VKDevice &device, pthread_t thread_id)
Definition vk_device.cc:363
VKResourcePool & resource_pool_get()
Definition vk_device.hh:105
void deinit(VKDevice &device)
Definition vk_device.cc:370
unsigned int uint32_t
Definition stdint.h:80
signed int int32_t
Definition stdint.h:77
#define UINT32_MAX
Definition stdint.h:142
struct blender::gpu::VKWorkarounds::@669 vertex_formats