38 " - [%c] shader output viewport index\n"
39 " - [%c] shader output layer\n"
40 " - [%c] fragment shader barycentric\n"
41 " - [%c] wide lines\n"
43 " - [%c] descriptor buffer\n"
44 " - [%c] dynamic rendering local read\n"
45 " - [%c] dynamic rendering unused attachments\n"
46 " - [%c] external memory\n"
47 " - [%c] maintenance4\n"
48 " - [%c] memory priority\n"
49 " - [%c] pageable device local memory\n"
50 " - [%c] shader stencil export",
77 deinit_submission_pool();
86 while (!thread_data_.is_empty()) {
94 descriptor_set_layouts_.deinit();
96 mem_allocator_ = VK_NULL_HANDLE;
98 while (!render_graphs_.is_empty()) {
103 debugging_tools_.deinit(vk_instance_);
105 vk_instance_ = VK_NULL_HANDLE;
106 vk_physical_device_ = VK_NULL_HANDLE;
107 vk_device_ = VK_NULL_HANDLE;
108 vk_queue_family_ = 0;
109 vk_queue_ = VK_NULL_HANDLE;
110 vk_physical_device_properties_ = {};
111 glsl_vert_patch_.clear();
112 glsl_frag_patch_.clear();
113 glsl_geom_patch_.clear();
114 glsl_comp_patch_.clear();
115 is_initialized_ =
false;
121 GHOST_VulkanHandles
handles = {};
122 GHOST_GetVulkanHandles((GHOST_ContextHandle)ghost_context, &
handles);
123 vk_instance_ =
handles.instance;
124 vk_physical_device_ =
handles.physical_device;
126 vk_queue_family_ =
handles.graphic_queue_family;
128 mem_allocator_ =
handles.vma_allocator;
129 queue_mutex_ =
static_cast<std::mutex *
>(
handles.queue_mutex);
131 init_physical_device_extensions();
132 init_physical_device_properties();
133 init_physical_device_memory_properties();
134 init_physical_device_features();
138 init_debug_callbacks();
149 resources.use_dynamic_rendering_local_read = extensions_.dynamic_rendering_local_read;
152 init_submission_pool();
153 is_initialized_ =
true;
156void VKDevice::init_functions()
158#define LOAD_FUNCTION(name) (PFN_##name) vkGetInstanceProcAddr(vk_instance_, STRINGIFY(name))
174#elif not defined(__APPLE__)
183 vkGetDescriptorSetLayoutBindingOffsetEXT);
191void VKDevice::init_debug_callbacks()
193 debugging_tools_.
init(vk_instance_);
196void VKDevice::init_physical_device_properties()
198 BLI_assert(vk_physical_device_ != VK_NULL_HANDLE);
200 VkPhysicalDeviceProperties2 vk_physical_device_properties = {};
201 vk_physical_device_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
202 vk_physical_device_driver_properties_.sType =
203 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES;
204 vk_physical_device_id_properties_.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
205 vk_physical_device_properties.pNext = &vk_physical_device_driver_properties_;
206 vk_physical_device_driver_properties_.pNext = &vk_physical_device_id_properties_;
209 vk_physical_device_descriptor_buffer_properties_ = {
210 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_PROPERTIES_EXT};
211 vk_physical_device_descriptor_buffer_properties_.pNext =
212 vk_physical_device_driver_properties_.pNext;
213 vk_physical_device_driver_properties_.pNext =
214 &vk_physical_device_descriptor_buffer_properties_;
218 vk_physical_device_maintenance4_properties_.pNext = vk_physical_device_properties.pNext;
219 vk_physical_device_properties.pNext = &vk_physical_device_maintenance4_properties_;
222 vkGetPhysicalDeviceProperties2(vk_physical_device_, &vk_physical_device_properties);
223 vk_physical_device_properties_ = vk_physical_device_properties.properties;
226void VKDevice::init_physical_device_memory_properties()
228 BLI_assert(vk_physical_device_ != VK_NULL_HANDLE);
229 vkGetPhysicalDeviceMemoryProperties(vk_physical_device_, &vk_physical_device_memory_properties_);
232void VKDevice::init_physical_device_features()
234 BLI_assert(vk_physical_device_ != VK_NULL_HANDLE);
236 VkPhysicalDeviceFeatures2 features = {};
237 features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
238 vk_physical_device_vulkan_11_features_.sType =
239 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
240 vk_physical_device_vulkan_12_features_.sType =
241 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES;
243 features.pNext = &vk_physical_device_vulkan_11_features_;
244 vk_physical_device_vulkan_11_features_.pNext = &vk_physical_device_vulkan_12_features_;
246 vkGetPhysicalDeviceFeatures2(vk_physical_device_, &features);
247 vk_physical_device_features_ = features.features;
250void VKDevice::init_physical_device_extensions()
253 vkEnumerateDeviceExtensionProperties(vk_physical_device_,
nullptr, &
count,
nullptr);
254 device_extensions_ = Array<VkExtensionProperties>(
count);
255 vkEnumerateDeviceExtensionProperties(
256 vk_physical_device_,
nullptr, &
count, device_extensions_.data());
261 for (
const VkExtensionProperties &vk_extension_properties : device_extensions_) {
262 if (
STREQ(vk_extension_properties.extensionName, extension_name)) {
269void VKDevice::init_dummy_buffer()
272 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
273 VMA_MEMORY_USAGE_AUTO_PREFER_HOST,
274 VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT,
279 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
285 std::stringstream ss;
287 ss <<
"#version 450\n";
290 ss <<
"#extension GL_ARB_shader_draw_parameters : enable\n";
291 ss <<
"#define GPU_ARB_shader_draw_parameters\n";
292 ss <<
"#define gpu_BaseInstance (gl_BaseInstanceARB)\n";
294 ss <<
"#define GPU_ARB_clip_control\n";
296 ss <<
"#define gl_VertexID gl_VertexIndex\n";
297 ss <<
"#define gpu_InstanceIndex (gl_InstanceIndex)\n";
298 ss <<
"#define gl_InstanceID (gpu_InstanceIndex - gpu_BaseInstance)\n";
300 ss <<
"#extension GL_ARB_shader_viewport_layer_array: enable\n";
302 ss <<
"#extension GL_ARB_shader_stencil_export: enable\n";
303 ss <<
"#define GPU_ARB_shader_stencil_export 1\n";
305 if (extensions_.fragment_shader_barycentric) {
306 ss <<
"#extension GL_EXT_fragment_shader_barycentric : require\n";
307 ss <<
"#define gpu_BaryCoord gl_BaryCoordEXT\n";
308 ss <<
"#define gpu_BaryCoordNoPersp gl_BaryCoordNoPerspEXT\n";
318 return fmt::to_string(fmt::join(
319 gpu_shader_dependency_get_resolved_source(
"gpu_shader_compat_glsl.glsl", sources),
""));
325 return fmt::to_string(fmt::join(
326 gpu_shader_dependency_get_resolved_source(
"gpu_shader_compat_glsl.glsl", sources),
""));
332 return fmt::to_string(fmt::join(
333 gpu_shader_dependency_get_resolved_source(
"gpu_shader_compat_glsl.glsl", sources),
""));
339 return fmt::to_string(fmt::join(
340 gpu_shader_dependency_get_resolved_source(
"gpu_shader_compat_glsl.glsl", sources),
""));
355 switch (vk_physical_device_driver_properties_.driverID) {
356 case VK_DRIVER_ID_AMD_PROPRIETARY:
357 case VK_DRIVER_ID_AMD_OPEN_SOURCE:
358 case VK_DRIVER_ID_MESA_RADV:
361 case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
362 case VK_DRIVER_ID_MESA_NVK:
365 case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
366 case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA:
369 case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
372 case VK_DRIVER_ID_MOLTENVK:
375 case VK_DRIVER_ID_MESA_LLVMPIPE:
387 switch (vk_physical_device_driver_properties_.driverID) {
388 case VK_DRIVER_ID_AMD_PROPRIETARY:
389 case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS:
390 case VK_DRIVER_ID_NVIDIA_PROPRIETARY:
391 case VK_DRIVER_ID_QUALCOMM_PROPRIETARY:
394 case VK_DRIVER_ID_MOLTENVK:
395 case VK_DRIVER_ID_AMD_OPEN_SOURCE:
396 case VK_DRIVER_ID_MESA_RADV:
397 case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA:
398 case VK_DRIVER_ID_MESA_NVK:
401 case VK_DRIVER_ID_MESA_LLVMPIPE:
414 if (vk_physical_device_properties_.vendorID < 0x10000) {
415 switch (vk_physical_device_properties_.vendorID) {
418 return "Advanced Micro Devices";
420 return "NVIDIA Corporation";
422 return "Intel Corporation";
426 return std::to_string(vk_physical_device_properties_.vendorID);
434 return std::to_string(vk_physical_device_properties_.vendorID);
440 return StringRefNull(vk_physical_device_driver_properties_.driverName) +
" " +
441 StringRefNull(vk_physical_device_driver_properties_.driverInfo);
464 pthread_t current_thread_id = pthread_self();
467 if (pthread_equal(thread_data->thread_id, current_thread_id)) {
473 thread_data_.append(thread_data);
479 contexts_.append(std::reference_wrapper(context));
484 if (context.render_graph_.has_value()) {
486 context.render_graph_.reset();
488 "Unregistering a context that still has an unsubmitted render graph.");
495 orphaned_data.move_data(context.discard_pool, timeline_value_ + 1);
498 contexts_.remove(contexts_.first_index_of(std::reference_wrapper(context)));
507 VmaBudget budgets[VK_MAX_MEMORY_HEAPS];
509 VkDeviceSize total_mem = 0;
510 VkDeviceSize used_mem = 0;
512 for (
int memory_heap_index :
IndexRange(vk_physical_device_memory_properties_.memoryHeapCount)) {
513 const VkMemoryHeap &memory_heap =
514 vk_physical_device_memory_properties_.memoryHeaps[memory_heap_index];
515 const VmaBudget &budget = budgets[memory_heap_index];
518 if (!
bool(memory_heap.flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)) {
522 total_mem += memory_heap.size;
523 used_mem += budget.usage;
526 *r_total_mem_kb = int(total_mem / 1024);
527 *r_free_mem_kb = int((total_mem - used_mem) / 1024);
539 discard_pool.image_views_.
is_empty() && discard_pool.buffer_views_.
is_empty() &&
540 discard_pool.shader_modules_.
is_empty() && discard_pool.pipeline_layouts_.
is_empty() &&
541 discard_pool.descriptor_pools_.is_empty())
545 os <<
" Discardable resources: ";
546 if (!discard_pool.images_.
is_empty()) {
547 os <<
"VkImage=" << discard_pool.images_.
size() <<
" ";
549 if (!discard_pool.image_views_.
is_empty()) {
550 os <<
"VkImageView=" << discard_pool.image_views_.
size() <<
" ";
552 if (!discard_pool.buffers_.
is_empty()) {
553 os <<
"VkBuffer=" << discard_pool.buffers_.
size() <<
" ";
555 if (!discard_pool.buffer_views_.
is_empty()) {
556 os <<
"VkBufferViews=" << discard_pool.buffer_views_.
size() <<
" ";
558 if (!discard_pool.shader_modules_.
is_empty()) {
559 os <<
"VkShaderModule=" << discard_pool.shader_modules_.
size() <<
" ";
561 if (!discard_pool.pipeline_layouts_.
is_empty()) {
562 os <<
"VkPipelineLayout=" << discard_pool.pipeline_layouts_.
size() <<
" ";
564 if (!discard_pool.descriptor_pools_.is_empty()) {
565 os <<
"VkDescriptorPool=" << discard_pool.descriptor_pools_.size();
573 "VKDevice::debug_print can only be called from the main thread.");
576 std::ostream &os = std::cout;
578 os <<
" Graphics: " <<
pipelines.graphic_pipelines_.size() <<
"\n";
579 os <<
" Compute: " <<
pipelines.compute_pipelines_.size() <<
"\n";
580 os <<
"Descriptor sets\n";
581 os <<
" VkDescriptorSetLayouts: " << descriptor_set_layouts_.size() <<
"\n";
585 const bool is_main = pthread_equal(thread_data->thread_id, pthread_self());
586 os <<
"ThreadData" << (is_main ?
" (main-thread)" :
"") <<
")\n";
587 os <<
" Rendering_depth: " << thread_data->rendering_depth <<
"\n";
589 os <<
"Discard pool\n";
591 os <<
"Discard pool (render)\n";
595 for (
const std::reference_wrapper<VKContext> &context : contexts_) {
596 os <<
" VKContext \n";
603 os <<
"\nMemory: total=" << total_mem_kb <<
", free=" << free_mem_kb <<
"\n";
#define BLI_assert_msg(a, msg)
@ BLI_THREAD_QUEUE_WORK_PRIORITY_NORMAL
uint64_t BLI_thread_queue_push(ThreadQueue *queue, void *work, ThreadQueueWorkPriority priority)
int BLI_thread_is_main(void)
#define CLOG_DEBUG(clg_ref,...)
GHOST C-API function and type declarations.
bool GPU_stencil_export_support()
#define GPU_SHADER_FREE_SAFE(shader)
BMesh const char void * data
static void capabilities_init(VKDevice &device)
static void platform_init(const VKDevice &device)
void update_immediately(const void *data) const
VkBuffer vk_handle() const
bool create(size_t size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage vma_memory_usage, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
void init(void *ghost_context)
render_graph::VKResourceStateTracker resources
GPUDriverType driver_type() const
VmaAllocator mem_allocator_get() const
VkDevice vk_handle() const
bool supports_extension(const char *extension_name) const
std::string vendor_name() const
std::string driver_version() const
std::string glsl_fragment_patch_get() const
VKDiscardPool orphaned_data
GPUDeviceType device_type() const
VKThreadData & current_thread_data()
void context_register(VKContext &context)
bool is_initialized() const
shader::GeneratedSource extensions_define(StringRefNull stage_define) const
std::string glsl_vertex_patch_get() const
void context_unregister(VKContext &context)
void memory_statistics_get(int *r_total_mem_kb, int *r_free_mem_kb) const
std::string glsl_geometry_patch_get() const
std::string glsl_compute_patch_get() const
Span< std::reference_wrapper< VKContext > > contexts_get() const
struct blender::gpu::VKDevice::@152120360333013146246346216002113345357100126073 functions
VKDiscardPool orphaned_data_render
VKThreadData(VKDevice &device, pthread_t thread_id)
VKDescriptorPools descriptor_pools
void object_label(GLenum type, GLuint object, const char *name)
Vector< shader::GeneratedSource, 0 > GeneratedSourceList
constexpr int32_t PCI_ID_NVIDIA
constexpr int32_t PCI_ID_INTEL
constexpr int32_t PCI_ID_ATI
constexpr int32_t PCI_ID_AMD
constexpr int32_t PCI_ID_APPLE
MatBase< float, 4, 4 > float4x4
bool dynamic_rendering_unused_attachments
bool fragment_shader_barycentric
bool pageable_device_local_memory
bool dynamic_rendering_local_read
bool shader_output_viewport_index
#define LOAD_FUNCTION(name)