create vulkan swapchain
This commit is contained in:
@@ -4,5 +4,6 @@ typedef enum gnReturnCode {
|
|||||||
GN_SUCCESS = 0,
|
GN_SUCCESS = 0,
|
||||||
GN_FAILED_TO_FIND_LIBARY = 1,
|
GN_FAILED_TO_FIND_LIBARY = 1,
|
||||||
GN_UNSUPPORTED_BACKEND = 2,
|
GN_UNSUPPORTED_BACKEND = 2,
|
||||||
GN_EXTENSION_NOT_PRESENT = 3
|
GN_EXTENSION_NOT_PRESENT = 3,
|
||||||
|
GN_UNSUPPOTED_SURFACE
|
||||||
} gnReturnCode;
|
} gnReturnCode;
|
||||||
|
|||||||
@@ -1,9 +1,61 @@
|
|||||||
#include "../vulkan_functions.h"
|
#include "../vulkan_functions.h"
|
||||||
|
#include "gryphn_handle.h"
|
||||||
#include "gryphn_return_code.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) {
|
typedef struct vulkanSwapchain {
|
||||||
return GN_UNSUPPORTED_BACKEND;
|
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) {
|
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);
|
VkResult result = vkCreateDevice(info->physicalDevice->internalData, &createInfo, NULL, &vkDevice);
|
||||||
device->internalData = malloc(sizeof(vulkanDevice));
|
device->internalData = malloc(sizeof(vulkanDevice));
|
||||||
((vulkanDevice*)device->internalData)->device = vkDevice;
|
((vulkanDevice*)device->internalData)->device = vkDevice;
|
||||||
|
((vulkanDevice*)device->internalData)->physicalDevice = info->physicalDevice->internalData;
|
||||||
|
((vulkanDevice*)device->internalData)->queueCount = queueFamilyCount;
|
||||||
|
|
||||||
for (int i = 0; i < queueFamilyCount; i++) {
|
for (int i = 0; i < queueFamilyCount; i++) {
|
||||||
if ((queueFamilyProperties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) == VK_QUEUE_GRAPHICS_BIT) {
|
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);
|
vkGetDeviceQueue(vkDevice, i, 0, &((vulkanDevice*)device->internalData)->graphicsQueue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,9 @@
|
|||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
typedef struct vulkanDevice {
|
typedef struct vulkanDevice {
|
||||||
VkDevice device;
|
VkDevice device;
|
||||||
uint32_t queueCount;
|
VkPhysicalDevice physicalDevice;
|
||||||
|
|
||||||
|
uint32_t queueCount;
|
||||||
|
uint32_t graphicsQueueIndex;
|
||||||
VkQueue graphicsQueue;
|
VkQueue graphicsQueue;
|
||||||
} vulkanDevice;
|
} vulkanDevice;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "vulkan_helpers.h"
|
#include "vulkan_helpers.h"
|
||||||
#include "core/gryphn_format.h"
|
#include "core/gryphn_format.h"
|
||||||
|
#include "core/gryphn_present_mode.h"
|
||||||
#include "gryphn_return_code.h"
|
#include "gryphn_return_code.h"
|
||||||
#include "stdio.h"
|
#include "stdio.h"
|
||||||
#include <vulkan/vulkan_core.h>
|
#include <vulkan/vulkan_core.h>
|
||||||
@@ -51,3 +52,38 @@ gnPresentMode vulkanPresentModeToGryphnPresentMode(VkPresentModeKHR presentMode)
|
|||||||
default: return GN_PRESENT_MODE_UNKNOWN;
|
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);
|
gnFormat vulkanFormatToGryphnFormat(VkFormat format);
|
||||||
gnColorSpace vulkanColorSpaceToGryphnColorSpace(VkColorSpaceKHR colorSpace);
|
gnColorSpace vulkanColorSpaceToGryphnColorSpace(VkColorSpaceKHR colorSpace);
|
||||||
gnPresentMode vulkanPresentModeToGryphnPresentMode(VkPresentModeKHR presentMode);
|
gnPresentMode vulkanPresentModeToGryphnPresentMode(VkPresentModeKHR presentMode);
|
||||||
|
|
||||||
|
VkFormat gryphnFormatToVulkanFormat(gnFormat format);
|
||||||
|
VkColorSpaceKHR gryphnColorSpaceToVulkanColorSpace(gnColorSpace colorSpace);
|
||||||
|
VkPresentModeKHR gryphnPresentModeToVulkanPresentMode(gnPresentMode presentMode);
|
||||||
|
|||||||
Reference in New Issue
Block a user