Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -1500,6 +1500,8 @@ ORIGIN: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.h
ORIGIN: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.mm + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/android_hardware_buffer_texture_source_vk.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/android_hardware_buffer_texture_source_vk.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/barrier_vk.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/barrier_vk.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/impeller/renderer/backend/vulkan/blit_command_vk.cc + ../../../flutter/LICENSE
Expand Down Expand Up @@ -2338,8 +2340,10 @@ ORIGIN: ../../../flutter/shell/platform/android/external_view_embedder/surface_p
ORIGIN: ../../../flutter/shell/platform/android/external_view_embedder/surface_pool.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/flutter_main.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/flutter_main.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/hardware_buffer_external_texture.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_gl.cc + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_gl.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_vk.h + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/io/flutter/FlutterInjector.java + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/io/flutter/Log.java + ../../../flutter/LICENSE
ORIGIN: ../../../flutter/shell/platform/android/io/flutter/app/FlutterActivity.java + ../../../flutter/LICENSE
Expand Down Expand Up @@ -4218,6 +4222,8 @@ FILE: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.h
FILE: ../../../flutter/impeller/renderer/backend/metal/vertex_descriptor_mtl.mm
FILE: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.cc
FILE: ../../../flutter/impeller/renderer/backend/vulkan/allocator_vk.h
FILE: ../../../flutter/impeller/renderer/backend/vulkan/android_hardware_buffer_texture_source_vk.cc
FILE: ../../../flutter/impeller/renderer/backend/vulkan/android_hardware_buffer_texture_source_vk.h
FILE: ../../../flutter/impeller/renderer/backend/vulkan/barrier_vk.cc
FILE: ../../../flutter/impeller/renderer/backend/vulkan/barrier_vk.h
FILE: ../../../flutter/impeller/renderer/backend/vulkan/blit_command_vk.cc
Expand Down Expand Up @@ -5061,8 +5067,12 @@ FILE: ../../../flutter/shell/platform/android/external_view_embedder/surface_poo
FILE: ../../../flutter/shell/platform/android/external_view_embedder/surface_pool.h
FILE: ../../../flutter/shell/platform/android/flutter_main.cc
FILE: ../../../flutter/shell/platform/android/flutter_main.h
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture.cc
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture.h
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_gl.cc
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_gl.h
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_vk.cc
FILE: ../../../flutter/shell/platform/android/hardware_buffer_external_texture_vk.h
FILE: ../../../flutter/shell/platform/android/io/flutter/FlutterInjector.java
FILE: ../../../flutter/shell/platform/android/io/flutter/Log.java
FILE: ../../../flutter/shell/platform/android/io/flutter/app/FlutterActivity.java
Expand Down
4 changes: 1 addition & 3 deletions impeller/core/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@ namespace impeller {
constexpr size_t DefaultUniformAlignment() {
#if FML_OS_IOS && !TARGET_OS_SIMULATOR
return 16u;
#elif FML_OS_MACOSX
return 256u;
#else
return 0x40;
return 256u;
#endif
}

Expand Down
2 changes: 2 additions & 0 deletions impeller/renderer/backend/vulkan/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ impeller_component("vulkan") {
sources = [
"allocator_vk.cc",
"allocator_vk.h",
"android_hardware_buffer_texture_source_vk.cc",
"android_hardware_buffer_texture_source_vk.h",
"barrier_vk.cc",
"barrier_vk.h",
"blit_command_vk.cc",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
// 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 "impeller/renderer/backend/vulkan/android_hardware_buffer_texture_source_vk.h"
#include "impeller/renderer/backend/vulkan/texture_source_vk.h"

#ifdef FML_OS_ANDROID

namespace impeller {

namespace {

bool GetHardwareBufferProperties(
const vk::Device& device,
struct AHardwareBuffer* hardware_buffer,
::impeller::vk::AndroidHardwareBufferPropertiesANDROID* ahb_props,
::impeller::vk::AndroidHardwareBufferFormatPropertiesANDROID*
ahb_format_props) {
FML_CHECK(ahb_format_props != nullptr);
FML_CHECK(ahb_props != nullptr);
ahb_props->pNext = ahb_format_props;
::impeller::vk::Result result =
device.getAndroidHardwareBufferPropertiesANDROID(hardware_buffer,
ahb_props);
if (result != impeller::vk::Result::eSuccess) {
return false;
}
return true;
}

vk::ExternalFormatANDROID MakeExternalFormat(
const vk::AndroidHardwareBufferFormatPropertiesANDROID& format_props) {
vk::ExternalFormatANDROID external_format;
external_format.pNext = nullptr;
external_format.externalFormat = 0;
if (format_props.format == vk::Format::eUndefined) {
external_format.externalFormat = format_props.externalFormat;
}
return external_format;
}

// Returns -1 if not found.
int FindMemoryTypeIndex(
const vk::AndroidHardwareBufferPropertiesANDROID& props) {
uint32_t memory_type_bits = props.memoryTypeBits;
int32_t type_index = -1;
for (uint32_t i = 0; memory_type_bits;
memory_type_bits = memory_type_bits >> 0x1, ++i) {
if (memory_type_bits & 0x1) {
type_index = i;
break;
}
}
return type_index;
}

} // namespace

AndroidHardwareBufferTextureSourceVK::AndroidHardwareBufferTextureSourceVK(
TextureDescriptor desc,
const vk::Device& device,
struct AHardwareBuffer* hardware_buffer,
const AHardwareBuffer_Desc& hardware_buffer_desc)
: TextureSourceVK(desc), device_(device) {
vk::AndroidHardwareBufferFormatPropertiesANDROID ahb_format_props;
vk::AndroidHardwareBufferPropertiesANDROID ahb_props;
if (!GetHardwareBufferProperties(device, hardware_buffer, &ahb_props,
&ahb_format_props)) {
return;
}
vk::ExternalFormatANDROID external_format =
MakeExternalFormat(ahb_format_props);
vk::ExternalMemoryImageCreateInfo external_memory_image_info;
external_memory_image_info.pNext = &external_format;
external_memory_image_info.handleTypes =
vk::ExternalMemoryHandleTypeFlagBits::eAndroidHardwareBufferANDROID;
const int memory_type_index = FindMemoryTypeIndex(ahb_props);
if (memory_type_index < 0) {
FML_LOG(ERROR) << "Could not find memory type.";
return;
}

vk::ImageCreateFlags image_create_flags;
vk::ImageUsageFlags image_usage_flags;
if (hardware_buffer_desc.usage & AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE) {
image_usage_flags |= impeller::vk::ImageUsageFlagBits::eSampled |
impeller::vk::ImageUsageFlagBits::eInputAttachment;
}
if (hardware_buffer_desc.usage & AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT) {
image_usage_flags |= impeller::vk::ImageUsageFlagBits::eColorAttachment;
}
if (hardware_buffer_desc.usage & AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT) {
image_create_flags |= impeller::vk::ImageCreateFlagBits::eProtected;
}

vk::ImageCreateInfo image_create_info;
image_create_info.pNext = &external_memory_image_info;
image_create_info.imageType = vk::ImageType::e2D;
image_create_info.format = ahb_format_props.format;
image_create_info.extent.width = hardware_buffer_desc.width;
image_create_info.extent.height = hardware_buffer_desc.height;
image_create_info.extent.depth = 1;
image_create_info.mipLevels = 1;
image_create_info.arrayLayers = 1;
image_create_info.samples = vk::SampleCountFlagBits::e1;
image_create_info.tiling = vk::ImageTiling::eOptimal;
image_create_info.usage = image_usage_flags;
image_create_info.flags = image_create_flags;
image_create_info.sharingMode = vk::SharingMode::eExclusive;
image_create_info.initialLayout = vk::ImageLayout::eUndefined;

vk::ResultValue<impeller::vk::Image> maybe_image =
device.createImage(image_create_info);
if (maybe_image.result != vk::Result::eSuccess) {
FML_LOG(ERROR) << "device.createImage failed: "
<< static_cast<int>(maybe_image.result);
return;
}
vk::Image image = maybe_image.value;

vk::ImportAndroidHardwareBufferInfoANDROID ahb_import_info;
ahb_import_info.pNext = nullptr;
ahb_import_info.buffer = hardware_buffer;

vk::MemoryDedicatedAllocateInfo dedicated_alloc_info;
dedicated_alloc_info.pNext = &ahb_import_info;
dedicated_alloc_info.image = image;
dedicated_alloc_info.buffer = VK_NULL_HANDLE;

vk::MemoryAllocateInfo mem_alloc_info;
mem_alloc_info.pNext = &dedicated_alloc_info;
mem_alloc_info.allocationSize = ahb_props.allocationSize;
mem_alloc_info.memoryTypeIndex = memory_type_index;

vk::ResultValue<vk::DeviceMemory> allocate_result =
device.allocateMemory(mem_alloc_info);
if (allocate_result.result != vk::Result::eSuccess) {
FML_LOG(ERROR) << "vkAllocateMemory failed : "
<< static_cast<int>(allocate_result.result);
device.destroyImage(image);
return;
}
vk::DeviceMemory device_memory = allocate_result.value;

// Bind memory to the image object.
vk::Result bind_image_result =
device.bindImageMemory(image, device_memory, 0);
if (bind_image_result != vk::Result::eSuccess) {
FML_LOG(ERROR) << "vkBindImageMemory failed : "
<< static_cast<int>(bind_image_result);
device.destroyImage(image);
device.freeMemory(device_memory);
return;
}
image_ = image;
device_memory_ = device_memory;

// Create image view.
vk::ImageViewCreateInfo view_info;
view_info.image = image_;
view_info.viewType = vk::ImageViewType::e2D;
view_info.format = ToVKImageFormat(desc.format);
view_info.subresourceRange.aspectMask = vk::ImageAspectFlagBits::eColor;
view_info.subresourceRange.baseMipLevel = 0u;
view_info.subresourceRange.baseArrayLayer = 0u;
view_info.subresourceRange.levelCount = desc.mip_count;
view_info.subresourceRange.layerCount = ToArrayLayerCount(desc.type);
auto [view_result, view] = device.createImageViewUnique(view_info);
if (view_result != vk::Result::eSuccess) {
FML_LOG(ERROR) << "createImageViewUnique failed : "
<< static_cast<int>(view_result);
return;
}
image_view_ = std::move(view);
is_valid_ = true;
}

// |TextureSourceVK|
AndroidHardwareBufferTextureSourceVK::~AndroidHardwareBufferTextureSourceVK() {
device_.destroyImage(image_);
device_.freeMemory(device_memory_);
}

bool AndroidHardwareBufferTextureSourceVK::IsValid() const {
return is_valid_;
}

// |TextureSourceVK|
vk::Image AndroidHardwareBufferTextureSourceVK::GetImage() const {
FML_CHECK(IsValid());
return image_;
}

// |TextureSourceVK|
vk::ImageView AndroidHardwareBufferTextureSourceVK::GetImageView() const {
FML_CHECK(IsValid());
return image_view_.get();
}

} // namespace impeller

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// 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.

#pragma once

#include "flutter/fml/build_config.h"
#include "vulkan/vulkan_core.h"

#ifdef FML_OS_ANDROID

#include "flutter/fml/macros.h"
#include "impeller/geometry/size.h"
#include "impeller/renderer/backend/vulkan/formats_vk.h"
#include "impeller/renderer/backend/vulkan/texture_source_vk.h"
#include "impeller/renderer/backend/vulkan/vk.h"

#include <android/hardware_buffer.h>
#include <android/hardware_buffer_jni.h>

namespace impeller {

class AndroidHardwareBufferTextureSourceVK final : public TextureSourceVK {
public:
AndroidHardwareBufferTextureSourceVK(
TextureDescriptor desc,
const vk::Device& device,
struct AHardwareBuffer* hardware_buffer,
const AHardwareBuffer_Desc& hardware_buffer_desc);

// |TextureSourceVK|
~AndroidHardwareBufferTextureSourceVK() override;

// |TextureSourceVK|
vk::Image GetImage() const override;

// |TextureSourceVK|
vk::ImageView GetImageView() const override;

bool IsValid() const;

private:
const vk::Device& device_;
vk::Image image_ = VK_NULL_HANDLE;
vk::UniqueImageView image_view_ = {};
vk::DeviceMemory device_memory_ = VK_NULL_HANDLE;

bool is_valid_ = false;

FML_DISALLOW_COPY_AND_ASSIGN(AndroidHardwareBufferTextureSourceVK);
};

} // namespace impeller

#endif
12 changes: 12 additions & 0 deletions impeller/renderer/backend/vulkan/capabilities_vk.cc
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,18 @@ CapabilitiesVK::GetEnabledDeviceExtensions(
enabled.push_back("VK_KHR_portability_subset");
}

#ifdef FML_OS_ANDROID
if (exts->find("VK_ANDROID_external_memory_android_hardware_buffer") ==
exts->end()) {
VALIDATION_LOG
<< "Device does not support "
"VK_ANDROID_external_memory_android_hardware_buffer extension.";
return std::nullopt;
}
enabled.push_back("VK_ANDROID_external_memory_android_hardware_buffer");
enabled.push_back("VK_EXT_queue_family_foreign");
#endif

// Enable all optional extensions if the device supports it.
IterateOptionalDeviceExtensions([&](auto ext) {
auto ext_name = GetDeviceExtensionName(ext);
Expand Down
4 changes: 4 additions & 0 deletions shell/platform/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,12 @@ source_set("flutter_shell_native_src") {
"apk_asset_provider.h",
"flutter_main.cc",
"flutter_main.h",
"hardware_buffer_external_texture.cc",
"hardware_buffer_external_texture.h",
"hardware_buffer_external_texture_gl.cc",
"hardware_buffer_external_texture_gl.h",
"hardware_buffer_external_texture_vk.cc",
"hardware_buffer_external_texture_vk.h",
"library_loader.cc",
"ndk_helpers.cc",
"ndk_helpers.h",
Expand Down
Loading