Implement mulitsampling

This commit is contained in:
Piotr Krygier committed 2025-06-20 13:44:33 +02:00
1 parent 3c73e6bac3
commit 2d230d7280
4 files changed
+72 -19

No files matched your search

+42 -7
View File
@@ -1,6 +1,7 @@
#include "rse_vulkan_image.h" #include "rse_vulkan_image.h"
#include <stdint.h> #include <stdint.h>
#include "src/vulkan_pipeline.h"
#include "utilities/file_utils.h" #include "utilities/file_utils.h"
#include "utilities/logger.h" #include "utilities/logger.h"
#include "utilities/rse_commons.h" #include "utilities/rse_commons.h"
@@ -43,6 +44,7 @@ extern struct rse_vulkan_state_t g_vulkan_state;
struct rse_vulkan_image_t g_texture_images[RSE_MAX_IMAGE_COUNT]; struct rse_vulkan_image_t g_texture_images[RSE_MAX_IMAGE_COUNT];
struct rse_vulkan_image_t g_depth_image; struct rse_vulkan_image_t g_depth_image;
struct rse_vulkan_image_t g_color_image;
VkSampler g_sampler; VkSampler g_sampler;
@@ -105,7 +107,13 @@ static rse_err_t find_supported_format(const VkFormat* candidates,
return VULKAN_ERROR_FORMAT_NOT_FOUND; return VULKAN_ERROR_FORMAT_NOT_FOUND;
} }
static rse_err_t create_image(struct rse_vulkan_image_t* image, uint32_t width, uint32_t height, VkFormat format, VkImageUsageFlags usage, VmaAllocationCreateFlags allocationFlags) static rse_err_t create_image(struct rse_vulkan_image_t* image,
uint32_t width,
uint32_t height,
VkFormat format,
VkSampleCountFlagBits maa_samples,
VkImageUsageFlags usage,
VmaAllocationCreateFlags allocationFlags)
{ {
VkExtent3D image_extent = {0}; VkExtent3D image_extent = {0};
VkImageCreateInfo image_info = {0}; VkImageCreateInfo image_info = {0};
@@ -123,7 +131,7 @@ static rse_err_t create_image(struct rse_vulkan_image_t* image, uint32_t width,
image_info.extent = image_extent; image_info.extent = image_extent;
image_info.mipLevels = 1U; image_info.mipLevels = 1U;
image_info.arrayLayers = 1U; image_info.arrayLayers = 1U;
image_info.samples = VK_SAMPLE_COUNT_1_BIT; //TODO: Enable multisampling image_info.samples = maa_samples;
image_info.tiling = VK_IMAGE_TILING_OPTIMAL; image_info.tiling = VK_IMAGE_TILING_OPTIMAL;
image_info.usage = usage; image_info.usage = usage;
image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; //TODO: Change if used by more than one queue family image_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; //TODO: Change if used by more than one queue family
@@ -183,10 +191,26 @@ static rse_err_t create_image_view(struct rse_vulkan_image_t* image, VkFormat fo
return RSE_ERROR_NO_ERROR; return RSE_ERROR_NO_ERROR;
} }
// static rse_err_t create_color_resource() static rse_err_t create_color_resource()
// { {
// return RSE_ERROR_NO_ERROR; rse_err_t status = RSE_ERROR_NO_ERROR;
// } VkFormat color_format = IMAGE_FORMAT;
VkSurfaceCapabilitiesKHR physical_device_surface_capabilities;
vkGetPhysicalDeviceSurfaceCapabilitiesKHR(g_vulkan_state.physical_device,
g_vulkan_state.surface,
&physical_device_surface_capabilities);
STATUS_CHECK(create_image(&g_color_image,
physical_device_surface_capabilities.currentExtent.width,
physical_device_surface_capabilities.currentExtent.height,
color_format,
VK_SAMPLE_COUNT_16_BIT,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0U));
STATUS_CHECK(create_image_view(&g_color_image, color_format, VK_IMAGE_ASPECT_COLOR_BIT));
return status;
}
static rse_err_t create_depth_resources() static rse_err_t create_depth_resources()
@@ -204,7 +228,10 @@ static rse_err_t create_depth_resources()
STATUS_CHECK(create_image(&g_depth_image, STATUS_CHECK(create_image(&g_depth_image,
physical_device_surface_capabilities.currentExtent.width, physical_device_surface_capabilities.currentExtent.width,
physical_device_surface_capabilities.currentExtent.height, physical_device_surface_capabilities.currentExtent.height,
depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0U)); depth_format,
VK_SAMPLE_COUNT_16_BIT,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
0U));
STATUS_CHECK(create_image_view(&g_depth_image, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT)); STATUS_CHECK(create_image_view(&g_depth_image, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT));
return status; return status;
@@ -273,6 +300,7 @@ static rse_err_t create_textured_image(uint32_t width,
width, width,
height, height,
format, format,
VK_SAMPLE_COUNT_1_BIT,
VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT,
VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT)); VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT));
@@ -370,6 +398,7 @@ rse_err_t init_vulkan_images()
STATUS_CHECK(create_sampler()); STATUS_CHECK(create_sampler());
STATUS_CHECK(create_depth_resources()); STATUS_CHECK(create_depth_resources());
STATUS_CHECK(create_color_resource());
return status; return status;
} }
@@ -415,7 +444,9 @@ void rse_destroy_textures()
} }
vkDestroyImageView(g_vulkan_state.device, g_depth_image.image_view, NULL); vkDestroyImageView(g_vulkan_state.device, g_depth_image.image_view, NULL);
vkDestroyImageView(g_vulkan_state.device, g_color_image.image_view, NULL);
vmaDestroyImage(g_vulkan_state.allocator, g_depth_image.image, g_depth_image.allocation); vmaDestroyImage(g_vulkan_state.allocator, g_depth_image.image, g_depth_image.allocation);
vmaDestroyImage(g_vulkan_state.allocator, g_color_image.image, g_color_image.allocation);
} }
uint8_t image_exists(uint8_t image_id) { uint8_t image_exists(uint8_t image_id) {
@@ -432,6 +463,10 @@ VkImageView rse_get_depth_image_view()
return g_depth_image.image_view; return g_depth_image.image_view;
} }
VkImageView rse_get_color_image_view()
{
return g_color_image.image_view;
}
VkSampler rse_get_texture_sampler() VkSampler rse_get_texture_sampler()
{ {
+4 -2
View File
@@ -76,10 +76,12 @@ uint8_t image_exists(uint8_t image_id);
* *
* @return size_t Texture count * @return size_t Texture count
*/ */
size_t get_textures_count(); size_t get_textures_count(void);
rse_err_t find_depth_format(VkFormat* found_format); rse_err_t find_depth_format(VkFormat* found_format);
VkImageView rse_get_depth_image_view(); VkImageView rse_get_depth_image_view(void);
VkImageView rse_get_color_image_view(void);
#endif /* RSE_TEXTURE_H */ #endif /* RSE_TEXTURE_H */
+25 -10
View File
@@ -4,6 +4,7 @@
#include "utilities/file_utils.h" #include "utilities/file_utils.h"
#include "utilities/logger.h" #include "utilities/logger.h"
#include "utilities/rse_errors_common.h" #include "utilities/rse_errors_common.h"
#include "vulkan/vulkan_core.h"
#include "vulkan_errors.h" #include "vulkan_errors.h"
#include "rse_vulkan_image.h" #include "rse_vulkan_image.h"
#include "vulkan_descriptors.h" #include "vulkan_descriptors.h"
@@ -21,7 +22,6 @@ enum shader_stage_t
FRAGMENTS FRAGMENTS
}; };
#define IMAGE_FORMAT VK_FORMAT_B8G8R8A8_SRGB;
uint32_t g_swapchain_images_count = 0U; uint32_t g_swapchain_images_count = 0U;
@@ -194,9 +194,11 @@ static rse_err_t create_swapchain_image_views()
static rse_err_t create_render_pass() static rse_err_t create_render_pass()
{ {
rse_err_t status = RSE_ERROR_NO_ERROR; rse_err_t status = RSE_ERROR_NO_ERROR;
VkAttachmentDescription attachments[2] = {}; VkAttachmentDescription attachments[3] = {};
VkAttachmentDescription color_attachment = {}; VkAttachmentDescription color_attachment = {};
VkAttachmentReference color_attachment_ref = {}; VkAttachmentReference color_attachment_ref = {};
VkAttachmentDescription color_attachment_resolve = {};
VkAttachmentReference color_attachment_resolve_ref = {};
VkSubpassDescription subpass = {}; VkSubpassDescription subpass = {};
VkRenderPassCreateInfo renderpass_info = {}; VkRenderPassCreateInfo renderpass_info = {};
VkAttachmentDescription depth_attachment = {}; VkAttachmentDescription depth_attachment = {};
@@ -205,7 +207,7 @@ static rse_err_t create_render_pass()
STATUS_CHECK(find_depth_format(&depth_attachment.format)); STATUS_CHECK(find_depth_format(&depth_attachment.format));
depth_attachment.samples = VK_SAMPLE_COUNT_1_BIT; depth_attachment.samples = VK_SAMPLE_COUNT_16_BIT;
depth_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; depth_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
depth_attachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; depth_attachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
depth_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; depth_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
@@ -218,24 +220,38 @@ static rse_err_t create_render_pass()
color_attachment.flags = 0U; color_attachment.flags = 0U;
color_attachment.format = IMAGE_FORMAT; color_attachment.format = IMAGE_FORMAT;
color_attachment.samples = VK_SAMPLE_COUNT_1_BIT; color_attachment.samples = VK_SAMPLE_COUNT_16_BIT;
color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
color_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; color_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
color_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; color_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
color_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; color_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
color_attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; color_attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
color_attachment_ref.attachment = 0; color_attachment_ref.attachment = 0;
color_attachment_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; color_attachment_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
color_attachment_resolve.format = IMAGE_FORMAT;
color_attachment_resolve.samples = VK_SAMPLE_COUNT_1_BIT;
color_attachment_resolve.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
color_attachment_resolve.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
color_attachment_resolve.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
color_attachment_resolve.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
color_attachment_resolve.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
color_attachment_resolve.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
color_attachment_resolve_ref.attachment = 2;
color_attachment_resolve_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
subpass.colorAttachmentCount = 1; subpass.colorAttachmentCount = 1;
subpass.pColorAttachments = &color_attachment_ref; subpass.pColorAttachments = &color_attachment_ref;
subpass.pDepthStencilAttachment = &depth_attachment_ref; subpass.pDepthStencilAttachment = &depth_attachment_ref;
subpass.pResolveAttachments = &color_attachment_resolve_ref;
attachments[0] = color_attachment; attachments[0] = color_attachment;
attachments[1] = depth_attachment; attachments[1] = depth_attachment;
attachments[2] = color_attachment_resolve;
dependency.srcSubpass = VK_SUBPASS_EXTERNAL; dependency.srcSubpass = VK_SUBPASS_EXTERNAL;
dependency.dstSubpass = 0; dependency.dstSubpass = 0;
@@ -244,9 +260,8 @@ static rse_err_t create_render_pass()
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT; dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT | VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT;
dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT; dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
renderpass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; renderpass_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
renderpass_info.attachmentCount = 2; renderpass_info.attachmentCount = 3;
renderpass_info.pAttachments = attachments; renderpass_info.pAttachments = attachments;
renderpass_info.subpassCount = 1; renderpass_info.subpassCount = 1;
renderpass_info.pSubpasses = &subpass; renderpass_info.pSubpasses = &subpass;
@@ -595,7 +610,7 @@ static void fill_multisampling_state_info(VkPipelineMultisampleStateCreateInfo*
multisampling->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; multisampling->sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
multisampling->pNext = NULL; multisampling->pNext = NULL;
multisampling->flags = 0U; multisampling->flags = 0U;
multisampling->rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; multisampling->rasterizationSamples = VK_SAMPLE_COUNT_16_BIT;
multisampling->sampleShadingEnable = VK_FALSE; multisampling->sampleShadingEnable = VK_FALSE;
multisampling->minSampleShading = 1.0f; multisampling->minSampleShading = 1.0f;
multisampling->pSampleMask = NULL; multisampling->pSampleMask = NULL;
@@ -734,12 +749,12 @@ static rse_err_t create_framebuffers()
g_vulkan_state.swapchain_framebuffers = malloc(sizeof(VkFramebuffer) * g_swapchain_images_count); g_vulkan_state.swapchain_framebuffers = malloc(sizeof(VkFramebuffer) * g_swapchain_images_count);
for (size_t i = 0; i < g_swapchain_images_count; i++) { for (size_t i = 0; i < g_swapchain_images_count; i++) {
VkImageView attachments[] = {g_vulkan_state.swapchain_image_views[i], rse_get_depth_image_view()}; VkImageView attachments[] = {rse_get_color_image_view(), rse_get_depth_image_view(), g_vulkan_state.swapchain_image_views[i]};
VkFramebufferCreateInfo framebufferInfo = {}; VkFramebufferCreateInfo framebufferInfo = {};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = g_vulkan_state.render_pass; framebufferInfo.renderPass = g_vulkan_state.render_pass;
framebufferInfo.attachmentCount = 2; framebufferInfo.attachmentCount = 3;
framebufferInfo.pAttachments = attachments; framebufferInfo.pAttachments = attachments;
framebufferInfo.width = g_vulkan_state.swapchain_extent.width; framebufferInfo.width = g_vulkan_state.swapchain_extent.width;
framebufferInfo.height = g_vulkan_state.swapchain_extent.height; framebufferInfo.height = g_vulkan_state.swapchain_extent.height;
+1
View File
@@ -3,6 +3,7 @@
#include "utilities/rse_commons.h" #include "utilities/rse_commons.h"
#define IMAGE_FORMAT VK_FORMAT_B8G8R8A8_SRGB;
/** /**
* @brief Create a graphics pipeline * @brief Create a graphics pipeline
* *