diff --git a/src/main.c b/src/main.c index b8633bf..a727609 100644 --- a/src/main.c +++ b/src/main.c @@ -322,9 +322,10 @@ VkSemaphore* create_semaphores(VkDevice device, VkSemaphoreCreateFlags flags, ui return 0; } - VkSemaphoreCreateInfo semaphore_info = {}; - semaphore_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - semaphore_info.flags = flags; + VkSemaphoreCreateInfo semaphore_info = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, + .flags = flags, + }; for(uint32_t i = 0; i < count; i++) { VkResult result = vkCreateSemaphore(device, &semaphore_info, 0, &semaphores[i]); @@ -411,11 +412,12 @@ VkDescriptorSet* create_descriptor_sets(VkDevice device, VkDescriptorSetLayout l layouts[i] = layout; } - VkDescriptorSetAllocateInfo alloc_info = {}; - alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - alloc_info.descriptorPool = pool; - alloc_info.descriptorSetCount = count; - alloc_info.pSetLayouts = layouts; + VkDescriptorSetAllocateInfo alloc_info = { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO, + .descriptorPool = pool, + .descriptorSetCount = count, + .pSetLayouts = layouts, + }; VkResult result = vkAllocateDescriptorSets(device, &alloc_info, sets); free(layouts); @@ -490,13 +492,14 @@ bool check_queue_indices(QueueIndices indices) { } QueueIndices get_queue_indices(VkPhysicalDevice physical_device, VkSurfaceKHR surface) { - QueueIndices indices = {}; - indices.graphics_family = 0xFFFFFFFF; - indices.graphics_index = 0xFFFFFFFF; - indices.present_family = 0xFFFFFFFF; - indices.present_index = 0xFFFFFFFF; - indices.transfer_family = 0xFFFFFFFF; - indices.transfer_index = 0xFFFFFFFF; + QueueIndices indices = { + .graphics_family = 0xFFFFFFFF, + .graphics_index = 0xFFFFFFFF, + .present_family = 0xFFFFFFFF, + .present_index = 0xFFFFFFFF, + .transfer_family = 0xFFFFFFFF, + .transfer_index = 0xFFFFFFFF, + }; uint32_t queue_family_count; vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, 0); @@ -547,12 +550,13 @@ QueueIndices get_queue_indices(VkPhysicalDevice physical_device, VkSurfaceKHR su VkDebugUtilsMessengerEXT create_debug_messenger(VkInstance instance) { VkDebugUtilsMessengerEXT debug_messenger; - VkDebugUtilsMessengerCreateInfoEXT messenger_info = {}; - messenger_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - messenger_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT; - messenger_info.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 | VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT; - messenger_info.pfnUserCallback = debug_callback; - messenger_info.pUserData = 0; + VkDebugUtilsMessengerCreateInfoEXT messenger_info = { + .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, + .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_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 | VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT, + .pfnUserCallback = debug_callback, + .pUserData = 0, + }; PFN_vkCreateDebugUtilsMessengerEXT func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); @@ -574,20 +578,14 @@ VkInstance create_instance() { return VK_NULL_HANDLE; } - VkApplicationInfo app_info = {}; - app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; - app_info.pApplicationName = "spacegame"; - app_info.applicationVersion = VK_MAKE_VERSION(0, 0, 1); - app_info.pEngineName = "spacegame"; - app_info.engineVersion = VK_MAKE_VERSION(0, 0, 1); - app_info.apiVersion = VK_API_VERSION_1_2; - - VkInstanceCreateInfo instance_info = {}; - instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; - instance_info.pApplicationInfo = &app_info; - - instance_info.enabledLayerCount = validation_layer_count; - instance_info.ppEnabledLayerNames = validation_layers; + VkApplicationInfo app_info = { + .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, + .pApplicationName = "spacegame", + .applicationVersion = VK_MAKE_VERSION(0, 0, 1), + .pEngineName = "spacegame", + .engineVersion = VK_MAKE_VERSION(0, 0, 1), + .apiVersion = VK_API_VERSION_1_2, + }; uint32_t glfwExtensionCount = 0; const char** glfwExtensions; @@ -603,10 +601,17 @@ VkInstance create_instance() { requested_extensions[glfwExtensionCount + i] = instance_extensions[i]; } - instance_info.enabledExtensionCount = glfwExtensionCount + instance_extension_count; - instance_info.ppEnabledExtensionNames = requested_extensions; + VkInstanceCreateInfo instance_info = { + .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, + .pApplicationInfo = &app_info, + .enabledLayerCount = validation_layer_count, + .ppEnabledLayerNames = validation_layers, + .enabledExtensionCount = glfwExtensionCount + instance_extension_count, + .ppEnabledExtensionNames = requested_extensions, + .flags = VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR, + }; + - instance_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; VkResult result = vkCreateInstance(&instance_info, 0, &instance); if(result != VK_SUCCESS) { @@ -664,17 +669,16 @@ VkDevice create_logical_device(VkPhysicalDevice physical_device, QueueIndices qu .samplerAnisotropy = VK_TRUE, }; - VkDeviceCreateInfo device_create_info = {}; - device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; - device_create_info.pQueueCreateInfos = queue_create_info; - device_create_info.queueCreateInfoCount = unique_family_count; - device_create_info.pEnabledFeatures = &device_features; - - device_create_info.enabledExtensionCount = device_extension_count; - device_create_info.ppEnabledExtensionNames = device_extensions; - - device_create_info.enabledLayerCount = validation_layer_count; - device_create_info.ppEnabledLayerNames = validation_layers; + VkDeviceCreateInfo device_create_info = { + .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, + .pQueueCreateInfos = queue_create_info, + .queueCreateInfoCount = unique_family_count, + .pEnabledFeatures = &device_features, + .enabledExtensionCount = device_extension_count, + .ppEnabledExtensionNames = device_extensions, + .enabledLayerCount = validation_layer_count, + .ppEnabledLayerNames = validation_layers, + }; VkResult result = vkCreateDevice(physical_device, &device_create_info, 0, &device); if(result != VK_SUCCESS) { @@ -758,15 +762,21 @@ VkSwapchainKHR create_swapchain(VkDevice device, VkSurfaceFormatKHR format, VkPr image_count = max_images; } - VkSwapchainCreateInfoKHR swapchain_info = {}; - swapchain_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; - swapchain_info.surface = surface; - swapchain_info.minImageCount = image_count; - swapchain_info.imageFormat = format.format; - swapchain_info.imageColorSpace = format.colorSpace; - swapchain_info.imageExtent = extent; - swapchain_info.imageArrayLayers = 1; - swapchain_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + VkSwapchainCreateInfoKHR swapchain_info = { + .sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR, + .surface = surface, + .minImageCount = image_count, + .imageFormat = format.format, + .imageColorSpace = format.colorSpace, + .imageExtent = extent, + .imageArrayLayers = 1, + .imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, + .preTransform = capabilities.currentTransform, + .compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR, + .presentMode = present_mode, + .clipped = VK_TRUE, + .oldSwapchain = old_swapchain, + }; uint32_t queue_families[2] = {indices.graphics_family, indices.present_index}; if(indices.graphics_family != indices.present_family) { @@ -779,11 +789,6 @@ VkSwapchainKHR create_swapchain(VkDevice device, VkSurfaceFormatKHR format, VkPr swapchain_info.pQueueFamilyIndices = 0; } - swapchain_info.preTransform = capabilities.currentTransform; - swapchain_info.compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR; - swapchain_info.presentMode = present_mode; - swapchain_info.clipped = VK_TRUE; - swapchain_info.oldSwapchain = old_swapchain; VkSwapchainKHR swapchain; VkResult result; @@ -796,9 +801,10 @@ VkSwapchainKHR create_swapchain(VkDevice device, VkSurfaceFormatKHR format, VkPr } SwapchainImages get_swapchain_images(VkDevice device, VkSwapchainKHR swapchain) { - SwapchainImages images; - images.images = 0; - images.count = 0; + SwapchainImages images = { + .images = NULL, + .count = 0, + }; VkResult result; result = vkGetSwapchainImagesKHR(device, swapchain, &images.count, 0); @@ -829,22 +835,25 @@ VkImageView* create_image_views(VkDevice device, uint32_t image_count, VkImage* } for(uint32_t i = 0; i < image_count; i++) { - VkImageViewCreateInfo view_info = {}; - view_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; - view_info.image = images[i]; - view_info.viewType = VK_IMAGE_VIEW_TYPE_2D; - view_info.format = format.format; - - view_info.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; - view_info.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; - - view_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - view_info.subresourceRange.baseMipLevel = 0; - view_info.subresourceRange.levelCount = 1; - view_info.subresourceRange.baseArrayLayer = 0; - view_info.subresourceRange.layerCount = 1; + VkImageViewCreateInfo view_info = { + .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, + .image = images[i], + .viewType = VK_IMAGE_VIEW_TYPE_2D, + .format = format.format, + .components = { + .r = VK_COMPONENT_SWIZZLE_IDENTITY, + .g = VK_COMPONENT_SWIZZLE_IDENTITY, + .b = VK_COMPONENT_SWIZZLE_IDENTITY, + .a = VK_COMPONENT_SWIZZLE_IDENTITY, + }, + .subresourceRange = { + .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, + .baseMipLevel = 0, + .levelCount = 1, + .baseArrayLayer = 0, + .layerCount = 1, + }, + }; VkResult result = vkCreateImageView(device, &view_info, 0, &image_views[i]); if(result != VK_SUCCESS) { @@ -868,14 +877,15 @@ VkFramebuffer* create_swapchain_framebuffers(VkDevice device, uint32_t image_cou depth_image_view, }; - VkFramebufferCreateInfo framebuffer_info = {}; - framebuffer_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - framebuffer_info.renderPass = render_pass; - framebuffer_info.attachmentCount = 2; - framebuffer_info.pAttachments = attachments; - framebuffer_info.width = extent.width; - framebuffer_info.height = extent.height; - framebuffer_info.layers = 1; + VkFramebufferCreateInfo framebuffer_info = { + .sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, + .renderPass = render_pass, + .attachmentCount = 2, + .pAttachments = attachments, + .width = extent.width, + .height = extent.height, + .layers = 1, + }; VkResult result = vkCreateFramebuffer(device, &framebuffer_info, 0, &framebuffers[i]); if(result != VK_SUCCESS) { @@ -888,10 +898,11 @@ VkFramebuffer* create_swapchain_framebuffers(VkDevice device, uint32_t image_cou } VkShaderModule create_shader_module(VkDevice device, const char * code, uint32_t code_size) { - VkShaderModuleCreateInfo shader_info = {}; - shader_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - shader_info.codeSize = code_size; - shader_info.pCode = (uint32_t*)code; + VkShaderModuleCreateInfo shader_info = { + .sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO, + .codeSize = code_size, + .pCode = (uint32_t*)code, + }; VkShaderModule shader; VkResult result; @@ -1048,16 +1059,17 @@ AllocatedImage allocate_image(VkPhysicalDeviceMemoryProperties memories, VkDevic } AllocatedBuffer allocate_buffer(VkPhysicalDeviceMemoryProperties memories, VkDevice device, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags include, VkMemoryPropertyFlags exclude) { - AllocatedBuffer ret = {}; - ret.memory = VK_NULL_HANDLE; - ret.buffer = VK_NULL_HANDLE; - + AllocatedBuffer ret = { + .memory = VK_NULL_HANDLE, + .buffer = VK_NULL_HANDLE, + }; - VkBufferCreateInfo buffer_info = {}; - buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; - buffer_info.size = size; - buffer_info.usage = usage; - buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + VkBufferCreateInfo buffer_info = { + .sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, + .size = size, + .usage = usage, + .sharingMode = VK_SHARING_MODE_EXCLUSIVE, + }; VkResult result = vkCreateBuffer(device, &buffer_info, 0, &ret.buffer); if(result != VK_SUCCESS) { @@ -1069,10 +1081,11 @@ AllocatedBuffer allocate_buffer(VkPhysicalDeviceMemoryProperties memories, VkDev VkMemoryRequirements memory_requirements; vkGetBufferMemoryRequirements(device, ret.buffer, &memory_requirements); - VkMemoryAllocateInfo alloc_info = {}; - alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; - alloc_info.allocationSize = memory_requirements.size; - alloc_info.memoryTypeIndex = pick_memory(memories, memory_requirements.memoryTypeBits, include, exclude); + VkMemoryAllocateInfo alloc_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = memory_requirements.size, + .memoryTypeIndex = pick_memory(memories, memory_requirements.memoryTypeBits, include, exclude), + }; result = vkAllocateMemory(device, &alloc_info, 0, &ret.memory); if(result != VK_SUCCESS) { @@ -1125,11 +1138,12 @@ AllocatedBuffer* allocate_buffers(VkPhysicalDeviceMemoryProperties memories, VkD } VkCommandBuffer command_begin_single(VkDevice device, VkCommandPool transfer_pool) { - VkCommandBufferAllocateInfo command_info = {}; - command_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - command_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - command_info.commandPool = transfer_pool; - command_info.commandBufferCount = 1; + VkCommandBufferAllocateInfo command_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandPool = transfer_pool, + .commandBufferCount = 1, + }; VkCommandBuffer command_buffer; VkResult result = vkAllocateCommandBuffers(device, &command_info, &command_buffer); @@ -1137,9 +1151,10 @@ VkCommandBuffer command_begin_single(VkDevice device, VkCommandPool transfer_poo return VK_NULL_HANDLE; } - VkCommandBufferBeginInfo begin_info = {}; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + VkCommandBufferBeginInfo begin_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, + }; result = vkBeginCommandBuffer(command_buffer, &begin_info); if(result != VK_SUCCESS) { @@ -1157,10 +1172,11 @@ VkResult command_end_single(VkDevice device, VkCommandBuffer command_buffer, VkC return result; } - VkSubmitInfo submit_info = {}; - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &command_buffer; + VkSubmitInfo submit_info = { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .commandBufferCount = 1, + .pCommandBuffers = &command_buffer, + }; result = vkQueueSubmit(transfer_queue, 1, &submit_info, 0); if(result != VK_SUCCESS) { @@ -1176,10 +1192,11 @@ VkResult command_end_single(VkDevice device, VkCommandBuffer command_buffer, VkC VkResult command_copy_buffers(VkDevice device, VkCommandPool transfer_pool, VkQueue transfer_queue, VkBuffer source, VkBuffer dest, VkDeviceSize size) { VkCommandBuffer command_buffer = command_begin_single(device, transfer_pool); - VkBufferCopy copy_region = {}; - copy_region.srcOffset = 0; - copy_region.dstOffset = 0; - copy_region.size = size; + VkBufferCopy copy_region = { + .srcOffset = 0, + .dstOffset = 0, + .size = size, + }; vkCmdCopyBuffer(command_buffer, source, dest, 1, ©_region); @@ -1415,64 +1432,74 @@ VkPipeline create_graphics_pipeline( }; uint32_t dynamic_state_count = sizeof(dynamic_states)/sizeof(VkDynamicState); - VkPipelineDynamicStateCreateInfo dynamic_info = {}; - dynamic_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; - dynamic_info.dynamicStateCount = dynamic_state_count; - dynamic_info.pDynamicStates = dynamic_states; - - VkPipelineVertexInputStateCreateInfo vertex_input_info = {}; - vertex_input_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - vertex_input_info.vertexBindingDescriptionCount = mesh_type.bindings_count; - vertex_input_info.pVertexBindingDescriptions = mesh_type.bindings; - vertex_input_info.vertexAttributeDescriptionCount = mesh_type.attributes_count; - vertex_input_info.pVertexAttributeDescriptions = mesh_type.attributes; - - VkPipelineInputAssemblyStateCreateInfo input_assembly_info = {}; - input_assembly_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; - input_assembly_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; - input_assembly_info.primitiveRestartEnable = VK_FALSE; - - VkViewport viewport = {}; - viewport.x = 0.0f; - viewport.y = 0.0f; - viewport.width = (float)(extent.width); - viewport.height = (float)(extent.height); - viewport.minDepth = 0.0f; - viewport.maxDepth = 1.0f; - - VkRect2D scissor = {}; - VkOffset2D scissor_offset = {.x = 0, .y = 0}; - scissor.offset = scissor_offset; - scissor.extent = extent; - - VkPipelineViewportStateCreateInfo viewport_state = {}; - viewport_state.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; - viewport_state.viewportCount = 1; - viewport_state.pViewports = &viewport; - viewport_state.scissorCount = 1; - viewport_state.pScissors = &scissor; - - VkPipelineRasterizationStateCreateInfo raster_info = {}; - raster_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; - raster_info.depthClampEnable = VK_FALSE; - raster_info.rasterizerDiscardEnable = VK_FALSE; - raster_info.polygonMode = VK_POLYGON_MODE_FILL; - raster_info.lineWidth = 1.0f; - raster_info.cullMode = VK_CULL_MODE_NONE; - raster_info.frontFace = VK_FRONT_FACE_CLOCKWISE; - raster_info.depthBiasEnable = VK_FALSE; - raster_info.depthBiasConstantFactor = 0.0f; - raster_info.depthBiasClamp = 0.0f; - raster_info.depthBiasSlopeFactor = 0.0f; - - VkPipelineMultisampleStateCreateInfo multisample_info = {}; - multisample_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; - multisample_info.sampleShadingEnable = VK_FALSE; - multisample_info.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; - multisample_info.minSampleShading = 1.0f; - multisample_info.pSampleMask = 0; - multisample_info.alphaToCoverageEnable = VK_FALSE; - multisample_info.alphaToOneEnable = VK_FALSE; + VkPipelineDynamicStateCreateInfo dynamic_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO, + .dynamicStateCount = dynamic_state_count, + .pDynamicStates = dynamic_states, + }; + + VkPipelineVertexInputStateCreateInfo vertex_input_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO, + .vertexBindingDescriptionCount = mesh_type.bindings_count, + .pVertexBindingDescriptions = mesh_type.bindings, + .vertexAttributeDescriptionCount = mesh_type.attributes_count, + .pVertexAttributeDescriptions = mesh_type.attributes, + }; + + VkPipelineInputAssemblyStateCreateInfo input_assembly_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, + .topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + .primitiveRestartEnable = VK_FALSE, + }; + + VkViewport viewport = { + .x = 0.0f, + .y = 0.0f, + .width = (float)(extent.width), + .height = (float)(extent.height), + .minDepth = 0.0f, + .maxDepth = 1.0f, + }; + + VkRect2D scissor = { + .offset = { + .x = 0, + .y = 0, + }, + .extent = extent, + }; + + VkPipelineViewportStateCreateInfo viewport_state = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO, + .viewportCount = 1, + .pViewports = &viewport, + .scissorCount = 1, + .pScissors = &scissor, + }; + + VkPipelineRasterizationStateCreateInfo raster_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO, + .depthClampEnable = VK_FALSE, + .rasterizerDiscardEnable = VK_FALSE, + .polygonMode = VK_POLYGON_MODE_FILL, + .lineWidth = 1.0f, + .cullMode = VK_CULL_MODE_NONE, + .frontFace = VK_FRONT_FACE_CLOCKWISE, + .depthBiasEnable = VK_FALSE, + .depthBiasConstantFactor = 0.0f, + .depthBiasClamp = 0.0f, + .depthBiasSlopeFactor = 0.0f, + }; + + VkPipelineMultisampleStateCreateInfo multisample_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO, + .sampleShadingEnable = VK_FALSE, + .rasterizationSamples = VK_SAMPLE_COUNT_1_BIT, + .minSampleShading = 1.0f, + .pSampleMask = 0, + .alphaToCoverageEnable = VK_FALSE, + .alphaToOneEnable = VK_FALSE, + }; VkPipelineDepthStencilStateCreateInfo depth_info = { .sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO, @@ -1487,46 +1514,47 @@ VkPipeline create_graphics_pipeline( .back = {}, }; - VkPipelineColorBlendAttachmentState color_blend_attachment = {}; - color_blend_attachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; - color_blend_attachment.blendEnable = VK_TRUE; - color_blend_attachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; - color_blend_attachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; - color_blend_attachment.colorBlendOp = VK_BLEND_OP_ADD; - color_blend_attachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; - color_blend_attachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; - color_blend_attachment.alphaBlendOp = VK_BLEND_OP_ADD; - - VkPipelineColorBlendStateCreateInfo color_blend_info = {}; - color_blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; - color_blend_info.logicOpEnable = VK_FALSE; - color_blend_info.logicOp = VK_LOGIC_OP_COPY; - color_blend_info.attachmentCount = 1; - color_blend_info.pAttachments = &color_blend_attachment; - color_blend_info.blendConstants[0] = 0.0f; - color_blend_info.blendConstants[1] = 0.0f; - color_blend_info.blendConstants[2] = 0.0f; - color_blend_info.blendConstants[3] = 0.0f; - - VkGraphicsPipelineCreateInfo pipeline_info = {}; - pipeline_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; - pipeline_info.stageCount = shader_stage_count; - pipeline_info.pStages = shader_stages; - pipeline_info.pVertexInputState = &vertex_input_info; - pipeline_info.pInputAssemblyState = &input_assembly_info; - pipeline_info.pViewportState = &viewport_state; - pipeline_info.pRasterizationState = &raster_info; - pipeline_info.pDepthStencilState = 0; - pipeline_info.pColorBlendState = &color_blend_info; - pipeline_info.pDynamicState = &dynamic_info; - pipeline_info.pDepthStencilState = &depth_info; - pipeline_info.pMultisampleState = &multisample_info; - pipeline_info.layout = layout; - pipeline_info.renderPass = render_pass; - pipeline_info.subpass = 0; - - pipeline_info.basePipelineHandle = VK_NULL_HANDLE; - pipeline_info.basePipelineIndex = -1; + VkPipelineColorBlendAttachmentState color_blend_attachment = { + .colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT, + .blendEnable = VK_TRUE, + .srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA, + .dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, + .colorBlendOp = VK_BLEND_OP_ADD, + .srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE, + .dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO, + .alphaBlendOp = VK_BLEND_OP_ADD, + }; + + VkPipelineColorBlendStateCreateInfo color_blend_info = { + .sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO, + .logicOpEnable = VK_FALSE, + .logicOp = VK_LOGIC_OP_COPY, + .attachmentCount = 1, + .pAttachments = &color_blend_attachment, + .blendConstants[0] = 0.0f, + .blendConstants[1] = 0.0f, + .blendConstants[2] = 0.0f, + .blendConstants[3] = 0.0f, + }; + + VkGraphicsPipelineCreateInfo pipeline_info = { + .sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO, + .stageCount = shader_stage_count, + .pStages = shader_stages, + .pVertexInputState = &vertex_input_info, + .pInputAssemblyState = &input_assembly_info, + .pViewportState = &viewport_state, + .pRasterizationState = &raster_info, + .pColorBlendState = &color_blend_info, + .pDynamicState = &dynamic_info, + .pDepthStencilState = &depth_info, + .pMultisampleState = &multisample_info, + .layout = layout, + .renderPass = render_pass, + .subpass = 0, + .basePipelineHandle = VK_NULL_HANDLE, + .basePipelineIndex = -1, + }; VkPipeline pipeline; VkResult result = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipeline_info, 0, &pipeline); @@ -1640,8 +1668,6 @@ VkResult recreate_swapchain(VulkanContext* context) { vkDestroySemaphore(context->device, context->image_available_semaphores[i], 0); } - //vkDestroySwapchainKHR(context->device, context->swapchain, 0); - //free(context->swapchain_images); free(context->swapchain_image_views); free(context->swapchain_framebuffers); free(context->swapchain_details.formats); @@ -1748,23 +1774,17 @@ void command_draw_material(Material material, uint32_t object_count, Object* obj } VkResult command_draw_scene(uint32_t materials_count, Material* materials, uint32_t* object_counts, Object** objects, uint32_t frame_num, VkDescriptorSet* scene_descriptors, VkCommandBuffer command_buffer, VkRenderPass render_pass, VkFramebuffer framebuffer, VkExtent2D extent) { - VkCommandBufferBeginInfo begin_info = {}; - begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - begin_info.flags = 0; - begin_info.pInheritanceInfo = 0; + VkCommandBufferBeginInfo begin_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, + .flags = 0, + .pInheritanceInfo = 0, + }; VkResult result = vkBeginCommandBuffer(command_buffer, &begin_info); if(result != VK_SUCCESS) { return result; } - VkRenderPassBeginInfo render_pass_info = {}; - render_pass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; - render_pass_info.renderPass = render_pass; - render_pass_info.framebuffer = framebuffer; - VkOffset2D render_offset = {.x = 0, .y = 0}; - render_pass_info.renderArea.offset = render_offset; - render_pass_info.renderArea.extent = extent; VkClearValue clear_colors[] = { { .color = { @@ -1775,24 +1795,41 @@ VkResult command_draw_scene(uint32_t materials_count, Material* materials, uint3 .depthStencil = {1.0f, 0.0f}, }, }; - render_pass_info.clearValueCount = sizeof(clear_colors)/sizeof(VkClearValue); - render_pass_info.pClearValues = clear_colors; + + VkRenderPassBeginInfo render_pass_info = { + .sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, + .renderPass = render_pass, + .framebuffer = framebuffer, + .renderArea = { + .offset = { + .x = 0, + .y = 0, + }, + .extent = extent, + }, + .clearValueCount = sizeof(clear_colors)/sizeof(VkClearValue), + .pClearValues = clear_colors, + }; vkCmdBeginRenderPass(command_buffer, &render_pass_info, VK_SUBPASS_CONTENTS_INLINE); - VkViewport viewport = {}; - viewport.x = 0.0f; - viewport.y = 0.0f; - viewport.width = (float)(extent.width); - viewport.height = (float)(extent.height); - viewport.minDepth = 0.0f; - viewport.maxDepth = 1.0f; + VkViewport viewport = { + .x = 0.0f, + .y = 0.0f, + .width = (float)(extent.width), + .height = (float)(extent.height), + .minDepth = 0.0f, + .maxDepth = 1.0f, + }; vkCmdSetViewport(command_buffer, 0, 1, &viewport); - VkRect2D scissor = {}; - VkOffset2D scissor_offset = {.x = 0.0f, .y = 0.0f}; - scissor.offset = scissor_offset; - scissor.extent = extent; + VkRect2D scissor = { + .offset = { + .x = 0.0f, + .y = 0.0f, + }, + .extent = extent, + }; vkCmdSetScissor(command_buffer, 0, 1, &scissor); for(uint i = 0; i < materials_count; i++) { @@ -1805,11 +1842,12 @@ VkResult command_draw_scene(uint32_t materials_count, Material* materials, uint3 } VkCommandBuffer* create_command_buffers(VkDevice device, VkCommandPool command_pool, uint32_t image_count) { - VkCommandBufferAllocateInfo alloc_info = {}; - alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - alloc_info.commandPool = command_pool; - alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - alloc_info.commandBufferCount = image_count; + VkCommandBufferAllocateInfo alloc_info = { + .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, + .commandPool = command_pool, + .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY, + .commandBufferCount = image_count, + }; VkCommandBuffer* command_buffers = malloc(sizeof(VkCommandBuffer)*image_count); if(command_buffers == 0) { @@ -1830,9 +1868,10 @@ VkFence* create_fences(VkDevice device, VkFenceCreateFlags flags, uint32_t count return 0; } - VkFenceCreateInfo fence_info = {}; - fence_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; - fence_info.flags = flags; + VkFenceCreateInfo fence_info = { + .sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, + .flags = flags, + }; for(uint32_t i = 0; i < count; i++) { VkResult result = vkCreateFence(device, &fence_info, 0, &fences[i]); @@ -2926,30 +2965,32 @@ VkResult draw_frame(VulkanContext* context, SceneContext* scene, uint32_t materi return result; } - VkSubmitInfo submit_info = {}; VkPipelineStageFlags wait_stages[] = {VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT}; - submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; - submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &context->image_available_semaphores[context->current_frame]; - submit_info.pWaitDstStageMask = wait_stages; - submit_info.commandBufferCount = 1; - submit_info.pCommandBuffers = &context->swapchain_command_buffers[context->current_frame]; - submit_info.signalSemaphoreCount = 1; - submit_info.pSignalSemaphores = &context->render_finished_semaphores[context->current_frame]; + VkSubmitInfo submit_info = { + .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context->image_available_semaphores[context->current_frame], + .pWaitDstStageMask = wait_stages, + .commandBufferCount = 1, + .pCommandBuffers = &context->swapchain_command_buffers[context->current_frame], + .signalSemaphoreCount = 1, + .pSignalSemaphores = &context->render_finished_semaphores[context->current_frame], + }; result = vkQueueSubmit(context->queues.graphics, 1, &submit_info, context->in_flight_fences[context->current_frame]); if(result != VK_SUCCESS) { return result; } - VkPresentInfoKHR present_info = {}; - present_info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - present_info.waitSemaphoreCount = 1; - present_info.pWaitSemaphores = &context->render_finished_semaphores[context->current_frame]; - present_info.swapchainCount = 1; - present_info.pSwapchains = &context->swapchain; - present_info.pImageIndices = &image_index; - present_info.pResults = 0; + VkPresentInfoKHR present_info = { + .sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR, + .waitSemaphoreCount = 1, + .pWaitSemaphores = &context->render_finished_semaphores[context->current_frame], + .swapchainCount = 1, + .pSwapchains = &context->swapchain, + .pImageIndices = &image_index, + .pResults = 0, + }; return vkQueuePresentKHR(context->queues.present, &present_info); } @@ -3179,16 +3220,17 @@ Object create_texture_mesh_object(Material* texture_mesh_material, VkPhysicalDev .imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, }; - VkWriteDescriptorSet descriptor_write = {}; - descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - descriptor_write.dstSet = sets[i]; - descriptor_write.dstBinding = 0; - descriptor_write.dstArrayElement = 0; - descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - descriptor_write.descriptorCount = 1; - descriptor_write.pBufferInfo = 0; - descriptor_write.pImageInfo = &image_info; - descriptor_write.pTexelBufferView = 0; + VkWriteDescriptorSet descriptor_write = { + .sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, + .dstSet = sets[i], + .dstBinding = 0, + .dstArrayElement = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + .descriptorCount = 1, + .pBufferInfo = 0, + .pImageInfo = &image_info, + .pTexelBufferView = 0, + }; vkUpdateDescriptorSets(device, 1, &descriptor_write, 0, 0); }