| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/shell/platform/android/android_context_vulkan_impeller.h" |
| |
| #include "flutter/fml/paths.h" |
| #include "flutter/impeller/entity/vk/entity_shaders_vk.h" |
| #include "flutter/impeller/entity/vk/framebuffer_blend_shaders_vk.h" |
| #include "flutter/impeller/entity/vk/modern_shaders_vk.h" |
| #include "flutter/impeller/renderer/backend/vulkan/context_vk.h" |
| |
| #if IMPELLER_ENABLE_3D |
| #include "flutter/impeller/scene/shaders/vk/scene_shaders_vk.h" // nogncheck |
| #endif // IMPELLER_ENABLE_3D |
| |
| namespace flutter { |
| |
| static std::shared_ptr<impeller::Context> CreateImpellerContext( |
| const fml::RefPtr<fml::NativeLibrary>& vulkan_dylib, |
| bool enable_vulkan_validation, |
| bool enable_gpu_tracing) { |
| if (!vulkan_dylib) { |
| VALIDATION_LOG << "Could not open the Vulkan dylib."; |
| return nullptr; |
| } |
| |
| std::vector<std::shared_ptr<fml::Mapping>> shader_mappings = { |
| std::make_shared<fml::NonOwnedMapping>(impeller_entity_shaders_vk_data, |
| impeller_entity_shaders_vk_length), |
| std::make_shared<fml::NonOwnedMapping>( |
| impeller_framebuffer_blend_shaders_vk_data, |
| impeller_framebuffer_blend_shaders_vk_length), |
| #if IMPELLER_ENABLE_3D |
| std::make_shared<fml::NonOwnedMapping>(impeller_scene_shaders_vk_data, |
| impeller_scene_shaders_vk_length), |
| #endif |
| std::make_shared<fml::NonOwnedMapping>(impeller_modern_shaders_vk_data, |
| impeller_modern_shaders_vk_length), |
| }; |
| |
| auto instance_proc_addr = |
| vulkan_dylib->ResolveFunction<PFN_vkGetInstanceProcAddr>( |
| "vkGetInstanceProcAddr"); |
| |
| if (!instance_proc_addr.has_value()) { |
| VALIDATION_LOG << "Could not setup Vulkan proc table."; |
| return nullptr; |
| } |
| |
| impeller::ContextVK::Settings settings; |
| settings.proc_address_callback = instance_proc_addr.value(); |
| settings.shader_libraries_data = std::move(shader_mappings); |
| settings.cache_directory = fml::paths::GetCachesDirectory(); |
| settings.enable_validation = enable_vulkan_validation; |
| settings.enable_gpu_tracing = enable_gpu_tracing; |
| |
| auto context = impeller::ContextVK::Create(std::move(settings)); |
| |
| if (context && impeller::CapabilitiesVK::Cast(*context->GetCapabilities()) |
| .AreValidationsEnabled()) { |
| FML_LOG(IMPORTANT) << "Using the Impeller rendering backend (Vulkan with " |
| "Validation Layers)."; |
| } else { |
| FML_LOG(IMPORTANT) << "Using the Impeller rendering backend (Vulkan)."; |
| } |
| |
| return context; |
| } |
| |
| AndroidContextVulkanImpeller::AndroidContextVulkanImpeller( |
| bool enable_validation, |
| bool enable_gpu_tracing) |
| : AndroidContext(AndroidRenderingAPI::kVulkan), |
| vulkan_dylib_(fml::NativeLibrary::Create("libvulkan.so")) { |
| auto impeller_context = CreateImpellerContext( |
| vulkan_dylib_, enable_validation, enable_gpu_tracing); |
| SetImpellerContext(impeller_context); |
| is_valid_ = !!impeller_context; |
| } |
| |
| AndroidContextVulkanImpeller::~AndroidContextVulkanImpeller() = default; |
| |
| bool AndroidContextVulkanImpeller::IsValid() const { |
| return is_valid_; |
| } |
| |
| } // namespace flutter |