diff --git a/liblava/base/device.cpp b/liblava/base/device.cpp index 1e37a26e2bb283b60c7db2711b0228ce0aae7de7..9b7861b6aa5f8ac0686128e33c79d86968370c7c 100644 --- a/liblava/base/device.cpp +++ b/liblava/base/device.cpp @@ -20,50 +20,53 @@ namespace lava { return lava::add_dedicated_queues(queue_family_infos, physical_device->get_queue_family_properties(), priority); } - queue_verify_result device::create_param::verify_queues() const { + verify_queues_result device::create_param::verify_queues() const { return lava::verify_queues(queue_family_infos, physical_device->get_queue_family_properties()); } + void log_verify_queues_failed(verify_queues_result result) { + switch (result) { + case verify_queues_result::empty_list: { + log()->error("create device - verify queues - param with empty list"); + break; + } + case verify_queues_result::no_properties: { + log()->error("create device - verify queues - no device family properties"); + break; + } + case verify_queues_result::duplicate_family_index: { + log()->error("create device - verify queues - duplicate family index"); + break; + } + case verify_queues_result::no_family_index: { + log()->error("create device - verify queues - family index is not available"); + break; + } + case verify_queues_result::no_queues: { + log()->error("create device - verify queues - undefined queues in family"); + break; + } + case verify_queues_result::too_many_queues: { + log()->error("create device - verify queues - number of queues is incorrect"); + break; + } + case verify_queues_result::no_compatible_flags: { + log()->error("create device - verify queues - no compatible flags in queue"); + break; + } + default: + log()->error("create device - verify queues"); + } + } + bool device::create(create_param::ref param) { physical_device = param.physical_device; if (!physical_device) return false; auto verify_result = param.verify_queues(); - if (verify_result != queue_verify_result::ok) { - switch (verify_result) { - case queue_verify_result::empty_list: { - log()->error("create device - verify queues - param with empty list"); - break; - } - case queue_verify_result::no_properties: { - log()->error("create device - verify queues - no device family properties"); - break; - } - case queue_verify_result::duplicate_family_index: { - log()->error("create device - verify queues - duplicate family index"); - break; - } - case queue_verify_result::no_family_index: { - log()->error("create device - verify queues - family index is not available"); - break; - } - case queue_verify_result::no_queues: { - log()->error("create device - verify queues - undefined queues in family"); - break; - } - case queue_verify_result::too_many_queues: { - log()->error("create device - verify queues - number of queues is incorrect"); - break; - } - case queue_verify_result::no_compatible_flags: { - log()->error("create device - verify queues - no compatible flags in queue"); - break; - } - default: - log()->error("create device - verify queues"); - } - + if (verify_result != verify_queues_result::ok) { + log_verify_queues_failed(verify_result); return false; } diff --git a/liblava/base/device.hpp b/liblava/base/device.hpp index abc96daee5f5886b76bbdc44f24579ebcfa78b78..ecff605d5e9c6d41a8f0c399e0ce0e1139de8890 100644 --- a/liblava/base/device.hpp +++ b/liblava/base/device.hpp @@ -46,7 +46,7 @@ namespace lava { bool add_dedicated_queues(r32 priority = 1.f); - queue_verify_result verify_queues() const; + verify_queues_result verify_queues() const; }; ~device() { diff --git a/liblava/base/queue.cpp b/liblava/base/queue.cpp index 7fc13314f512cce59ded73ec01de95fcd4c4dd58..5aa7c0f3554e5f9ae36ef33e4c220ed3335de0ea 100644 --- a/liblava/base/queue.cpp +++ b/liblava/base/queue.cpp @@ -17,11 +17,14 @@ namespace lava { list.clear(); for (auto& queue_family : properties) { - queue_family_info info; - info.family_index = list.size(); - for (auto queue_count = 0; queue_count < queue_family.queueCount; ++queue_count) - info.queues.emplace_back(queue_family.queueFlags, 1.f); - list.push_back(info); + queue_family_info family_info; + family_info.family_index = list.size(); + for (auto queue_count = 0; queue_count < queue_family.queueCount; ++queue_count) { + queue_info info{ queue_family.queueFlags, 1.f }; + family_info.queues.push_back(info); + } + + list.push_back(family_info); } } @@ -36,7 +39,7 @@ namespace lava { queue_family_info family_info; family_info.family_index = family_index; family_info.add(flags, count, priority); - list.emplace_back(family_info); + list.push_back(family_info); } bool add_queues(queue_family_info::list& list, VkQueueFamilyPropertiesList const& properties, VkQueueFlags flags, ui32 count, r32 priority) { @@ -84,46 +87,49 @@ namespace lava { return false; for (auto family_index = 1u; family_index < properties.size(); ++family_index) { - queue_family_info info; - info.family_index = family_index; - for (auto queue_count = 0; queue_count < properties.at(family_index).queueCount; ++queue_count) - info.queues.emplace_back(properties.at(family_index).queueFlags, priority); - list.push_back(info); + queue_family_info family_info; + family_info.family_index = family_index; + for (auto queue_count = 0; queue_count < properties.at(family_index).queueCount; ++queue_count) { + queue_info info{ properties.at(family_index).queueFlags, priority }; + family_info.queues.push_back(info); + } + + list.push_back(family_info); } return true; } - queue_verify_result verify_queues(queue_family_info::list const& list, VkQueueFamilyPropertiesList const& properties) { + verify_queues_result verify_queues(queue_family_info::list const& list, VkQueueFamilyPropertiesList const& properties) { if (list.empty()) - return queue_verify_result::empty_list; + return verify_queues_result::empty_list; if (properties.empty()) - return queue_verify_result::no_properties; + return verify_queues_result::no_properties; index_list families; for (auto& info : list) { if (contains(families, info.family_index)) - return queue_verify_result::duplicate_family_index; + return verify_queues_result::duplicate_family_index; families.push_back(info.family_index); if (info.family_index > properties.size() - 1) - return queue_verify_result::no_family_index; + return verify_queues_result::no_family_index; if (info.queues.empty()) - return queue_verify_result::no_queues; + return verify_queues_result::no_queues; if (info.count() > properties[info.family_index].queueCount) - return queue_verify_result::too_many_queues; + return verify_queues_result::too_many_queues; for (auto& queue : info.queues) { if ((properties[info.family_index].queueFlags & queue.flags) != queue.flags) - return queue_verify_result::no_compatible_flags; + return verify_queues_result::no_compatible_flags; } } - return queue_verify_result::ok; + return verify_queues_result::ok; } } // namespace lava diff --git a/liblava/base/queue.hpp b/liblava/base/queue.hpp index 385304d619f80f2c061729e0665817ae17460500..9882e65fab18dd8f13891800e9c3ba355e3b262b 100644 --- a/liblava/base/queue.hpp +++ b/liblava/base/queue.hpp @@ -39,8 +39,10 @@ namespace lava { queue_info::list queues; void add(VkQueueFlags flags, ui32 count = 1, r32 priority = 1.f) { - for (auto i = 0u; i < count; ++i) - queues.emplace_back(flags, priority); + for (auto i = 0u; i < count; ++i) { + queue_info info{ flags, priority }; + queues.push_back(info); + } } ui32 count() const { @@ -63,7 +65,7 @@ namespace lava { VkQueueFamilyPropertiesList const& properties, r32 priority = 1.f); - enum class queue_verify_result : type { + enum class verify_queues_result : type { ok = 0, empty_list, no_properties, @@ -73,6 +75,6 @@ namespace lava { too_many_queues, no_compatible_flags }; - queue_verify_result verify_queues(queue_family_info::list const& list, VkQueueFamilyPropertiesList const& properties); + verify_queues_result verify_queues(queue_family_info::list const& list, VkQueueFamilyPropertiesList const& properties); } // namespace lava diff --git a/tests/unit.cpp b/tests/unit.cpp index dbae9908505f20409c30c45888709b9c9f920952..6d4556918d189eb99bf3e44c8fa1928632dc96e1 100644 --- a/tests/unit.cpp +++ b/tests/unit.cpp @@ -48,7 +48,7 @@ TEST_CASE("queue setup - GeForce GTX 1060", "[queue]") { REQUIRE(add_queues(list, properties, VK_QUEUE_TRANSFER_BIT, 1)); } - REQUIRE(verify_queues(list, properties) == queue_verify_result::ok); + REQUIRE(verify_queues(list, properties) == verify_queues_result::ok); } TEST_CASE("queue setup - Radeon RX 580 Series", "[queue]") { @@ -87,7 +87,7 @@ TEST_CASE("queue setup - Radeon RX 580 Series", "[queue]") { REQUIRE_FALSE(add_queues(list, properties, VK_QUEUE_COMPUTE_BIT, 1)); } - REQUIRE(verify_queues(list, properties) == queue_verify_result::ok); + REQUIRE(verify_queues(list, properties) == verify_queues_result::ok); } TEST_CASE("queue setup - Intel(R) HD Graphics 620", "[queue]") { @@ -102,13 +102,13 @@ TEST_CASE("queue setup - Intel(R) HD Graphics 620", "[queue]") { SECTION("no dedicated queues available") { REQUIRE_FALSE(add_dedicated_queues(list, properties)); - REQUIRE(verify_queues(list, properties) == queue_verify_result::empty_list); + REQUIRE(verify_queues(list, properties) == verify_queues_result::empty_list); } SECTION("no more queues available") { REQUIRE(add_queues(list, properties, VK_QUEUE_GRAPHICS_BIT, 1)); REQUIRE_FALSE(add_queues(list, properties, VK_QUEUE_COMPUTE_BIT, 1)); - REQUIRE(verify_queues(list, properties) == queue_verify_result::ok); + REQUIRE(verify_queues(list, properties) == verify_queues_result::ok); } }