Commit 360d48b9 authored by Vikas Soni's avatar Vikas Soni Committed by Commit Bot

Use ExternalVkImageFactory for software decode video path.

Use ExternalVkImageFactory as an interop factory instead of
SharedImageBackingFactoryAHB for software decode video path
on android. This is because AHB backing do not support single
channel formats used by video frames in this path.

Bug: 985387
Change-Id: I31243c34a8b72beb0a7af0bec7e54bd326e9a203
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2045130
Commit-Queue: vikas soni <vikassoni@chromium.org>
Reviewed-by: default avatarPeng Huang <penghuang@chromium.org>
Reviewed-by: default avatarKhushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741692}
parent ea145b4c
......@@ -329,7 +329,7 @@ target(link_target_type, "gles2_sources") {
"//gpu/vulkan",
]
if (is_linux || is_fuchsia) {
if (is_linux || is_fuchsia || is_android) {
sources += [
"external_vk_image_backing.cc",
"external_vk_image_backing.h",
......
......@@ -35,7 +35,7 @@
#include "gpu/vulkan/fuchsia/vulkan_fuchsia_ext.h"
#endif
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581
#define GL_TEXTURE_TILING_EXT 0x9580
#define GL_TILING_TYPES_EXT 0x9583
......@@ -665,7 +665,7 @@ ExternalVkImageBacking::ProduceDawn(SharedImageManager* manager,
}
GLuint ExternalVkImageBacking::ProduceGLTextureInternal() {
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
GrVkImageInfo image_info;
bool result = backend_texture_.getVkImageInfo(&image_info);
DCHECK(result);
......@@ -717,7 +717,7 @@ GLuint ExternalVkImageBacking::ProduceGLTextureInternal() {
#elif defined(OS_FUCHSIA)
NOTIMPLEMENTED_LOG_ONCE();
return 0;
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA) && !defined(OS_ANDROID)
#error Unsupported OS
#endif
}
......@@ -731,7 +731,7 @@ ExternalVkImageBacking::ProduceGLTexture(SharedImageManager* manager,
return nullptr;
}
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
if (!texture_) {
GLuint texture_service_id = ProduceGLTextureInternal();
if (!texture_service_id)
......@@ -762,7 +762,7 @@ ExternalVkImageBacking::ProduceGLTexture(SharedImageManager* manager,
#elif defined(OS_FUCHSIA)
NOTIMPLEMENTED_LOG_ONCE();
return nullptr;
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA) && !defined(OS_ANDROID)
#error Unsupported OS
#endif
}
......@@ -777,7 +777,7 @@ ExternalVkImageBacking::ProduceGLTexturePassthrough(
return nullptr;
}
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
if (!texture_passthrough_) {
GLuint texture_service_id = ProduceGLTextureInternal();
if (!texture_service_id)
......@@ -797,7 +797,7 @@ ExternalVkImageBacking::ProduceGLTexturePassthrough(
#elif defined(OS_FUCHSIA)
NOTIMPLEMENTED_LOG_ONCE();
return nullptr;
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA)
#else // !defined(OS_LINUX) && !defined(OS_FUCHSIA) && !defined(OS_ANDROID)
#error Unsupported OS
#endif
}
......@@ -815,7 +815,7 @@ ExternalVkImageBacking::ProduceSkia(
tracker);
}
#ifdef OS_LINUX
#if defined(OS_LINUX) || defined(OS_ANDROID)
int ExternalVkImageBacking::GetMemoryFd(const GrVkImageInfo& image_info) {
VkMemoryGetFdInfoKHR get_fd_info;
get_fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
......
......@@ -11,6 +11,7 @@
#include "base/memory/scoped_refptr.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/optional.h"
#include "build/build_config.h"
#include "components/viz/common/gpu/vulkan_context_provider.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/service/shared_context_state.h"
......@@ -132,7 +133,7 @@ class ExternalVkImageBacking final : public ClearTrackingSharedImageBacking {
base::Optional<WGPUTextureFormat> wgpu_format,
base::Optional<uint32_t> memory_type_index);
#ifdef OS_LINUX
#if defined(OS_LINUX) || defined(OS_ANDROID)
// Extract file descriptor from image
int GetMemoryFd(const GrVkImageInfo& image_info);
#endif
......
......@@ -185,7 +185,7 @@ GLuint ExternalVkImageGLRepresentationShared::ImportVkSemaphoreIntoGL(
#if defined(OS_FUCHSIA)
NOTIMPLEMENTED_LOG_ONCE();
return 0;
#elif defined(OS_LINUX)
#elif defined(OS_LINUX) || defined(OS_ANDROID)
if (handle.vk_handle_type() !=
VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_FD_BIT) {
DLOG(ERROR) << "Importing semaphore handle of unexpected type:"
......@@ -200,7 +200,7 @@ GLuint ExternalVkImageGLRepresentationShared::ImportVkSemaphoreIntoGL(
fd.release());
return gl_semaphore;
#else // !defined(OS_FUCHSIA) && !defined(OS_LINUX)
#else // !defined(OS_FUCHSIA) && !defined(OS_LINUX) && !defined(OS_ANDROID)
#error Unsupported OS
#endif
}
......
......@@ -140,4 +140,4 @@ void ExternalVkImageSkiaRepresentation::EndAccess(bool readonly) {
backing_impl()->EndAccess(readonly, std::move(handle), false /* is_gl */);
}
} // namespace gpu
\ No newline at end of file
} // namespace gpu
......@@ -1128,6 +1128,14 @@ bool SharedImageBackingFactoryAHB::CanImportGpuMemoryBuffer(
return memory_buffer_type == gfx::ANDROID_HARDWARE_BUFFER;
}
bool SharedImageBackingFactoryAHB::IsFormatSupported(
viz::ResourceFormat format) {
DCHECK_GE(format, 0);
DCHECK_LE(format, viz::RESOURCE_FORMAT_MAX);
return format_info_[format].ahb_supported;
}
SharedImageBackingFactoryAHB::FormatInfo::FormatInfo() = default;
SharedImageBackingFactoryAHB::FormatInfo::~FormatInfo() = default;
......
......@@ -59,6 +59,7 @@ class GPU_GLES2_EXPORT SharedImageBackingFactoryAHB
uint32_t usage) override;
bool CanImportGpuMemoryBuffer(
gfx::GpuMemoryBufferType memory_buffer_type) override;
bool IsFormatSupported(viz::ResourceFormat format);
private:
bool ValidateUsage(uint32_t usage,
......
......@@ -30,6 +30,7 @@
#if (defined(USE_X11) || defined(OS_FUCHSIA)) && BUILDFLAG(ENABLE_VULKAN)
#include "gpu/command_buffer/service/external_vk_image_factory.h"
#elif defined(OS_ANDROID) && BUILDFLAG(ENABLE_VULKAN)
#include "gpu/command_buffer/service/external_vk_image_factory.h"
#include "gpu/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.h"
#elif defined(OS_MACOSX)
#include "gpu/command_buffer/service/shared_image_backing_factory_iosurface.h"
......@@ -99,6 +100,10 @@ SharedImageFactory::SharedImageFactory(
}
#elif defined(OS_ANDROID) && BUILDFLAG(ENABLE_VULKAN)
// For Android
if (using_vulkan_) {
external_vk_image_factory_ =
std::make_unique<ExternalVkImageFactory>(context_state);
}
interop_backing_factory_ = std::make_unique<SharedImageBackingFactoryAHB>(
workarounds, gpu_feature_info, context_state);
#elif defined(OS_MACOSX)
......@@ -149,7 +154,7 @@ bool SharedImageFactory::CreateSharedImage(const Mailbox& mailbox,
const gfx::ColorSpace& color_space,
uint32_t usage) {
bool allow_legacy_mailbox = false;
auto* factory = GetFactoryByUsage(usage, &allow_legacy_mailbox);
auto* factory = GetFactoryByUsage(usage, format, &allow_legacy_mailbox);
if (!factory)
return false;
auto backing = factory->CreateSharedImage(
......@@ -206,7 +211,9 @@ bool SharedImageFactory::CreateSharedImage(const Mailbox& mailbox,
// TODO(piman): depending on handle.type, choose platform-specific backing
// factory, e.g. SharedImageBackingFactoryAHB.
bool allow_legacy_mailbox = false;
auto* factory = GetFactoryByUsage(usage, &allow_legacy_mailbox, handle.type);
auto resource_format = viz::GetResourceFormat(format);
auto* factory = GetFactoryByUsage(usage, resource_format,
&allow_legacy_mailbox, handle.type);
if (!factory)
return false;
auto backing =
......@@ -350,6 +357,7 @@ bool SharedImageFactory::IsSharedBetweenThreads(uint32_t usage) {
SharedImageBackingFactory* SharedImageFactory::GetFactoryByUsage(
uint32_t usage,
viz::ResourceFormat format,
bool* allow_legacy_mailbox,
gfx::GpuMemoryBufferType gmb_type) {
if (backing_factory_for_testing_)
......@@ -418,6 +426,21 @@ SharedImageBackingFactory* SharedImageFactory::GetFactoryByUsage(
return nullptr;
}
#if defined(OS_ANDROID)
// On android, we sometime choose VkImage based backing factory as an
// interop if the format is not supported by the AHB backing factory.
auto* ahb_backing_factory = static_cast<SharedImageBackingFactoryAHB*>(
interop_backing_factory_.get());
if (!ahb_backing_factory->IsFormatSupported(format) &&
external_vk_image_factory_) {
if (share_between_threads) {
LOG(FATAL) << "ExternalVkImageFactory currently do not support "
"cross-thread usage.";
}
*allow_legacy_mailbox = false;
return external_vk_image_factory_.get();
}
#endif
return interop_backing_factory_.get();
}
......
......@@ -25,6 +25,7 @@ class VulkanContextProvider;
} // namespace viz
namespace gpu {
class ExternalVkImageFactory;
class GpuDriverBugWorkarounds;
class ImageFactory;
class MailboxManager;
......@@ -114,6 +115,7 @@ class GPU_GLES2_EXPORT SharedImageFactory {
bool IsSharedBetweenThreads(uint32_t usage);
SharedImageBackingFactory* GetFactoryByUsage(
uint32_t usage,
viz::ResourceFormat format,
bool* allow_legacy_mailbox,
gfx::GpuMemoryBufferType gmb_type = gfx::EMPTY_BUFFER);
MailboxManager* mailbox_manager_;
......@@ -136,6 +138,13 @@ class GPU_GLES2_EXPORT SharedImageFactory {
// D3D12.
std::unique_ptr<SharedImageBackingFactory> interop_backing_factory_;
#if defined(OS_ANDROID)
// On android we have two interop factory which is |interop_backing_factory_|
// and |external_vk_image_factory_| and we choose one of those
// based on the format it supports.
std::unique_ptr<ExternalVkImageFactory> external_vk_image_factory_;
#endif
// Non-null if compositing with SkiaRenderer.
std::unique_ptr<raster::WrappedSkImageFactory> wrapped_sk_image_factory_;
......
......@@ -128,6 +128,7 @@ VulkanImplementationAndroid::GetRequiredDeviceExtensions() {
VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME,
VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME,
VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME,
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,
VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME,
VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME,
VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME};
......
......@@ -173,7 +173,7 @@ VULKAN_DEVICE_FUNCTIONS = [
]
},
{
'ifdef': 'defined(OS_LINUX)',
'ifdef': 'defined(OS_LINUX) || defined(OS_ANDROID)',
'extension': 'VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME',
'functions': [
'vkGetMemoryFdKHR',
......
......@@ -803,7 +803,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers(
}
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
if (gfx::HasExtension(enabled_extensions,
VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME)) {
vkGetMemoryFdKHRFn = reinterpret_cast<PFN_vkGetMemoryFdKHR>(
......@@ -823,7 +823,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers(
return false;
}
}
#endif // defined(OS_LINUX)
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_FUCHSIA)
if (gfx::HasExtension(enabled_extensions,
......
......@@ -185,10 +185,10 @@ struct VulkanFunctionPointers {
PFN_vkImportSemaphoreFdKHR vkImportSemaphoreFdKHRFn = nullptr;
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
PFN_vkGetMemoryFdKHR vkGetMemoryFdKHRFn = nullptr;
PFN_vkGetMemoryFdPropertiesKHR vkGetMemoryFdPropertiesKHRFn = nullptr;
#endif // defined(OS_LINUX)
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_FUCHSIA)
PFN_vkImportSemaphoreZirconHandleFUCHSIA
......@@ -385,11 +385,11 @@ struct VulkanFunctionPointers {
gpu::GetVulkanFunctionPointers()->vkImportSemaphoreFdKHRFn
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_LINUX)
#if defined(OS_LINUX) || defined(OS_ANDROID)
#define vkGetMemoryFdKHR gpu::GetVulkanFunctionPointers()->vkGetMemoryFdKHRFn
#define vkGetMemoryFdPropertiesKHR \
gpu::GetVulkanFunctionPointers()->vkGetMemoryFdPropertiesKHRFn
#endif // defined(OS_LINUX)
#endif // defined(OS_LINUX) || defined(OS_ANDROID)
#if defined(OS_FUCHSIA)
#define vkImportSemaphoreZirconHandleFUCHSIA \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment