From 94242fca0b3c08361feeaad46c738aeed8784f1b Mon Sep 17 00:00:00 2001 From: Attila Uygun Date: Tue, 16 May 2023 11:26:57 +0200 Subject: [PATCH] Revert "Try Vulkan renderer first, fallback to OpenGL if it fails." This reverts commit daa3a8c06f375d5002159e7cbf343b71982fce27. --- src/engine/platform/platform.cc | 14 +++---- src/engine/renderer/vulkan/renderer_vulkan.cc | 41 +++++++++---------- src/engine/renderer/vulkan/renderer_vulkan.h | 4 +- .../vulkan/renderer_vulkan_android.cc | 6 ++- .../renderer/vulkan/renderer_vulkan_linux.cc | 6 ++- 5 files changed, 39 insertions(+), 32 deletions(-) diff --git a/src/engine/platform/platform.cc b/src/engine/platform/platform.cc index 7333d29..3f7f0e6 100644 --- a/src/engine/platform/platform.cc +++ b/src/engine/platform/platform.cc @@ -12,6 +12,8 @@ #include "engine/audio/audio_driver_alsa.h" #endif +#define USE_VULKAN_RENDERER 1 + using namespace base; namespace eng { @@ -34,13 +36,11 @@ void Platform::InitializeCommon() { bool res = audio_driver_->Initialize(); CHECK(res) << "Failed to initialize audio driver."; - auto context = std::make_unique(); - if (context->Initialize()) { - renderer_ = std::make_unique(std::move(context)); - } else { - LOG << "Failed to initialize Vulkan context. Fallback to OpenGL."; - renderer_ = std::make_unique(); - } +#if (USE_VULKAN_RENDERER == 1) + renderer_ = std::make_unique(); +#else + renderer_ = std::make_unique(); +#endif } void Platform::ShutdownCommon() { diff --git a/src/engine/renderer/vulkan/renderer_vulkan.cc b/src/engine/renderer/vulkan/renderer_vulkan.cc index 4687e91..b0d4170 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.cc +++ b/src/engine/renderer/vulkan/renderer_vulkan.cc @@ -370,8 +370,7 @@ std::pair GetNumBlocksForImageFormat(VkFormat format, namespace eng { -RendererVulkan::RendererVulkan(std::unique_ptr context) - : context_{std::move(context)} {} +RendererVulkan::RendererVulkan() = default; RendererVulkan::~RendererVulkan() = default; @@ -707,7 +706,7 @@ uint64_t RendererVulkan::CreateShader( pipeline_info.pDepthStencilState = &depth_stencil; pipeline_info.pDynamicState = &dynamic_state_create_info; pipeline_info.layout = shader.pipeline_layout; - pipeline_info.renderPass = context_->GetRenderPass(); + pipeline_info.renderPass = context_.GetRenderPass(); pipeline_info.subpass = 0; pipeline_info.basePipelineHandle = VK_NULL_HANDLE; @@ -828,7 +827,7 @@ void RendererVulkan::UploadUniforms(uint64_t resource_id) { } void RendererVulkan::PrepareForDrawing() { - context_->PrepareBuffers(); + context_.PrepareBuffers(); DrawListBegin(); } @@ -840,20 +839,20 @@ void RendererVulkan::Present() { bool RendererVulkan::InitializeInternal() { glslang::InitializeProcess(); - device_ = context_->GetDevice(); + device_ = context_.GetDevice(); // Allocate one extra frame to ensure it's unused at any time without having // to use a fence. - int frame_count = context_->GetSwapchainImageCount() + 1; + int frame_count = context_.GetSwapchainImageCount() + 1; frames_.resize(frame_count); frames_drawn_ = frame_count; // Initialize allocator VmaAllocatorCreateInfo allocator_info; memset(&allocator_info, 0, sizeof(VmaAllocatorCreateInfo)); - allocator_info.physicalDevice = context_->GetPhysicalDevice(); + allocator_info.physicalDevice = context_.GetPhysicalDevice(); allocator_info.device = device_; - allocator_info.instance = context_->GetInstance(); + allocator_info.instance = context_.GetInstance(); vmaCreateAllocator(&allocator_info, &allocator_); for (size_t i = 0; i < frames_.size(); i++) { @@ -861,7 +860,7 @@ bool RendererVulkan::InitializeInternal() { VkCommandPoolCreateInfo cmd_pool_info; cmd_pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; cmd_pool_info.pNext = nullptr; - cmd_pool_info.queueFamilyIndex = context_->GetGraphicsQueue(); + cmd_pool_info.queueFamilyIndex = context_.GetGraphicsQueue(); cmd_pool_info.flags = 0; VkResult err = vkCreateCommandPool(device_, &cmd_pool_info, nullptr, @@ -1014,8 +1013,8 @@ void RendererVulkan::Shutdown() { current_staging_buffer_ = 0; staging_buffer_used_ = false; - context_->DestroyWindow(); - context_->Shutdown(); + context_.DestroyWindow(); + context_.Shutdown(); glslang::FinalizeProcess(); } @@ -1023,8 +1022,8 @@ void RendererVulkan::Shutdown() { void RendererVulkan::BeginFrame() { FreePendingResources(current_frame_); - context_->AppendCommandBuffer(frames_[current_frame_].setup_command_buffer); - context_->AppendCommandBuffer(frames_[current_frame_].draw_command_buffer); + context_.AppendCommandBuffer(frames_[current_frame_].setup_command_buffer); + context_.AppendCommandBuffer(frames_[current_frame_].draw_command_buffer); vkResetCommandPool(device_, frames_[current_frame_].setup_command_pool, 0); vkResetCommandPool(device_, frames_[current_frame_].draw_command_pool, 0); @@ -1063,7 +1062,7 @@ void RendererVulkan::BeginFrame() { void RendererVulkan::FlushSetupBuffer() { vkEndCommandBuffer(frames_[current_frame_].setup_command_buffer); - context_->Flush(false); + context_.Flush(false); vkResetCommandPool(device_, frames_[current_frame_].setup_command_pool, 0); @@ -1079,8 +1078,8 @@ void RendererVulkan::FlushSetupBuffer() { DLOG << "vkBeginCommandBuffer failed with error " << string_VkResult(err); return; } - context_->AppendCommandBuffer(frames_[current_frame_].setup_command_buffer, - true); + context_.AppendCommandBuffer(frames_[current_frame_].setup_command_buffer, + true); } void RendererVulkan::FreePendingResources(int frame) { @@ -1907,8 +1906,8 @@ void RendererVulkan::DrawListBegin() { VkRenderPassBeginInfo render_pass_begin; render_pass_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; render_pass_begin.pNext = nullptr; - render_pass_begin.renderPass = context_->GetRenderPass(); - render_pass_begin.framebuffer = context_->GetFramebuffer(); + render_pass_begin.renderPass = context_.GetRenderPass(); + render_pass_begin.framebuffer = context_.GetFramebuffer(); render_pass_begin.renderArea.extent.width = screen_width_; render_pass_begin.renderArea.extent.height = screen_height_; @@ -1974,7 +1973,7 @@ void RendererVulkan::SwapBuffers() { vkEndCommandBuffer(frames_[current_frame_].setup_command_buffer); vkEndCommandBuffer(frames_[current_frame_].draw_command_buffer); - context_->SwapBuffers(); + context_.SwapBuffers(); current_frame_ = (current_frame_ + 1) % frames_.size(); active_pipeline_ = VK_NULL_HANDLE; @@ -2033,13 +2032,13 @@ bool RendererVulkan::SetUniformInternal(ShaderVulkan& shader, bool RendererVulkan::IsFormatSupported(VkFormat format) { VkFormatProperties properties; - vkGetPhysicalDeviceFormatProperties(context_->GetPhysicalDevice(), format, + vkGetPhysicalDeviceFormatProperties(context_.GetPhysicalDevice(), format, &properties); return properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT; } size_t RendererVulkan::GetAndResetFPS() { - return context_->GetAndResetFPS(); + return context_.GetAndResetFPS(); } void RendererVulkan::DestroyAllResources() { diff --git a/src/engine/renderer/vulkan/renderer_vulkan.h b/src/engine/renderer/vulkan/renderer_vulkan.h index 2d5fb60..38b9bee 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan.h +++ b/src/engine/renderer/vulkan/renderer_vulkan.h @@ -22,7 +22,7 @@ class Image; class RendererVulkan final : public Renderer { public: - RendererVulkan(std::unique_ptr context); + RendererVulkan(); ~RendererVulkan() final; #if defined(__ANDROID__) @@ -156,7 +156,7 @@ class RendererVulkan final : public Renderer { bool context_lost_ = false; - std::unique_ptr context_; + VulkanContext context_; VmaAllocator allocator_ = nullptr; diff --git a/src/engine/renderer/vulkan/renderer_vulkan_android.cc b/src/engine/renderer/vulkan/renderer_vulkan_android.cc index 6f7c2d3..8106fb4 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan_android.cc +++ b/src/engine/renderer/vulkan/renderer_vulkan_android.cc @@ -12,7 +12,11 @@ bool RendererVulkan::Initialize(ANativeWindow* window) { screen_width_ = ANativeWindow_getWidth(window); screen_height_ = ANativeWindow_getHeight(window); - if (!context_->CreateWindow(window, screen_width_, screen_height_)) { + if (!context_.Initialize()) { + LOG << "Failed to initialize Vulkan context."; + return false; + } + if (!context_.CreateWindow(window, screen_width_, screen_height_)) { LOG << "Vulkan context failed to create window."; return false; } diff --git a/src/engine/renderer/vulkan/renderer_vulkan_linux.cc b/src/engine/renderer/vulkan/renderer_vulkan_linux.cc index e51c0d6..4cb66bd 100644 --- a/src/engine/renderer/vulkan/renderer_vulkan_linux.cc +++ b/src/engine/renderer/vulkan/renderer_vulkan_linux.cc @@ -12,7 +12,11 @@ bool RendererVulkan::Initialize(Display* display, Window window) { screen_width_ = xwa.width; screen_height_ = xwa.height; - if (!context_->CreateWindow(display, window, screen_width_, screen_height_)) { + if (!context_.Initialize()) { + LOG << "Failed to initialize Vulkan context."; + return false; + } + if (!context_.CreateWindow(display, window, screen_width_, screen_height_)) { LOG << "Vulkan context failed to create window."; return false; }