|
|
|
|
@@ -1,4 +1,4 @@
|
|
|
|
|
#include "renderer_vulkan.h"
|
|
|
|
|
#include "renderer_vk.h"
|
|
|
|
|
|
|
|
|
|
#include "imgui_impl_glfw.h"
|
|
|
|
|
#include "utils/utils.hpp"
|
|
|
|
|
@@ -26,7 +26,7 @@ static bool is_extension_available(const std::vector<vk::ExtensionProperties>& p
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
vk::PhysicalDevice renderer_vulkan::setup_vulkan_select_physical_device() const {
|
|
|
|
|
vk::PhysicalDevice renderer_vk::setup_vulkan_select_physical_device() const {
|
|
|
|
|
const std::vector<vk::PhysicalDevice> gpus = instance.enumeratePhysicalDevices();
|
|
|
|
|
IM_ASSERT(!gpus.empty());
|
|
|
|
|
|
|
|
|
|
@@ -46,7 +46,7 @@ vk::PhysicalDevice renderer_vulkan::setup_vulkan_select_physical_device() const
|
|
|
|
|
return VK_NULL_HANDLE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::setup_vulkan(ImVector<const char*> instance_extensions) {
|
|
|
|
|
void renderer_vk::setup_vulkan(ImVector<const char*> instance_extensions) {
|
|
|
|
|
// Create Vulkan Instance
|
|
|
|
|
{
|
|
|
|
|
VkInstanceCreateInfo create_info = {};
|
|
|
|
|
@@ -121,7 +121,7 @@ void renderer_vulkan::setup_vulkan(ImVector<const char*> instance_extensions) {
|
|
|
|
|
|
|
|
|
|
// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo.
|
|
|
|
|
// Your real engine/app may not use them.
|
|
|
|
|
void renderer_vulkan::setup_vulkan_window(VkSurfaceKHR surface, int width,
|
|
|
|
|
void renderer_vk::setup_vulkan_window(VkSurfaceKHR surface, int width,
|
|
|
|
|
int height) {
|
|
|
|
|
main_window_data.Surface = surface;
|
|
|
|
|
|
|
|
|
|
@@ -161,7 +161,7 @@ void renderer_vulkan::setup_vulkan_window(VkSurfaceKHR surface, int width,
|
|
|
|
|
height, min_image_count);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::cleanup_vulkan() const {
|
|
|
|
|
void renderer_vk::cleanup_vulkan() const {
|
|
|
|
|
device.destroyDescriptorPool(descriptor_pool);
|
|
|
|
|
#ifdef APP_USE_VULKAN_DEBUG_REPORT
|
|
|
|
|
// Remove the debug report callback
|
|
|
|
|
@@ -173,12 +173,12 @@ void renderer_vulkan::cleanup_vulkan() const {
|
|
|
|
|
instance.destroy();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::cleanup_vulkan_window() {
|
|
|
|
|
void renderer_vk::cleanup_vulkan_window() {
|
|
|
|
|
ImGui_ImplVulkanH_DestroyWindow(instance, device, &main_window_data,
|
|
|
|
|
reinterpret_cast<VkAllocationCallbacks*>(allocator));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::frame_render(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) {
|
|
|
|
|
void renderer_vk::frame_render(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) {
|
|
|
|
|
vk::Semaphore image_acquired_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore;
|
|
|
|
|
vk::Semaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore;
|
|
|
|
|
|
|
|
|
|
@@ -253,7 +253,7 @@ void renderer_vulkan::frame_render(ImGui_ImplVulkanH_Window* wd, ImDrawData* dra
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::frame_present(ImGui_ImplVulkanH_Window* wd) {
|
|
|
|
|
void renderer_vk::frame_present(ImGui_ImplVulkanH_Window* wd) {
|
|
|
|
|
if (swap_chain_rebuild)
|
|
|
|
|
return;
|
|
|
|
|
vk::Semaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore;
|
|
|
|
|
@@ -274,12 +274,12 @@ void renderer_vulkan::frame_present(ImGui_ImplVulkanH_Window* wd) {
|
|
|
|
|
wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::pre_init() {
|
|
|
|
|
void renderer_vk::pre_init() {
|
|
|
|
|
renderer::pre_init();
|
|
|
|
|
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool renderer_vulkan::init(GLFWwindow* window_handle) {
|
|
|
|
|
bool renderer_vk::init(GLFWwindow* window_handle) {
|
|
|
|
|
if (has_initialized_)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
@@ -292,29 +292,29 @@ bool renderer_vulkan::init(GLFWwindow* window_handle) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::shutdown() {
|
|
|
|
|
void renderer_vk::shutdown() {
|
|
|
|
|
renderer::shutdown();
|
|
|
|
|
|
|
|
|
|
ImGui_ImplGlfw_Shutdown();
|
|
|
|
|
ImGui_ImplVulkan_Shutdown();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<shader> renderer_vulkan::load_shader(const std::string& entry_name) {
|
|
|
|
|
std::shared_ptr<shader> renderer_vk::load_shader(const std::string& entry_name) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<pixel_shader_drawer> renderer_vulkan::create_pixel_shader_drawer() {
|
|
|
|
|
std::shared_ptr<pixel_shader_drawer> renderer_vk::create_pixel_shader_drawer() {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::new_frame(GLFWwindow* window_handle) {
|
|
|
|
|
void renderer_vk::new_frame(GLFWwindow* window_handle) {
|
|
|
|
|
// Start the Dear ImGui frame
|
|
|
|
|
ImGui_ImplVulkan_NewFrame();
|
|
|
|
|
ImGui_ImplGlfw_NewFrame();
|
|
|
|
|
ImGui::NewFrame();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::end_frame(GLFWwindow* window_handle) {
|
|
|
|
|
void renderer_vk::end_frame(GLFWwindow* window_handle) {
|
|
|
|
|
ImGuiIO& io = ImGui::GetIO();
|
|
|
|
|
|
|
|
|
|
// Rendering
|
|
|
|
|
@@ -340,18 +340,18 @@ void renderer_vulkan::end_frame(GLFWwindow* window_handle) {
|
|
|
|
|
frame_present(&main_window_data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::resize(int width, int height) {
|
|
|
|
|
void renderer_vk::resize(int width, int height) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<texture> renderer_vulkan::create_texture(const unsigned char* data, int width, int height) {
|
|
|
|
|
std::shared_ptr<texture> renderer_vk::create_texture(const unsigned char* data, int width, int height) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<render_target> renderer_vulkan::create_render_target(int width, int height, texture_format format) {
|
|
|
|
|
std::shared_ptr<render_target> renderer_vk::create_render_target(int width, int height, texture_format format) {
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void renderer_vulkan::init_vulkan(GLFWwindow* window_handle) {
|
|
|
|
|
void renderer_vk::init_vulkan(GLFWwindow* window_handle) {
|
|
|
|
|
ImVector<const char*> extensions;
|
|
|
|
|
uint32_t extensions_count = 0;
|
|
|
|
|
const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&extensions_count);
|