vulkan swapchain support

This commit is contained in:
Greg Wells
2025-05-24 15:13:16 -04:00
parent 3fa37d0229
commit e955775ba0
13 changed files with 80 additions and 163 deletions

View File

@@ -1,14 +0,0 @@
// #include "vulkan_swapchain.h"
// #include "core/presentation_queue/gryphn_device_presentation_details.h"
// #include "../output_device/vulkan_output_devices.h"
// #include "../instance/vulkan_instance.h"
// GN_EXPORT gnDevicePresentationDetails gnGetDevicePresentationDetailsFn(const gnPhysicalOutputDevice& physicalOutputDevice) {
// SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalOutputDevice.physicalOutputDevice->instance->instance->window_surface, physicalOutputDevice.physicalOutputDevice->device);
// gnDevicePresentationDetails presentationDetails = gnDevicePresentationDetails{};
// presentationDetails.MinimumImageCount = swapChainSupport.capabilities.minImageCount;
// presentationDetails.MaximumImageCount = swapChainSupport.capabilities.maxImageCount;
// return presentationDetails;
// }

View File

@@ -1,14 +0,0 @@
#include "vulkan_swapchain.h"
#include "core/presentation_queue/gryphn_device_presentation_details.h"
#include "../output_device/vulkan_output_devices.h"
#include "../instance/vulkan_instance.h"
GN_EXPORT gnDevicePresentationDetails gnGetDevicePresentationDetailsFn(const gnPhysicalOutputDevice& physicalOutputDevice) {
SwapChainSupportDetails swapChainSupport = querySwapChainSupport(physicalOutputDevice.physicalOutputDevice->instance->instance->window_surface, physicalOutputDevice.physicalOutputDevice->device);
gnDevicePresentationDetails presentationDetails = gnDevicePresentationDetails{};
presentationDetails.MinimumImageCount = swapChainSupport.capabilities.minImageCount;
presentationDetails.MaximumImageCount = swapChainSupport.capabilities.maxImageCount;
return presentationDetails;
}

View File

@@ -1,7 +1,31 @@
#include "vulkan_presentation_queue.h"
#include "vulkan_swapchain_support.h"
#include <output_device/vulkan_physical_device.h>
#include "vulkan_surface/vulkan_surface.h"
#include "core/debugger/gryphn_debugger.h"
gnReturnCode gnCreatePresentationQueueFn() {
gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, const gnOutputDevice* device, struct gnPresentationQueueInfo_t presentationInfo) {
vkSwapchainSupportDetails details = vkGetSwapchainSupport(device->physicalDevice.physicalDevice->device, presentationInfo.surface.windowSurface->surface);
if (details.formatCount == 0) {
gnDebuggerSetErrorMessage(device->instance->debugger,
(gnMessageData){
.message = gnCreateString("Format count for presentation queue is zero")
}
);
return GN_NO_SUPPORTED_FORMATS;
}
if (details.presentModeCount == 0) {
gnDebuggerSetErrorMessage(device->instance->debugger,
(gnMessageData){
.message = gnCreateString("Present mode count for presentation queue is zero")
}
);
return GN_NO_SUPPORTED_PRESENT_MODES;
}
return GN_SUCCESS;
}
// #include "core/presentation_queue/gryphn_presentation_queue.h"

View File

@@ -1,99 +0,0 @@
// #pragma once
// #include <vulkan/vulkan.h>
// #include <gryphn/gryphn_utils.h>
// #include <cstdint> // Necessary for uint32_t
// #include <limits> // Necessary for std::numeric_limits
// #include <algorithm> // Necessary for std::clamp
// #include "vector"
// #include "set"
// #include <iostream>
// const std::vector<const char*> deviceExtensions = {
// VK_KHR_SWAPCHAIN_EXTENSION_NAME,
// "VK_KHR_portability_subset"
// };
// static VkSurfaceFormatKHR chooseSwapSurfaceFormat(const std::vector<VkSurfaceFormatKHR>& availableFormats) {
// for (const auto& availableFormat : availableFormats) {
// if (availableFormat.format == VK_FORMAT_B8G8R8A8_SRGB && availableFormat.colorSpace == VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) {
// return availableFormat;
// }
// }
// return availableFormats[0];
// }
// static VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR>& availablePresentModes) {
// for (const auto& availablePresentMode : availablePresentModes) {
// if (availablePresentMode == VK_PRESENT_MODE_MAILBOX_KHR) {
// return availablePresentMode;
// }
// }
// return VK_PRESENT_MODE_FIFO_KHR;
// }
// static VkExtent2D chooseSwapExtent(gnVec2 size, const VkSurfaceCapabilitiesKHR& capabilities) {
// if (capabilities.currentExtent.width != std::numeric_limits<uint32_t>::max()) {
// return capabilities.currentExtent;
// } else {
// // int width, height;
// // glfwGetFramebufferSize(window, &width, &height);
// VkExtent2D actualExtent = {
// static_cast<uint32_t>(size.x),
// static_cast<uint32_t>(size.y)
// };
// actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
// actualExtent.height = std::clamp(actualExtent.height, capabilities.minImageExtent.height, capabilities.maxImageExtent.height);
// return actualExtent;
// }
// }
// static bool checkDeviceExtensionSupport(std::vector<const char*> deviceExtensions, const VkPhysicalDevice& device) {
// uint32_t extensionCount;
// vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, nullptr);
// std::vector<VkExtensionProperties> availableExtensions(extensionCount);
// vkEnumerateDeviceExtensionProperties(device, nullptr, &extensionCount, availableExtensions.data());
// std::set<std::string> requiredExtensions(deviceExtensions.begin(), deviceExtensions.end());
// for (const auto& extension : availableExtensions) {
// requiredExtensions.erase(extension.extensionName);
// }
// return requiredExtensions.empty();
// }
// struct SwapChainSupportDetails {
// VkSurfaceCapabilitiesKHR capabilities;
// std::vector<VkSurfaceFormatKHR> formats;
// std::vector<VkPresentModeKHR> presentModes;
// };
// static SwapChainSupportDetails querySwapChainSupport(const VkSurfaceKHR& surface, const VkPhysicalDevice& device) {
// SwapChainSupportDetails details;
// vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities);
// uint32_t formatCount;
// vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, nullptr);
// if (formatCount != 0) {
// details.formats.resize(formatCount);
// vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &formatCount, details.formats.data());
// }
// uint32_t presentModeCount;
// vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, nullptr);
// if (presentModeCount != 0) {
// details.presentModes.resize(presentModeCount);
// vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &presentModeCount, details.presentModes.data());
// }
// return details;
// }

View File

@@ -0,0 +1,23 @@
#include "vulkan_swapchain_support.h"
struct vkSwapchainSupportDetails_t vkGetSwapchainSupport(
const VkPhysicalDevice device,
const VkSurfaceKHR surface
) {
struct vkSwapchainSupportDetails_t details;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(device, surface, &details.capabilities);
vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &details.formatCount, NULL);
if (details.formatCount > 0) {
details.formats = malloc(sizeof(VkSurfaceFormatKHR) * details.formatCount);
vkGetPhysicalDeviceSurfaceFormatsKHR(device, surface, &details.formatCount, details.formats);
}
vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &details.presentModeCount, NULL);
if (details.presentModeCount > 0) {
details.presentModes = malloc(sizeof(VkPresentModeKHR) * details.presentModeCount);
vkGetPhysicalDeviceSurfacePresentModesKHR(device, surface, &details.presentModeCount, details.presentModes);
}
return details;
}

View File

@@ -1,24 +1,17 @@
// #pragma once
// #include "vulkan/vulkan.h"
// #include "vulkan_swapchain.h"
// #include "../output_device/vulkan_output_devices.h"
#pragma once
#include <vulkan/vulkan.h>
#include <output_device/vulkan_output_devices.h>
// struct vulkanSwapchainDetails {
// VkSurfaceFormatKHR surfaceFormat;
// VkPresentModeKHR presentMode;
// VkExtent2D extent;
typedef struct vkSwapchainSupportDetails_t {
VkSurfaceCapabilitiesKHR capabilities;
uint32_t formatCount;
VkSurfaceFormatKHR* formats;
// SwapChainSupportDetails swapChainSupport;
// };
uint32_t presentModeCount;
VkPresentModeKHR* presentModes;
} vkSwapchainSupportDetails;
// static vulkanSwapchainDetails vulkanGetSwapchainDetails(gnVec2 size, const VkSurfaceKHR& surface, const VkPhysicalDevice& physicalDevice) {
// SwapChainSupportDetails swapChainSupport = querySwapChainSupport(surface, physicalDevice);
// VkSurfaceFormatKHR surfaceFormat = chooseSwapSurfaceFormat(swapChainSupport.formats);
// VkPresentModeKHR presentMode = chooseSwapPresentMode(swapChainSupport.presentModes);
// VkExtent2D extent = chooseSwapExtent(size, swapChainSupport.capabilities);
// return {
// surfaceFormat, presentMode, extent, swapChainSupport
// };
// }
struct vkSwapchainSupportDetails_t vkGetSwapchainSupport(
const VkPhysicalDevice device,
const VkSurfaceKHR surface
);