diff --git a/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.m b/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.m index 1b3a4ff..f80f945 100644 --- a/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.m +++ b/rendering_api/metal/src/core/presentation_queue/metal_presentation_queue.m @@ -1,25 +1,40 @@ #include "metal_presentation_queue.h" #include "core/surface/metal_surface.h" #include "core/devices/metal_output_devices.h" +#include "core/debugger/gryphn_debugger.h" gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, const gnOutputDevice* device, struct gnPresentationQueueInfo_t presentationInfo) { + if (presentationInfo.minImageCount > 3) { + gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){ + .message = gnCreateString("On Metal you cannot have more than 3 images in a presentation queue") + }); + return GN_UNSUPPORTED_IMAGE_COUNT; + } + + if (presentationInfo.minImageCount < 2) { + gnDebuggerSetErrorMessage(device->instance->debugger, (gnMessageData){ + .message = gnCreateString("On Metal you cannot have less than 2 images in a presentation queue") + }); + return GN_UNSUPPORTED_IMAGE_COUNT; + } + presentationQueue->presentationQueue = malloc(sizeof(struct gnPlatformPresentationQueue_t)); MTLPixelFormat convertedFormat = mtlGryphnFormatToVulkanFormat(presentationInfo.format.format); CGColorSpaceRef convertedColorSpace = mtlGryphnColorSpaceToVulkanColorSpace(presentationInfo.format.colorSpace); - presentationQueue->presentationQueue->textureCount = presentationInfo.ImageCount; - presentationQueue->presentationQueue->textures = malloc(sizeof(id) * presentationInfo.ImageCount); + presentationQueue->presentationQueue->textureCount = presentationInfo.minImageCount; + presentationQueue->presentationQueue->textures = malloc(sizeof(id) * presentationInfo.minImageCount); MTLTextureDescriptor* textureDescriptor = [[MTLTextureDescriptor alloc] init]; textureDescriptor.pixelFormat = convertedFormat; - textureDescriptor.width = presentationInfo.ImageSize.x; - textureDescriptor.height = presentationInfo.ImageSize.y; + textureDescriptor.width = presentationInfo.imageSize.x; + textureDescriptor.height = presentationInfo.imageSize.y; textureDescriptor.usage = MTLTextureUsageRenderTarget; textureDescriptor.textureType = MTLTextureType2D; - for (int i = 0; i < presentationInfo.ImageCount; i++) { + for (int i = 0; i < presentationInfo.minImageCount; i++) { presentationQueue->presentationQueue->textures[i] = [device->outputDevice->device newTextureWithDescriptor:textureDescriptor]; } diff --git a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c index 46a1871..3c40e67 100644 --- a/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c +++ b/rendering_api/vulkan/src/presentation_queue/vulkan_presentation_queue.c @@ -43,15 +43,15 @@ gnReturnCode gnCreatePresentationQueueFn(gnPresentationQueue* presentationQueue, } VkPresentModeKHR presentMode = VK_PRESENT_MODE_FIFO_KHR; VkExtent2D extent = { - .width = presentationInfo.ImageSize.x, - .height = presentationInfo.ImageSize.y + .width = presentationInfo.imageSize.x, + .height = presentationInfo.imageSize.y }; VkSwapchainCreateInfoKHR createInfo = {}; createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; createInfo.surface = presentationInfo.surface.windowSurface->surface; - createInfo.minImageCount = presentationInfo.ImageCount; + createInfo.minImageCount = presentationInfo.minImageCount; createInfo.imageFormat = details.formats[index].format; createInfo.imageColorSpace = details.formats[index].colorSpace; createInfo.imageExtent = extent; diff --git a/src/core/presentation_queue/gryphn_presentation_queue.h b/src/core/presentation_queue/gryphn_presentation_queue.h index d145b2a..eefb066 100644 --- a/src/core/presentation_queue/gryphn_presentation_queue.h +++ b/src/core/presentation_queue/gryphn_presentation_queue.h @@ -5,8 +5,8 @@ #include typedef struct gnPresentationQueueInfo_t { - uint32_t ImageCount; - struct gnUInt2_t ImageSize; + uint32_t minImageCount; + struct gnUInt2_t imageSize; struct gnWindowSurface_t surface; struct gnSurfaceFormat_t format; enum gnImageSharingMode_e imageSharingMode; @@ -20,6 +20,7 @@ typedef struct gnPresentationQueue_t { struct gnPlatformPresentationQueue_t* presentationQueue; struct gnOutputDevice_t* outputDevice; gnBool valid; + int imageCount; } gnPresentationQueue; gnReturnCode gnCreatePresentationQueue(gnPresentationQueue* presentationQueue, struct gnOutputDevice_t* device, struct gnPresentationQueueInfo_t presentationInfo); diff --git a/src/utils/gryphn_error_code.h b/src/utils/gryphn_error_code.h index 10d8341..74930a9 100644 --- a/src/utils/gryphn_error_code.h +++ b/src/utils/gryphn_error_code.h @@ -14,21 +14,17 @@ typedef enum gnReturnCode_t { GN_NO_SUPPORTED_FORMATS, GN_NO_SUPPORTED_PRESENT_MODES, GN_UNKNOWN_IMAGE_FORMAT, - GN_FAILED_TO_CREATE_PRESENTATION_QUEUE + GN_FAILED_TO_CREATE_PRESENTATION_QUEUE, + GN_UNSUPPORTED_IMAGE_COUNT - // GN_UNKNOWN_ERROR, // GN_UNKNOWN_FRAMEBUFFER_ATTACHMENT, // GN_UNKNOWN_SHADER_MODULE, // GN_UNKNOWN_FUNCTION, // GN_SHADER_FAILED_TO_COMPILE, - // GN_UNSUPPORTED_COLOR_FORMAT, // GN_UNKNOWN_COLOR_FORMAT, - // GN_FUNCTION_NOT_FOUND, // GN_FAILED_CREATE_GRAPHICS_PIPELINE, - // GN_FAILED_CREATE_PRESENTATION_QUEUE, // GN_FAILED_TO_CREATE_FRAMEBUFFER, // GN_FAILED_CREATE_RENDERPASS, - // GN_FAILED_TO_ATTACH_WINDOW, // GN_FAILED_TO_CREATE_IMAGE } gnReturnCode; @@ -49,5 +45,6 @@ static const char* gnErrorCodeToCString(enum gnReturnCode_t returnCode) { case GN_NO_SUPPORTED_PRESENT_MODES: return "GN_NO_SUPPORTED_PRESENT_MODES"; case GN_UNKNOWN_IMAGE_FORMAT: return "GN_UNKNOWN_IMAGE_FORMAT"; case GN_FAILED_TO_CREATE_PRESENTATION_QUEUE: return "GN_FAILED_TO_CREATE_PRESENTATION_QUEUE"; + case GN_UNSUPPORTED_IMAGE_COUNT: return "GN_UNSUPPORTED_IMAGE_COUNT"; } }