blob: a590898843eebff49fb45a148415ff7b51262da2 [file] [log] [blame]
// 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/embedder/embedder_surface_vulkan_impeller.h"
#include <utility>
#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/shell/gpu/gpu_surface_vulkan.h"
#include "impeller/renderer/backend/vulkan/context_vk.h"
#include "include/gpu/ganesh/GrDirectContext.h"
#include "shell/gpu/gpu_surface_vulkan_impeller.h"
namespace flutter {
EmbedderSurfaceVulkanImpeller::EmbedderSurfaceVulkanImpeller(
uint32_t version,
VkInstance instance,
size_t instance_extension_count,
const char** instance_extensions,
size_t device_extension_count,
const char** device_extensions,
VkPhysicalDevice physical_device,
VkDevice device,
uint32_t queue_family_index,
VkQueue queue,
const VulkanDispatchTable& vulkan_dispatch_table,
std::shared_ptr<EmbedderExternalViewEmbedder> external_view_embedder)
: vk_(fml::MakeRefCounted<vulkan::VulkanProcTable>(
vulkan_dispatch_table.get_instance_proc_address)),
vulkan_dispatch_table_(vulkan_dispatch_table),
external_view_embedder_(std::move(external_view_embedder)) {
// Make sure all required members of the dispatch table are checked.
if (!vulkan_dispatch_table_.get_instance_proc_address ||
!vulkan_dispatch_table_.get_next_image ||
!vulkan_dispatch_table_.present_image) {
return;
}
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_modern_shaders_vk_data,
impeller_modern_shaders_vk_length),
std::make_shared<fml::NonOwnedMapping>(
impeller_framebuffer_blend_shaders_vk_data,
impeller_framebuffer_blend_shaders_vk_length),
};
impeller::ContextVK::Settings settings;
settings.shader_libraries_data = shader_mappings;
settings.proc_address_callback =
vulkan_dispatch_table.get_instance_proc_address;
impeller::ContextVK::EmbedderData data;
data.instance = instance;
data.physical_device = physical_device;
data.device = device;
data.queue = queue;
data.queue_family_index = queue_family_index;
data.instance_extensions.reserve(instance_extension_count);
for (auto i = 0u; i < instance_extension_count; i++) {
data.instance_extensions.push_back(std::string{instance_extensions[i]});
}
data.device_extensions.reserve(device_extension_count);
for (auto i = 0u; i < device_extension_count; i++) {
data.device_extensions.push_back(std::string{device_extensions[i]});
}
settings.embedder_data = data;
context_ = impeller::ContextVK::Create(std::move(settings));
if (!context_) {
FML_LOG(ERROR) << "Failed to initialize Vulkan Context.";
return;
}
FML_LOG(IMPORTANT) << "Using the Impeller rendering backend (Vulkan).";
valid_ = true;
}
EmbedderSurfaceVulkanImpeller::~EmbedderSurfaceVulkanImpeller() {}
std::shared_ptr<impeller::Context>
EmbedderSurfaceVulkanImpeller::CreateImpellerContext() const {
return context_;
}
// |GPUSurfaceVulkanDelegate|
const vulkan::VulkanProcTable& EmbedderSurfaceVulkanImpeller::vk() {
return *vk_;
}
// |GPUSurfaceVulkanDelegate|
FlutterVulkanImage EmbedderSurfaceVulkanImpeller::AcquireImage(
const SkISize& size) {
return vulkan_dispatch_table_.get_next_image(size);
}
// |GPUSurfaceVulkanDelegate|
bool EmbedderSurfaceVulkanImpeller::PresentImage(VkImage image,
VkFormat format) {
return vulkan_dispatch_table_.present_image(image, format);
}
// |EmbedderSurface|
bool EmbedderSurfaceVulkanImpeller::IsValid() const {
return valid_;
}
// |EmbedderSurface|
std::unique_ptr<Surface> EmbedderSurfaceVulkanImpeller::CreateGPUSurface() {
return std::make_unique<GPUSurfaceVulkanImpeller>(this, context_);
}
// |EmbedderSurface|
sk_sp<GrDirectContext> EmbedderSurfaceVulkanImpeller::CreateResourceContext()
const {
return nullptr;
}
} // namespace flutter