diff --git a/src/engine/renderer/tr_image.c b/src/engine/renderer/tr_image.c
index 31b6aef..c2aabf4 100644
--- a/src/engine/renderer/tr_image.c
+++ b/src/engine/renderer/tr_image.c
@@ -1845,8 +1845,17 @@ R_DeleteTextures
void R_DeleteTextures( void ) {
int i;
+ // VULKAN
+ vkDeviceWaitIdle(vk_instance.device);
+
for ( i=0; i
texnum );
+
+ // VULKAN
+ vkDestroyImage(vk_instance.device, tr.images[i]->vk_image, nullptr);
+ vkDestroyImageView(vk_instance.device, tr.images[i]->vk_image_view, nullptr);
+ if (tr.images[i]->vk_staging_buffer.handle != VK_NULL_HANDLE)
+ vkDestroyBuffer(vk_instance.device, tr.images[i]->vk_staging_buffer.handle, nullptr);
}
Com_Memset( tr.images, 0, sizeof( tr.images ) );
diff --git a/src/engine/renderer/vk.cpp b/src/engine/renderer/vk.cpp
index 4e29401..5512017 100644
--- a/src/engine/renderer/vk.cpp
+++ b/src/engine/renderer/vk.cpp
@@ -1,6 +1,7 @@
#include "vk.h"
#include "vk_utils.h"
#include "vk_allocator.h"
+#include "vk_resource_manager.h"
#include "tr_local.h"
#include "vk_demo.h"
@@ -28,6 +29,25 @@ static bool is_extension_available(const std::vector& pro
return false;
}
+static VkFormat find_format_with_features(VkPhysicalDevice physical_device, const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {
+ for (VkFormat format : candidates) {
+ VkFormatProperties properties;
+ vkGetPhysicalDeviceFormatProperties(physical_device, format, &properties);
+
+ if (tiling == VK_IMAGE_TILING_LINEAR && (properties.linearTilingFeatures & features) == features)
+ return format;
+ if (tiling == VK_IMAGE_TILING_OPTIMAL && (properties.optimalTilingFeatures & features) == features)
+ return format;
+ }
+ error("failed to find format with requested features");
+ return VK_FORMAT_UNDEFINED; // never get here
+}
+
+VkFormat find_depth_format(VkPhysicalDevice physical_device) {
+ return find_format_with_features(physical_device, {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT},
+ VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
+}
+
static uint32_t select_queue_family(VkPhysicalDevice physical_device, VkSurfaceKHR surface) {
uint32_t queue_family_count;
vkGetPhysicalDeviceQueueFamilyProperties(physical_device, &queue_family_count, nullptr);
@@ -234,6 +254,68 @@ static VkSwapchainKHR create_swapchain(VkPhysicalDevice physical_device, VkDevic
return swapchain;
}
+// TODO: pass device, color format, depth format. Physical device is not needed.
+static VkRenderPass create_render_pass(VkPhysicalDevice physical_device, VkDevice device) {
+ VkAttachmentDescription color_attachment;
+ color_attachment.flags = 0;
+ color_attachment.format = vk_instance.surface_format.format;
+ color_attachment.samples = VK_SAMPLE_COUNT_1_BIT;
+ color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
+ color_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ color_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ color_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
+ color_attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
+
+ VkAttachmentDescription depth_attachment;
+ depth_attachment.flags = 0;
+ depth_attachment.format = find_depth_format(physical_device);
+ depth_attachment.samples = VK_SAMPLE_COUNT_1_BIT;
+ depth_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
+ depth_attachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ depth_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
+ depth_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
+ depth_attachment.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ depth_attachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference color_attachment_ref;
+ color_attachment_ref.attachment = 0;
+ color_attachment_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
+
+ VkAttachmentReference depth_attachment_ref;
+ depth_attachment_ref.attachment = 1;
+ depth_attachment_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+
+ VkSubpassDescription subpass;
+ subpass.flags = 0;
+ subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
+ subpass.inputAttachmentCount = 0;
+ subpass.pInputAttachments = nullptr;
+ subpass.colorAttachmentCount = 1;
+ subpass.pColorAttachments = &color_attachment_ref;
+ subpass.pResolveAttachments = nullptr;
+ subpass.pDepthStencilAttachment = &depth_attachment_ref;
+ subpass.preserveAttachmentCount = 0;
+ subpass.pPreserveAttachments = nullptr;
+
+ std::array attachments{color_attachment, depth_attachment};
+ VkRenderPassCreateInfo desc;
+ desc.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
+ desc.pNext = nullptr;
+ desc.flags = 0;
+ desc.attachmentCount = static_cast(attachments.size());
+ desc.pAttachments = attachments.data();
+ desc.subpassCount = 1;
+ desc.pSubpasses = &subpass;
+ desc.dependencyCount = 0;
+ desc.pDependencies = nullptr;
+
+ VkRenderPass render_pass;
+ VkResult result = vkCreateRenderPass(device, &desc, nullptr, &render_pass);
+ check_vk_result(result, "vkCreateRenderPass");
+ return render_pass;
+}
+
bool vk_initialize(HWND hwnd) {
try {
auto& g = vk_instance;
@@ -300,6 +382,44 @@ bool vk_initialize(HWND hwnd) {
result = vkAllocateCommandBuffers(vk_instance.device, &alloc_info, &g.command_buffer);
check_vk_result(result, "vkAllocateCommandBuffers");
}
+
+ get_allocator()->initialize(vk_instance.physical_device, vk_instance.device);
+ get_resource_manager()->initialize(vk_instance.device);
+
+ {
+ VkFormat depth_format = find_depth_format(vk_instance.physical_device);
+ vk_instance.depth_image = create_depth_attachment_image(glConfig.vidWidth, glConfig.vidHeight, depth_format);
+ vk_instance.depth_image_view = create_image_view(vk_instance.depth_image, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT);
+
+ record_and_run_commands(vk_instance.command_pool, vk_instance.queue, [&depth_format](VkCommandBuffer command_buffer) {
+ record_image_layout_transition(command_buffer, vk_instance.depth_image, depth_format, 0, VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
+ });
+ }
+
+ g.render_pass = create_render_pass(g.physical_device, g.device);
+
+ {
+ std::array attachments = {VK_NULL_HANDLE, vk_instance.depth_image_view};
+
+ VkFramebufferCreateInfo desc;
+ desc.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
+ desc.pNext = nullptr;
+ desc.flags = 0;
+ desc.renderPass = vk_instance.render_pass;
+ desc.attachmentCount = static_cast(attachments.size());
+ desc.pAttachments = attachments.data();
+ desc.width = glConfig.vidWidth;
+ desc.height = glConfig.vidHeight;
+ desc.layers = 1;
+
+ for (uint32_t i = 0; i < vk_instance.swapchain_image_count; i++) {
+ attachments[0] = vk_instance.swapchain_image_views[i]; // set color attachment
+ VkResult result = vkCreateFramebuffer(vk_instance.device, &desc, nullptr, &vk_instance.framebuffers[i]);
+ check_vk_result(result, "vkCreateFramebuffer");
+ }
+ }
+
} catch (const std::exception&) {
return false;
}
@@ -309,9 +429,22 @@ bool vk_initialize(HWND hwnd) {
void vk_deinitialize() {
auto& g = vk_instance;
+ get_resource_manager()->release_resources();
+ get_allocator()->deallocate_all();
+
+ vkDestroyFence(vk_instance.device, vulkan_demo->rendering_finished_fence, nullptr);
+ vkDestroyImage(vk_instance.device, vk_instance.depth_image, nullptr);
+ vkDestroyImageView(vk_instance.device, vk_instance.depth_image_view, nullptr);
+
+ for (uint32_t i = 0; i < vk_instance.swapchain_image_count; i++) {
+ vkDestroyFramebuffer(vk_instance.device, vk_instance.framebuffers[i], nullptr);
+ }
+
+ vkDestroyRenderPass(vk_instance.device, vk_instance.render_pass, nullptr);
+
vkDestroyCommandPool(g.device, g.command_pool, nullptr);
- for (int i = 0; i < g.swapchain_image_count; i++) {
+ for (uint32_t i = 0; i < g.swapchain_image_count; i++) {
vkDestroyImageView(g.device, g.swapchain_image_views[i], nullptr);
}
@@ -665,7 +798,7 @@ static VkPipeline create_pipeline(const Vk_Pipeline_Desc& desc) {
create_info.pColorBlendState = &blend_state;
create_info.pDynamicState = &dynamic_state;
create_info.layout = vulkan_demo->pipeline_layout;
- create_info.renderPass = vulkan_demo->render_pass;
+ create_info.renderPass = vk_instance.render_pass;
create_info.subpass = 0;
create_info.basePipelineHandle = VK_NULL_HANDLE;
create_info.basePipelineIndex = -1;
@@ -712,14 +845,11 @@ VkPipeline vk_find_pipeline(const Vk_Pipeline_Desc& desc) {
}
static void vk_destroy_pipelines() {
- vkDeviceWaitIdle(vk_instance.device);
-
for (int i = 0; i < tr.vk.num_pipelines; i++) {
vkDestroyPipeline(vk_instance.device, tr.vk.pipelines[i], nullptr);
}
tr.vk.num_pipelines = 0;
-
Com_Memset(tr.vk.pipelines, 0, sizeof(tr.vk.pipelines));
Com_Memset(tr.vk.pipeline_desc, 0, sizeof(tr.vk.pipeline_desc));
@@ -727,5 +857,6 @@ static void vk_destroy_pipelines() {
}
void vk_destroy_resources() {
+ vkDeviceWaitIdle(vk_instance.device);
vk_destroy_pipelines();
}
diff --git a/src/engine/renderer/vk.h b/src/engine/renderer/vk.h
index 4b7979a..d318d1e 100644
--- a/src/engine/renderer/vk.h
+++ b/src/engine/renderer/vk.h
@@ -150,6 +150,12 @@ struct Vulkan_Instance {
VkCommandPool command_pool = VK_NULL_HANDLE;
VkCommandBuffer command_buffer = VK_NULL_HANDLE;
+
+ VkImage depth_image = VK_NULL_HANDLE;
+ VkImageView depth_image_view = VK_NULL_HANDLE;
+
+ VkRenderPass render_pass = VK_NULL_HANDLE;
+ VkFramebuffer framebuffers[MAX_SWAPCHAIN_IMAGES];
};
const int MAX_VK_PIPELINES = 1024;
diff --git a/src/engine/renderer/vk_demo.cpp b/src/engine/renderer/vk_demo.cpp
index 4d96552..aa72314 100644
--- a/src/engine/renderer/vk_demo.cpp
+++ b/src/engine/renderer/vk_demo.cpp
@@ -18,25 +18,6 @@ struct Uniform_Buffer_Object {
float mvp[16];
};
-static VkFormat find_format_with_features(VkPhysicalDevice physical_device, const std::vector& candidates, VkImageTiling tiling, VkFormatFeatureFlags features) {
- for (VkFormat format : candidates) {
- VkFormatProperties properties;
- vkGetPhysicalDeviceFormatProperties(physical_device, format, &properties);
-
- if (tiling == VK_IMAGE_TILING_LINEAR && (properties.linearTilingFeatures & features) == features)
- return format;
- if (tiling == VK_IMAGE_TILING_OPTIMAL && (properties.optimalTilingFeatures & features) == features)
- return format;
- }
- error("failed to find format with requested features");
- return VK_FORMAT_UNDEFINED; // never get here
-}
-
-static VkFormat find_depth_format(VkPhysicalDevice physical_device) {
- return find_format_with_features(physical_device, {VK_FORMAT_D32_SFLOAT, VK_FORMAT_D32_SFLOAT_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT},
- VK_IMAGE_TILING_OPTIMAL, VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT);
-}
-
FILE* logfile;
Vulkan_Demo::Vulkan_Demo(int window_width, int window_height)
@@ -44,8 +25,6 @@ Vulkan_Demo::Vulkan_Demo(int window_width, int window_height)
, window_height(window_height)
{
logfile = fopen("vk_dev.log", "w");
- get_allocator()->initialize(vk_instance.physical_device, vk_instance.device);
- get_resource_manager()->initialize(vk_instance.device);
image_acquired = get_resource_manager()->create_semaphore();
rendering_finished = get_resource_manager()->create_semaphore();
@@ -62,25 +41,13 @@ Vulkan_Demo::Vulkan_Demo(int window_width, int window_height)
create_uniform_buffer();
create_texture_sampler();
- create_depth_buffer_resources();
create_descriptor_set_layout();
- create_render_pass();
- create_framebuffers();
create_pipeline_layout();
upload_geometry();
}
-Vulkan_Demo::~Vulkan_Demo() {
- VkResult result = vkDeviceWaitIdle(vk_instance.device);
- if (result < 0)
- std::cerr << "vkDeviceWaitIdle returned an error code: " + result;
-
- get_resource_manager()->release_resources();
- get_allocator()->deallocate_all();
-}
-
void Vulkan_Demo::create_descriptor_pool() {
std::array pool_sizes;
pool_sizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
@@ -182,17 +149,6 @@ void Vulkan_Demo::create_texture_sampler() {
texture_image_sampler = get_resource_manager()->create_sampler(desc);
}
-void Vulkan_Demo::create_depth_buffer_resources() {
- VkFormat depth_format = find_depth_format(vk_instance.physical_device);
- depth_image = create_depth_attachment_image(window_width, window_height, depth_format);
- depth_image_view = create_image_view(depth_image, depth_format, VK_IMAGE_ASPECT_DEPTH_BIT);
-
- record_and_run_commands(vk_instance.command_pool, vk_instance.queue, [&depth_format, this](VkCommandBuffer command_buffer) {
- record_image_layout_transition(command_buffer, depth_image, depth_format, 0, VK_IMAGE_LAYOUT_UNDEFINED,
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
- });
-}
-
void Vulkan_Demo::create_descriptor_set_layout() {
std::array descriptor_bindings;
descriptor_bindings[0].binding = 0;
@@ -311,85 +267,6 @@ void Vulkan_Demo::create_multitexture_descriptor_set(const image_t* image, const
multitexture_descriptor_sets[images] = set;
}
-void Vulkan_Demo::create_render_pass() {
- VkAttachmentDescription color_attachment;
- color_attachment.flags = 0;
- color_attachment.format = vk_instance.surface_format.format;
- color_attachment.samples = VK_SAMPLE_COUNT_1_BIT;
- color_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- color_attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
- color_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- color_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- color_attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- color_attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
-
- VkAttachmentDescription depth_attachment;
- depth_attachment.flags = 0;
- depth_attachment.format = find_depth_format(vk_instance.physical_device);
- depth_attachment.samples = VK_SAMPLE_COUNT_1_BIT;
- depth_attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
- depth_attachment.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- depth_attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
- depth_attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
- depth_attachment.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
- depth_attachment.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
-
- VkAttachmentReference color_attachment_ref;
- color_attachment_ref.attachment = 0;
- color_attachment_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
-
- VkAttachmentReference depth_attachment_ref;
- depth_attachment_ref.attachment = 1;
- depth_attachment_ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
-
- VkSubpassDescription subpass;
- subpass.flags = 0;
- subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
- subpass.inputAttachmentCount = 0;
- subpass.pInputAttachments = nullptr;
- subpass.colorAttachmentCount = 1;
- subpass.pColorAttachments = &color_attachment_ref;
- subpass.pResolveAttachments = nullptr;
- subpass.pDepthStencilAttachment = &depth_attachment_ref;
- subpass.preserveAttachmentCount = 0;
- subpass.pPreserveAttachments = nullptr;
-
- std::array attachments{color_attachment, depth_attachment};
- VkRenderPassCreateInfo desc;
- desc.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
- desc.pNext = nullptr;
- desc.flags = 0;
- desc.attachmentCount = static_cast(attachments.size());
- desc.pAttachments = attachments.data();
- desc.subpassCount = 1;
- desc.pSubpasses = &subpass;
- desc.dependencyCount = 0;
- desc.pDependencies = nullptr;
-
- render_pass = get_resource_manager()->create_render_pass(desc);
-}
-
-void Vulkan_Demo::create_framebuffers() {
- std::array attachments = {VK_NULL_HANDLE, depth_image_view};
-
- VkFramebufferCreateInfo desc;
- desc.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
- desc.pNext = nullptr;
- desc.flags = 0;
- desc.renderPass = render_pass;
- desc.attachmentCount = static_cast(attachments.size());
- desc.pAttachments = attachments.data();
- desc.width = window_width;
- desc.height = window_height;
- desc.layers = 1;
-
- framebuffers.resize(vk_instance.swapchain_image_count);
- for (std::size_t i = 0; i < framebuffers.size(); i++) {
- attachments[0] = vk_instance.swapchain_image_views[i]; // set color attachment
- framebuffers[i] = get_resource_manager()->create_framebuffer(desc);
- }
-}
-
void Vulkan_Demo::create_pipeline_layout() {
VkPipelineLayoutCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
@@ -532,8 +409,8 @@ void Vulkan_Demo::begin_frame() {
VkRenderPassBeginInfo render_pass_begin_info;
render_pass_begin_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
render_pass_begin_info.pNext = nullptr;
- render_pass_begin_info.renderPass = render_pass;
- render_pass_begin_info.framebuffer = framebuffers[swapchain_image_index];
+ render_pass_begin_info.renderPass = vk_instance.render_pass;
+ render_pass_begin_info.framebuffer = vk_instance.framebuffers[swapchain_image_index];
render_pass_begin_info.renderArea.offset = {0, 0};
render_pass_begin_info.renderArea.extent = {(uint32_t)window_width, (uint32_t)window_height};
render_pass_begin_info.clearValueCount = static_cast(clear_values.size());
diff --git a/src/engine/renderer/vk_demo.h b/src/engine/renderer/vk_demo.h
index 1beaab8..61bffbd 100644
--- a/src/engine/renderer/vk_demo.h
+++ b/src/engine/renderer/vk_demo.h
@@ -11,7 +11,6 @@
class Vulkan_Demo {
public:
Vulkan_Demo(int window_width, int window_height);
- ~Vulkan_Demo();
void begin_frame();
void end_frame();
@@ -24,13 +23,10 @@ public:
void create_uniform_buffer();
VkImage create_texture(const uint8_t* pixels, int bytes_per_pixel, int width, int height, VkImageView& image_view);
void create_texture_sampler();
- void create_depth_buffer_resources();
void create_descriptor_set_layout();
void create_image_descriptor_set(const image_t* image);
void create_multitexture_descriptor_set(const image_t* image, const image_t* image2);
- void create_render_pass();
- void create_framebuffers();
void create_pipeline_layout();
void upload_geometry();
@@ -52,12 +48,8 @@ public:
VkBuffer uniform_buffer = VK_NULL_HANDLE;
VkSampler texture_image_sampler = VK_NULL_HANDLE;
- VkImage depth_image = VK_NULL_HANDLE;
- VkImageView depth_image_view = VK_NULL_HANDLE;
-
+
VkDescriptorSetLayout descriptor_set_layout = VK_NULL_HANDLE;
- VkRenderPass render_pass = VK_NULL_HANDLE;
- std::vector framebuffers;
VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
VkBuffer tess_vertex_buffer = VK_NULL_HANDLE;
diff --git a/src/engine/renderer/vk_resource_manager.cpp b/src/engine/renderer/vk_resource_manager.cpp
index 1bfe63b..fa554ef 100644
--- a/src/engine/renderer/vk_resource_manager.cpp
+++ b/src/engine/renderer/vk_resource_manager.cpp
@@ -26,31 +26,11 @@ void Resource_Manager::release_resources() {
}
buffers.clear();
- for (auto image : images) {
- vkDestroyImage(device, image, nullptr);
- }
- images.clear();
-
- for (auto image_view : image_views) {
- vkDestroyImageView(device, image_view, nullptr);
- }
- image_views.clear();
-
for (auto sampler : samplers) {
vkDestroySampler(device, sampler, nullptr);
}
samplers.clear();
- for (auto render_pass : render_passes) {
- vkDestroyRenderPass(device, render_pass, nullptr);
- }
- render_passes.clear();
-
- for (auto framebuffer : framebuffers) {
- vkDestroyFramebuffer(device, framebuffer, nullptr);
- }
- framebuffers.clear();
-
for (auto descriptor_set_layout : descriptor_set_layouts) {
vkDestroyDescriptorSetLayout(device, descriptor_set_layout, nullptr);
}
@@ -60,11 +40,6 @@ void Resource_Manager::release_resources() {
vkDestroyPipelineLayout(device, pipeline_layout, nullptr);
}
pipeline_layouts.clear();
-
- for (auto pipeline : graphics_pipelines) {
- vkDestroyPipeline(device, pipeline, nullptr);
- }
- graphics_pipelines.clear();
}
VkSemaphore Resource_Manager::create_semaphore() {
@@ -96,22 +71,6 @@ VkBuffer Resource_Manager::create_buffer(const VkBufferCreateInfo& desc) {
return buffer;
}
-VkImage Resource_Manager::create_image(const VkImageCreateInfo& desc) {
- VkImage image;
- VkResult result = vkCreateImage(device, &desc, nullptr, &image);
- check_vk_result(result, "vkCreateImage");
- images.push_back(image);
- return image;
-}
-
-VkImageView Resource_Manager::create_image_view(const VkImageViewCreateInfo& desc) {
- VkImageView image_view;
- VkResult result = vkCreateImageView(device, &desc, nullptr, &image_view);
- check_vk_result(result, "vkCreateImageView");
- image_views.push_back(image_view);
- return image_view;
-}
-
VkSampler Resource_Manager::create_sampler(const VkSamplerCreateInfo& desc) {
VkSampler sampler;
VkResult result = vkCreateSampler(device, &desc, nullptr, &sampler);
@@ -120,22 +79,6 @@ VkSampler Resource_Manager::create_sampler(const VkSamplerCreateInfo& desc) {
return sampler;
}
-VkRenderPass Resource_Manager::create_render_pass(const VkRenderPassCreateInfo& desc) {
- VkRenderPass render_pass;
- VkResult result = vkCreateRenderPass(device, &desc, nullptr, &render_pass);
- check_vk_result(result, "vkCreateRenderPass");
- render_passes.push_back(render_pass);
- return render_pass;
-}
-
-VkFramebuffer Resource_Manager::create_framebuffer(const VkFramebufferCreateInfo& desc) {
- VkFramebuffer framebuffer;
- VkResult result = vkCreateFramebuffer(device, &desc, nullptr, &framebuffer);
- check_vk_result(result, "vkCreateFramebuffer");
- framebuffers.push_back(framebuffer);
- return framebuffer;
-}
-
VkDescriptorSetLayout Resource_Manager::create_descriptor_set_layout(const VkDescriptorSetLayoutCreateInfo& desc) {
VkDescriptorSetLayout descriptor_set_layout;
VkResult result = vkCreateDescriptorSetLayout(device, &desc, nullptr, &descriptor_set_layout);
@@ -151,11 +94,3 @@ VkPipelineLayout Resource_Manager::create_pipeline_layout(const VkPipelineLayout
pipeline_layouts.push_back(pipeline_layout);
return pipeline_layout;
}
-
-VkPipeline Resource_Manager::create_graphics_pipeline(const VkGraphicsPipelineCreateInfo& desc) {
- VkPipeline pipeline;
- VkResult result = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &desc, nullptr, &pipeline);
- check_vk_result(result, "vkCreateGraphicsPipelines");
- graphics_pipelines.push_back(pipeline);
- return pipeline;
-}
diff --git a/src/engine/renderer/vk_resource_manager.h b/src/engine/renderer/vk_resource_manager.h
index 905223a..751747e 100644
--- a/src/engine/renderer/vk_resource_manager.h
+++ b/src/engine/renderer/vk_resource_manager.h
@@ -11,28 +11,18 @@ public:
VkSemaphore create_semaphore();
VkDescriptorPool create_descriptor_pool(const VkDescriptorPoolCreateInfo& desc);
VkBuffer create_buffer(const VkBufferCreateInfo& desc);
- VkImage create_image(const VkImageCreateInfo& desc);
- VkImageView create_image_view(const VkImageViewCreateInfo& desc);
VkSampler create_sampler(const VkSamplerCreateInfo& desc);
- VkRenderPass create_render_pass(const VkRenderPassCreateInfo& desc);
- VkFramebuffer create_framebuffer(const VkFramebufferCreateInfo& desc);
VkDescriptorSetLayout create_descriptor_set_layout(const VkDescriptorSetLayoutCreateInfo& desc);
VkPipelineLayout create_pipeline_layout(const VkPipelineLayoutCreateInfo& desc);
- VkPipeline create_graphics_pipeline(const VkGraphicsPipelineCreateInfo& desc);
private:
VkDevice device = VK_NULL_HANDLE;
std::vector semaphores;
std::vector descriptor_pools;
std::vector buffers;
- std::vector images;
- std::vector image_views;
std::vector samplers;
std::vector descriptor_set_layouts;
- std::vector render_passes;
- std::vector framebuffers;
std::vector pipeline_layouts;
- std::vector graphics_pipelines;
};
Resource_Manager* get_resource_manager();
diff --git a/src/engine/renderer/vk_utils.cpp b/src/engine/renderer/vk_utils.cpp
index 23b833b..382a3dc 100644
--- a/src/engine/renderer/vk_utils.cpp
+++ b/src/engine/renderer/vk_utils.cpp
@@ -161,10 +161,12 @@ VkImage create_texture(int image_width, int image_height, VkFormat format) {
desc.pQueueFamilyIndices = nullptr;
desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- VkImage image = get_resource_manager()->create_image(desc);
+ VkImage image;
+ VkResult result = vkCreateImage(vk_instance.device, &desc, nullptr, &image);
+ check_vk_result(result, "vkCreateImage");
VkDeviceMemory memory = get_allocator()->allocate_memory(image);
- VkResult result = vkBindImageMemory(vk_instance.device, image, memory, 0);
+ result = vkBindImageMemory(vk_instance.device, image, memory, 0);
check_vk_result(result, "vkBindImageMemory");
return image;
}
@@ -242,10 +244,12 @@ VkImage create_depth_attachment_image(int image_width, int image_height, VkForma
desc.pQueueFamilyIndices = nullptr;
desc.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
- VkImage image = get_resource_manager()->create_image(desc);
+ VkImage image;
+ VkResult result = vkCreateImage(vk_instance.device, &desc, nullptr, &image);
+ check_vk_result(result, "vkCreateImage");
VkDeviceMemory memory = get_allocator()->allocate_memory(image);
- VkResult result = vkBindImageMemory(vk_instance.device, image, memory, 0);
+ result = vkBindImageMemory(vk_instance.device, image, memory, 0);
check_vk_result(result, "vkBindImageMemory");
return image;
}
@@ -268,7 +272,10 @@ VkImageView create_image_view(VkImage image, VkFormat format, VkImageAspectFlags
desc.subresourceRange.baseArrayLayer = 0;
desc.subresourceRange.layerCount = 1;
- return get_resource_manager()->create_image_view(desc);
+ VkImageView image_view;
+ VkResult result = vkCreateImageView(vk_instance.device, &desc, nullptr, &image_view);
+ check_vk_result(result, "vkCreateImageView");
+ return image_view;
}
VkBuffer create_buffer(VkDeviceSize size, VkBufferUsageFlags usage) {
@@ -290,34 +297,6 @@ VkBuffer create_buffer(VkDeviceSize size, VkBufferUsageFlags usage) {
return buffer;
}
-VkBuffer create_staging_buffer(VkDeviceSize size, const void* data) {
- VkBufferCreateInfo desc;
- desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
- desc.pNext = nullptr;
- desc.flags = 0;
- desc.size = size;
- desc.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
- desc.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
- desc.queueFamilyIndexCount = 0;
- desc.pQueueFamilyIndices = nullptr;
-
- VkBuffer buffer;
- VkResult result = vkCreateBuffer(vk_instance.device, &desc, nullptr, &buffer);
- check_vk_result(result, "vkCreateBuffer");
-
- get_allocator()->get_shared_staging_memory().ensure_allocation_for_object(buffer);
- VkDeviceMemory memory = get_allocator()->get_shared_staging_memory().get_handle();
- result = vkBindBufferMemory(vk_instance.device, buffer, memory, 0);
- check_vk_result(result, "vkBindBufferMemory");
-
- void* buffer_data;
- result = vkMapMemory(vk_instance.device, memory, 0, size, 0, &buffer_data);
- check_vk_result(result, "vkMapMemory");
- memcpy(buffer_data, data, size);
- vkUnmapMemory(vk_instance.device, memory);
- return buffer;
-}
-
VkBuffer create_permanent_staging_buffer(VkDeviceSize size, VkDeviceMemory& memory) {
VkBufferCreateInfo desc;
desc.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
diff --git a/src/engine/renderer/vk_utils.h b/src/engine/renderer/vk_utils.h
index f87ed79..0ffe774 100644
--- a/src/engine/renderer/vk_utils.h
+++ b/src/engine/renderer/vk_utils.h
@@ -39,5 +39,4 @@ VkImageView create_image_view(VkImage image, VkFormat format, VkImageAspectFlags
// Buffers
VkBuffer create_buffer(VkDeviceSize size, VkBufferUsageFlags usage);
-VkBuffer create_staging_buffer(VkDeviceSize size, const void* data);
VkBuffer create_permanent_staging_buffer(VkDeviceSize size, VkDeviceMemory& memory);