Aeon Engine c550894
AeonGames Open Source Game Engine
Loading...
Searching...
No Matches
VulkanUtilities.cpp
1/*
2Copyright (C) 2017-2019,2021,2025,2026 Rodrigo Jose Hernandez Cordoba
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16#include "VulkanUtilities.hpp"
18#include <iostream>
19#include <sstream>
20namespace AeonGames
21{
23 const char* GetVulkanResultString ( VkResult aResult )
24 {
25 switch ( aResult )
26 {
27 case VK_SUCCESS:
28 return "VK_SUCCESS";
29 case VK_NOT_READY:
30 return "VK_NOT_READY";
31 case VK_TIMEOUT:
32 return "VK_TIMEOUT";
33 case VK_EVENT_SET:
34 return "VK_EVENT_SET";
35 case VK_EVENT_RESET:
36 return "VK_EVENT_RESET";
37 case VK_INCOMPLETE:
38 return "VK_INCOMPLETE";
39 case VK_ERROR_OUT_OF_HOST_MEMORY:
40 return "VK_ERROR_OUT_OF_HOST_MEMORY";
41 case VK_ERROR_OUT_OF_DEVICE_MEMORY:
42 return "VK_ERROR_OUT_OF_DEVICE_MEMORY";
43 case VK_ERROR_INITIALIZATION_FAILED:
44 return "VK_ERROR_INITIALIZATION_FAILED";
45 case VK_ERROR_DEVICE_LOST:
46 return "VK_ERROR_DEVICE_LOST";
47 case VK_ERROR_MEMORY_MAP_FAILED:
48 return "VK_ERROR_MEMORY_MAP_FAILED";
49 case VK_ERROR_LAYER_NOT_PRESENT:
50 return "VK_ERROR_LAYER_NOT_PRESENT";
51 case VK_ERROR_EXTENSION_NOT_PRESENT:
52 return "VK_ERROR_EXTENSION_NOT_PRESENT";
53 case VK_ERROR_FEATURE_NOT_PRESENT:
54 return "VK_ERROR_FEATURE_NOT_PRESENT";
55 case VK_ERROR_INCOMPATIBLE_DRIVER:
56 return "VK_ERROR_INCOMPATIBLE_DRIVER";
57 case VK_ERROR_TOO_MANY_OBJECTS:
58 return "VK_ERROR_TOO_MANY_OBJECTS";
59 case VK_ERROR_FORMAT_NOT_SUPPORTED:
60 return "VK_ERROR_FORMAT_NOT_SUPPORTED";
61 case VK_ERROR_SURFACE_LOST_KHR:
62 return "VK_ERROR_SURFACE_LOST_KHR";
63 case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR:
64 return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR";
65 case VK_SUBOPTIMAL_KHR:
66 return "VK_SUBOPTIMAL_KHR";
67 case VK_ERROR_OUT_OF_DATE_KHR:
68 return "VK_ERROR_OUT_OF_DATE_KHR";
69 case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR:
70 return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR";
71 case VK_ERROR_VALIDATION_FAILED_EXT:
72 return "VK_ERROR_VALIDATION_FAILED_EXT";
73 case VK_ERROR_INVALID_SHADER_NV:
74 return "VK_ERROR_INVALID_SHADER_NV";
75 case VK_ERROR_OUT_OF_POOL_MEMORY_KHR:
76 return "VK_ERROR_OUT_OF_POOL_MEMORY_KHR";
77 default:
78 return "Unknown Result";
79 }
80 }
81
89 VKAPI_ATTR VkBool32 VKAPI_CALL
91 (
92 VkDebugUtilsMessageSeverityFlagBitsEXT aMessageSeverity,
93 VkDebugUtilsMessageTypeFlagsEXT aMessageTypes,
94 const VkDebugUtilsMessengerCallbackDataEXT* aCallbackData,
95 void* aUserData
96 )
97 {
98
99 if ( aMessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT )
100 {
101 std::cout << LogLevel::Info;
102 }
103 if ( aMessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT )
104 {
105 std::cout << LogLevel::Warning;
106 }
107#if 0
108 if ( aMessageSeverity & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT )
109 {
110 std::cout << LogLevel::Performance;
111 }
112#endif
113 if ( aMessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT )
114 {
115 std::cout << LogLevel::Error;
116 }
117 if ( aMessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT )
118 {
119 std::cout << LogLevel::Debug;
120 }
121 std::cout << aCallbackData->pMessageIdName << ": " << aCallbackData->pMessage << std::endl;
122 return false;
123 }
124
126 VkDescriptorPool CreateDescriptorPool ( const VkDevice& aVkDevice, const std::vector<VkDescriptorPoolSize>& aVkDescriptorPoolSizes )
127 {
128 VkDescriptorPool descriptor_pool{VK_NULL_HANDLE};
129 VkDescriptorPoolCreateInfo descriptor_pool_create_info{};
130 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
131 descriptor_pool_create_info.pNext = nullptr;
132 descriptor_pool_create_info.flags = 0;
133 descriptor_pool_create_info.maxSets = static_cast<uint32_t> ( aVkDescriptorPoolSizes.size() );
134 descriptor_pool_create_info.poolSizeCount = static_cast<uint32_t> ( aVkDescriptorPoolSizes.size() );
135 descriptor_pool_create_info.pPoolSizes = aVkDescriptorPoolSizes.data();
136 if ( VkResult result = vkCreateDescriptorPool ( aVkDevice, &descriptor_pool_create_info, nullptr, &descriptor_pool ) )
137 {
138 std::ostringstream stream;
139 stream << "vkCreateDescriptorPool failed. error code: ( " << GetVulkanResultString ( result ) << " )";
140 std::cout << LogLevel::Error << stream.str() << std::endl;
141 throw std::runtime_error ( stream.str().c_str() );
142 }
143 return descriptor_pool;
144 }
145
147 void DestroyDescriptorPool ( const VkDevice& aVkDevice, VkDescriptorPool aVkDescriptorPool )
148 {
149 vkDestroyDescriptorPool ( aVkDevice, aVkDescriptorPool, nullptr );
150 }
151
153 VkDescriptorSet CreateDescriptorSet ( const VkDevice& aVkDevice, const VkDescriptorPool& aVkDescriptorPool, const VkDescriptorSetLayout& aVkDescriptorSetLayout, uint32_t aDescriptorSetCount )
154 {
155 VkDescriptorSet descriptor_set{VK_NULL_HANDLE};
156 VkDescriptorSetAllocateInfo descriptor_set_allocate_info{};
157 descriptor_set_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
158 descriptor_set_allocate_info.descriptorPool = aVkDescriptorPool;
159 descriptor_set_allocate_info.descriptorSetCount = aDescriptorSetCount;
160 descriptor_set_allocate_info.pSetLayouts = &aVkDescriptorSetLayout;
161 if ( VkResult result = vkAllocateDescriptorSets ( aVkDevice, &descriptor_set_allocate_info, &descriptor_set ) )
162 {
163 std::ostringstream stream;
164 stream << "Allocate Descriptor Set failed: ( " << GetVulkanResultString ( result ) << " )";
165 std::cout << LogLevel::Error << stream.str() << std::endl;
166 throw std::runtime_error ( stream.str().c_str() );
167 }
168 return descriptor_set;
169 }
170}
Defines log severity levels and stream output for the AeonGames engine.
<- This is here just for the literals
Definition AABB.hpp:31
VKAPI_ATTR VkBool32 VKAPI_CALL DebugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT aMessageSeverity, VkDebugUtilsMessageTypeFlagsEXT aMessageTypes, const VkDebugUtilsMessengerCallbackDataEXT *aCallbackData, void *aUserData)
Vulkan debug messenger callback.
VkDescriptorPool CreateDescriptorPool(const VkDevice &aVkDevice, const std::vector< VkDescriptorPoolSize > &aVkDescriptorPoolSizes)
Create a Vulkan descriptor pool from the given pool sizes.
void DestroyDescriptorPool(const VkDevice &aVkDevice, VkDescriptorPool aVkDescriptorPool)
Destroy a Vulkan descriptor pool.
const char * GetVulkanResultString(VkResult aResult)
Convert a VkResult code to a human-readable string.
@ Warning
Potential issues that may need attention.
Definition LogLevel.hpp:32
@ Info
General informational messages.
Definition LogLevel.hpp:30
@ Error
Error conditions.
Definition LogLevel.hpp:33
@ Performance
Performance-related metrics.
Definition LogLevel.hpp:31
@ Debug
Detailed diagnostic information.
Definition LogLevel.hpp:29
VkDescriptorSet CreateDescriptorSet(const VkDevice &aVkDevice, const VkDescriptorPool &aVkDescriptorPool, const VkDescriptorSetLayout &aVkDescriptorSetLayout, uint32_t aDescriptorSetCount)
Allocate a Vulkan descriptor set from the given pool and layout.