VapourSynth-llvmexpr
Loading...
Searching...
No Matches
vkexpr::VulkanContext Class Reference

#include <llvmexpr/runtime/vulkan/VulkanContext.hpp>

Public Member Functions

 VulkanContext (int device_id=-1)
 ~VulkanContext ()
 VulkanContext (const VulkanContext &)=delete
VulkanContextoperator= (const VulkanContext &)=delete
 VulkanContext (VulkanContext &&)=delete
VulkanContextoperator= (VulkanContext &&)=delete
vk::raii::Context & getContext ()
vk::raii::Instance & getInstanceRef ()
vk::raii::PhysicalDevice & getPhysicalDevice ()
vk::raii::Device & getDevice ()
vk::raii::Queue & getComputeQueue ()
uint32_t getQueueFamilyIndex () const
void submit (const vk::SubmitInfo &submit_info, const vk::Fence &fence)
void waitIdle ()

Static Public Member Functions

static VulkanContextgetInstance ()
static VulkanContextgetInstance (int device_id)

Detailed Description

Definition at line 36 of file VulkanContext.hpp.

Constructor & Destructor Documentation

◆ VulkanContext() [1/3]

vkexpr::VulkanContext::VulkanContext ( int device_id = -1)
explicit

Definition at line 100 of file VulkanContext.cpp.

101 : device_id(device_id), instance(nullptr) {
102
103 createInstance();
104 // Re-load volk with the instance
105 volkLoadInstance(*instance);
106
107 pickPhysicalDevice();
108 createDevice();
109}

Referenced by getInstance(), getInstance(), operator=(), operator=(), VulkanContext(), and VulkanContext().

◆ ~VulkanContext()

vkexpr::VulkanContext::~VulkanContext ( )

Definition at line 111 of file VulkanContext.cpp.

111 {
112 try {
113 waitIdle();
114 } catch (...) {
115 }
116}

References waitIdle().

◆ VulkanContext() [2/3]

vkexpr::VulkanContext::VulkanContext ( const VulkanContext & )
delete

References VulkanContext().

◆ VulkanContext() [3/3]

vkexpr::VulkanContext::VulkanContext ( VulkanContext && )
delete

References VulkanContext().

Member Function Documentation

◆ getComputeQueue()

vk::raii::Queue & vkexpr::VulkanContext::getComputeQueue ( )
inline

Definition at line 53 of file VulkanContext.hpp.

53{ return compute_queue; }

◆ getContext()

vk::raii::Context & vkexpr::VulkanContext::getContext ( )
inline

Definition at line 49 of file VulkanContext.hpp.

49{ return context; }

◆ getDevice()

vk::raii::Device & vkexpr::VulkanContext::getDevice ( )
inline

Definition at line 52 of file VulkanContext.hpp.

52{ return device; }

◆ getInstance() [1/2]

VulkanContext & vkexpr::VulkanContext::getInstance ( )
static

Definition at line 65 of file VulkanContext.cpp.

65{ return getInstance(-1); }
static VulkanContext & getInstance()

References getInstance(), and VulkanContext().

Referenced by getInstance().

◆ getInstance() [2/2]

VulkanContext & vkexpr::VulkanContext::getInstance ( int device_id)
static

Definition at line 67 of file VulkanContext.cpp.

67 {
68 static bool initialized = []() { return volkInitialize() == VK_SUCCESS; }();
69 if (!initialized) {
70 throw std::runtime_error("Failed to initialize volk");
71 }
72
73 struct NoDestroy {
74 void operator()(VulkanContext* /*ptr*/) const {}
75 };
76 using ContextPtr = std::unique_ptr<VulkanContext, NoDestroy>;
77
78 static std::mutex context_mutex;
79 static std::unordered_map<int, ContextPtr> contexts;
80
81 int key = device_id;
82 if (key < 0) {
83 key = -1;
84 }
85
86 std::lock_guard<std::mutex> lock(context_mutex);
87 auto it = contexts.find(key);
88 if (it != contexts.end()) {
89 return *it->second;
90 }
91
92 auto created = std::make_unique<VulkanContext>(key);
93 VulkanContext& ref = *created;
94
95 // Leaky Singleton
96 contexts.emplace(key, ContextPtr(created.release()));
97 return ref;
98}
VulkanContext(int device_id=-1)

References VulkanContext().

◆ getInstanceRef()

vk::raii::Instance & vkexpr::VulkanContext::getInstanceRef ( )
inline

Definition at line 50 of file VulkanContext.hpp.

50{ return instance; }

◆ getPhysicalDevice()

vk::raii::PhysicalDevice & vkexpr::VulkanContext::getPhysicalDevice ( )
inline

Definition at line 51 of file VulkanContext.hpp.

51{ return physical_device; }

◆ getQueueFamilyIndex()

uint32_t vkexpr::VulkanContext::getQueueFamilyIndex ( ) const
inlinenodiscard

Definition at line 54 of file VulkanContext.hpp.

54 {
55 return queue_family_index;
56 }

◆ operator=() [1/2]

VulkanContext & vkexpr::VulkanContext::operator= ( const VulkanContext & )
delete

References VulkanContext().

◆ operator=() [2/2]

VulkanContext & vkexpr::VulkanContext::operator= ( VulkanContext && )
delete

References VulkanContext().

◆ submit()

void vkexpr::VulkanContext::submit ( const vk::SubmitInfo & submit_info,
const vk::Fence & fence )

Definition at line 249 of file VulkanContext.cpp.

250 {
251 std::lock_guard<std::mutex> lock(queue_mutex);
252 compute_queue.submit(submit_info, fence);
253}

◆ waitIdle()

void vkexpr::VulkanContext::waitIdle ( )

Definition at line 255 of file VulkanContext.cpp.

255 {
256 if (!*device) {
257 return;
258 }
259 std::lock_guard<std::mutex> lock(queue_mutex);
260 device.waitIdle();
261}

Referenced by ~VulkanContext().


The documentation for this class was generated from the following files: