redo code and add xlib surface loader interface
This commit is contained in:
@@ -3,11 +3,13 @@
|
||||
#include "core/gryphn_format.h"
|
||||
#include "core/gryphn_present_mode.h"
|
||||
typedef struct gnMetalSurfaceCreateInfo gnMetalSurfaceCreateInfo;
|
||||
typedef struct gnXlibSurfaceCreateInfo gnXlibSurfaceCreateInfo;
|
||||
typedef struct gnSurfaceCapabilities gnSurfaceCapabilities;
|
||||
typedef struct gnPhysicalDeviceProperties gnPhysicalDeviceProperties;
|
||||
typedef struct gnDeviceCreateInfo gnDeviceCreateInfo;
|
||||
|
||||
typedef gnReturnCode (*PFN_gnCreateMetalSurface)(gnInstance, gnMetalSurfaceCreateInfo*, gnSurface*);
|
||||
typedef gnReturnCode (*PFN_gnCreateXlibSurface)(gnInstance, gnXlibSurfaceCreateInfo*, gnSurface*);
|
||||
typedef gnReturnCode (*PFN_enumeratePhysicalDevices)(gnInstance, uint32_t*, gnPhysicalDevice*);
|
||||
typedef gnReturnCode (*PFN_gnGetPhysicalDeviceProperties)(gnPhysicalDevice, gnPhysicalDeviceProperties*);
|
||||
typedef gnReturnCode (*PFN_gnCreateDevice)(gnInstance, gnDeviceCreateInfo*, gnDevice);
|
||||
@@ -19,6 +21,7 @@ typedef gnReturnCode (*PFN_gnDestroyInstance)(gnInstance);
|
||||
|
||||
typedef struct gnInstanceDispatchTable {
|
||||
PFN_gnCreateMetalSurface createMetalSurface;
|
||||
PFN_gnCreateXlibSurface createXlibSurface;
|
||||
PFN_gnGetSurfaceCapabilities getSurfaceCapabilities;
|
||||
PFN_gnGetSurfaceFormats getSurfaceFormats;
|
||||
PFN_gnGetSurfacePresentModes getSurfacePresentModes;
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#pragma once
|
||||
#ifdef GN_USE_SURFACE_COCOA
|
||||
#include "gryphn_handle.h"
|
||||
#include "gryphn_return_code.h"
|
||||
|
||||
#ifndef GN_CA_METAL_LAYER
|
||||
typedef struct CAMetalLayer CAMetalLayer;
|
||||
#endif
|
||||
#import <QuartzCore/CAMetalLayer.h>
|
||||
typedef struct gnMetalSurfaceCreateInfo {
|
||||
CAMetalLayer* metalLayer;
|
||||
} gnMetalSurfaceCreateInfo;
|
||||
gnReturnCode gnCreateMetalSurface(gnInstance instance, gnMetalSurfaceCreateInfo* createInfo, gnSurface* surface);
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#pragma once
|
||||
#include "gryphn_metal_surface.h"
|
||||
#include "gryphn_xlib_surface.h"
|
||||
#include "gryphn_return_code.h"
|
||||
#include "gryphn_handle.h"
|
||||
#include "core/gryphn_vec2d.h"
|
||||
#include "core/gryphn_format.h"
|
||||
#include "core/gryphn_present_mode.h"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#include "gryphn_xlib_surface.h"
|
||||
#include "instance/gryphn_instance.h"
|
||||
|
||||
gnReturnCode gnCreateXlibSurface(gnInstance instance, gnXlibSurfaceCreateInfo* createInfo, gnSurface* surface) {
|
||||
return instance->dispatchTable.createXlibSurface(instance, createInfo, surface);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
#pragma once
|
||||
#ifdef GN_USE_SURFACE_XLIB
|
||||
#include "gryphn_handle.h"
|
||||
#include "gryphn_return_code.h"
|
||||
|
||||
#include "X11/Xlib.h"
|
||||
typedef struct gnXlibSurfaceCreateInfo {
|
||||
Display* dpy;
|
||||
Window window;
|
||||
} gnXlibSurfaceCreateInfo;
|
||||
|
||||
gnReturnCode gnCreateXlibSurface(gnInstance instance, gnXlibSurfaceCreateInfo* createInfo, gnSurface* surface);
|
||||
#endif
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "stdlib.h"
|
||||
#include <vulkan/vulkan_core.h>
|
||||
#include "vulkan_functions.h"
|
||||
#include "string.h"
|
||||
|
||||
gnReturnCode vulkanCodeToGryphnCode(VkResult result) {
|
||||
if (result != VK_SUCCESS) {
|
||||
@@ -58,7 +59,19 @@ gnReturnCode initBackend(gnInstance instance, gnInstanceCreateInfo* info) {
|
||||
const char** extensions = malloc(sizeof(const char*) * info->enabledExtensionCount);
|
||||
int realEnabledExtensionCount = 0;
|
||||
for (int i = 0; i < info->enabledExtensionCount; i++) {
|
||||
// zero supported vulkan extensions right now
|
||||
if (strcmp(info->enabledExtensions[i], "GN_EXT_surface") == 0) {
|
||||
extensions[realEnabledExtensionCount] = "VK_KHR_surface";
|
||||
realEnabledExtensionCount++;
|
||||
// instance->dispatchTable.destroySurface = metalDestroySurface;
|
||||
// instance->dispatchTable.getSurfaceCapabilities = metalGetSurfaceCapabilities;
|
||||
// instance->dispatchTable.getSurfaceFormats = metalGetSurfaceFormats;
|
||||
// instance->dispatchTable.getSurfacePresentModes = metalGetSurfacePresentModes;
|
||||
}
|
||||
if (strcmp(info->enabledExtensions[i], "GN_EXT_surface_xlib") == 0) {
|
||||
extensions[realEnabledExtensionCount] = "VK_KHR_xlib_surface";
|
||||
realEnabledExtensionCount++;
|
||||
// instance->dispatchTable.createMetalSurface = metalCreateSurface;
|
||||
}
|
||||
}
|
||||
VkInstanceCreateInfo createInfo = {
|
||||
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#define GN_USE_SURFACE_XLIB
|
||||
#include "Gryphn/gryphn.h"
|
||||
#include <iostream>
|
||||
#include "stdlib.h"
|
||||
#include "iostream"
|
||||
#define GLFW_EXPOSE_NATIVE_X11
|
||||
#include "glfw/include/GLFW/glfw3.h"
|
||||
#include "glfw/include/GLFW/glfw3native.h"
|
||||
@@ -15,7 +16,6 @@
|
||||
}
|
||||
|
||||
GLFWwindow* window;
|
||||
CAMetalLayer* layer;
|
||||
gnVersion version = gnCreateVersion(1, 0, 0);
|
||||
gnInstance instance;
|
||||
gnPhysicalDevice pysicalDevice;
|
||||
@@ -79,17 +79,12 @@ void createDevice() {
|
||||
}
|
||||
|
||||
void createSurface() {
|
||||
// NSWindow* nswin = glfwGetCocoaWindow((GLFWwindow*)window);
|
||||
// NSView* view = [nswin contentView];
|
||||
// layer = [CAMetalLayer layer];
|
||||
// [view setWantsLayer:YES];
|
||||
// [view setLayer:layer];
|
||||
// layer.contentsScale = [nswin backingScaleFactor];
|
||||
gnXlibSurfaceCreateInfo createInfo = {
|
||||
.dpy = glfwGetX11Display(),
|
||||
.window = glfwGetX11Window(window)
|
||||
};
|
||||
|
||||
// gnMetalSurfaceCreateInfo createInfo = {
|
||||
// .metalLayer = layer
|
||||
// };
|
||||
// CHECK(gnCreateMetalSurface(instance, &createInfo, &surface));
|
||||
CHECK(gnCreateXlibSurface(instance, &createInfo, &surface));
|
||||
|
||||
// gnSurfaceCapabilities capabilites;
|
||||
// gnGetSurfaceCapabilities(pysicalDevice, surface, &capabilites);
|
||||
@@ -115,7 +110,7 @@ int main() {
|
||||
try {
|
||||
createInstance();
|
||||
createDevice();
|
||||
// createSurface();
|
||||
createSurface();
|
||||
// createSwapchain();
|
||||
while (!glfwWindowShouldClose(window)) {
|
||||
glfwPollEvents();
|
||||
@@ -125,7 +120,7 @@ int main() {
|
||||
return 0;
|
||||
}
|
||||
glfwDestroyWindow(window);
|
||||
// gnDestroySurface(instance, &surface);
|
||||
gnDestroySurface(instance, &surface);
|
||||
gnDestroyDevice(&device);
|
||||
gnDestroyInstance(&instance);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user