diff options
| author | grm <grm@eyesin.space> | 2024-05-21 21:17:06 +0300 | 
|---|---|---|
| committer | grm <grm@eyesin.space> | 2024-05-21 21:17:06 +0300 | 
| commit | 1ea8c5cf3022c2548def6fd7dcf02df7848e465b (patch) | |
| tree | cd8618cfe09d2ee2f55fee634ce1cb571ab80da4 /src | |
| parent | 4d13db7bf32a73105507297d2e573a599afd3d9d (diff) | |
| download | cgame-1ea8c5cf3022c2548def6fd7dcf02df7848e465b.tar.gz cgame-1ea8c5cf3022c2548def6fd7dcf02df7848e465b.tar.bz2 cgame-1ea8c5cf3022c2548def6fd7dcf02df7848e465b.zip  | |
Dynamic rendering
Diffstat (limited to 'src')
| -rw-r--r-- | src/game.c | 188 | ||||
| -rw-r--r-- | src/state.h | 16 | 
2 files changed, 88 insertions, 116 deletions
@@ -891,11 +891,17 @@ vulkan_create_graphics_pipeline()      vk_log(VK_ERROR, "failed to create pipeline layout!\n");    } +  VkPipelineRenderingCreateInfo pipeline_rendering_create_info = { +      .sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR, +      .colorAttachmentCount = 1, +      .pColorAttachmentFormats = &s.vk_swap_chain_image_format, +  };    VkGraphicsPipelineCreateInfo pipelineInfo = {0};    pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;    pipelineInfo.stageCount = 2;    pipelineInfo.pStages = shaderStages; +  pipelineInfo.pNext = &pipeline_rendering_create_info,    pipelineInfo.pVertexInputState = &vertexInputInfo;    pipelineInfo.pInputAssemblyState = &inputAssembly;    pipelineInfo.pViewportState = &viewportState; @@ -905,7 +911,7 @@ vulkan_create_graphics_pipeline()    pipelineInfo.pColorBlendState = &colorBlending;    pipelineInfo.pDynamicState = &dynamicState;    pipelineInfo.layout = s.vk_pipeline_layout; -  pipelineInfo.renderPass = s.vk_render_pass; +  pipelineInfo.renderPass = VK_NULL_HANDLE;    pipelineInfo.subpass = 0;    pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; // Optional    pipelineInfo.basePipelineIndex = -1; // Optional @@ -926,72 +932,6 @@ vulkan_create_graphics_pipeline()  }  void -vulkan_create_render_pass() -{ -  VkAttachmentDescription colorAttachment = {0}; -  colorAttachment.format = s.vk_swap_chain_image_format; -  colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT; -  colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; -  colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; -  colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; -  colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; -  colorAttachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; -  colorAttachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - -  VkAttachmentReference colorAttachmentRef = {0}; -  colorAttachmentRef.attachment = 0; -  colorAttachmentRef.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - -  VkSubpassDescription subpass = {0}; -  subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; -  subpass.colorAttachmentCount = 1; -  subpass.pColorAttachments = &colorAttachmentRef; - -  VkSubpassDependency dependency = {0}; -  dependency.srcSubpass = VK_SUBPASS_EXTERNAL; -  dependency.dstSubpass = 0; -  dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; -  dependency.srcAccessMask = 0; -  dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; -  dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - -  VkRenderPassCreateInfo renderPassInfo = {0}; -  renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; -  renderPassInfo.attachmentCount = 1; -  renderPassInfo.pAttachments = &colorAttachment; -  renderPassInfo.subpassCount = 1; -  renderPassInfo.pSubpasses = &subpass; -  renderPassInfo.dependencyCount = 1; -  renderPassInfo.pDependencies = &dependency; - -  if (vkCreateRenderPass(s.vk_device, &renderPassInfo, NULL, &s.vk_render_pass) != VK_SUCCESS) { -    vk_log(VK_ERROR, "failed to create render pass!\n"); -  } -} - -void -vulkan_create_framebuffers() -{ -  s.vk_swap_chain_framebuffers_count = s.vk_swap_chain_image_count; -  for (size_t i = 0; i < s.vk_swap_chain_image_count; i++) { -    VkImageView attachments[] = { -      s.vk_swap_chain_image_views[i] -    }; - -    VkFramebufferCreateInfo framebufferInfo = {0}; -    framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; -    framebufferInfo.renderPass = s.vk_render_pass; -    framebufferInfo.attachmentCount = 1; -    framebufferInfo.pAttachments = attachments; -    framebufferInfo.width = s.vk_swap_chain_extent.width; -    framebufferInfo.height = s.vk_swap_chain_extent.height; -    framebufferInfo.layers = 1; - -    VK_CHECK(vkCreateFramebuffer(s.vk_device, &framebufferInfo, NULL, &s.vk_swap_chain_framebuffers[i])); -  } -} - -void  vulkan_create_command_pool()  {    QueueFamilyIndices queueFamilyIndices = vulkan_find_queue_families(s.vk_physical_device); @@ -1029,38 +969,53 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex)    VK_CHECK(vkBeginCommandBuffer(commandBuffer, &beginInfo)); -  VkRenderPassBeginInfo renderPassInfo = {0}; -  renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; -  renderPassInfo.renderPass = s.vk_render_pass; -  renderPassInfo.framebuffer = s.vk_swap_chain_framebuffers[imageIndex]; -  renderPassInfo.renderArea.offset = (VkOffset2D){0, 0}; -  renderPassInfo.renderArea.extent = s.vk_swap_chain_extent; +  VkImageMemoryBarrier image_memory_barrier = { +    .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, +    .dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, +    .oldLayout = VK_IMAGE_LAYOUT_UNDEFINED, +    .newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, +    .image = s.vk_swap_chain_images[imageIndex], +    .subresourceRange = (VkImageSubresourceRange){ +      .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, +      .baseMipLevel = 0, +      .levelCount = 1, +      .baseArrayLayer = 0, +      .layerCount = 1, +    } +  }; + +  vkCmdPipelineBarrier( +                       commandBuffer, +                       VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,  // srcStageMask +                       VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, // dstStageMask +                       0, +                       0, +                       NULL, +                       0, +                       NULL, +                       1, // imageMemoryBarrierCount +                       &image_memory_barrier // pImageMemoryBarriers +                       );    VkClearValue clearColor = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; -  renderPassInfo.clearValueCount = 1; -  renderPassInfo.pClearValues = &clearColor;    // TODO DYNAMIC RENDERING -  /* VkRenderingAttachmentInfo colorAttachment = {}; */ -  /* colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; */ -  /* colorAttachment.imageView = s.vk_swap_chain_image_views[imageIndex]; */ -  /* colorAttachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; */ -  /* colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; */ -  /* colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; */ -  /* //colorAttachment.clearValue.color = clearColor; */ - -  /* VkRenderingInfo renderingInfo = {}; */ -  /* renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; */ -  /* renderingInfo.renderArea = (VkRect2D){ {0, 0}, {(float)(s.vk_swap_chain_extent.width), (float)(s.vk_swap_chain_extent.height)} }; */ -  /* renderingInfo.layerCount = 1; */ -  /* renderingInfo.colorAttachmentCount = 1; */ -  /* renderingInfo.pColorAttachments = &colorAttachment; */ - -  /* vkCmdBeginRendering(commandBuffer, &renderingInfo); */ -  /*   .... */ -  /* vkCmdEndRendering(commandBuffer); */ - -  vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); +  VkRenderingAttachmentInfo colorAttachment = {}; +  colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; +  colorAttachment.imageView = s.vk_swap_chain_image_views[imageIndex]; +  colorAttachment.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; +  colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; +  colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; +  //colorAttachment.clearValue.color = clearColor; + +  VkRenderingInfo renderingInfo = {}; +  renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; +  renderingInfo.renderArea = (VkRect2D){ {0, 0}, {(float)(s.vk_swap_chain_extent.width), (float)(s.vk_swap_chain_extent.height)} }; +  renderingInfo.layerCount = 1; +  renderingInfo.colorAttachmentCount = 1; +  renderingInfo.pColorAttachments = &colorAttachment; + +  vkCmdBeginRendering(commandBuffer, &renderingInfo);    vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, s.vk_graphics_pipeline); @@ -1085,8 +1040,40 @@ recordCommandBuffer(VkCommandBuffer commandBuffer, uint32_t imageIndex)    vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, s.vk_pipeline_layout, 0, 1, &s.frames[currentFrame].vk_descriptor_set, 0, NULL);    vkCmdDrawIndexed(commandBuffer, INDICES_SIZE, 1, 0, 0, 0); - -  vkCmdEndRenderPass(commandBuffer); +  vkCmdEndRendering(commandBuffer); + +  /* vkCmdBeginRenderPass(commandBuffer, &renderPassInfo, VK_SUBPASS_CONTENTS_INLINE); */ + + +  /* vkCmdEndRenderPass(commandBuffer); */ + +  VkImageMemoryBarrier image_memory_barrier2 = { +    .sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, +    .srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, +    .oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, +    .newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, +    .image = s.vk_swap_chain_images[imageIndex], +    .subresourceRange = (VkImageSubresourceRange){ +      .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT, +      .baseMipLevel = 0, +      .levelCount = 1, +      .baseArrayLayer = 0, +      .layerCount = 1, +     } +     }; + +     vkCmdPipelineBarrier( +                          commandBuffer, +                          VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,  // srcStageMask +                          VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, // dstStageMask +                          0, +                          0, +                          NULL, +                          0, +                          NULL, +                          1, // imageMemoryBarrierCount +                          &image_memory_barrier2 // pImageMemoryBarriers +                          );    VK_CHECK(vkEndCommandBuffer(commandBuffer));  } @@ -1339,9 +1326,6 @@ vulkan_create_descriptor_sets()  void  cleanupSwapChain()  { -  for (size_t i = 0; i < s.vk_swap_chain_image_count; i++) { -    vkDestroyFramebuffer(s.vk_device, s.vk_swap_chain_framebuffers[i], NULL); -  }    for (uint32_t i = 0; i < s.vk_swap_chain_image_count; i++) {      vkDestroyImageView(s.vk_device, s.vk_swap_chain_image_views[i], NULL);    } @@ -1357,7 +1341,6 @@ recreateSwapChain()    vulkan_create_swap_chain();    vulkan_create_image_views(); -  vulkan_create_framebuffers();  }  void @@ -1447,10 +1430,8 @@ init_vulkan()    vulkan_create_logical_device();    vulkan_create_swap_chain();    vulkan_create_image_views(); -  vulkan_create_render_pass();    vulkan_create_descriptor_set_layout();    vulkan_create_graphics_pipeline(); -  vulkan_create_framebuffers();    vulkan_create_command_pool();    vulkan_create_vertex_buffer();    vulkan_create_index_buffer(); @@ -1490,7 +1471,6 @@ close_vulkan()    vkFreeMemory(s.vk_device, s.vk_index_buffer_memory, NULL);    vkDestroyPipeline(s.vk_device, s.vk_graphics_pipeline, NULL); -  vkDestroyRenderPass(s.vk_device, s.vk_render_pass, NULL);    vkDestroyPipelineLayout(s.vk_device, s.vk_pipeline_layout, NULL);    vkDestroyDevice(s.vk_device, NULL);    vkDestroySurfaceKHR(s.vk_instance, s.vk_surface, NULL); diff --git a/src/state.h b/src/state.h index 6feb9d1..e5cb784 100644 --- a/src/state.h +++ b/src/state.h @@ -74,24 +74,18 @@ typedef struct state {    VkQueue vk_present_queue;    VkSwapchainKHR vk_swap_chain; +    uint32_t vk_swap_chain_image_count; -  // LIST vk_swap_chain_images; // VkImage -  VkImage vk_swap_chain_images[1024]; +  VkImage vk_swap_chain_images[5]; +  VkImageView vk_swap_chain_image_views[5]; // 5 for some reason +    VkFormat vk_swap_chain_image_format;    VkExtent2D vk_swap_chain_extent; -  //LIST vk_swap_chain_image_views; // VkImageView -  VkImageView vk_swap_chain_image_views[1000]; - -  VkRenderPass vk_render_pass; -    VkDescriptorSetLayout vk_descriptor_set_layout;    VkPipelineLayout vk_pipeline_layout;    VkPipeline vk_graphics_pipeline; -  VkFramebuffer vk_swap_chain_framebuffers[1000]; -  uint32_t vk_swap_chain_framebuffers_count; -    VkCommandPool vk_command_pool;    frame_data frames[MAX_FRAMES_IN_FLIGHT]; @@ -153,8 +147,6 @@ init_state(state_t * s)    s->vk_swap_chain_image_count = 0;    s->vk_physical_device = VK_NULL_HANDLE; -  s->vk_swap_chain_framebuffers_count = 0; -    s->prev_vert_result = NULL;    s->prev_frag_result = NULL;  }  | 
