|
@@ -4,359 +4,7 @@
|
|
|
#include <core/File.hpp>
|
|
|
#include <core/Logger.hpp>
|
|
|
|
|
|
-static VkInstance instance;
|
|
|
-#ifdef DEBUG_VULKAN
|
|
|
-static VkDebugUtilsMessengerEXT debugMessenger;
|
|
|
-static VkDebugReportCallbackEXT debugReportCallback;
|
|
|
-#endif
|
|
|
-
|
|
|
-#define VK_ERROR_CASE(error) \
|
|
|
- case error: return #error
|
|
|
-
|
|
|
-const char* getVulkanResultString(VkResult r) {
|
|
|
- switch(r) {
|
|
|
- VK_ERROR_CASE(VK_SUCCESS);
|
|
|
- VK_ERROR_CASE(VK_NOT_READY);
|
|
|
- VK_ERROR_CASE(VK_TIMEOUT);
|
|
|
- VK_ERROR_CASE(VK_EVENT_SET);
|
|
|
- VK_ERROR_CASE(VK_EVENT_RESET);
|
|
|
- VK_ERROR_CASE(VK_INCOMPLETE);
|
|
|
- VK_ERROR_CASE(VK_ERROR_OUT_OF_HOST_MEMORY);
|
|
|
- VK_ERROR_CASE(VK_ERROR_OUT_OF_DEVICE_MEMORY);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INITIALIZATION_FAILED);
|
|
|
- VK_ERROR_CASE(VK_ERROR_DEVICE_LOST);
|
|
|
- VK_ERROR_CASE(VK_ERROR_MEMORY_MAP_FAILED);
|
|
|
- VK_ERROR_CASE(VK_ERROR_LAYER_NOT_PRESENT);
|
|
|
- VK_ERROR_CASE(VK_ERROR_EXTENSION_NOT_PRESENT);
|
|
|
- VK_ERROR_CASE(VK_ERROR_FEATURE_NOT_PRESENT);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INCOMPATIBLE_DRIVER);
|
|
|
- VK_ERROR_CASE(VK_ERROR_TOO_MANY_OBJECTS);
|
|
|
- VK_ERROR_CASE(VK_ERROR_FORMAT_NOT_SUPPORTED);
|
|
|
- VK_ERROR_CASE(VK_ERROR_FRAGMENTED_POOL);
|
|
|
- VK_ERROR_CASE(VK_ERROR_UNKNOWN);
|
|
|
- VK_ERROR_CASE(VK_ERROR_OUT_OF_POOL_MEMORY);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INVALID_EXTERNAL_HANDLE);
|
|
|
- VK_ERROR_CASE(VK_ERROR_FRAGMENTATION);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS);
|
|
|
- VK_ERROR_CASE(VK_PIPELINE_COMPILE_REQUIRED);
|
|
|
- VK_ERROR_CASE(VK_ERROR_SURFACE_LOST_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
|
|
|
- VK_ERROR_CASE(VK_SUBOPTIMAL_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_OUT_OF_DATE_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VALIDATION_FAILED_EXT);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INVALID_SHADER_NV);
|
|
|
- VK_ERROR_CASE(VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT);
|
|
|
- VK_ERROR_CASE(VK_ERROR_NOT_PERMITTED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT);
|
|
|
- VK_ERROR_CASE(VK_THREAD_IDLE_KHR);
|
|
|
- VK_ERROR_CASE(VK_THREAD_DONE_KHR);
|
|
|
- VK_ERROR_CASE(VK_OPERATION_DEFERRED_KHR);
|
|
|
- VK_ERROR_CASE(VK_OPERATION_NOT_DEFERRED_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_INVALID_VIDEO_STD_PARAMETERS_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_COMPRESSION_EXHAUSTED_EXT);
|
|
|
- VK_ERROR_CASE(VK_INCOMPATIBLE_SHADER_BINARY_EXT);
|
|
|
- VK_ERROR_CASE(VK_PIPELINE_BINARY_MISSING_KHR);
|
|
|
- VK_ERROR_CASE(VK_ERROR_NOT_ENOUGH_SPACE_KHR);
|
|
|
- default: break;
|
|
|
- }
|
|
|
- return "unknown";
|
|
|
-}
|
|
|
-
|
|
|
-static PFN_vkVoidFunction getVulkanFunction(const char* name) {
|
|
|
- return vkGetInstanceProcAddr(instance, name);
|
|
|
-}
|
|
|
-
|
|
|
-#define GET_VULKAN_FUNCTION(name) \
|
|
|
- (reinterpret_cast<PFN_##name>(getVulkanFunction(#name)))
|
|
|
-
|
|
|
-bool initVulkanInstance() {
|
|
|
- u32 baseCount = 0;
|
|
|
- const char** baseExtensions = glfwGetRequiredInstanceExtensions(&baseCount);
|
|
|
- if(baseExtensions == nullptr) {
|
|
|
- LOG_ERROR("Could not get required extensions from GLFW");
|
|
|
- return true;
|
|
|
- }
|
|
|
-#ifdef DEBUG_VULKAN
|
|
|
- u32 count = baseCount + 2;
|
|
|
- Core::Array<const char*, 32> extensions;
|
|
|
- if(count > extensions.getLength()) {
|
|
|
- LOG_ERROR("Extension buffer is too small");
|
|
|
- return true;
|
|
|
- }
|
|
|
- for(u32 i = 0; i < baseCount; i++) {
|
|
|
- extensions[i] = baseExtensions[i];
|
|
|
- }
|
|
|
- extensions[baseCount] = VK_EXT_DEBUG_UTILS_EXTENSION_NAME;
|
|
|
- extensions[baseCount + 1] = VK_EXT_DEBUG_REPORT_EXTENSION_NAME;
|
|
|
- const char* layers[] = {"VK_LAYER_KHRONOS_validation"};
|
|
|
-#else
|
|
|
- u32 count = baseCount;
|
|
|
- const char** extensions = baseExtensions;
|
|
|
-#endif
|
|
|
- VkApplicationInfo appInfo = {
|
|
|
- .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
|
|
|
- .pApplicationName = "Vulkan",
|
|
|
- .applicationVersion = VK_MAKE_VERSION(1, 0, 0),
|
|
|
- .pEngineName = "Kajetan",
|
|
|
- .engineVersion = VK_MAKE_VERSION(0, 0, 1),
|
|
|
- .apiVersion = VK_API_VERSION_1_1};
|
|
|
- VkInstanceCreateInfo info = {
|
|
|
- .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
|
|
- .pApplicationInfo = &appInfo,
|
|
|
-#ifdef DEBUG_VULKAN
|
|
|
- .enabledLayerCount = 1,
|
|
|
- .ppEnabledLayerNames = layers,
|
|
|
-#endif
|
|
|
- .enabledExtensionCount = count,
|
|
|
- .ppEnabledExtensionNames = extensions.begin()};
|
|
|
- VK_ASSERT(vkCreateInstance(&info, nullptr, &instance));
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-void destroyVulkanInstance() {
|
|
|
- vkDestroyInstance(instance, nullptr);
|
|
|
- instance = VK_NULL_HANDLE;
|
|
|
-}
|
|
|
-
|
|
|
-#ifdef DEBUG_VULKAN
|
|
|
-static VKAPI_ATTR VkBool32 onVulkanDebugMessenger VKAPI_CALL(
|
|
|
- VkDebugUtilsMessageSeverityFlagBitsEXT, VkDebugUtilsMessageTypeFlagsEXT,
|
|
|
- const VkDebugUtilsMessengerCallbackDataEXT* data, void*) {
|
|
|
- LOG_WARNING("Vulkan validation layer message: %s", data->pMessage);
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static bool initDebugMessenger() {
|
|
|
- VkDebugUtilsMessengerCreateInfoEXT info = {
|
|
|
- .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
|
|
|
- .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
|
|
|
- VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,
|
|
|
- .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
|
|
|
- VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
|
|
|
- VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
|
|
|
- .pfnUserCallback = onVulkanDebugMessenger};
|
|
|
- auto f = GET_VULKAN_FUNCTION(vkCreateDebugUtilsMessengerEXT);
|
|
|
- if(f == nullptr) {
|
|
|
- LOG_WARNING("Could not find debug util messenger function");
|
|
|
- return false;
|
|
|
- }
|
|
|
- VK_ASSERT(f(instance, &info, nullptr, &debugMessenger));
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static VKAPI_ATTR VkBool32 onVulkanDebugReport VKAPI_CALL(
|
|
|
- VkDebugReportFlagsEXT, VkDebugReportObjectTypeEXT, uint64_t, size_t,
|
|
|
- int32_t, const char* pLayerPrefix, const char* pMessage, void*) {
|
|
|
- LOG_WARNING("Vulkan debug message '%s': %s", pLayerPrefix, pMessage);
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-static bool initDebugReportCallback() {
|
|
|
- VkDebugReportCallbackCreateInfoEXT info = {
|
|
|
- .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT,
|
|
|
- .flags = VK_DEBUG_REPORT_WARNING_BIT_EXT |
|
|
|
- VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT |
|
|
|
- VK_DEBUG_REPORT_ERROR_BIT_EXT,
|
|
|
- .pfnCallback = onVulkanDebugReport};
|
|
|
- auto f = GET_VULKAN_FUNCTION(vkCreateDebugReportCallbackEXT);
|
|
|
- if(f == nullptr) {
|
|
|
- LOG_WARNING("Could not find debug report function");
|
|
|
- return false;
|
|
|
- }
|
|
|
- VK_ASSERT(f(instance, &info, nullptr, &debugReportCallback));
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-bool initVulkanDebugging() {
|
|
|
- return initDebugMessenger() || initDebugReportCallback();
|
|
|
-}
|
|
|
-
|
|
|
-static void destroyDebugMessenger() {
|
|
|
- auto f = GET_VULKAN_FUNCTION(vkDestroyDebugUtilsMessengerEXT);
|
|
|
- if(f == nullptr) {
|
|
|
- LOG_WARNING("Could not find debug util messenger destroy function");
|
|
|
- return;
|
|
|
- }
|
|
|
- f(instance, debugMessenger, nullptr);
|
|
|
-}
|
|
|
-
|
|
|
-static void destroyDebugReportCallback() {
|
|
|
- auto f = GET_VULKAN_FUNCTION(vkDestroyDebugReportCallbackEXT);
|
|
|
- if(f == nullptr) {
|
|
|
- LOG_WARNING("Could not find debug report destroy function");
|
|
|
- return;
|
|
|
- }
|
|
|
- f(instance, debugReportCallback, nullptr);
|
|
|
-}
|
|
|
-
|
|
|
-void destroyVulkanDebugging() {
|
|
|
- if(instance != VK_NULL_HANDLE) {
|
|
|
- destroyDebugMessenger();
|
|
|
- destroyDebugReportCallback();
|
|
|
- }
|
|
|
-}
|
|
|
-#else
|
|
|
-bool initVulkanDebugging() {
|
|
|
- (void)getVulkanFunction;
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-void destroyVulkanDebugging() {
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-u32 findVulkanQueueFamily(VkPhysicalDevice pd, VkQueueFlags flags) {
|
|
|
- Core::Array<VkQueueFamilyProperties, 32> properties;
|
|
|
- u32 count = properties.getLength();
|
|
|
- vkGetPhysicalDeviceQueueFamilyProperties(pd, &count, properties.begin());
|
|
|
- for(u32 i = 0; i < count; i++) {
|
|
|
- if((properties[i].queueFlags & flags) == flags) {
|
|
|
- return i;
|
|
|
- }
|
|
|
- }
|
|
|
- return INVALID_VULKAN_QUEUE_FAMILY;
|
|
|
-}
|
|
|
-
|
|
|
-static bool noPresentationSupport(
|
|
|
- VkPhysicalDevice pd, VkSurfaceKHR s, u32 index) {
|
|
|
- VkBool32 b = false;
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceSupportKHR(pd, index, s, &b));
|
|
|
- return !b;
|
|
|
-}
|
|
|
-
|
|
|
-u32 findVulkanSurfaceQueueFamily(VkPhysicalDevice pd, VkSurfaceKHR s) {
|
|
|
- u32 count = 0;
|
|
|
- vkGetPhysicalDeviceQueueFamilyProperties(pd, &count, nullptr);
|
|
|
- for(u32 i = 0; i < count; i++) {
|
|
|
- if(!noPresentationSupport(pd, s, i)) {
|
|
|
- return i;
|
|
|
- }
|
|
|
- }
|
|
|
- return INVALID_VULKAN_QUEUE_FAMILY;
|
|
|
-}
|
|
|
-
|
|
|
-bool findVulkanSurfaceFormat(
|
|
|
- VkSurfaceFormatKHR* sf, VkPhysicalDevice pd, VkSurfaceKHR s,
|
|
|
- VulkanSurfaceFormatSelector sfs) {
|
|
|
- Core::Array<VkSurfaceFormatKHR, 64> formats;
|
|
|
- u32 c = formats.getLength();
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceFormatsKHR(pd, s, &c, formats.begin()));
|
|
|
- int bestPoints = 0;
|
|
|
- for(u32 i = 0; i < c; i++) {
|
|
|
- int points = sfs(&formats[i]);
|
|
|
- if(points > bestPoints) {
|
|
|
- bestPoints = points;
|
|
|
- *sf = formats[i];
|
|
|
- }
|
|
|
- }
|
|
|
- return bestPoints == 0;
|
|
|
-}
|
|
|
-
|
|
|
-bool findVulkanSurfacePresentMode(
|
|
|
- VkPresentModeKHR* m, VkPhysicalDevice pd, VkSurfaceKHR s,
|
|
|
- VulkanSurfacePresentModeSelector spms) {
|
|
|
- Core::Array<VkPresentModeKHR, 64> modes;
|
|
|
- u32 c = modes.getLength();
|
|
|
- VK_ASSERT(
|
|
|
- vkGetPhysicalDeviceSurfacePresentModesKHR(pd, s, &c, modes.begin()));
|
|
|
- int bestPoints = 0;
|
|
|
- for(u32 i = 0; i < c; i++) {
|
|
|
- int points = spms(modes[i]);
|
|
|
- if(points > bestPoints) {
|
|
|
- bestPoints = points;
|
|
|
- *m = modes[i];
|
|
|
- }
|
|
|
- }
|
|
|
- return bestPoints == 0;
|
|
|
-}
|
|
|
-
|
|
|
-bool findVulkanPhysicalDevice(
|
|
|
- VkPhysicalDevice* pd, VulkanPhysicalDeviceSelector s) {
|
|
|
- Core::Array<VkPhysicalDevice, 32> devices;
|
|
|
- u32 c = devices.getLength();
|
|
|
- VK_ASSERT(vkEnumeratePhysicalDevices(instance, &c, devices.begin()));
|
|
|
- int bestPoints = 0;
|
|
|
- for(u32 i = 0; i < c; i++) {
|
|
|
- int points = s(devices[i]);
|
|
|
- if(points > bestPoints) {
|
|
|
- bestPoints = points;
|
|
|
- *pd = devices[i];
|
|
|
- }
|
|
|
- }
|
|
|
- return bestPoints == 0;
|
|
|
-}
|
|
|
-
|
|
|
-bool hasVulkanExtension(VkPhysicalDevice pd, const char* extension) {
|
|
|
- Core::Array<VkExtensionProperties, 1024> e;
|
|
|
- u32 c = e.getLength();
|
|
|
- VkResult r =
|
|
|
- vkEnumerateDeviceExtensionProperties(pd, nullptr, &c, e.begin());
|
|
|
- if(r != VK_SUCCESS) {
|
|
|
- LOG_ERROR(
|
|
|
- "Cannot get physical device extension properties: %s",
|
|
|
- getVulkanResultString(r));
|
|
|
- return false;
|
|
|
- }
|
|
|
- for(u32 i = 0; i < c; i++) {
|
|
|
- if(strcmp(e[i].extensionName, extension) == 0) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-bool initVulkanDevice(
|
|
|
- VkDevice* d, VkPhysicalDevice pd, const VulkanDeviceQueueData* data,
|
|
|
- size_t n, const char** extensions, size_t nExtensions) {
|
|
|
- constexpr size_t LENGTH = 32;
|
|
|
- if(n >= LENGTH) {
|
|
|
- LOG_ERROR("Vulkan device queue overload");
|
|
|
- return true;
|
|
|
- }
|
|
|
- VkDeviceQueueCreateInfo deviceQueueInfo[LENGTH] = {};
|
|
|
- for(size_t i = 0; i < n; i++) {
|
|
|
- VkDeviceQueueCreateInfo* qInfo = deviceQueueInfo + i;
|
|
|
- qInfo->sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
|
|
|
- qInfo->queueFamilyIndex = data[i].queueFamilyIndex;
|
|
|
- qInfo->queueCount = 1;
|
|
|
- qInfo->pQueuePriorities = &data[i].priority;
|
|
|
- }
|
|
|
- VkPhysicalDeviceFeatures deviceFeatures = {};
|
|
|
- vkGetPhysicalDeviceFeatures(pd, &deviceFeatures);
|
|
|
- VkDeviceCreateInfo info = {
|
|
|
- .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
|
|
|
- .queueCreateInfoCount = static_cast<u32>(n),
|
|
|
- .pQueueCreateInfos = deviceQueueInfo,
|
|
|
- .enabledExtensionCount = static_cast<u32>(nExtensions),
|
|
|
- .ppEnabledExtensionNames = extensions,
|
|
|
- .pEnabledFeatures = &deviceFeatures};
|
|
|
- VK_ASSERT(vkCreateDevice(pd, &info, nullptr, d));
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-void destroyVulkanDevice(VkDevice d) {
|
|
|
- if(instance != VK_NULL_HANDLE) {
|
|
|
- vkDestroyDevice(d, nullptr);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-bool initVulkanSurface(VkSurfaceKHR* s, GLFWwindow* w) {
|
|
|
- VK_ASSERT(glfwCreateWindowSurface(instance, w, nullptr, s));
|
|
|
- return false;
|
|
|
-}
|
|
|
-
|
|
|
-void destroyVulkanSurface(VkSurfaceKHR s) {
|
|
|
- if(instance != VK_NULL_HANDLE) {
|
|
|
- vkDestroySurfaceKHR(instance, s, nullptr);
|
|
|
- }
|
|
|
-}
|
|
|
+#include "core/VulkanUtility.hpp"
|
|
|
|
|
|
static u32 getSwapImageCount(const VkSurfaceCapabilitiesKHR* caps) {
|
|
|
u32 c = caps->minImageCount + 1;
|
|
@@ -370,11 +18,12 @@ static u32 getSwapImageCount(const VkSurfaceCapabilitiesKHR* caps) {
|
|
|
|
|
|
bool initVulkanSwapchain(VkSwapchainKHR* sc, VulkanSwapchainData* d) {
|
|
|
VkSurfaceCapabilitiesKHR caps = {0};
|
|
|
- VK_ASSERT(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(
|
|
|
- d->physicalDevice, d->surface, &caps));
|
|
|
+ if(d->base.getSurfaceCapabilities(caps)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
VkSwapchainCreateInfoKHR ci = {
|
|
|
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
|
|
|
- .surface = d->surface,
|
|
|
+ .surface = d->base,
|
|
|
.minImageCount = getSwapImageCount(&caps),
|
|
|
.imageFormat = d->surfaceFormat.format,
|
|
|
.imageColorSpace = d->surfaceFormat.colorSpace,
|
|
@@ -382,14 +31,14 @@ bool initVulkanSwapchain(VkSwapchainKHR* sc, VulkanSwapchainData* d) {
|
|
|
.imageArrayLayers = 1,
|
|
|
.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
|
|
|
.imageSharingMode = d->sharingMode,
|
|
|
- .queueFamilyIndexCount = d->queueFamilyIndexCount,
|
|
|
- .pQueueFamilyIndices = d->queueFamilyIndices,
|
|
|
+ .queueFamilyIndexCount = static_cast<u32>(d->queueFamilies.getLength()),
|
|
|
+ .pQueueFamilyIndices = &d->queueFamilies[0],
|
|
|
.preTransform = caps.currentTransform,
|
|
|
.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
|
|
|
.presentMode = d->presentMode,
|
|
|
.clipped = VK_TRUE,
|
|
|
.oldSwapchain = VK_NULL_HANDLE};
|
|
|
- VK_ASSERT(vkCreateSwapchainKHR(d->device, &ci, nullptr, sc));
|
|
|
+ VK_CHECK_TRUE(vkCreateSwapchainKHR(d->base, &ci, nullptr, sc));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -400,7 +49,7 @@ void destroyVulkanSwapchain(VkSwapchainKHR s, VkDevice d) {
|
|
|
}
|
|
|
|
|
|
static bool createImageView(
|
|
|
- VkImageView* view, VkDevice d, VkImage image, VkFormat format) {
|
|
|
+ VkImageView& view, VkDevice d, VkImage image, VkFormat format) {
|
|
|
VkImageViewCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
|
|
|
.image = image,
|
|
@@ -412,50 +61,48 @@ static bool createImageView(
|
|
|
.levelCount = 1,
|
|
|
.baseArrayLayer = 0,
|
|
|
.layerCount = 1}};
|
|
|
- VK_ASSERT(vkCreateImageView(d, &info, nullptr, view));
|
|
|
+ VK_CHECK_TRUE(vkCreateImageView(d, &info, nullptr, &view));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
bool initVulkanSwapchainImages(
|
|
|
- VulkanSwapchainImages* si, VkDevice d, VkSwapchainKHR sc, VkFormat format) {
|
|
|
- VK_ASSERT(vkGetSwapchainImagesKHR(d, sc, &si->amount, nullptr));
|
|
|
- si->images = static_cast<VkImage*>(
|
|
|
- Core::zeroAllocateRaw(sizeof(VkImage) * si->amount));
|
|
|
- si->imageViews = static_cast<VkImageView*>(
|
|
|
- Core::zeroAllocateRaw(sizeof(VkImageView) * si->amount));
|
|
|
- VK_ASSERT(vkGetSwapchainImagesKHR(d, sc, &si->amount, si->images));
|
|
|
- for(u32 x = 0; x < si->amount; x++) {
|
|
|
- if(createImageView(si->imageViews + x, d, si->images[x], format)) {
|
|
|
+ VulkanSwapchainImages& si, VkDevice d, VkSwapchainKHR sc, VkFormat format) {
|
|
|
+ u32 c = 0;
|
|
|
+ VK_CHECK_TRUE(vkGetSwapchainImagesKHR(d, sc, &c, nullptr));
|
|
|
+ si.images.resize(c);
|
|
|
+ si.imageViews.resize(c);
|
|
|
+ VK_CHECK_TRUE(vkGetSwapchainImagesKHR(d, sc, &c, &si.images[0]));
|
|
|
+ for(u32 x = 0; x < c; x++) {
|
|
|
+ if(createImageView(si.imageViews[x], d, si.images[x], format)) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void destroyVulkanSwapchainImages(VulkanSwapchainImages* si, VkDevice d) {
|
|
|
- if(d == VK_NULL_HANDLE || si == nullptr) {
|
|
|
+void destroyVulkanSwapchainImages(VulkanSwapchainImages& si, VkDevice d) {
|
|
|
+ if(d == VK_NULL_HANDLE) {
|
|
|
return;
|
|
|
}
|
|
|
- for(size_t x = 0; x < si->amount; x++) {
|
|
|
- vkDestroyImageView(d, si->imageViews[x], nullptr);
|
|
|
+ for(VkImageView& v : si.imageViews) {
|
|
|
+ vkDestroyImageView(d, v, nullptr);
|
|
|
}
|
|
|
- Core::deallocateRaw(si->images);
|
|
|
- Core::deallocateRaw(si->imageViews);
|
|
|
- *si = VulkanSwapchainImages();
|
|
|
+ si.imageViews.clear();
|
|
|
+ si.images.clear();
|
|
|
}
|
|
|
|
|
|
static bool initShaderModule(
|
|
|
Core::List<char>& f, VkDevice d, VkShaderModule* sm) {
|
|
|
size_t l = f.getLength() - 1;
|
|
|
if((l % 4) != 0) {
|
|
|
- LOG_ERROR("Shader size is not a multiple of 4");
|
|
|
+ VK_REPORT_ERROR("Shader size is not a multiple of 4");
|
|
|
return true;
|
|
|
}
|
|
|
VkShaderModuleCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO,
|
|
|
.codeSize = l,
|
|
|
.pCode = reinterpret_cast<u32*>(static_cast<void*>(&f[0]))};
|
|
|
- VK_ASSERT(vkCreateShaderModule(d, &info, nullptr, sm));
|
|
|
+ VK_CHECK_TRUE(vkCreateShaderModule(d, &info, nullptr, sm));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -480,7 +127,7 @@ bool initVulkanPipelineLayout(VkPipelineLayout* pl, VkDevice d) {
|
|
|
.pSetLayouts = nullptr,
|
|
|
.pushConstantRangeCount = 0,
|
|
|
.pPushConstantRanges = nullptr};
|
|
|
- VK_ASSERT(vkCreatePipelineLayout(d, &info, nullptr, pl));
|
|
|
+ VK_CHECK_TRUE(vkCreatePipelineLayout(d, &info, nullptr, pl));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -491,34 +138,30 @@ void destroyVulkanPipelineLayout(VkPipelineLayout pl, VkDevice d) {
|
|
|
}
|
|
|
|
|
|
bool initVulkanFramebuffers(
|
|
|
- VkFramebuffer** f, VulkanSwapchainImages* si, VkDevice d, VkRenderPass rp,
|
|
|
- u32 width, u32 height) {
|
|
|
- *f = static_cast<VkFramebuffer*>(
|
|
|
- Core::zeroAllocateRaw(sizeof(VkFramebuffer) * si->amount));
|
|
|
- for(u32 i = 0; i < si->amount; i++) {
|
|
|
+ Core::List<VkFramebuffer>& f, VulkanSwapchainImages& si, VkDevice d,
|
|
|
+ VkRenderPass rp, u32 width, u32 height) {
|
|
|
+ f.resize(si.imageViews.getLength());
|
|
|
+ for(u32 i = 0; i < si.imageViews.getLength(); i++) {
|
|
|
VkFramebufferCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
|
|
|
.renderPass = rp,
|
|
|
.attachmentCount = 1,
|
|
|
- .pAttachments = si->imageViews + i,
|
|
|
+ .pAttachments = &si.imageViews[i],
|
|
|
.width = width,
|
|
|
.height = height,
|
|
|
.layers = 1};
|
|
|
- VK_ASSERT(vkCreateFramebuffer(d, &info, nullptr, (*f) + i));
|
|
|
+ VK_CHECK_TRUE(vkCreateFramebuffer(d, &info, nullptr, &f[i]));
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-void destroyVulkanFramebuffers(VkFramebuffer** f, u32 amount, VkDevice d) {
|
|
|
- if(f != nullptr) {
|
|
|
- if(d != VK_NULL_HANDLE && *f != nullptr) {
|
|
|
- for(u32 i = 0; i < amount; i++) {
|
|
|
- vkDestroyFramebuffer(d, (*f)[i], nullptr);
|
|
|
- }
|
|
|
+void destroyVulkanFramebuffers(Core::List<VkFramebuffer>& fs, VkDevice d) {
|
|
|
+ if(d != VK_NULL_HANDLE) {
|
|
|
+ for(VkFramebuffer f : fs) {
|
|
|
+ vkDestroyFramebuffer(d, f, nullptr);
|
|
|
}
|
|
|
- Core::deallocateRaw(*f);
|
|
|
- *f = nullptr;
|
|
|
}
|
|
|
+ fs.clear();
|
|
|
}
|
|
|
|
|
|
bool initCommandVulkanBuffer(
|
|
@@ -528,14 +171,14 @@ bool initCommandVulkanBuffer(
|
|
|
.commandPool = cp,
|
|
|
.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
|
|
|
.commandBufferCount = 1};
|
|
|
- VK_ASSERT(vkAllocateCommandBuffers(d, &info, cb));
|
|
|
+ VK_CHECK_TRUE(vkAllocateCommandBuffers(d, &info, cb));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
bool initVulkanSemaphore(VkSemaphore* s, VkDevice d) {
|
|
|
VkSemaphoreCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO};
|
|
|
- VK_ASSERT(vkCreateSemaphore(d, &info, nullptr, s));
|
|
|
+ VK_CHECK_TRUE(vkCreateSemaphore(d, &info, nullptr, s));
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -549,7 +192,7 @@ bool initVulkanFence(VkFence* f, VkDevice d) {
|
|
|
VkFenceCreateInfo info = {
|
|
|
.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO,
|
|
|
.flags = VK_FENCE_CREATE_SIGNALED_BIT};
|
|
|
- VK_ASSERT(vkCreateFence(d, &info, nullptr, f));
|
|
|
+ VK_CHECK_TRUE(vkCreateFence(d, &info, nullptr, f));
|
|
|
return false;
|
|
|
}
|
|
|
|