Remove gnCreateWindowSurface, add platform specific window creation
functions
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
#define GLFW_INCLUDE_VULKAN
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include "gryphn/gryphn_utils.h"
|
||||
#include "vector"
|
||||
#include <cstring>
|
||||
#include "debugger/vulkan_debugger.h"
|
||||
#include "vulkan_instance.h"
|
||||
|
||||
|
||||
|
||||
// now I gotta do some shit to setup debug layers
|
||||
bool checkValidationLayerSupport(gnList<gnString> layers_to_validate) {
|
||||
uint32_t layerCount;
|
||||
@@ -33,21 +32,24 @@ bool checkValidationLayerSupport(gnList<gnString> layers_to_validate) {
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<const char*> getRequiredExtensions(bool validation_layers_required) {
|
||||
uint32_t glfwExtensionCount = 0;
|
||||
const char** glfwExtensions;
|
||||
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
|
||||
// std::vector<const char*> getRequiredExtensions(bool validation_layers_required, gnInstance& instance) {
|
||||
// // uint32_t glfwExtensionCount = 0;
|
||||
// // const char** glfwExtensions;
|
||||
// // glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);
|
||||
|
||||
std::vector<const char*> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount);
|
||||
// std::vector<const char*> extensions(instance.instance->extensions, instance.instance->extensions + instance.instance->extensionCount);
|
||||
|
||||
if (validation_layers_required) {
|
||||
extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
}
|
||||
extensions.push_back("VK_KHR_portability_enumeration");
|
||||
extensions.push_back("VK_EXT_metal_surface");
|
||||
// if (validation_layers_required) {
|
||||
// extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
// }
|
||||
|
||||
return extensions;
|
||||
}
|
||||
// #ifdef GN_PLATFORM_MACOS
|
||||
// extensions.push_back("VK_KHR_portability_enumeration");
|
||||
// extensions.push_back("VK_EXT_metal_surface");
|
||||
// #endif
|
||||
|
||||
// return extensions;
|
||||
// }
|
||||
|
||||
void gnInstanceSetAppInfoFn(gnInstance& instance, gnAppInfo& info) {
|
||||
if (instance.instance == nullptr) instance.instance = new gnPlatformInstanceData();
|
||||
@@ -76,14 +78,36 @@ GN_EXPORT gnReturnCode gnCreateInstanceFn(gnInstance* instance) {
|
||||
|
||||
instance->valid = true;
|
||||
|
||||
#ifdef GN_PLATFORM_LINUX
|
||||
#ifdef GN_WINDOW_X11
|
||||
instance->instance->extensions.push_back("VK_KHR_xlib_surface");
|
||||
#endif
|
||||
#ifdef GN_WINFDOW_WAYLAND
|
||||
instance->instance->extensions.push_back("VK_KHR_wayland_surface");
|
||||
#endif
|
||||
#endif
|
||||
#ifdef GN_PLATFORM_WINDOWS
|
||||
instance->instance->extensions.push_back("VK_MVK_macos_surface");
|
||||
#endif
|
||||
#ifdef GN_PLATFORM_MACOS
|
||||
instance->instance->extensions.push_back("VK_MVK_macos_surface");
|
||||
instance->instance->extensions.push_back("VK_KHR_portability_enumeration");
|
||||
instance->instance->extensions.push_back("VK_EXT_metal_surface");
|
||||
#endif
|
||||
|
||||
|
||||
instance->instance->extensions.push_back("VK_KHR_surface");
|
||||
if (instance->debugger)
|
||||
instance->instance->extensions.push_back(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
|
||||
VkInstanceCreateInfo createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||
createInfo.pApplicationInfo = &instance->instance->appInfo;
|
||||
createInfo.flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR;
|
||||
auto extensions = getRequiredExtensions(instance->debugger);
|
||||
// auto extensions = getRequiredExtensions(instance->debugger);
|
||||
|
||||
createInfo.enabledExtensionCount = static_cast<uint32_t>(extensions.size());;
|
||||
createInfo.ppEnabledExtensionNames = extensions.data();
|
||||
createInfo.enabledExtensionCount = static_cast<uint32_t>(instance->instance->extensions.size());;
|
||||
createInfo.ppEnabledExtensionNames = instance->instance->extensions.data();
|
||||
|
||||
VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{};
|
||||
if (instance->debugger != nullptr) {
|
||||
@@ -116,16 +140,3 @@ GN_EXPORT void gnDestroyInstanceFn(gnInstance& instance) {
|
||||
vkDestroySurfaceKHR(instance.instance->vk_instance, instance.instance->window_surface, nullptr);
|
||||
vkDestroyInstance(instance.instance->vk_instance, nullptr);
|
||||
}
|
||||
|
||||
GN_EXPORT gnReturnCode gnInstanceSetWindowFn(gnInstance& instance, GLFWwindow* window) {
|
||||
instance.instance->window = window;
|
||||
|
||||
if (glfwVulkanSupported() != GLFW_TRUE) {
|
||||
return gnReturnError(GN_UNSUPPORTED_RENDERING_API, "vulkan is not actually supported\n");
|
||||
}
|
||||
|
||||
VkResult result = glfwCreateWindowSurface(instance.instance->vk_instance, window, nullptr, &instance.instance->window_surface);\
|
||||
if (result != VK_SUCCESS)
|
||||
return gnReturnError(GN_FAILED_TO_ATTACH_WINDOW, std::to_string(result).c_str());
|
||||
return GN_SUCCESS;
|
||||
}
|
||||
|
@@ -1,10 +1,14 @@
|
||||
#pragma once
|
||||
#include "core/instance/gryphn_instance.h"
|
||||
#include <vulkan/vulkan.h>
|
||||
#ifdef GN_PLATFORM_MACOS
|
||||
#include "vulkan_macos_bridge.h"
|
||||
#endif
|
||||
|
||||
struct gnPlatformInstanceData {
|
||||
VkInstance vk_instance;
|
||||
VkApplicationInfo appInfo;
|
||||
VkSurfaceKHR window_surface;
|
||||
GLFWwindow* window;
|
||||
|
||||
std::vector<const char*> extensions;
|
||||
};
|
||||
|
2
rendering_api/vulkan/src/instance/vulkan_macos_bridge.h
Normal file
2
rendering_api/vulkan/src/instance/vulkan_macos_bridge.h
Normal file
@@ -0,0 +1,2 @@
|
||||
#pragma once
|
||||
void* macosBridge(void* window, void* view);
|
18
rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm
Normal file
18
rendering_api/vulkan/src/instance/vulkan_macos_bridge.mm
Normal file
@@ -0,0 +1,18 @@
|
||||
#include "vulkan_macos_bridge.h"
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <QuartzCore/CAMetalLayer.h>
|
||||
#import <QuartzCore/QuartzCore.h>
|
||||
#import <Metal/Metal.h>
|
||||
|
||||
// kinda borrowed from cocoa_window.m in GLFW
|
||||
void* macosBridge(void* inputWindow, void* inputView) {
|
||||
NSWindow* window = (__bridge NSWindow*)inputView;
|
||||
NSView* view = (__bridge NSView*)inputView;
|
||||
|
||||
CAMetalLayer* layer = [CAMetalLayer layer];
|
||||
[layer setContentsScale:[window backingScaleFactor]];
|
||||
|
||||
[view setLayer:layer];
|
||||
[view setWantsLayer:YES];
|
||||
return layer;
|
||||
}
|
70
rendering_api/vulkan/src/instance/vulkan_surfance.cpp
Normal file
70
rendering_api/vulkan/src/instance/vulkan_surfance.cpp
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "vulkan_instance.h"
|
||||
|
||||
#ifdef GN_PLATFORM_LINUX
|
||||
#ifdef GN_WINDOW_X11
|
||||
#include <vulkan/vulkan_xlib.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
GN_EXPORT gnReturnCode gnCreateX11WindowSurfaceFn(gnInstance& instance, Display* display, Window* window) {
|
||||
VkXlibSurfaceCreateInfoKHR info{};
|
||||
info.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
|
||||
info.dpy = display;
|
||||
info.window = window;
|
||||
|
||||
vkCreateXlibSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface);
|
||||
return GN_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef GN_WINFDOW_WAYLAND
|
||||
#include <vulkan/vulkan_wayland.h>
|
||||
#include <wayland-client.h>
|
||||
GN_EXPORT gnReturnCode gnCreateWaylandWindowSurfaceFn(gnInstance& instance, wl_display* display, wl_surface* surface) {
|
||||
VkWaylandSurfaceCreateInfoKHR info{};
|
||||
info.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
|
||||
info.display = display;
|
||||
info.surface = surface;
|
||||
|
||||
VkSurfaceKHR surface;
|
||||
vkCreateWaylandSurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface);
|
||||
return GN_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef GN_PLATFORM_WINDOWS
|
||||
#include "vulkan/vulkan_win32.h"
|
||||
GN_EXPORT gnReturnCode gnCreateWindowsWindowSurfaceFn(gnInstance& instance, HWND* window, HINSTANCE* instance) {
|
||||
VkWin32SurfaceCreateInfoKHR info{};
|
||||
info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
|
||||
info.hwnd = window;
|
||||
info.hinstance = instance;
|
||||
|
||||
VkSurfaceKHR surface;
|
||||
vkCreateWin32SurfaceKHR(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface);
|
||||
return GN_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
#include "vulkan/vulkan_macos.h"
|
||||
#include "vulkan/vulkan_metal.h"
|
||||
|
||||
#ifdef GN_PLATFORM_MACOS
|
||||
GN_EXPORT gnReturnCode gnCreateMacOSWindowSurfaceFn(gnInstance& instance, NS::Window* window, NS::View* view) {
|
||||
// VkMacOSSurfaceCreateInfoMVK info{};
|
||||
// info.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
|
||||
// info.pView = (void*)view;
|
||||
|
||||
VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {};
|
||||
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
|
||||
surfaceCreateInfo.pNext = nullptr;
|
||||
surfaceCreateInfo.flags = 0;
|
||||
surfaceCreateInfo.pLayer = macosBridge(window, view);
|
||||
|
||||
VkSurfaceKHR surface;
|
||||
VkResult result = vkCreateMetalSurfaceEXT(instance.instance->vk_instance, &surfaceCreateInfo, nullptr, &instance.instance->window_surface);
|
||||
|
||||
// VkSurfaceKHR surface;
|
||||
// vkCreateMacOSSurfaceMVK(instance.instance->vk_instance, &info, nullptr, &instance.instance->window_surface);
|
||||
// return GN_SUCCESS;
|
||||
}
|
||||
#endif
|
@@ -15,14 +15,12 @@ GN_EXPORT gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presenta
|
||||
presentationQueue->presentationQueue->outputDevice = const_cast<gnOutputDevice*>(&device);
|
||||
|
||||
vulkanSwapchainDetails swapchain_details = vulkanGetSwapchainDetails(
|
||||
device.physicalOutputDevice->physicalOutputDevice->instance->instance->window,
|
||||
device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface,
|
||||
device.physicalOutputDevice->physicalOutputDevice->device
|
||||
{ (float)details.ImageSize.x, (float)details.ImageSize.y },
|
||||
device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface,
|
||||
device.physicalOutputDevice->physicalOutputDevice->device
|
||||
);
|
||||
presentationQueue->presentationQueue->swapchainDetails = swapchain_details;
|
||||
|
||||
//std::cout << "Swapchain Image Format: " << presentationQueue->presentation_queue->swapchainDetails.surfaceFormat << "\n";
|
||||
|
||||
VkSwapchainCreateInfoKHR createInfo{};
|
||||
createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
|
||||
createInfo.surface = device.physicalOutputDevice->physicalOutputDevice->instance->instance->window_surface;
|
||||
|
@@ -1,5 +1,4 @@
|
||||
#pragma once
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <vulkan/vulkan.h>
|
||||
#include <gryphn/gryphn_utils.h>
|
||||
#include <cstdint> // Necessary for uint32_t
|
||||
@@ -7,6 +6,7 @@
|
||||
#include <algorithm> // Necessary for std::clamp
|
||||
#include "vector"
|
||||
#include "set"
|
||||
#include <iostream>
|
||||
|
||||
const std::vector<const char*> deviceExtensions = {
|
||||
VK_KHR_SWAPCHAIN_EXTENSION_NAME,
|
||||
@@ -33,16 +33,16 @@ static VkPresentModeKHR chooseSwapPresentMode(const std::vector<VkPresentModeKHR
|
||||
return VK_PRESENT_MODE_FIFO_KHR;
|
||||
}
|
||||
|
||||
static VkExtent2D chooseSwapExtent(GLFWwindow* window, const VkSurfaceCapabilitiesKHR& capabilities) {
|
||||
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);
|
||||
// int width, height;
|
||||
// glfwGetFramebufferSize(window, &width, &height);
|
||||
|
||||
VkExtent2D actualExtent = {
|
||||
static_cast<uint32_t>(width),
|
||||
static_cast<uint32_t>(height)
|
||||
static_cast<uint32_t>(size.x),
|
||||
static_cast<uint32_t>(size.y)
|
||||
};
|
||||
|
||||
actualExtent.width = std::clamp(actualExtent.width, capabilities.minImageExtent.width, capabilities.maxImageExtent.width);
|
||||
|
@@ -11,12 +11,12 @@ struct vulkanSwapchainDetails {
|
||||
SwapChainSupportDetails swapChainSupport;
|
||||
};
|
||||
|
||||
static vulkanSwapchainDetails vulkanGetSwapchainDetails(GLFWwindow* window, const VkSurfaceKHR& surface, const VkPhysicalDevice& physicalDevice) {
|
||||
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(window, swapChainSupport.capabilities);
|
||||
VkExtent2D extent = chooseSwapExtent(size, swapChainSupport.capabilities);
|
||||
|
||||
return {
|
||||
surfaceFormat, presentMode, extent, swapChainSupport
|
||||
|
Reference in New Issue
Block a user