summaryrefslogtreecommitdiff
path: root/src/vk/queue_family.cpp
diff options
context:
space:
mode:
authorFrederico Linhares <fred@linhares.blue>2022-08-02 16:52:33 -0300
committerFrederico Linhares <fred@linhares.blue>2022-08-02 16:52:33 -0300
commitf88712a929ee3543f8e1d45c6071f676df339cdb (patch)
treead4c9272ead49eb205b1c655bb1d878654863e26 /src/vk/queue_family.cpp
parent9c6a166fa2b00a1ab177d9e9216a839b87e36ca7 (diff)
refa Use Vulkan for graphics
This is a partial refactory. Some functionalities implemented in SDL were removed and need reimplementation.
Diffstat (limited to 'src/vk/queue_family.cpp')
-rw-r--r--src/vk/queue_family.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/vk/queue_family.cpp b/src/vk/queue_family.cpp
new file mode 100644
index 0000000..7c91ba2
--- /dev/null
+++ b/src/vk/queue_family.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2022 Frederico de Oliveira Linhares
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "queue_family.hpp"
+
+#include <iostream>
+
+#include "../core.hpp"
+
+namespace VK
+{
+
+QueueFamily::QueueFamily(
+ VK::Device *device, uint32_t family_index,
+ const VkQueueFamilyProperties &queue_family_properties):
+ queue_mutex{}
+{
+
+#ifdef DEBUG
+ std::cout << "Queue quantity: " << queue_family_properties.queueCount <<
+ std::endl;
+ std::cout << "Graphics: " <<
+ (queue_family_properties.queueFlags & VK_QUEUE_GRAPHICS_BIT ?
+ "true" : "false") << std::endl;
+ std::cout << "Compute: " <<
+ (queue_family_properties.queueFlags & VK_QUEUE_COMPUTE_BIT ?
+ "true" : "false") << std::endl;
+ std::cout << "Transfer: " <<
+ (queue_family_properties.queueFlags & VK_QUEUE_TRANSFER_BIT ?
+ "true" : "false") << std::endl;
+ std::cout << "Sparse Binding: " <<
+ (queue_family_properties.queueFlags & VK_QUEUE_SPARSE_BINDING_BIT ?
+ "true" : "false") << std::endl;
+#endif
+
+ this->device = device;
+ this->family_index = family_index;
+ this->family_properties = queue_family_properties;
+
+ // Create queues
+ {
+ auto queue_count = this->family_properties.queueCount;
+ this->queue_states.resize(queue_count);
+
+ for(auto i{0}; i < queue_count; i++)
+ {
+ vkGetDeviceQueue(device->device, this->family_index, i,
+ &this->queue_states[i].queue);
+ if(this->queue_states[i].queue == VK_NULL_HANDLE)
+ throw std::runtime_error("Failed to get Vulkan queue.");
+ }
+ }
+}
+
+Queue
+QueueFamily::get_queue()
+{
+ std::unique_lock<std::mutex> lock{this->queue_mutex};
+
+ for(auto i{0}; i < this->queue_states.size(); i++)
+ if(!this->queue_states[i].busy)
+ return Queue(this, this->queue_states[i].queue, i);
+
+ throw std::length_error("No free queues found.");
+}
+
+}