| Line |
Branch |
Exec |
Source |
| 1 |
|
|
// SPDX-License-Identifier: BSD-3-Clause |
| 2 |
|
|
#pragma once |
| 3 |
|
|
|
| 4 |
|
|
#include <cstdint> |
| 5 |
|
|
#include <vector> |
| 6 |
|
|
|
| 7 |
|
|
#include <volk.h> |
| 8 |
|
|
|
| 9 |
|
|
#include "chrono_batch_render/util/version.h" |
| 10 |
|
|
|
| 11 |
|
|
namespace chrono::batch_render::device::vulkan { |
| 12 |
|
|
|
| 13 |
|
|
constexpr Version kMinimumInstanceVersion{1, 3}; |
| 14 |
|
|
|
| 15 |
|
|
inline constexpr const char* kSurfaceExtensions[] = { |
| 16 |
|
|
VK_KHR_SURFACE_EXTENSION_NAME, "VK_KHR_xlib_surface", "VK_KHR_xcb_surface", |
| 17 |
|
|
"VK_KHR_wayland_surface", "VK_KHR_win32_surface", "VK_EXT_metal_surface"}; |
| 18 |
|
|
|
| 19 |
|
95 |
constexpr Version DecodeVersion(uint32_t packed) { |
| 20 |
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✓ Branch 1 taken 42 times.
|
95 |
return {int(packed >> 22 & 0x7f), int(packed >> 12 & 0x3ff), int(packed & 0xfff)}; |
| 21 |
|
|
} |
| 22 |
|
|
|
| 23 |
|
|
struct Api { |
| 24 |
|
|
Version instanceVersion; |
| 25 |
|
|
}; |
| 26 |
|
|
|
| 27 |
|
343 |
template <class T, class Count = uint32_t, class Query> std::vector<T> Enumerate(Query query) { |
| 28 |
|
343 |
Count count = 0; |
| 29 |
|
343 |
query(&count, static_cast<T*>(nullptr)); |
| 30 |
5/5
std::vector<VkExtensionProperties, std::allocator<VkExtensionProperties> > chrono::batch_render::device::vulkan::Enumerate<VkExtensionProperties, unsigned int, chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}>(chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}):
✓ Branch 2 taken 137 times.
std::vector<VkPhysicalDevice_T*, std::allocator<VkPhysicalDevice_T*> > chrono::batch_render::device::vulkan::Enumerate<VkPhysicalDevice_T*, unsigned int, chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}>(chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}):
✓ Branch 2 taken 62 times.
std::vector<VkQueueFamilyProperties, std::allocator<VkQueueFamilyProperties> > chrono::batch_render::device::vulkan::Enumerate<VkQueueFamilyProperties, unsigned int, chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}>(chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}):
✓ Branch 2 taken 104 times.
std::vector<VkTimeDomainKHR, std::allocator<VkTimeDomainKHR> > chrono::batch_render::device::vulkan::Enumerate<VkTimeDomainKHR, unsigned int, chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}>(chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}):
✓ Branch 2 taken 20 times.
std::vector<char, std::allocator<char> > chrono::batch_render::device::vulkan::Enumerate<char, unsigned long, chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}>(chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}):
✓ Branch 2 taken 20 times.
|
343 |
std::vector<T> items(count); |
| 31 |
5/6
std::vector<VkExtensionProperties, std::allocator<VkExtensionProperties> > chrono::batch_render::device::vulkan::Enumerate<VkExtensionProperties, unsigned int, chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}>(chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}):
✓ Branch 1 taken 137 times.
std::vector<VkLayerProperties, std::allocator<VkLayerProperties> > chrono::batch_render::device::vulkan::Enumerate<VkLayerProperties, unsigned int, VkResult (*)(unsigned int*, VkLayerProperties*)>(VkResult (*)(unsigned int*, VkLayerProperties*)):
✗ Branch 1 not taken.
std::vector<VkPhysicalDevice_T*, std::allocator<VkPhysicalDevice_T*> > chrono::batch_render::device::vulkan::Enumerate<VkPhysicalDevice_T*, unsigned int, chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}>(chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}):
✓ Branch 1 taken 62 times.
std::vector<VkQueueFamilyProperties, std::allocator<VkQueueFamilyProperties> > chrono::batch_render::device::vulkan::Enumerate<VkQueueFamilyProperties, unsigned int, chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}>(chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}):
✓ Branch 1 taken 104 times.
std::vector<VkTimeDomainKHR, std::allocator<VkTimeDomainKHR> > chrono::batch_render::device::vulkan::Enumerate<VkTimeDomainKHR, unsigned int, chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}>(chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}):
✓ Branch 1 taken 20 times.
std::vector<char, std::allocator<char> > chrono::batch_render::device::vulkan::Enumerate<char, unsigned long, chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}>(chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}):
✓ Branch 1 taken 20 times.
|
343 |
query(&count, items.data()); |
| 32 |
5/6
std::vector<VkExtensionProperties, std::allocator<VkExtensionProperties> > chrono::batch_render::device::vulkan::Enumerate<VkExtensionProperties, unsigned int, chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}>(chrono::batch_render::device::vulkan::Extensions::Extensions(VkPhysicalDevice_T*)::{lambda(unsigned int*, VkExtensionProperties*)#1}):
✓ Branch 1 taken 137 times.
std::vector<VkLayerProperties, std::allocator<VkLayerProperties> > chrono::batch_render::device::vulkan::Enumerate<VkLayerProperties, unsigned int, VkResult (*)(unsigned int*, VkLayerProperties*)>(VkResult (*)(unsigned int*, VkLayerProperties*)):
✗ Branch 1 not taken.
std::vector<VkPhysicalDevice_T*, std::allocator<VkPhysicalDevice_T*> > chrono::batch_render::device::vulkan::Enumerate<VkPhysicalDevice_T*, unsigned int, chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}>(chrono::batch_render::device::vulkan::PhysicalDevices(VkInstance_T*)::{lambda(unsigned int*, VkPhysicalDevice_T**)#1}):
✓ Branch 1 taken 62 times.
std::vector<VkQueueFamilyProperties, std::allocator<VkQueueFamilyProperties> > chrono::batch_render::device::vulkan::Enumerate<VkQueueFamilyProperties, unsigned int, chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}>(chrono::batch_render::device::vulkan::ComputeQueueFamily(VkPhysicalDevice_T*, unsigned int)::{lambda(unsigned int*, VkQueueFamilyProperties*)#1}):
✓ Branch 1 taken 104 times.
std::vector<VkTimeDomainKHR, std::allocator<VkTimeDomainKHR> > chrono::batch_render::device::vulkan::Enumerate<VkTimeDomainKHR, unsigned int, chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}>(chrono::batch_render::device::vulkan::(anonymous namespace)::CalibratedTimestampsExtension(VkPhysicalDevice_T*, chrono::batch_render::device::vulkan::Extensions const&)::{lambda(unsigned int*, VkTimeDomainKHR*)#1}):
✓ Branch 1 taken 20 times.
std::vector<char, std::allocator<char> > chrono::batch_render::device::vulkan::Enumerate<char, unsigned long, chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}>(chrono::batch_render::device::vulkan::VulkanDevice::Destroy()::{lambda(unsigned long*, char*)#1}):
✓ Branch 1 taken 20 times.
|
343 |
items.resize(count); |
| 33 |
|
343 |
return items; |
| 34 |
|
✗ |
} |
| 35 |
|
|
|
| 36 |
|
|
bool Available(); |
| 37 |
|
|
|
| 38 |
|
|
const Api& GetApi(); |
| 39 |
|
|
|
| 40 |
|
|
const char* ResultName(VkResult result); |
| 41 |
|
|
|
| 42 |
|
|
void Check(VkResult result, const char* what); |
| 43 |
|
|
|
| 44 |
3/3
<unknown function 19>:
✓ Branch 2 taken 42 times.
<unknown function 27>:
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 2 times.
|
137 |
class Extensions { |
| 45 |
|
|
public: |
| 46 |
|
|
explicit Extensions(VkPhysicalDevice device = VK_NULL_HANDLE); |
| 47 |
|
|
bool Has(const char* name) const; |
| 48 |
|
|
|
| 49 |
|
|
private: |
| 50 |
|
|
std::vector<VkExtensionProperties> m_extensions; |
| 51 |
|
|
}; |
| 52 |
|
|
|
| 53 |
|
|
VkInstance Instance(bool validation); |
| 54 |
|
|
|
| 55 |
|
|
struct Creator; |
| 56 |
|
|
|
| 57 |
|
|
class OwnedInstance { |
| 58 |
|
|
public: |
| 59 |
1/1
✓ Branch 1 taken 18 times.
|
38 |
OwnedInstance() = default; |
| 60 |
|
|
|
| 61 |
|
2 |
OwnedInstance(VkInstance instance, VkDebugUtilsMessengerEXT messenger) |
| 62 |
|
2 |
: m_instance(instance), m_messenger(messenger) {} |
| 63 |
|
|
|
| 64 |
|
|
OwnedInstance(OwnedInstance&& other) noexcept; |
| 65 |
|
|
OwnedInstance& operator=(OwnedInstance&& other) noexcept; |
| 66 |
|
|
~OwnedInstance(); |
| 67 |
|
|
|
| 68 |
|
41 |
VkInstance Get() const { |
| 69 |
5/5
<unknown function 27>:
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 18 times.
<unknown function 59>:
✓ Branch 1 taken 1 time.
|
41 |
return m_instance; |
| 70 |
|
|
} |
| 71 |
|
|
|
| 72 |
|
|
private: |
| 73 |
|
|
void Destroy() noexcept; |
| 74 |
|
|
|
| 75 |
|
|
VkInstance m_instance = VK_NULL_HANDLE; |
| 76 |
|
|
VkDebugUtilsMessengerEXT m_messenger = VK_NULL_HANDLE; |
| 77 |
|
|
}; |
| 78 |
|
|
|
| 79 |
|
|
OwnedInstance CreateInstance(bool validation, const Creator& creator); |
| 80 |
|
|
|
| 81 |
|
|
bool ValidationEnabled(); |
| 82 |
|
|
|
| 83 |
|
|
uint64_t ValidationMessageCount(); |
| 84 |
|
|
|
| 85 |
|
|
std::vector<VkPhysicalDevice> PhysicalDevices(VkInstance instance); |
| 86 |
|
|
|
| 87 |
|
|
void LoadDeviceFunctions(VolkDeviceTable& functions, VkDevice device); |
| 88 |
|
|
|
| 89 |
|
|
} |
| 90 |
|
|
|