create vulkan swapchain

This commit is contained in:
Gregory Wells
2026-05-25 18:14:40 -04:00
parent 629036542a
commit eaf3bcb290
6 changed files with 103 additions and 5 deletions
+2 -1
View File
@@ -4,5 +4,6 @@ typedef enum gnReturnCode {
GN_SUCCESS = 0,
GN_FAILED_TO_FIND_LIBARY = 1,
GN_UNSUPPORTED_BACKEND = 2,
GN_EXTENSION_NOT_PRESENT = 3
GN_EXTENSION_NOT_PRESENT = 3,
GN_UNSUPPOTED_SURFACE
} gnReturnCode;
@@ -1,9 +1,61 @@
#include "../vulkan_functions.h"
#include "gryphn_handle.h"
#include "gryphn_return_code.h"
#include "ext/device/swapchain/gryphn_swapchain.h"
#include "../vulkan_helpers.h"
#include "../vulkan_device.h"
#include <vulkan/vulkan_core.h>
gnReturnCode vulkanCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* createInfo, gnSwapchain* swapchain) {
return GN_UNSUPPORTED_BACKEND;
typedef struct vulkanSwapchain {
uint32_t presentQueueIndex;
VkQueue presentQueue;
} vulkanSwapchain;
gnReturnCode vulkanCreateSwapchain(gnDevice device, gnSwapchainCreateInfo* info, gnSwapchain* swapchain) {
uint32_t presentQueueIndex;
VkBool32 presentSupport = VK_FALSE;
for (int i = 0; i < ((vulkanDevice*)device->internalData)->queueCount; i++) {
vkGetPhysicalDeviceSurfaceSupportKHR(((vulkanDevice*)device->internalData)->physicalDevice, i, info->surface, &presentSupport);
if (presentSupport == VK_TRUE) {
presentQueueIndex = i;
break;
}
}
if (presentSupport == VK_FALSE) return GN_UNSUPPOTED_SURFACE;
VkSurfaceCapabilitiesKHR capabilities;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(((vulkanDevice*)device->internalData)->physicalDevice, info->surface, &capabilities);
VkSwapchainCreateInfoKHR createInfo = {
.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR,
.pNext = NULL,
.flags = 0,
.surface = info->surface,
.minImageCount = info->minImageCount,
.imageFormat = gryphnFormatToVulkanFormat(info->imageFormat),
.imageColorSpace = gryphnColorSpaceToVulkanColorSpace(info->imageColorSpace),
.imageExtent = { info->imageExtent.width, info->imageExtent.height },
.imageArrayLayers = info->imageArrayLayers,
.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE,
.queueFamilyIndexCount = 0,
.pQueueFamilyIndices = NULL,
.preTransform = capabilities.currentTransform,
.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR,
.presentMode = gryphnPresentModeToVulkanPresentMode(info->presentMode),
.clipped = VK_TRUE,
.oldSwapchain = NULL,
};
if (((vulkanDevice*)device->internalData)->graphicsQueueIndex != presentQueueIndex) {
createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
createInfo.queueFamilyIndexCount = 2;
createInfo.pQueueFamilyIndices = (uint32_t[]){((vulkanDevice*)device->internalData)->graphicsQueueIndex, presentQueueIndex};
}
return vulkanCodeToGryphnCode(vkCreateSwapchainKHR(((vulkanDevice*)device->internalData)->device, &createInfo, NULL, (VkSwapchainKHR*)swapchain));
}
gnReturnCode vulkanDestroySwapchain(gnDevice device, gnSwapchain* swapchain) {
return GN_UNSUPPORTED_BACKEND;
vkDestroySwapchainKHR(((vulkanDevice*)device->internalData)->device, *((VkSwapchainKHR*)swapchain), NULL);
return GN_SUCCESS;
}
@@ -107,9 +107,12 @@ gnReturnCode vulkanCreateDevice(gnInstance instance, gnDeviceCreateInfo* info, g
VkResult result = vkCreateDevice(info->physicalDevice->internalData, &createInfo, NULL, &vkDevice);
device->internalData = malloc(sizeof(vulkanDevice));
((vulkanDevice*)device->internalData)->device = vkDevice;
((vulkanDevice*)device->internalData)->physicalDevice = info->physicalDevice->internalData;
((vulkanDevice*)device->internalData)->queueCount = queueFamilyCount;
for (int i = 0; i < queueFamilyCount; i++) {
if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) {
((vulkanDevice*)device->internalData)->graphicsQueueIndex = i;
vkGetDeviceQueue(vkDevice, i, 0, &((vulkanDevice*)device->internalData)->graphicsQueue);
break;
}
+3 -1
View File
@@ -3,7 +3,9 @@
#include <vulkan/vulkan_core.h>
typedef struct vulkanDevice {
VkDevice device;
uint32_t queueCount;
VkPhysicalDevice physicalDevice;
uint32_t queueCount;
uint32_t graphicsQueueIndex;
VkQueue graphicsQueue;
} vulkanDevice;
@@ -1,5 +1,6 @@
#include "vulkan_helpers.h"
#include "core/gryphn_format.h"
#include "core/gryphn_present_mode.h"
#include "gryphn_return_code.h"
#include "stdio.h"
#include <vulkan/vulkan_core.h>
@@ -51,3 +52,38 @@ gnPresentMode vulkanPresentModeToGryphnPresentMode(VkPresentModeKHR presentMode)
default: return GN_PRESENT_MODE_UNKNOWN;
}
}
VkFormat gryphnFormatToVulkanFormat(gnFormat format) {
switch (format) {
case GN_FORMAT_UNDEFINED: return VK_FORMAT_UNDEFINED;
case GN_FORMAT_RGBA8_UNORM: return VK_FORMAT_R8G8B8A8_UNORM;
case GN_FORMAT_RGBA8_SNORM: return VK_FORMAT_R8G8B8A8_SNORM;
case GN_FORMAT_RGBA8_USCALED: return VK_FORMAT_R8G8B8A8_USCALED;
case GN_FORMAT_RGBA8_SSCALED: return VK_FORMAT_R8G8B8A8_SSCALED;
case GN_FORMAT_RGBA8_UINT: return VK_FORMAT_R8G8B8A8_UINT;
case GN_FORMAT_RGBA8_SINT: return VK_FORMAT_R8G8B8A8_SINT;
case GN_FORMAT_RGBA8_SRGB: return VK_FORMAT_R8G8B8A8_SRGB;
case GN_FORMAT_BGRA8_UNORM: return VK_FORMAT_B8G8R8A8_UNORM;
case GN_FORMAT_BGRA8_SNORM: return VK_FORMAT_B8G8R8A8_SNORM;
case GN_FORMAT_BGRA8_USCALED: return VK_FORMAT_B8G8R8A8_USCALED;
case GN_FORMAT_BGRA8_SSCALED: return VK_FORMAT_B8G8R8A8_SSCALED;
case GN_FORMAT_BGRA8_UINT: return VK_FORMAT_B8G8R8A8_UINT;
case GN_FORMAT_BGRA8_SINT: return VK_FORMAT_B8G8R8A8_SINT;
case GN_FORMAT_BGRA8_SRGB: return VK_FORMAT_B8G8R8A8_SRGB;
}
}
VkColorSpaceKHR gryphnColorSpaceToVulkanColorSpace(gnColorSpace colorSpace) {
switch (colorSpace) {
case GN_COLOR_SPACE_SRGB_NONLINEAR: return VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
case GN_COLOR_SPACE_UNKNOWN: return VK_COLOR_SPACE_MAX_ENUM_KHR;
}
}
VkPresentModeKHR gryphnPresentModeToVulkanPresentMode(gnPresentMode presentMode) {
switch (presentMode) {
case GN_PRESENT_MODE_IMMEDIATE: return VK_PRESENT_MODE_IMMEDIATE_KHR;
case GN_PRESENT_MODE_MAILBOX: return VK_PRESENT_MODE_MAILBOX_KHR;
case GN_PRESENT_MODE_FIFO: return VK_PRESENT_MODE_FIFO_KHR;
case GN_PRESENT_MODE_FIFO_RELAXED: return VK_PRESENT_MODE_FIFO_RELAXED_KHR;
case GN_PRESENT_MODE_UNKNOWN: return VK_PRESENT_MODE_MAX_ENUM_KHR;
}
}
@@ -8,3 +8,7 @@ gnReturnCode vulkanCodeToGryphnCode(VkResult result);
gnFormat vulkanFormatToGryphnFormat(VkFormat format);
gnColorSpace vulkanColorSpaceToGryphnColorSpace(VkColorSpaceKHR colorSpace);
gnPresentMode vulkanPresentModeToGryphnPresentMode(VkPresentModeKHR presentMode);
VkFormat gryphnFormatToVulkanFormat(gnFormat format);
VkColorSpaceKHR gryphnColorSpaceToVulkanColorSpace(gnColorSpace colorSpace);
VkPresentModeKHR gryphnPresentModeToVulkanPresentMode(gnPresentMode presentMode);