fix CAMetalLayers

This commit is contained in:
Greg Wells
2025-06-01 20:39:49 -04:00
parent 964ac7127d
commit 5b9f0d8ebe
22 changed files with 161 additions and 117 deletions

View File

@@ -3,6 +3,8 @@
#include "presentation_queue/vulkan_presentation_queue.h"
#include "output_device/vulkan_output_devices.h"
#include "stdio.h"
gnReturnCode gnPresentFn(struct gnOutputDevice_t* device, struct gnPresentInfo_t info) {
VkSemaphore* waitSemaphores = malloc(sizeof(VkSemaphore) * info.waitCount);
for (int i = 0; i < info.waitCount; i++) waitSemaphores[i] = info.waitSemaphores[i].semaphore->semaphore;
@@ -22,7 +24,8 @@ gnReturnCode gnPresentFn(struct gnOutputDevice_t* device, struct gnPresentInfo_t
VkQueue queue;
vkGetDeviceQueue(device->outputDevice->device, info.queueIndex, 0, &queue);
vkQueuePresentKHR(queue, &presentInfo);
VkResult result = vkQueuePresentKHR(queue, &presentInfo);
if (result == VK_ERROR_OUT_OF_DATE_KHR) return GN_OUT_OF_DATE_PRESENTATION_QUEUE;
if (result == VK_SUBOPTIMAL_KHR) return GN_SUBOPTIMAL_PRESENTATION_QUEUE;
return GN_SUCCESS;
}

View File

@@ -110,11 +110,16 @@ gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue,
return GN_SUCCESS;
}
void gnPresentationQueueGetImageFn(gnPresentationQueue* presentationQueue, uint64_t timeout, struct gnSemaphore_t* semaphore, uint32_t* imageIndex) {
vkAcquireNextImageKHR(
gnReturnCode gnPresentationQueueGetImageFn(gnPresentationQueue* presentationQueue, uint64_t timeout, struct gnSemaphore_t* semaphore, uint32_t* imageIndex) {
VkResult result = vkAcquireNextImageKHR(
presentationQueue->outputDevice->outputDevice->device,
presentationQueue->presentationQueue->swapChain,
timeout, semaphore->semaphore->semaphore, VK_NULL_HANDLE, imageIndex);
if (result == VK_ERROR_OUT_OF_DATE_KHR) return GN_OUT_OF_DATE_PRESENTATION_QUEUE;
if (result == VK_SUBOPTIMAL_KHR) return GN_SUBOPTIMAL_PRESENTATION_QUEUE;
return GN_SUCCESS;
}
void gnDestroyPresentationQueueFn(gnPresentationQueue* queue) {

View File

@@ -12,22 +12,12 @@
#include "vulkan/vulkan_metal.h"
gnReturnCode gnCreateMacOSWindowSurfaceFn(struct gnWindowSurface_t* windowSurface, gnInstance* instance, struct gnMacOSWindowSurfaceInfo_t createInfo) {
NSWindow* window = (__bridge NSWindow*)createInfo.window;
NSView* view = [window contentView];
CAMetalLayer* layer = [CAMetalLayer layer];
[layer setContentsScale:[window backingScaleFactor]];
[layer setFramebufferOnly:YES];
[view setLayer:layer];
[view setWantsLayer:YES];
windowSurface->windowSurface = malloc(sizeof(gnPlatformWindowSurface));
VkMetalSurfaceCreateInfoEXT surfaceCreateInfo = {};
surfaceCreateInfo.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
surfaceCreateInfo.pNext = NULL;
surfaceCreateInfo.flags = 0;
surfaceCreateInfo.pLayer = layer;
surfaceCreateInfo.pLayer = createInfo.layer;
VkResult result = vkCreateMetalSurfaceEXT(instance->instance->vk_instance, &surfaceCreateInfo, NULL, &windowSurface->windowSurface->surface);
if (result != VK_SUCCESS)