103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
#include <GLFW/glfw3.h>
|
|
|
|
#include "precomp.h"
|
|
#include "vulkan_engine/vulkan/graphics.h"
|
|
|
|
namespace veng {
|
|
|
|
Graphics::Graphics(gsl::not_null<Window*> window) : window(window) {
|
|
#if !defined(NDEBUG)
|
|
validation_enabled_ = true;
|
|
#endif
|
|
InitializeVulkan();
|
|
}
|
|
|
|
Graphics::~Graphics() {
|
|
if (logical_device_ != VK_NULL_HANDLE) {
|
|
vkDeviceWaitIdle(logical_device_);
|
|
CleanupSwapChain();
|
|
DestroyTexture(depth_texture_);
|
|
|
|
if (texture_pool_ != VK_NULL_HANDLE)
|
|
vkDestroyDescriptorPool(logical_device_, texture_pool_, nullptr);
|
|
|
|
if (texture_set_layout_ != VK_NULL_HANDLE)
|
|
vkDestroyDescriptorSetLayout(logical_device_, texture_set_layout_,
|
|
nullptr);
|
|
|
|
if (texture_sampler_ != VK_NULL_HANDLE)
|
|
vkDestroySampler(logical_device_, texture_sampler_, nullptr);
|
|
|
|
if (uniform_pool_ != VK_NULL_HANDLE)
|
|
vkDestroyDescriptorPool(logical_device_, uniform_pool_, nullptr);
|
|
|
|
for (Frame& frame : frames_) {
|
|
DestroyBuffer(frame.uniform_buffer);
|
|
|
|
if (frame.image_available_signal != VK_NULL_HANDLE)
|
|
vkDestroySemaphore(logical_device_, frame.image_available_signal,
|
|
nullptr);
|
|
|
|
if (frame.render_finished_signal != VK_NULL_HANDLE)
|
|
vkDestroySemaphore(logical_device_, frame.render_finished_signal,
|
|
nullptr);
|
|
|
|
if (frame.still_rendering_fence != VK_NULL_HANDLE)
|
|
vkDestroyFence(logical_device_, frame.still_rendering_fence, nullptr);
|
|
}
|
|
|
|
if (uniform_set_layout_ != VK_NULL_HANDLE)
|
|
vkDestroyDescriptorSetLayout(logical_device_, uniform_set_layout_,
|
|
nullptr);
|
|
|
|
if (command_pool_ != VK_NULL_HANDLE)
|
|
vkDestroyCommandPool(logical_device_, command_pool_, nullptr);
|
|
|
|
if (logical_device_ != VK_NULL_HANDLE)
|
|
vkDestroyPipeline(logical_device_, pipeline_, nullptr);
|
|
|
|
if (pipeline_layout_ != VK_NULL_HANDLE)
|
|
vkDestroyPipelineLayout(logical_device_, pipeline_layout_, nullptr);
|
|
|
|
if (render_pass_ != VK_NULL_HANDLE)
|
|
vkDestroyRenderPass(logical_device_, render_pass_, nullptr);
|
|
|
|
vkDestroyDevice(logical_device_, nullptr);
|
|
}
|
|
if (instance_ != VK_NULL_HANDLE) {
|
|
if (surface_ != VK_NULL_HANDLE)
|
|
vkDestroySurfaceKHR(instance_, surface_, nullptr);
|
|
|
|
if (debug_messenger_ != VK_NULL_HANDLE)
|
|
vkDestroyDebugUtilsMessengerEXT(instance_, debug_messenger_, nullptr);
|
|
|
|
vkDestroyInstance(instance_, nullptr);
|
|
}
|
|
}
|
|
|
|
void Graphics::InitializeVulkan() {
|
|
CreateInstance();
|
|
SetupDebugMessenger();
|
|
CreateSurface();
|
|
PickPhysicalDevice();
|
|
CreateLogicalDeviceAndQueues();
|
|
CreateSwapChain();
|
|
CreateImageViews();
|
|
CreateRenderPass();
|
|
CreateDescriptorSetLayouts();
|
|
CreateGraphicsPipeline();
|
|
CreateDepthResources();
|
|
CreateFramebuffers();
|
|
CreateCommandPool();
|
|
CreateCommandBuffer();
|
|
CreateSignals();
|
|
CreateUniformBuffers();
|
|
CreateDescriptorPools();
|
|
CreateDescriptorSets();
|
|
CreateTextureSampler();
|
|
TransitionImageLayout(depth_texture_.image, VK_IMAGE_LAYOUT_UNDEFINED,
|
|
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
|
|
}
|
|
|
|
} // namespace veng
|