From 3e6be613382d5cc6e6a1feb699afa8315490959d Mon Sep 17 00:00:00 2001 From: butchhartman Date: Thu, 22 Jan 2026 14:22:29 -0700 Subject: [PATCH 01/11] Broke like every single creation function but made them less annoying to look at :) --- .../creation/rtER_VK_objectCreation.h | 55 ++++------------ src/rtERenderer/rtERenderer.c | 66 +++++-------------- 2 files changed, 31 insertions(+), 90 deletions(-) diff --git a/src/rtERenderer/creation/rtER_VK_objectCreation.h b/src/rtERenderer/creation/rtER_VK_objectCreation.h index f7a6a16..cee2241 100644 --- a/src/rtERenderer/creation/rtER_VK_objectCreation.h +++ b/src/rtERenderer/creation/rtER_VK_objectCreation.h @@ -1,6 +1,7 @@ #ifndef RTER_VK_OBJECTCREATION_H_ #define RTER_VK_OBJECTCREATION_H_ #include +struct rtERenderer; struct rtER_VK_queueInfo; struct rtER_VK_queueCapabilities; struct rtER_VK_swapchainInfo; @@ -13,32 +14,26 @@ VkQueue* rtER_VK_getQueueWithCapabilities( ); enum VkResult rtER_VK_createVKInstance( - VkInstance* dest, - uint32_t* apiVersionDest, + struct rtERenderer* renderer, const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions, const char** requiredLayers, uint32_t numRequiredLayers); enum VkResult rtER_VK_createDebugMessenger( - VkDebugUtilsMessengerEXT* dest, - VkInstance instance, + struct rtERenderer* renderer, VkDebugUtilsMessengerCreateInfoEXT info); enum VkResult rtER_VK_getSuitablePhysicalDevice( - VkPhysicalDevice* dest, - VkInstance instance, - VkSurfaceKHR surface, + struct rtERenderer* renderer, VkQueueFlagBits requiredQueueFlags, const char** requiredExtensions, uint32_t requiredExtensionsCount ); enum VkResult rtER_VK_createLogicalDevice( - VkDevice* dest, - VkPhysicalDevice physDevice, - VkSurfaceKHR* surface, + struct rtERenderer* renderer, VkQueueFlagBits requiredQueueTypeFlags, const char** requiredExtensions, uint32_t requiredExtensionsCount, @@ -46,53 +41,30 @@ enum VkResult rtER_VK_createLogicalDevice( ); enum VkResult rtER_VK_createSwapchain( - VkSwapchainKHR* dest, - struct rtER_VK_swapchainInfo* infoDest, - VkSurfaceKHR surface, - VkPhysicalDevice physDevice, - VkDevice logicalDevice, - VkImage** swapchainImages, - uint32_t* swapchainImageCount + struct rtERenderer* renderer ); enum VkResult rtER_VK_createImageViews( - VkImageView** dest, - struct rtER_VK_swapchainInfo swapchainInfo, - VkImage* images, - uint32_t imageCount, - VkDevice logicalDevice + struct rtERenderer* renderer ); enum VkResult rtER_VK_createRenderpass( - VkRenderPass* dest, - VkDevice logicalDevice, - struct rtER_VK_swapchainInfo swapchainInfo + struct rtERenderer* renderer ); enum VkResult rtER_VK_createFramebuffers( - VkFramebuffer** dest, - VkDevice logicalDevice, - VkRenderPass renderPass, - VkImageView* imageViews, - uint32_t numImageViews, - struct rtER_VK_swapchainInfo swapchainInfo + struct rtERenderer* renderer ); enum VkResult rtER_VK_createGraphicsPipeline( - VkPipeline* dest, - VkPipelineLayout* layoutDest, - VkDevice logicalDevice, - VkRenderPass renderpass, - struct rtER_VK_swapchainInfo swapchainInfo, - VkDescriptorSetLayout UBODescriptorSetLayout + struct rtERenderer* renderer ); enum VkResult rtER_VK_createCommandPool( - VkCommandPool* dest, - VkDevice logicalDevice, - struct rtER_VK_queueInfo queueInfo + struct rtERenderer* renderer ); +// The following creation functions will need more thought as the renderer needs to create multiple. Perhaps convert to create *s functions enum VkResult rtER_VK_createCommandBuffer( VkCommandBuffer* dest, VkDevice logicalDevice, @@ -132,8 +104,7 @@ enum VkResult rtER_VK_bufferData( ); enum VkResult rtER_VK_createDescriptorSetLayout( - VkDescriptorSetLayout* dest, - VkDevice logicalDevice, + struct rtERenderer* renderer, uint32_t binding, uint32_t descriptorCount, enum VkDescriptorType descriptorType, diff --git a/src/rtERenderer/rtERenderer.c b/src/rtERenderer/rtERenderer.c index 8b6a49c..8c534fb 100644 --- a/src/rtERenderer/rtERenderer.c +++ b/src/rtERenderer/rtERenderer.c @@ -33,8 +33,7 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru // TODO: Remove needing to put every relevant member in individually and just send through the whole renderer struct rtER_VK_createVKInstance( - &renderer->instance, - &renderer->apiVersion, + renderer, rtER_VK_requiredInstanceExtensions, ARRAY_SIZE(rtER_VK_requiredInstanceExtensions), rtER_VK_requiredValidationLayers, @@ -42,8 +41,7 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru ); rtER_VK_createDebugMessenger( - &renderer->debugMessenger, - renderer->instance, + renderer, rtER_VK_getDebugMessengerCreateInfo( VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | @@ -57,6 +55,7 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru ) ); + // this is a rtEW function, it makes sense to not give the windowing library access to the renderer definition. rtEW_VK_createSurface( &renderer->surface, renderer->instance, @@ -64,18 +63,14 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru ); rtER_VK_getSuitablePhysicalDevice( - &renderer->physDevice, - renderer->instance, - renderer->surface, + renderer, VK_QUEUE_GRAPHICS_BIT, rtER_VK_requiredDeviceExtensions, ARRAY_SIZE(rtER_VK_requiredDeviceExtensions) ); rtER_VK_createLogicalDevice( - &renderer->logicalDevice, - renderer->physDevice, - &renderer->surface, + renderer, VK_QUEUE_GRAPHICS_BIT, rtER_VK_requiredDeviceExtensions, ARRAY_SIZE(rtER_VK_requiredDeviceExtensions), @@ -83,61 +78,36 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru ); rtER_VK_createSwapchain( - &renderer->swapchain, - &renderer->swapchainInfo, - renderer->surface, - renderer->physDevice, - renderer->logicalDevice, - &renderer->swapchainImages, - &renderer->swapchainImageCount + renderer ); rtER_VK_createImageViews( - &renderer->swapchainImageViews, - renderer->swapchainInfo, - renderer->swapchainImages, - renderer->swapchainImageCount, - renderer->logicalDevice + renderer ); rtER_VK_createRenderpass( - &renderer->renderPass, - renderer->logicalDevice, - renderer->swapchainInfo + renderer ); rtER_VK_createFramebuffers( - &renderer->framebuffers, - renderer->logicalDevice, - renderer->renderPass, - renderer->swapchainImageViews, - renderer->swapchainImageCount, - renderer->swapchainInfo + renderer ); rtER_VK_createDescriptorSetLayout( - &renderer->UBODescriptorSetLayout, - renderer->logicalDevice, - 0, - 1, - VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - VK_SHADER_STAGE_VERTEX_BIT, - nullptr - ); + renderer, + 0, + 1, + VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + VK_SHADER_STAGE_VERTEX_BIT, + nullptr + ); rtER_VK_createGraphicsPipeline( - &renderer->graphicsPipeline, - &renderer->pipelineLayout, - renderer->logicalDevice, - renderer->renderPass, - renderer->swapchainInfo, - renderer->UBODescriptorSetLayout + renderer ); rtER_VK_createCommandPool( - &renderer->commandPool, - renderer->logicalDevice, - renderer->queueInfo + renderer ); rtER_VK_createCommandBuffer( From 403ce861f65a9364cb69ed6fc3da9ae6fb8b7188 Mon Sep 17 00:00:00 2001 From: butchhartman Date: Sun, 25 Jan 2026 08:17:57 -0700 Subject: [PATCH 02/11] Updated object creation functions to use renderer struct --- .../creation/rtER_VK_objectCreation.c | 228 ++++++++---------- 1 file changed, 102 insertions(+), 126 deletions(-) diff --git a/src/rtERenderer/creation/rtER_VK_objectCreation.c b/src/rtERenderer/creation/rtER_VK_objectCreation.c index 91c35f0..b7357a4 100644 --- a/src/rtERenderer/creation/rtER_VK_objectCreation.c +++ b/src/rtERenderer/creation/rtER_VK_objectCreation.c @@ -37,14 +37,12 @@ VkQueue* rtER_VK_getQueueWithCapabilities( } enum VkResult rtER_VK_createVKInstance( - VkInstance* dest, - uint32_t* apiVersionDest, + struct rtERenderer* renderer, const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions, const char** requiredLayers, uint32_t numRequiredLayers) { - assert(dest != nullptr); #ifndef NDEBUG if (!rtER_debug_checkValidationLayerSupport(requiredLayers, numRequiredLayers)) { rtELog_logError("One or more required validation layers not supported"); @@ -58,24 +56,25 @@ enum VkResult rtER_VK_createVKInstance( } VK_ERROR_LOG_AND_RETURN( - vkEnumerateInstanceVersion(apiVersionDest), + vkEnumerateInstanceVersion(&renderer->apiVersion), "Failed to enumerate instance version. This should not happen." ); - if (VK_API_VERSION_MINOR(*apiVersionDest) < 4) { + /* This is not needed because there is no vk version below 1.0 + if (VK_API_VERSION_MINOR(&renderer->apiVersion) < 0) { rtELog_logError("Required Vulkan version 1.4 not supported"); return VK_ERROR_INCOMPATIBLE_DRIVER; } + */ - // I dont think this needs a separate function. Maybe to make this code cleaner but this will always be the same value struct VkApplicationInfo applicationInfo = { - .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, - .pNext = nullptr, - .pApplicationName = RTECH_APPLICATION_NAME, + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pNext = nullptr, + .pApplicationName = RTECH_APPLICATION_NAME, .applicationVersion = VK_MAKE_API_VERSION(0, RTECH_VERSION_MAJOR, RTECH_VERSION_MINOR, RTECH_VERSION_PATCH), - .pEngineName = nullptr, - .engineVersion = 0, - .apiVersion = VK_API_VERSION_1_0//VK_API_VERSION_1_4 + .pEngineName = nullptr, + .engineVersion = 0, + .apiVersion = VK_API_VERSION_1_0//VK_API_VERSION_1_4 }; struct VkDebugUtilsMessengerCreateInfoEXT dbmsgCreateInfo = @@ -102,7 +101,7 @@ enum VkResult rtER_VK_createVKInstance( }; VK_ERROR_LOG_AND_RETURN( - vkCreateInstance(&createInfo, nullptr, dest), + vkCreateInstance(&createInfo, nullptr, &renderer->instance), "Failed to create Vulkan instance" ); @@ -111,22 +110,21 @@ enum VkResult rtER_VK_createVKInstance( } enum VkResult rtER_VK_createDebugMessenger( - VkDebugUtilsMessengerEXT* dest, - VkInstance instance, + struct rtERenderer* renderer, VkDebugUtilsMessengerCreateInfoEXT info) { PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) vkGetInstanceProcAddr( - instance, + renderer->instance, "vkCreateDebugUtilsMessengerEXT"); VK_ERROR_LOG_AND_RETURN( pfnCreateDebugUtilsMessengerEXT( - instance, + renderer->instance, &info, nullptr, - dest), + &renderer->debugMessenger), "Failed to create debug messenger"); rtELog_debug_logInfo("Created debug messenger"); @@ -140,10 +138,6 @@ static VkQueueFamilyProperties* getQueueFamilyProperties(VkPhysicalDevice physDe vkGetPhysicalDeviceQueueFamilyProperties(physDevice, count, nullptr); VkQueueFamilyProperties* queueFamilyProperties = malloc(sizeof(VkQueueFamilyProperties) * *count); -// for (size_t i = 0; i < *count; i++) { - // queueFamilyProperties[i]. = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2; - // queueFamilyProperties[i].pNext = nullptr; - // } vkGetPhysicalDeviceQueueFamilyProperties(physDevice, count, queueFamilyProperties); @@ -156,6 +150,7 @@ static bool physicalDeviceHasQueueFamilies( VkQueueFlagBits* neededQueueFlags ) { + // base case if (*neededQueueFlags == 0) { return true; } @@ -167,6 +162,7 @@ static bool physicalDeviceHasQueueFamilies( for (size_t i = 0; i < numQueueFamilies; i++) { if (queueFamilyProperties[i].queueFlags & *neededQueueFlags) { + // Removes the supported flag(s) from neededqueueflags (*neededQueueFlags) = (*neededQueueFlags) & ~(queueFamilyProperties[i].queueFlags & *neededQueueFlags); free(queueFamilyProperties); rtELog_debug_logInfo("Found queue family, iterating %d", (*neededQueueFlags)); @@ -264,23 +260,27 @@ static bool checkPhysicalDeviceSuitability( } enum VkResult rtER_VK_getSuitablePhysicalDevice( - VkPhysicalDevice* dest, - VkInstance instance, - VkSurfaceKHR surface, + struct rtERenderer* renderer, VkQueueFlagBits requiredQueueFlags, const char** requiredExtensions, uint32_t requiredExtensionsCount ) { uint32_t numPhysDevices; - vkEnumeratePhysicalDevices(instance, &numPhysDevices, nullptr); + vkEnumeratePhysicalDevices(renderer->instance, &numPhysDevices, nullptr); VkPhysicalDevice* physicalDevices = malloc(sizeof(VkPhysicalDevice) * numPhysDevices); - vkEnumeratePhysicalDevices(instance, &numPhysDevices, physicalDevices); + vkEnumeratePhysicalDevices(renderer->instance, &numPhysDevices, physicalDevices); + // Just selects the first one it finds; most users only have 1 for (size_t i = 0; i < numPhysDevices; i++) { - if (checkPhysicalDeviceSuitability(physicalDevices[i], surface, requiredQueueFlags, requiredExtensions, requiredExtensionsCount)) { - *dest = physicalDevices[i]; + if (checkPhysicalDeviceSuitability(physicalDevices[i], + renderer->surface, + requiredQueueFlags, + requiredExtensions, + requiredExtensionsCount) + ) { + renderer->physDevice = physicalDevices[i]; rtELog_debug_logInfo("Found a suitable physical device"); free(physicalDevices); return VK_SUCCESS; @@ -365,6 +365,7 @@ static bool populatertERQueueInfo( return false; } +// Note: priority is dynamically allocated and the caller is responsible for freeing it. static bool getDeviceQueueCreateInfosFromrtERQueueInfo( VkDeviceQueueCreateInfo** dest, uint32_t* queueCreateInfoCount, @@ -406,11 +407,10 @@ static bool populationrtERQueueInfoQueueHandles( return true; } +// this is dumb. presentation is always wanted. // SOLUTION: If the surface pointer is nullptr, then it is implied presentation is not wanted. if it is a valid pointer, then it is implied surface support is wanted enum VkResult rtER_VK_createLogicalDevice( - VkDevice* dest, - VkPhysicalDevice physDevice, - VkSurfaceKHR* surface, + struct rtERenderer* renderer, VkQueueFlagBits requiredQueueTypeFlags, const char** requiredExtensions, uint32_t requiredExtensionsCount, @@ -418,13 +418,13 @@ enum VkResult rtER_VK_createLogicalDevice( ) { struct rtER_VK_queueCapabilities requiredQueueCapabilities = { .queueFlags = requiredQueueTypeFlags, - .presentationSupport = !(surface == nullptr) + .presentationSupport = true }; if (!populatertERQueueInfo( queueInfo, requiredQueueCapabilities, - physDevice, - *surface + renderer->physDevice, + renderer->surface )) { rtELog_logError("Required queues not supported"); return VK_ERROR_INCOMPATIBLE_DRIVER; @@ -451,11 +451,14 @@ enum VkResult rtER_VK_createLogicalDevice( .pEnabledFeatures = nullptr }; - VK_ERROR_LOG_AND_RETURN(vkCreateDevice(physDevice, &createInfo, nullptr, dest), "Failed to create logical device"); + VK_ERROR_LOG_AND_RETURN( + vkCreateDevice(renderer->physDevice, &createInfo, nullptr, &renderer->logicalDevice), + "Failed to create logical device" + ); rtELog_debug_logInfo("Successfully created logical device"); - populationrtERQueueInfoQueueHandles(*queueInfo, *dest); + populationrtERQueueInfoQueueHandles(*queueInfo, renderer->logicalDevice); rtELog_debug_logInfo("Successfully retrieved all queue handles"); @@ -465,36 +468,28 @@ enum VkResult rtER_VK_createLogicalDevice( // TODO: dynamically adjust sharing modes to account for graphics and present queues not being the same -//TODO: create render pass objects - enum VkResult rtER_VK_createSwapchain( - VkSwapchainKHR* dest, - struct rtER_VK_swapchainInfo* infoDest, - VkSurfaceKHR surface, - VkPhysicalDevice physDevice, - VkDevice logicalDevice, - VkImage** swapchainImages, - uint32_t* swapchainImageCount + struct rtERenderer* renderer ) { VkSurfaceCapabilitiesKHR surfaceCapabilities; vkGetPhysicalDeviceSurfaceCapabilitiesKHR( - physDevice, - surface, + renderer->physDevice, + renderer->surface, &surfaceCapabilities ); uint32_t numSurfaceFormats; vkGetPhysicalDeviceSurfaceFormatsKHR( - physDevice, - surface, + renderer->physDevice, + renderer->surface, &numSurfaceFormats, nullptr ); VkSurfaceFormatKHR* surfaceFormats = malloc(sizeof(VkSurfaceFormatKHR) * numSurfaceFormats); vkGetPhysicalDeviceSurfaceFormatsKHR( - physDevice, - surface, + renderer->physDevice, + renderer->surface, &numSurfaceFormats, surfaceFormats ); @@ -516,7 +511,7 @@ enum VkResult rtER_VK_createSwapchain( .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, .pNext = nullptr, .flags = 0, - .surface = surface, + .surface = renderer->surface, .minImageCount = surfaceCapabilities.minImageCount, .imageFormat = selectedSurfaceFormat.format, .imageColorSpace = selectedSurfaceFormat.colorSpace, @@ -533,29 +528,29 @@ enum VkResult rtER_VK_createSwapchain( .oldSwapchain = nullptr }; - infoDest->imageFormat = selectedSurfaceFormat.format; - infoDest->swapchianExtent = swapchainCreateInfo.imageExtent; + renderer->swapchainInfo.imageFormat = selectedSurfaceFormat.format; + renderer->swapchainInfo.swapchianExtent = swapchainCreateInfo.imageExtent; VK_ERROR_LOG_AND_RETURN(vkCreateSwapchainKHR( - logicalDevice, + renderer->logicalDevice, &swapchainCreateInfo, nullptr, - dest + &renderer->swapchain ), "Failed to create swapchain"); VK_ERROR_LOG_AND_RETURN(vkGetSwapchainImagesKHR( - logicalDevice, - *dest, - swapchainImageCount, + renderer->logicalDevice, + renderer->swapchain, + &renderer->swapchainImageCount, nullptr ), "Failed to retrieve swapchain image count"); - (*swapchainImages) = malloc(sizeof(VkImage) * *swapchainImageCount); + renderer->swapchainImages = malloc(sizeof(VkImage) * renderer->swapchainImageCount); VK_ERROR_LOG_AND_RETURN(vkGetSwapchainImagesKHR( - logicalDevice, - *dest, - swapchainImageCount, - *swapchainImages + renderer->logicalDevice, + renderer->swapchain, + &renderer->swapchainImageCount, + renderer->swapchainImages ), "Failed to retrieve swapchain images"); @@ -563,21 +558,17 @@ enum VkResult rtER_VK_createSwapchain( } enum VkResult rtER_VK_createImageViews( - VkImageView** dest, - struct rtER_VK_swapchainInfo swapchainInfo, - VkImage* images, - uint32_t imageCount, - VkDevice logicalDevice + struct rtERenderer* renderer ) { - *dest = malloc(sizeof(VkImageView) * imageCount); - for (size_t i = 0; i < imageCount; i++) { + renderer->swapchainImageViews = malloc(sizeof(VkImageView) * renderer->swapchainImageCount); + for (size_t i = 0; i < renderer->swapchainImageCount; i++) { VkImageViewCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, .pNext = nullptr, .flags = 0, - .image = images[i], + .image = renderer->swapchainImages[i], .viewType = VK_IMAGE_VIEW_TYPE_2D, - .format = swapchainInfo.imageFormat, + .format = renderer->swapchainInfo.imageFormat, .components = { .r = VK_COMPONENT_SWIZZLE_R, .g = VK_COMPONENT_SWIZZLE_G, @@ -597,10 +588,10 @@ enum VkResult rtER_VK_createImageViews( VK_ERROR_LOG_AND_RETURN( vkCreateImageView( - logicalDevice, + renderer->logicalDevice, &createInfo, nullptr, - &(*dest)[i] + &(renderer->swapchainImageViews[i]) ), "Failed to create image view" @@ -612,14 +603,12 @@ enum VkResult rtER_VK_createImageViews( } enum VkResult rtER_VK_createRenderpass( - VkRenderPass* dest, - VkDevice logicalDevice, - struct rtER_VK_swapchainInfo swapchainInfo + struct rtERenderer* renderer ) { VkAttachmentDescription imageAttachmentDesc = { .flags = 0, - .format = swapchainInfo.imageFormat, + .format = renderer->swapchainInfo.imageFormat, .samples = VK_SAMPLE_COUNT_1_BIT, // No MSAA .loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR, .storeOp = VK_ATTACHMENT_STORE_OP_STORE, // Keeps what we draw @@ -674,45 +663,40 @@ enum VkResult rtER_VK_createRenderpass( VK_ERROR_LOG_AND_RETURN( vkCreateRenderPass( - logicalDevice, + renderer->logicalDevice, &createInfo, nullptr, - dest), + &renderer->renderPass), "Failed to create render pass"); return VK_SUCCESS; } enum VkResult rtER_VK_createFramebuffers( - VkFramebuffer** dest, - VkDevice logicalDevice, - VkRenderPass renderPass, - VkImageView* imageViews, - uint32_t numImageViews, - struct rtER_VK_swapchainInfo swapchainInfo + struct rtERenderer* renderer ) { - (*dest) = malloc(sizeof(VkFramebuffer) * numImageViews); + (renderer->framebuffers) = malloc(sizeof(VkFramebuffer) * renderer->swapchainImageCount); - for (size_t i = 0; i < numImageViews; i++) { + for (size_t i = 0; i < renderer->swapchainImageCount; i++) { VkFramebufferCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, .pNext = nullptr, .flags = 0, - .renderPass = renderPass, + .renderPass = renderer->renderPass, .attachmentCount = 1, - .pAttachments = &(imageViews[i]), - .width = swapchainInfo.swapchianExtent.width, - .height = swapchainInfo.swapchianExtent.height, + .pAttachments = &(renderer->swapchainImageViews[i]), + .width = renderer->swapchainInfo.swapchianExtent.width, + .height = renderer->swapchainInfo.swapchianExtent.height, .layers = 1 // ? }; VK_ERROR_LOG_AND_RETURN( vkCreateFramebuffer( - logicalDevice, + renderer->logicalDevice, &createInfo, nullptr, - &(*dest)[i] + &(renderer->framebuffers[i]) ), "Failed to create framebuffer" ); @@ -748,12 +732,7 @@ enum VkResult rtER_VK_createShaderModule( } enum VkResult rtER_VK_createGraphicsPipeline( - VkPipeline* dest, - VkPipelineLayout* layoutDest, - VkDevice logicalDevice, - VkRenderPass renderpass, - struct rtER_VK_swapchainInfo swapchainInfo, - VkDescriptorSetLayout UBODescriptorSetLayout + struct rtERenderer* renderer ) { uint32_t vertexShaderSize; @@ -767,13 +746,13 @@ enum VkResult rtER_VK_createGraphicsPipeline( rtER_VK_createShaderModule( &vertexShaderModule, - logicalDevice, + renderer->logicalDevice, vertexShaderCode, vertexShaderSize); rtER_VK_createShaderModule( &fragmentShaderModule, - logicalDevice, + renderer->logicalDevice, fragmentShaderCode, fragmentShaderSize); @@ -918,9 +897,9 @@ enum VkResult rtER_VK_createGraphicsPipeline( VkViewport viewport = { .x = 0, - .y = swapchainInfo.swapchianExtent.height, // Changes origin to lower left corner - .width = swapchainInfo.swapchianExtent.width, - .height = -((float)swapchainInfo.swapchianExtent.height), // Changes viewport so < 0 is down and > 0 is up + .y = renderer->swapchainInfo.swapchianExtent.height, // Changes origin to lower left corner + .width = renderer->swapchainInfo.swapchianExtent.width, + .height = -((float)renderer->swapchainInfo.swapchianExtent.height), // Changes viewport so < 0 is down and > 0 is up .minDepth = 0.0f, .maxDepth = 1.0f }; @@ -931,8 +910,8 @@ enum VkResult rtER_VK_createGraphicsPipeline( .y = 0 }, .extent = { - .width = swapchainInfo.swapchianExtent.width, - .height = swapchainInfo.swapchianExtent.height + .width = renderer->swapchainInfo.swapchianExtent.width, + .height = renderer->swapchainInfo.swapchianExtent.height } }; @@ -951,16 +930,16 @@ enum VkResult rtER_VK_createGraphicsPipeline( .pNext = nullptr, .flags = 0, .setLayoutCount = 1, - .pSetLayouts = &UBODescriptorSetLayout, + .pSetLayouts = &renderer->UBODescriptorSetLayout, .pushConstantRangeCount = 0, .pPushConstantRanges = nullptr }; vkCreatePipelineLayout( - logicalDevice, + renderer->logicalDevice, &pipelineLayoutCreateInfo, nullptr, - layoutDest + &renderer->pipelineLayout ); VkGraphicsPipelineCreateInfo createInfo = { @@ -979,8 +958,8 @@ enum VkResult rtER_VK_createGraphicsPipeline( .pColorBlendState = &colorBlendState, // TODO: dynamic viewport and scissor .pDynamicState = nullptr, - .layout = *layoutDest, - .renderPass = renderpass, + .layout = renderer->pipelineLayout, + .renderPass = renderer->renderPass, .subpass = 0, .basePipelineHandle = VK_NULL_HANDLE, .basePipelineIndex = 0 @@ -988,12 +967,12 @@ enum VkResult rtER_VK_createGraphicsPipeline( VK_ERROR_LOG_AND_RETURN( vkCreateGraphicsPipelines( - logicalDevice, + renderer->logicalDevice, VK_NULL_HANDLE, 1, &createInfo, nullptr, - dest), + &renderer->graphicsPipeline), "Failed to create graphics pipeline" ); @@ -1001,9 +980,7 @@ enum VkResult rtER_VK_createGraphicsPipeline( } enum VkResult rtER_VK_createCommandPool( - VkCommandPool* dest, - VkDevice logicalDevice, - struct rtER_VK_queueInfo queueInfo + struct rtERenderer* renderer ) { struct rtER_VK_queueCapabilities reqCapa = { @@ -1013,7 +990,7 @@ enum VkResult rtER_VK_createCommandPool( uint32_t qfi; rtER_VK_getQueueWithCapabilities( - queueInfo, + renderer->queueInfo, reqCapa, &qfi); @@ -1026,10 +1003,10 @@ enum VkResult rtER_VK_createCommandPool( VK_ERROR_LOG_AND_RETURN( vkCreateCommandPool( - logicalDevice, + renderer->logicalDevice, &createInfo, nullptr, - dest + &renderer->commandPool ), "Failed to create command pool" ); @@ -1255,8 +1232,7 @@ enum VkResult rtER_VK_bufferData( } enum VkResult rtER_VK_createDescriptorSetLayout( - VkDescriptorSetLayout* dest, - VkDevice logicalDevice, + struct rtERenderer* renderer, uint32_t binding, uint32_t descriptorCount, enum VkDescriptorType descriptorType, @@ -1281,10 +1257,10 @@ enum VkResult rtER_VK_createDescriptorSetLayout( VK_ERROR_LOG_AND_RETURN( vkCreateDescriptorSetLayout( - logicalDevice, + renderer->logicalDevice, &createInfo, nullptr, - dest + &renderer->UBODescriptorSetLayout ), "Failed to create descriptor set layout" ); From 53d28e6b810e5f4490334680e072ebc8e63a458d Mon Sep 17 00:00:00 2001 From: butchhartman Date: Sun, 25 Jan 2026 08:44:26 -0700 Subject: [PATCH 03/11] Moved function definitions to more reasonable headers --- src/rtERenderer/CMakeLists.txt | 1 - src/rtERenderer/creation/CMakeLists.txt | 4 +- .../creation/rtER_VK_infoCreation.c | 9 - .../creation/rtER_VK_infoCreation.h | 22 --- .../creation/rtER_VK_objectCreation.c | 39 +++-- .../creation/rtER_VK_objectCreation.h | 4 +- .../creation/rtER_VK_readShaderSource.c | 27 --- .../creation/rtER_VK_readShaderSource.h | 7 - src/rtERenderer/debug/CMakeLists.txt | 3 - .../debug/checkValidationLayerSupport.c | 64 ------- .../debug/checkValidationLayerSupport.h | 7 - src/rtERenderer/debug/debugCallback.c | 20 --- src/rtERenderer/debug/debugCallback.h | 11 -- src/rtERenderer/rtERenderer.c | 15 +- src/rtERenderer/support/CMakeLists.txt | 2 +- .../support/checkInstanceExtensionSupport.c | 57 ------- .../support/checkInstanceExtensionSupport.h | 7 - src/rtERenderer/support/rtER_VK_support.c | 160 ++++++++++++++++++ src/rtERenderer/support/rtER_VK_support.h | 17 ++ 19 files changed, 207 insertions(+), 269 deletions(-) delete mode 100644 src/rtERenderer/creation/rtER_VK_infoCreation.c delete mode 100644 src/rtERenderer/creation/rtER_VK_infoCreation.h delete mode 100644 src/rtERenderer/creation/rtER_VK_readShaderSource.c delete mode 100644 src/rtERenderer/creation/rtER_VK_readShaderSource.h delete mode 100644 src/rtERenderer/debug/CMakeLists.txt delete mode 100644 src/rtERenderer/debug/checkValidationLayerSupport.c delete mode 100644 src/rtERenderer/debug/checkValidationLayerSupport.h delete mode 100644 src/rtERenderer/debug/debugCallback.c delete mode 100644 src/rtERenderer/debug/debugCallback.h delete mode 100644 src/rtERenderer/support/checkInstanceExtensionSupport.c delete mode 100644 src/rtERenderer/support/checkInstanceExtensionSupport.h create mode 100644 src/rtERenderer/support/rtER_VK_support.c create mode 100644 src/rtERenderer/support/rtER_VK_support.h diff --git a/src/rtERenderer/CMakeLists.txt b/src/rtERenderer/CMakeLists.txt index b25d423..947ac97 100644 --- a/src/rtERenderer/CMakeLists.txt +++ b/src/rtERenderer/CMakeLists.txt @@ -2,5 +2,4 @@ target_sources(${PROJECT_NAME} PRIVATE rtERenderer.c) add_subdirectory(creation) -add_subdirectory(debug) add_subdirectory(support) diff --git a/src/rtERenderer/creation/CMakeLists.txt b/src/rtERenderer/creation/CMakeLists.txt index d58e992..65041b2 100644 --- a/src/rtERenderer/creation/CMakeLists.txt +++ b/src/rtERenderer/creation/CMakeLists.txt @@ -1,4 +1,2 @@ target_sources(${PROJECT_NAME} PRIVATE - rtER_VK_objectCreation.c - rtER_VK_infoCreation.c - rtER_VK_readShaderSource.c) + rtER_VK_objectCreation.c) diff --git a/src/rtERenderer/creation/rtER_VK_infoCreation.c b/src/rtERenderer/creation/rtER_VK_infoCreation.c deleted file mode 100644 index 996a219..0000000 --- a/src/rtERenderer/creation/rtER_VK_infoCreation.c +++ /dev/null @@ -1,9 +0,0 @@ -#include "rtERenderer/creation/rtER_VK_infoCreation.h" - -// If the compiler declines to inline this function, it will look here for the regular definition -extern inline VkDebugUtilsMessengerCreateInfoEXT rtER_VK_getDebugMessengerCreateInfo( - VkDebugUtilsMessageSeverityFlagsEXT severity, - VkDebugUtilsMessageTypeFlagsEXT type, - PFN_vkDebugUtilsMessengerCallbackEXT callback - ); - diff --git a/src/rtERenderer/creation/rtER_VK_infoCreation.h b/src/rtERenderer/creation/rtER_VK_infoCreation.h deleted file mode 100644 index 10ec8c3..0000000 --- a/src/rtERenderer/creation/rtER_VK_infoCreation.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef RTER_VK_INFOCREATION_H_ -#define RTER_VK_INFOCREATION_H_ -#include - -inline VkDebugUtilsMessengerCreateInfoEXT rtER_VK_getDebugMessengerCreateInfo( - VkDebugUtilsMessageSeverityFlagsEXT severity, - VkDebugUtilsMessageTypeFlagsEXT type, - PFN_vkDebugUtilsMessengerCallbackEXT callback) { - - VkDebugUtilsMessengerCreateInfoEXT createInfo = { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, - .pNext = nullptr, - .messageSeverity = severity, - .messageType = type, - .pfnUserCallback = callback, - .flags = 0, - .pUserData = nullptr - }; - return createInfo; -} - -#endif // RTER_VK_INFOCREATION_H_ diff --git a/src/rtERenderer/creation/rtER_VK_objectCreation.c b/src/rtERenderer/creation/rtER_VK_objectCreation.c index b7357a4..3b055ae 100644 --- a/src/rtERenderer/creation/rtER_VK_objectCreation.c +++ b/src/rtERenderer/creation/rtER_VK_objectCreation.c @@ -3,11 +3,7 @@ #include #include #include "rtELog/rtELog.h" -#include "rtERenderer/creation/rtER_VK_infoCreation.h" -#include "rtERenderer/creation/rtER_VK_readShaderSource.h" -#include "rtERenderer/debug/checkValidationLayerSupport.h" -#include "rtERenderer/debug/debugCallback.h" -#include "rtERenderer/support/checkInstanceExtensionSupport.h" +#include "rtERenderer/support/rtER_VK_support.h" #include "rtERenderer/creation/rtER_VK_objectCreation.h" #include "rtERenderer/macros/rtERendererVKMacros.h" #include "rtERenderer/rtER_VK_struct_definitions.h" @@ -77,12 +73,16 @@ enum VkResult rtER_VK_createVKInstance( .apiVersion = VK_API_VERSION_1_0//VK_API_VERSION_1_4 }; - struct VkDebugUtilsMessengerCreateInfoEXT dbmsgCreateInfo = - rtER_VK_getDebugMessengerCreateInfo( - VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, - VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT, - rtER_debug_debugCallback - ); + struct VkDebugUtilsMessengerCreateInfoEXT dbmsgCreateInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + .pNext = nullptr, + .flags = NO_VK_FLAGS, + .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, + .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, + .pfnUserCallback = rtER_debug_debugCallback, + .pUserData = nullptr + + }; struct VkInstanceCreateInfo createInfo = { .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, @@ -110,8 +110,8 @@ enum VkResult rtER_VK_createVKInstance( } enum VkResult rtER_VK_createDebugMessenger( - struct rtERenderer* renderer, - VkDebugUtilsMessengerCreateInfoEXT info) { + struct rtERenderer* renderer + ) { PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT) @@ -119,10 +119,21 @@ enum VkResult rtER_VK_createDebugMessenger( renderer->instance, "vkCreateDebugUtilsMessengerEXT"); + struct VkDebugUtilsMessengerCreateInfoEXT dbmsgCreateInfo = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + .pNext = nullptr, + .flags = NO_VK_FLAGS, + .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, + .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, + .pfnUserCallback = rtER_debug_debugCallback, + .pUserData = nullptr + + }; + VK_ERROR_LOG_AND_RETURN( pfnCreateDebugUtilsMessengerEXT( renderer->instance, - &info, + &dbmsgCreateInfo, nullptr, &renderer->debugMessenger), "Failed to create debug messenger"); diff --git a/src/rtERenderer/creation/rtER_VK_objectCreation.h b/src/rtERenderer/creation/rtER_VK_objectCreation.h index cee2241..cebff35 100644 --- a/src/rtERenderer/creation/rtER_VK_objectCreation.h +++ b/src/rtERenderer/creation/rtER_VK_objectCreation.h @@ -21,8 +21,8 @@ enum VkResult rtER_VK_createVKInstance( uint32_t numRequiredLayers); enum VkResult rtER_VK_createDebugMessenger( - struct rtERenderer* renderer, - VkDebugUtilsMessengerCreateInfoEXT info); + struct rtERenderer* renderer + ); enum VkResult rtER_VK_getSuitablePhysicalDevice( diff --git a/src/rtERenderer/creation/rtER_VK_readShaderSource.c b/src/rtERenderer/creation/rtER_VK_readShaderSource.c deleted file mode 100644 index bea3bfb..0000000 --- a/src/rtERenderer/creation/rtER_VK_readShaderSource.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "rtERenderer/creation/rtER_VK_readShaderSource.h" -#include -#include - -unsigned char* rtER_VK_readShaderSource(const char* shaderPath, uint32_t* codeSize) { - FILE* shaderSource; - - errno_t err = fopen_s(&shaderSource, shaderPath, "rb"); - - if (err != 0) { - *codeSize = 0; - return nullptr; - } - - fseek(shaderSource, 0, SEEK_END); - size_t shaderSrcSize = ftell(shaderSource); - rewind(shaderSource); - - unsigned char* shaderCode = malloc(shaderSrcSize * sizeof(unsigned char)); - - fread(shaderCode, sizeof(unsigned char), shaderSrcSize, shaderSource); - - fclose(shaderSource); - - *codeSize = shaderSrcSize; - return shaderCode; -} diff --git a/src/rtERenderer/creation/rtER_VK_readShaderSource.h b/src/rtERenderer/creation/rtER_VK_readShaderSource.h deleted file mode 100644 index 0c9d363..0000000 --- a/src/rtERenderer/creation/rtER_VK_readShaderSource.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef RTER_VK_READSHADERSOURCE_H_ -#define RTER_VK_READSHADERSOURCE_H_ -#include - -unsigned char* rtER_VK_readShaderSource(const char* shaderPath, uint32_t* codeSize); - -#endif // RTER_VK_READSHADERSOURCE_H_ diff --git a/src/rtERenderer/debug/CMakeLists.txt b/src/rtERenderer/debug/CMakeLists.txt deleted file mode 100644 index de7f7c7..0000000 --- a/src/rtERenderer/debug/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -target_sources(${PROJECT_NAME} PRIVATE - checkValidationLayerSupport.c - debugCallback.c) diff --git a/src/rtERenderer/debug/checkValidationLayerSupport.c b/src/rtERenderer/debug/checkValidationLayerSupport.c deleted file mode 100644 index 01190ac..0000000 --- a/src/rtERenderer/debug/checkValidationLayerSupport.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "rtELog/rtELog.h" -#include "rtERenderer/debug/checkValidationLayerSupport.h" -#include "rtERenderer/macros/rtERendererVKMacros.h" -#include -#include - - -VkBool32 rtER_debug_checkValidationLayerSupport(const char** requiredValidationLayers, uint32_t numRequiredLayers) { - uint32_t numSupportedLayers; - VK_ERROR_LOG_AND_RETURN( - vkEnumerateInstanceLayerProperties( - &numSupportedLayers, - nullptr - ), - "Failed to enumerate instance layer properties" - ); - - VkLayerProperties* layerPropertiesArray = malloc(sizeof(VkLayerProperties) * numSupportedLayers); - - VK_ERROR_LOG_AND_RETURN( - vkEnumerateInstanceLayerProperties( - &numSupportedLayers, - layerPropertiesArray - ), - "Failed to enumerate instance layer properties" - ); - - - for(size_t i = 0; i < numRequiredLayers; i++) { - bool requiredLayerSupported = false; - for(size_t j = 0; j < numSupportedLayers; j++) { - if (strcmp(requiredValidationLayers[i], layerPropertiesArray[j].layerName) == 0) { - requiredLayerSupported = true; - } - - } - - if (!requiredLayerSupported) { - free(layerPropertiesArray); - return VK_FALSE; - } - - } - - #ifndef NDEBUG - rtELog_debug_logInfo("Required Validation Layers:"); - - for(size_t i = 0; i < numRequiredLayers; i++) { - rtELog_debug_logInfo("\t%s", requiredValidationLayers[i]); - } - - rtELog_debug_logInfo("Supported Validation Layers:"); - - for(size_t j = 0; j < numSupportedLayers; j++) { - rtELog_debug_logInfo("\t%s", layerPropertiesArray[j].layerName); - } - - #endif - - - free(layerPropertiesArray); - rtELog_debug_logInfo("All required validation layers supported"); - return VK_TRUE; -} diff --git a/src/rtERenderer/debug/checkValidationLayerSupport.h b/src/rtERenderer/debug/checkValidationLayerSupport.h deleted file mode 100644 index 79ab47a..0000000 --- a/src/rtERenderer/debug/checkValidationLayerSupport.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef CHECKVALIDATIONLAYERSUPPORT_H_ -#define CHECKVALIDATIONLAYERSUPPORT_H_ -#include - -VkBool32 rtER_debug_checkValidationLayerSupport(const char** requiredValidationLayers, uint32_t numRequiredLayers); - -#endif // CHECKVALIDATIONLAYERSUPPORT_H_ diff --git a/src/rtERenderer/debug/debugCallback.c b/src/rtERenderer/debug/debugCallback.c deleted file mode 100644 index 3943c86..0000000 --- a/src/rtERenderer/debug/debugCallback.c +++ /dev/null @@ -1,20 +0,0 @@ -#include "rtELog/rtELog.h" -#include "rtERenderer/debug/debugCallback.h" - -VkBool32 VKAPI_PTR rtER_debug_debugCallback( - VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, - VkDebugUtilsMessageTypeFlagsEXT messageTypes, - const struct VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData) { - - (void)messageSeverity; - (void)messageTypes; - (void)pUserData; - - rtELog_logWarning("%s", pCallbackData->pMessage); -/* -This function should always return VK_FALSE as per the spec: -https://docs.vulkan.org/spec/latest/chapters/debugging.html#PFN_vkDebugUtilsMessengerCallbackEXT -*/ - return VK_FALSE; -} diff --git a/src/rtERenderer/debug/debugCallback.h b/src/rtERenderer/debug/debugCallback.h deleted file mode 100644 index 0857938..0000000 --- a/src/rtERenderer/debug/debugCallback.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef DEBUGCALLBACK_H_ -#define DEBUGCALLBACK_H_ -#include - -VkBool32 VKAPI_PTR rtER_debug_debugCallback( - VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, - VkDebugUtilsMessageTypeFlagsEXT messageTypes, - const struct VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData); - -#endif // DEBUGCALLBACK_H_ diff --git a/src/rtERenderer/rtERenderer.c b/src/rtERenderer/rtERenderer.c index 8c534fb..412d496 100644 --- a/src/rtERenderer/rtERenderer.c +++ b/src/rtERenderer/rtERenderer.c @@ -1,8 +1,6 @@ #include "rtERenderer/rtERenderer.h" #include "rtEMath/rtEMath.h" -#include "rtERenderer/creation/rtER_VK_infoCreation.h" #include "rtERenderer/creation/rtER_VK_objectCreation.h" -#include "rtERenderer/debug/debugCallback.h" #include "rtERenderer/macros/rtERendererVKMacros.h" #include "rtEErrorCodes/rtEErrorCodes.h" #include "rtELog/rtELog.h" @@ -41,18 +39,7 @@ enum rtEErrorCode rtER_initializeRenderer(struct rtERenderer** rendererPtr, stru ); rtER_VK_createDebugMessenger( - renderer, - rtER_VK_getDebugMessengerCreateInfo( - VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT, - - VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | - VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT, - - rtER_debug_debugCallback - ) + renderer ); // this is a rtEW function, it makes sense to not give the windowing library access to the renderer definition. diff --git a/src/rtERenderer/support/CMakeLists.txt b/src/rtERenderer/support/CMakeLists.txt index e37a5fd..8de7612 100644 --- a/src/rtERenderer/support/CMakeLists.txt +++ b/src/rtERenderer/support/CMakeLists.txt @@ -1,3 +1,3 @@ target_sources(${PROJECT_NAME} PRIVATE - checkInstanceExtensionSupport.c) + rtER_VK_support.c) diff --git a/src/rtERenderer/support/checkInstanceExtensionSupport.c b/src/rtERenderer/support/checkInstanceExtensionSupport.c deleted file mode 100644 index 966443d..0000000 --- a/src/rtERenderer/support/checkInstanceExtensionSupport.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include "rtELog/rtELog.h" -#include "rtERenderer/support/checkInstanceExtensionSupport.h" - -VkBool32 rtER_VK_checkInstanceExtensionSupport(const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions) { - uint32_t numSupportedInstanceExtensions; - if (vkEnumerateInstanceExtensionProperties(nullptr, &numSupportedInstanceExtensions, nullptr) < 0) { - rtELog_logError("Failed to enumerate instance extension properties"); - return VK_FALSE; - } - - struct VkExtensionProperties* supportedExtensions = malloc(sizeof(struct VkExtensionProperties) * numSupportedInstanceExtensions); - - if (vkEnumerateInstanceExtensionProperties(nullptr, &numSupportedInstanceExtensions, supportedExtensions) < 0) { - rtELog_logError("Failed to enumerate instance extension properties"); - free(supportedExtensions); - return VK_FALSE; - } - - for(size_t i = 0; i < numRequiredInstanceExtensions; i++) { - bool extensionSupported = false; - for(size_t j = 0; j < numSupportedInstanceExtensions; j++) { - if (strcmp(requiredInstanceExtensions[i], supportedExtensions[j].extensionName) == 0) { - extensionSupported = true; - } - - } - - if (!extensionSupported) { - free(supportedExtensions); - return VK_FALSE; - } - - } - - #ifndef NDEBUG - rtELog_debug_logInfo("Required Instance Extensions:"); - - for(size_t i = 0; i < numRequiredInstanceExtensions; i++) { - rtELog_debug_logInfo("\t%s", requiredInstanceExtensions[i]); - } - - rtELog_debug_logInfo("Supported Instance Extensions:"); - - for(size_t j = 0; j < numSupportedInstanceExtensions; j++) { - rtELog_debug_logInfo("\t%s", supportedExtensions[j].extensionName); - } - - #endif - - - - free(supportedExtensions); - rtELog_debug_logInfo("All required instance extensions supported"); - return VK_TRUE; -} diff --git a/src/rtERenderer/support/checkInstanceExtensionSupport.h b/src/rtERenderer/support/checkInstanceExtensionSupport.h deleted file mode 100644 index fe7cd5f..0000000 --- a/src/rtERenderer/support/checkInstanceExtensionSupport.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef CHECKINSTANCEEXTEXTENSIONSUPPORT_H_ -#define CHECKINSTANCEEXTEXTENSIONSUPPORT_H_ -#include - -VkBool32 rtER_VK_checkInstanceExtensionSupport(const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions); - -#endif // CHECKINSTANCEEXTEXTENSIONSUPPORT_H_ diff --git a/src/rtERenderer/support/rtER_VK_support.c b/src/rtERenderer/support/rtER_VK_support.c new file mode 100644 index 0000000..86ff61c --- /dev/null +++ b/src/rtERenderer/support/rtER_VK_support.c @@ -0,0 +1,160 @@ +#include "rtERenderer/support/rtER_VK_support.h" +#include "rtERenderer/macros/rtERendererVKMacros.h" +#include +#include +#include +#include "rtELog/rtELog.h" + +VkBool32 rtER_VK_checkInstanceExtensionSupport(const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions) { + uint32_t numSupportedInstanceExtensions; + if (vkEnumerateInstanceExtensionProperties(nullptr, &numSupportedInstanceExtensions, nullptr) < 0) { + rtELog_logError("Failed to enumerate instance extension properties"); + return VK_FALSE; + } + + struct VkExtensionProperties* supportedExtensions = malloc(sizeof(struct VkExtensionProperties) * numSupportedInstanceExtensions); + + if (vkEnumerateInstanceExtensionProperties(nullptr, &numSupportedInstanceExtensions, supportedExtensions) < 0) { + rtELog_logError("Failed to enumerate instance extension properties"); + free(supportedExtensions); + return VK_FALSE; + } + + for(size_t i = 0; i < numRequiredInstanceExtensions; i++) { + bool extensionSupported = false; + for(size_t j = 0; j < numSupportedInstanceExtensions; j++) { + if (strcmp(requiredInstanceExtensions[i], supportedExtensions[j].extensionName) == 0) { + extensionSupported = true; + } + + } + + if (!extensionSupported) { + free(supportedExtensions); + return VK_FALSE; + } + + } + + #ifndef NDEBUG + rtELog_debug_logInfo("Required Instance Extensions:"); + + for(size_t i = 0; i < numRequiredInstanceExtensions; i++) { + rtELog_debug_logInfo("\t%s", requiredInstanceExtensions[i]); + } + + rtELog_debug_logInfo("Supported Instance Extensions:"); + + for(size_t j = 0; j < numSupportedInstanceExtensions; j++) { + rtELog_debug_logInfo("\t%s", supportedExtensions[j].extensionName); + } + + #endif + + + + free(supportedExtensions); + rtELog_debug_logInfo("All required instance extensions supported"); + return VK_TRUE; +} + + +unsigned char* rtER_VK_readShaderSource(const char* shaderPath, uint32_t* codeSize) { + FILE* shaderSource; + + errno_t err = fopen_s(&shaderSource, shaderPath, "rb"); + + if (err != 0) { + *codeSize = 0; + return nullptr; + } + + fseek(shaderSource, 0, SEEK_END); + size_t shaderSrcSize = ftell(shaderSource); + rewind(shaderSource); + + unsigned char* shaderCode = malloc(shaderSrcSize * sizeof(unsigned char)); + + fread(shaderCode, sizeof(unsigned char), shaderSrcSize, shaderSource); + + fclose(shaderSource); + + *codeSize = shaderSrcSize; + return shaderCode; +} + +VkBool32 rtER_debug_checkValidationLayerSupport(const char** requiredValidationLayers, uint32_t numRequiredLayers) { + uint32_t numSupportedLayers; + VK_ERROR_LOG_AND_RETURN( + vkEnumerateInstanceLayerProperties( + &numSupportedLayers, + nullptr + ), + "Failed to enumerate instance layer properties" + ); + + VkLayerProperties* layerPropertiesArray = malloc(sizeof(VkLayerProperties) * numSupportedLayers); + + VK_ERROR_LOG_AND_RETURN( + vkEnumerateInstanceLayerProperties( + &numSupportedLayers, + layerPropertiesArray + ), + "Failed to enumerate instance layer properties" + ); + + + for(size_t i = 0; i < numRequiredLayers; i++) { + bool requiredLayerSupported = false; + for(size_t j = 0; j < numSupportedLayers; j++) { + if (strcmp(requiredValidationLayers[i], layerPropertiesArray[j].layerName) == 0) { + requiredLayerSupported = true; + } + + } + + if (!requiredLayerSupported) { + free(layerPropertiesArray); + return VK_FALSE; + } + + } + + #ifndef NDEBUG + rtELog_debug_logInfo("Required Validation Layers:"); + + for(size_t i = 0; i < numRequiredLayers; i++) { + rtELog_debug_logInfo("\t%s", requiredValidationLayers[i]); + } + + rtELog_debug_logInfo("Supported Validation Layers:"); + + for(size_t j = 0; j < numSupportedLayers; j++) { + rtELog_debug_logInfo("\t%s", layerPropertiesArray[j].layerName); + } + + #endif + + + free(layerPropertiesArray); + rtELog_debug_logInfo("All required validation layers supported"); + return VK_TRUE; +} + +VkBool32 VKAPI_PTR rtER_debug_debugCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageTypes, + const struct VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData) { + + (void)messageSeverity; + (void)messageTypes; + (void)pUserData; + + rtELog_logWarning("%s", pCallbackData->pMessage); +/* +This function should always return VK_FALSE as per the spec: +https://docs.vulkan.org/spec/latest/chapters/debugging.html#PFN_vkDebugUtilsMessengerCallbackEXT +*/ + return VK_FALSE; +} diff --git a/src/rtERenderer/support/rtER_VK_support.h b/src/rtERenderer/support/rtER_VK_support.h new file mode 100644 index 0000000..7ca2c75 --- /dev/null +++ b/src/rtERenderer/support/rtER_VK_support.h @@ -0,0 +1,17 @@ +#ifndef RTER_VK_SUPPORT_H_ +#define RTER_VK_SUPPORT_H_ +#include + +VkBool32 rtER_VK_checkInstanceExtensionSupport(const char** requiredInstanceExtensions, uint32_t numRequiredInstanceExtensions); + +unsigned char* rtER_VK_readShaderSource(const char* shaderPath, uint32_t* codeSize); + +VkBool32 rtER_debug_checkValidationLayerSupport(const char** requiredValidationLayers, uint32_t numRequiredLayers); + +VkBool32 VKAPI_PTR rtER_debug_debugCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageTypes, + const struct VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData); + +#endif // RTER_VK_SUPPORT_H_ From cc67ef2fa8617bffdc2d4bd5a8da68775b47714f Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 09:37:03 -0700 Subject: [PATCH 04/11] Create main.yml --- .github/workflows/main.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..d380094 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,17 @@ +name: test +run-name: ${{ github.actor }} +on: [workflow_dispatch] +jobs: + test-compilation: + runs-on: windows-latest + steps: + + - name: Setup python + uses: actions/setup-python@v6.2.0 + + + - name: Setup Vulkan SDK + run: curl -O https://sdk.lunarg.com/sdk/download/latest/windows/vulkan_sdk.exe + + - name: Checkout PR + uses: actions/checkout@v6.0.2 From db2c4cde7a7e35b22ed7241a53a389dd4627fa39 Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 09:43:43 -0700 Subject: [PATCH 05/11] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d380094..dfb5306 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,6 @@ name: test run-name: ${{ github.actor }} -on: [workflow_dispatch] +on: [pull_request] jobs: test-compilation: runs-on: windows-latest From d727025a42f6c5566b6330fb1a7667eb466e7f8a Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 09:52:16 -0700 Subject: [PATCH 06/11] Update main.yml --- .github/workflows/main.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dfb5306..878268f 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -9,9 +9,14 @@ jobs: - name: Setup python uses: actions/setup-python@v6.2.0 - - name: Setup Vulkan SDK run: curl -O https://sdk.lunarg.com/sdk/download/latest/windows/vulkan_sdk.exe - name: Checkout PR uses: actions/checkout@v6.0.2 + + - name: configure repo + run: py ${GITHUB_WORKSPACE}/scripts/clang_withtests.py + + - name: build repo + run: cmake --build ${GITHUB_WORKSPACE}/build --config Debug From bdc08382ba1364354f9c4b1d7384c6e4b58c3331 Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 09:55:35 -0700 Subject: [PATCH 07/11] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 878268f..f02c9d9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v6.0.2 - name: configure repo - run: py ${GITHUB_WORKSPACE}/scripts/clang_withtests.py + run: py ${{github.workspace}}/RTech/scripts/clang_withtests.py - name: build repo - run: cmake --build ${GITHUB_WORKSPACE}/build --config Debug + run: cmake --build ${{github.workspace}}/RTech/build --config Debug From 2baeeb39ecf557a24f94389b755808480ac47db3 Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 09:57:16 -0700 Subject: [PATCH 08/11] Update main.yml --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f02c9d9..bb53623 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v6.0.2 - name: configure repo - run: py ${{github.workspace}}/RTech/scripts/clang_withtests.py + run: py ${{github.workspace}}/scripts/clang_withtests.py - name: build repo - run: cmake --build ${{github.workspace}}/RTech/build --config Debug + run: cmake --build ${{github.workspace}}/build --config Debug From eefbeb42b6b61fdac5938a2a3e7b6f2c6a795e2d Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 10:01:02 -0700 Subject: [PATCH 09/11] Update main.yml --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bb53623..9a03999 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,6 +16,7 @@ jobs: uses: actions/checkout@v6.0.2 - name: configure repo + working-directory: ${{github.workspace}}/scripts run: py ${{github.workspace}}/scripts/clang_withtests.py - name: build repo From 2ae5881971904a8ba70fb0e7716dc7d071600299 Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 10:10:28 -0700 Subject: [PATCH 10/11] Update main.yml --- .github/workflows/main.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9a03999..67b8f43 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -5,6 +5,10 @@ jobs: test-compilation: runs-on: windows-latest steps: + - name: install cmake + uses: ssrobins/install-cmake@v1 + with: + version: 4.1.1 - name: Setup python uses: actions/setup-python@v6.2.0 From 4d2649c67735c07f8200ad447671d288b4afa407 Mon Sep 17 00:00:00 2001 From: butchhartman <157433073+butchhartman@users.noreply.github.com> Date: Sun, 25 Jan 2026 10:13:44 -0700 Subject: [PATCH 11/11] Update main.yml --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 67b8f43..8ceb5a9 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: uses: actions/setup-python@v6.2.0 - name: Setup Vulkan SDK - run: curl -O https://sdk.lunarg.com/sdk/download/latest/windows/vulkan_sdk.exe + uses: humbletim/install-vulkan-sdk@30ba978f977e81b72d091fc8888feb1fb26f9aff - name: Checkout PR uses: actions/checkout@v6.0.2