Commit 85bf8ed5 authored by Vikas Soni's avatar Vikas Soni Committed by Commit Bot

Vulkan backed Skia representation of the SharedImageVideo.

1. Implement vulkan representation of the SharedImageVideo.

2. Skia promise image requires sampler conversion information ycbcr
in the vulkan mode. This information is needed during the promise
image creation time which happens before BeginReadAccess. This is
done by passing this info to promise image via
VideoFrame->StreamVideoDrawQuad->ResourceMetadata.

3. Add ycbcr info to the video frame. Update required mojom and struct
traits.

4. Add ycbcr info to the StreamVideoDrawQuad and update required mojom
and struct traits.

Bug: 900963
Change-Id: Ie4537604efe446492377d3615ed7c3cfde8c2130
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1582774
Commit-Queue: vikas soni <vikassoni@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarFrank Liberato <liberato@chromium.org>
Reviewed-by: default avatarEric Karl <ericrk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664802}
parent ea8bab4e
...@@ -250,6 +250,7 @@ viz_component("common") { ...@@ -250,6 +250,7 @@ viz_component("common") {
"//gpu/command_buffer/client:gles2_interface", "//gpu/command_buffer/client:gles2_interface",
"//gpu/command_buffer/client:raster", "//gpu/command_buffer/client:raster",
"//gpu/command_buffer/client:raster_interface", "//gpu/command_buffer/client:raster_interface",
"//gpu/ipc/common:common",
"//gpu/vulkan:buildflags", "//gpu/vulkan:buildflags",
"//mojo/public/cpp/base", "//mojo/public/cpp/base",
"//mojo/public/cpp/system", "//mojo/public/cpp/system",
......
...@@ -10,6 +10,7 @@ include_rules = [ ...@@ -10,6 +10,7 @@ include_rules = [
"+third_party/skia", "+third_party/skia",
"+ui/gl/dc_renderer_layer_params.h", "+ui/gl/dc_renderer_layer_params.h",
"+ui/latency", "+ui/latency",
"+gpu/ipc/common/vulkan_ycbcr_info.h",
] ]
specific_include_rules = { specific_include_rules = {
......
...@@ -12,15 +12,20 @@ ...@@ -12,15 +12,20 @@
namespace viz { namespace viz {
StreamVideoDrawQuad::StreamVideoDrawQuad() = default; StreamVideoDrawQuad::StreamVideoDrawQuad() = default;
StreamVideoDrawQuad::~StreamVideoDrawQuad() = default;
StreamVideoDrawQuad::StreamVideoDrawQuad(const StreamVideoDrawQuad& quad) =
default;
void StreamVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state, void StreamVideoDrawQuad::SetNew(
const gfx::Rect& rect, const SharedQuadState* shared_quad_state,
const gfx::Rect& visible_rect, const gfx::Rect& rect,
bool needs_blending, const gfx::Rect& visible_rect,
unsigned resource_id, bool needs_blending,
gfx::Size resource_size_in_pixels, unsigned resource_id,
const gfx::PointF& uv_top_left, gfx::Size resource_size_in_pixels,
const gfx::PointF& uv_bottom_right) { const gfx::PointF& uv_top_left,
const gfx::PointF& uv_bottom_right,
const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info) {
DrawQuad::SetAll(shared_quad_state, DrawQuad::Material::kStreamVideoContent, DrawQuad::SetAll(shared_quad_state, DrawQuad::Material::kStreamVideoContent,
rect, visible_rect, needs_blending); rect, visible_rect, needs_blending);
resources.ids[kResourceIdIndex] = resource_id; resources.ids[kResourceIdIndex] = resource_id;
...@@ -28,6 +33,7 @@ void StreamVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state, ...@@ -28,6 +33,7 @@ void StreamVideoDrawQuad::SetNew(const SharedQuadState* shared_quad_state,
resources.count = 1; resources.count = 1;
this->uv_top_left = uv_top_left; this->uv_top_left = uv_top_left;
this->uv_bottom_right = uv_bottom_right; this->uv_bottom_right = uv_bottom_right;
this->ycbcr_info = ycbcr_info;
} }
void StreamVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state, void StreamVideoDrawQuad::SetAll(const SharedQuadState* shared_quad_state,
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "components/viz/common/quads/draw_quad.h" #include "components/viz/common/quads/draw_quad.h"
#include "components/viz/common/viz_common_export.h" #include "components/viz/common/viz_common_export.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/point_f.h"
namespace viz { namespace viz {
...@@ -20,15 +21,19 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad { ...@@ -20,15 +21,19 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad {
static const size_t kResourceIdIndex = 0; static const size_t kResourceIdIndex = 0;
StreamVideoDrawQuad(); StreamVideoDrawQuad();
~StreamVideoDrawQuad() override;
void SetNew(const SharedQuadState* shared_quad_state, StreamVideoDrawQuad(const StreamVideoDrawQuad& quad);
const gfx::Rect& rect,
const gfx::Rect& visible_rect, void SetNew(
bool needs_blending, const SharedQuadState* shared_quad_state,
unsigned resource_id, const gfx::Rect& rect,
gfx::Size resource_size_in_pixels, const gfx::Rect& visible_rect,
const gfx::PointF& uv_top_left, bool needs_blending,
const gfx::PointF& uv_bottom_right); unsigned resource_id,
gfx::Size resource_size_in_pixels,
const gfx::PointF& uv_top_left,
const gfx::PointF& uv_bottom_right,
const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info = base::nullopt);
void SetAll(const SharedQuadState* shared_quad_state, void SetAll(const SharedQuadState* shared_quad_state,
const gfx::Rect& rect, const gfx::Rect& rect,
...@@ -48,6 +53,9 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad { ...@@ -48,6 +53,9 @@ class VIZ_COMMON_EXPORT StreamVideoDrawQuad : public DrawQuad {
}; };
OverlayResources overlay_resources; OverlayResources overlay_resources;
// Sampler conversion information which is used in vulkan context for android.
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
static const StreamVideoDrawQuad* MaterialCast(const DrawQuad*); static const StreamVideoDrawQuad* MaterialCast(const DrawQuad*);
ResourceId resource_id() const { return resources.ids[kResourceIdIndex]; } ResourceId resource_id() const { return resources.ids[kResourceIdIndex]; }
......
...@@ -198,6 +198,7 @@ viz_component("service") { ...@@ -198,6 +198,7 @@ viz_component("service") {
# Note that dependency on //gpu/ipc/client is for GpuMemoryBufferImpl. This # Note that dependency on //gpu/ipc/client is for GpuMemoryBufferImpl. This
# dependency should not be in public_deps. # dependency should not be in public_deps.
"//gpu/ipc/client", "//gpu/ipc/client",
"//gpu/ipc/common:common",
"//gpu/ipc/common:surface_handle_type", "//gpu/ipc/common:surface_handle_type",
"//gpu/ipc/service", "//gpu/ipc/service",
"//gpu/skia_bindings:skia_bindings", "//gpu/skia_bindings:skia_bindings",
......
...@@ -22,6 +22,7 @@ include_rules = [ ...@@ -22,6 +22,7 @@ include_rules = [
"+ui/gl/ca_renderer_layer_params.h", "+ui/gl/ca_renderer_layer_params.h",
"+ui/gl/dc_renderer_layer_params.h", "+ui/gl/dc_renderer_layer_params.h",
"+ui/gl/trace_util.h", "+ui/gl/trace_util.h",
"+gpu/ipc/common/vulkan_ycbcr_info.h",
] ]
specific_include_rules = { specific_include_rules = {
......
...@@ -5,11 +5,13 @@ ...@@ -5,11 +5,13 @@
#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_RESOURCE_METADATA_H_ #ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_RESOURCE_METADATA_H_
#define COMPONENTS_VIZ_SERVICE_DISPLAY_RESOURCE_METADATA_H_ #define COMPONENTS_VIZ_SERVICE_DISPLAY_RESOURCE_METADATA_H_
#include "base/optional.h"
#include "components/viz/common/resources/resource_format.h" #include "components/viz/common/resources/resource_format.h"
#include "components/viz/common/resources/resource_id.h" #include "components/viz/common/resources/resource_id.h"
#include "components/viz/service/viz_service_export.h" #include "components/viz/service/viz_service_export.h"
#include "gpu/command_buffer/common/mailbox_holder.h" #include "gpu/command_buffer/common/mailbox_holder.h"
#include "gpu/command_buffer/common/sync_token.h" #include "gpu/command_buffer/common/sync_token.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "third_party/skia/include/gpu/GrTypes.h" #include "third_party/skia/include/gpu/GrTypes.h"
#include "ui/gfx/color_space.h" #include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
...@@ -44,6 +46,10 @@ struct VIZ_SERVICE_EXPORT ResourceMetadata { ...@@ -44,6 +46,10 @@ struct VIZ_SERVICE_EXPORT ResourceMetadata {
// If the SkImage should use top-left or bottom-left for (0,0) uv // If the SkImage should use top-left or bottom-left for (0,0) uv
GrSurfaceOrigin origin; GrSurfaceOrigin origin;
// Sampler conversion information which is used in vulkan context for android
// video.
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
}; };
} // namespace viz } // namespace viz
......
...@@ -451,6 +451,11 @@ class SkiaRenderer::ScopedSkImageBuilder { ...@@ -451,6 +451,11 @@ class SkiaRenderer::ScopedSkImageBuilder {
ResourceId resource_id, ResourceId resource_id,
SkAlphaType alpha_type = kPremul_SkAlphaType, SkAlphaType alpha_type = kPremul_SkAlphaType,
GrSurfaceOrigin origin = kTopLeft_GrSurfaceOrigin); GrSurfaceOrigin origin = kTopLeft_GrSurfaceOrigin);
ScopedSkImageBuilder(SkiaRenderer* skia_renderer,
ResourceId resource_id,
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info,
SkAlphaType alpha_type = kPremul_SkAlphaType,
GrSurfaceOrigin origin = kTopLeft_GrSurfaceOrigin);
~ScopedSkImageBuilder() = default; ~ScopedSkImageBuilder() = default;
const SkImage* sk_image() const { return sk_image_; } const SkImage* sk_image() const { return sk_image_; }
...@@ -466,6 +471,18 @@ SkiaRenderer::ScopedSkImageBuilder::ScopedSkImageBuilder( ...@@ -466,6 +471,18 @@ SkiaRenderer::ScopedSkImageBuilder::ScopedSkImageBuilder(
SkiaRenderer* skia_renderer, SkiaRenderer* skia_renderer,
ResourceId resource_id, ResourceId resource_id,
SkAlphaType alpha_type, SkAlphaType alpha_type,
GrSurfaceOrigin origin)
: SkiaRenderer::ScopedSkImageBuilder(skia_renderer,
resource_id,
base::nullopt,
alpha_type,
origin) {}
SkiaRenderer::ScopedSkImageBuilder::ScopedSkImageBuilder(
SkiaRenderer* skia_renderer,
ResourceId resource_id,
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info,
SkAlphaType alpha_type,
GrSurfaceOrigin origin) { GrSurfaceOrigin origin) {
if (!resource_id) if (!resource_id)
return; return;
...@@ -486,6 +503,7 @@ SkiaRenderer::ScopedSkImageBuilder::ScopedSkImageBuilder( ...@@ -486,6 +503,7 @@ SkiaRenderer::ScopedSkImageBuilder::ScopedSkImageBuilder(
skia_renderer->lock_set_for_external_use_->LockResource(resource_id); skia_renderer->lock_set_for_external_use_->LockResource(resource_id);
metadata.alpha_type = alpha_type; metadata.alpha_type = alpha_type;
metadata.origin = origin; metadata.origin = origin;
metadata.ycbcr_info = ycbcr_info;
image = skia_renderer->skia_output_surface_->MakePromiseSkImage(metadata); image = skia_renderer->skia_output_surface_->MakePromiseSkImage(metadata);
LOG_IF(ERROR, !image) << "Failed to create the promise sk image."; LOG_IF(ERROR, !image) << "Failed to create the promise sk image.";
} }
...@@ -1267,7 +1285,8 @@ void SkiaRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad, ...@@ -1267,7 +1285,8 @@ void SkiaRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad,
void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad, void SkiaRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
DrawQuadParams* params) { DrawQuadParams* params) {
DCHECK(!MustFlushBatchedQuads(quad, *params)); DCHECK(!MustFlushBatchedQuads(quad, *params));
ScopedSkImageBuilder builder(this, quad->resource_id(),
ScopedSkImageBuilder builder(this, quad->resource_id(), quad->ycbcr_info,
kUnpremul_SkAlphaType); kUnpremul_SkAlphaType);
const SkImage* image = builder.sk_image(); const SkImage* image = builder.sk_image();
if (!image) if (!image)
......
...@@ -224,8 +224,10 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImage( ...@@ -224,8 +224,10 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImage(
image_context = std::make_unique<ImageContext>(metadata); image_context = std::make_unique<ImageContext>(metadata);
SkColorType color_type = ResourceFormatToClosestSkColorType( SkColorType color_type = ResourceFormatToClosestSkColorType(
true /* gpu_compositing */, metadata.resource_format); true /* gpu_compositing */, metadata.resource_format);
GrBackendFormat backend_format = GetGrBackendFormatForTexture( GrBackendFormat backend_format = GetGrBackendFormatForTexture(
metadata.resource_format, metadata.mailbox_holder.texture_target); metadata.resource_format, metadata.mailbox_holder.texture_target,
metadata.ycbcr_info);
image_context->image = recorder_->makePromiseTexture( image_context->image = recorder_->makePromiseTexture(
backend_format, metadata.size.width(), metadata.size.height(), backend_format, metadata.size.width(), metadata.size.height(),
GrMipMapped::kNo, metadata.origin, color_type, metadata.alpha_type, GrMipMapped::kNo, metadata.origin, color_type, metadata.alpha_type,
...@@ -594,8 +596,10 @@ void SkiaOutputSurfaceImpl::ScheduleGpuTask( ...@@ -594,8 +596,10 @@ void SkiaOutputSurfaceImpl::ScheduleGpuTask(
GrBackendFormat SkiaOutputSurfaceImpl::GetGrBackendFormatForTexture( GrBackendFormat SkiaOutputSurfaceImpl::GetGrBackendFormatForTexture(
ResourceFormat resource_format, ResourceFormat resource_format,
uint32_t gl_texture_target) { uint32_t gl_texture_target,
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info) {
if (!is_using_vulkan_) { if (!is_using_vulkan_) {
DCHECK(!ycbcr_info);
// Convert internal format from GLES2 to platform GL. // Convert internal format from GLES2 to platform GL.
const auto* version_info = impl_on_gpu_->gl_version_info(); const auto* version_info = impl_on_gpu_->gl_version_info();
unsigned int texture_storage_format = TextureStorageFormat(resource_format); unsigned int texture_storage_format = TextureStorageFormat(resource_format);
...@@ -607,7 +611,20 @@ GrBackendFormat SkiaOutputSurfaceImpl::GetGrBackendFormatForTexture( ...@@ -607,7 +611,20 @@ GrBackendFormat SkiaOutputSurfaceImpl::GetGrBackendFormatForTexture(
gl_texture_target); gl_texture_target);
} else { } else {
#if BUILDFLAG(ENABLE_VULKAN) #if BUILDFLAG(ENABLE_VULKAN)
return GrBackendFormat::MakeVk(ToVkFormat(resource_format)); if (!ycbcr_info)
return GrBackendFormat::MakeVk(ToVkFormat(resource_format));
GrVkYcbcrConversionInfo fYcbcrConversionInfo(
static_cast<VkSamplerYcbcrModelConversion>(
ycbcr_info->suggested_ycbcr_model),
static_cast<VkSamplerYcbcrRange>(ycbcr_info->suggested_ycbcr_range),
static_cast<VkChromaLocation>(ycbcr_info->suggested_xchroma_offset),
static_cast<VkChromaLocation>(ycbcr_info->suggested_ychroma_offset),
VK_FILTER_LINEAR, // VkFilter
0, // VkBool32 forceExplicitReconstruction,
ycbcr_info->external_format,
static_cast<VkFormatFeatureFlags>(ycbcr_info->format_features));
return GrBackendFormat::MakeVk(fYcbcrConversionInfo);
#else #else
NOTREACHED(); NOTREACHED();
return GrBackendFormat(); return GrBackendFormat();
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "components/viz/service/viz_service_export.h" #include "components/viz/service/viz_service_export.h"
#include "gpu/command_buffer/common/sync_token.h" #include "gpu/command_buffer/common/sync_token.h"
#include "gpu/ipc/common/surface_handle.h" #include "gpu/ipc/common/surface_handle.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "gpu/ipc/in_process_command_buffer.h" #include "gpu/ipc/in_process_command_buffer.h"
#include "third_party/skia/include/core/SkDeferredDisplayListRecorder.h" #include "third_party/skia/include/core/SkDeferredDisplayListRecorder.h"
#include "third_party/skia/include/core/SkOverdrawCanvas.h" #include "third_party/skia/include/core/SkOverdrawCanvas.h"
...@@ -107,8 +108,10 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurfaceBase { ...@@ -107,8 +108,10 @@ class VIZ_SERVICE_EXPORT SkiaOutputSurfaceImpl : public SkiaOutputSurfaceBase {
void BufferPresented(const gfx::PresentationFeedback& feedback); void BufferPresented(const gfx::PresentationFeedback& feedback);
void ScheduleGpuTask(base::OnceClosure callback, void ScheduleGpuTask(base::OnceClosure callback,
std::vector<gpu::SyncToken> sync_tokens); std::vector<gpu::SyncToken> sync_tokens);
GrBackendFormat GetGrBackendFormatForTexture(ResourceFormat resource_format, GrBackendFormat GetGrBackendFormatForTexture(
uint32_t gl_texture_target); ResourceFormat resource_format,
uint32_t gl_texture_target,
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info = base::nullopt);
uint64_t sync_fence_release_ = 0; uint64_t sync_fence_release_ = 0;
GpuServiceImpl* const gpu_service_; GpuServiceImpl* const gpu_service_;
......
...@@ -311,6 +311,7 @@ jumbo_source_set("base") { ...@@ -311,6 +311,7 @@ jumbo_source_set("base") {
deps = [ deps = [
"//base/allocator:buildflags", "//base/allocator:buildflags",
"//gpu/command_buffer/common", "//gpu/command_buffer/common",
"//gpu/ipc/common:common",
"//skia", "//skia",
"//third_party/libyuv", "//third_party/libyuv",
"//third_party/widevine/cdm:headers", "//third_party/widevine/cdm:headers",
...@@ -319,6 +320,7 @@ jumbo_source_set("base") { ...@@ -319,6 +320,7 @@ jumbo_source_set("base") {
"//ui/events:events_base", "//ui/events:events_base",
"//url:url", "//url:url",
] ]
libs = [] libs = []
configs += [ configs += [
"//build/config:precompiled_headers", "//build/config:precompiled_headers",
......
...@@ -22,11 +22,13 @@ ...@@ -22,11 +22,13 @@
#include "base/memory/shared_memory.h" #include "base/memory/shared_memory.h"
#include "base/memory/shared_memory_handle.h" #include "base/memory/shared_memory_handle.h"
#include "base/memory/unsafe_shared_memory_region.h" #include "base/memory/unsafe_shared_memory_region.h"
#include "base/optional.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/thread_annotations.h" #include "base/thread_annotations.h"
#include "base/unguessable_token.h" #include "base/unguessable_token.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "gpu/command_buffer/common/mailbox_holder.h" #include "gpu/command_buffer/common/mailbox_holder.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "media/base/video_frame_layout.h" #include "media/base/video_frame_layout.h"
#include "media/base/video_frame_metadata.h" #include "media/base/video_frame_metadata.h"
#include "media/base/video_types.h" #include "media/base/video_types.h"
...@@ -434,6 +436,10 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { ...@@ -434,6 +436,10 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
return data_[plane]; return data_[plane];
} }
const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info() const {
return ycbcr_info_;
}
// Returns pointer to the data in the visible region of the frame, for // Returns pointer to the data in the visible region of the frame, for
// IsMappable() storage types. The returned pointer is offsetted into the // IsMappable() storage types. The returned pointer is offsetted into the
// plane buffer specified by visible_rect().origin(). Memory is owned by // plane buffer specified by visible_rect().origin(). Memory is owned by
...@@ -537,6 +543,11 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { ...@@ -537,6 +543,11 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
// Returns the number of bits per channel. // Returns the number of bits per channel.
size_t BitDepth() const; size_t BitDepth() const;
// Provide the sampler conversion information for the frame.
void set_ycbcr_info(const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info) {
ycbcr_info_ = ycbcr_info;
}
protected: protected:
friend class base::RefCountedThreadSafe<VideoFrame>; friend class base::RefCountedThreadSafe<VideoFrame>;
...@@ -678,6 +689,9 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> { ...@@ -678,6 +689,9 @@ class MEDIA_EXPORT VideoFrame : public base::RefCountedThreadSafe<VideoFrame> {
gfx::ColorSpace color_space_; gfx::ColorSpace color_space_;
// Sampler conversion information which is used in vulkan context for android.
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info_;
DISALLOW_IMPLICIT_CONSTRUCTORS(VideoFrame); DISALLOW_IMPLICIT_CONSTRUCTORS(VideoFrame);
}; };
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
import("//build/buildflag_header.gni") import("//build/buildflag_header.gni")
import("//build/config/features.gni") import("//build/config/features.gni")
import("//build/config/ui.gni") import("//build/config/ui.gni")
import("//gpu/vulkan/features.gni")
import("//media/gpu/args.gni") import("//media/gpu/args.gni")
import("//media/media_options.gni") import("//media/media_options.gni")
import("//testing/test.gni") import("//testing/test.gni")
...@@ -148,6 +149,9 @@ component("gpu") { ...@@ -148,6 +149,9 @@ component("gpu") {
"//services/service_manager/public/cpp:cpp", "//services/service_manager/public/cpp:cpp",
"//ui/gl:gl_jni_headers", "//ui/gl:gl_jni_headers",
] ]
if (enable_vulkan) {
deps += [ "//gpu/vulkan:vulkan" ]
}
# TODO(crbug.com/789435): This is needed for AVDA to access the CDM # TODO(crbug.com/789435): This is needed for AVDA to access the CDM
# directly. Remove this dependency after VDAs are also running as part of # directly. Remove this dependency after VDAs are also running as part of
......
...@@ -13,6 +13,7 @@ include_rules = [ ...@@ -13,6 +13,7 @@ include_rules = [
"+ui/display/manager", "+ui/display/manager",
"+ui/display/types", "+ui/display/types",
"+ui/platform_window", "+ui/platform_window",
"+components/viz/common/gpu/vulkan_context_provider.h",
# media/gpu is not part of "media" target and should not use MEDIA_EXPORT. # media/gpu is not part of "media" target and should not use MEDIA_EXPORT.
"-media/base/media_export.h", "-media/base/media_export.h",
......
...@@ -69,8 +69,10 @@ class ImageReaderGLOwner::ScopedHardwareBufferImpl ...@@ -69,8 +69,10 @@ class ImageReaderGLOwner::ScopedHardwareBufferImpl
} }
void SetReadFence(base::ScopedFD fence_fd, bool has_context) final { void SetReadFence(base::ScopedFD fence_fd, bool has_context) final {
DCHECK(!read_fence_.is_valid()); // Client can call this method multiple times for a hardware buffer. Hence
read_fence_ = std::move(fence_fd); // all the client provided sync_fd should be merged. Eg: BeginReadAccess()
// can be called multiple times for a SharedImageVideo representation.
read_fence_ = gl::MergeFDs(std::move(read_fence_), std::move(fence_fd));
} }
private: private:
......
This diff is collapsed.
...@@ -8,8 +8,10 @@ ...@@ -8,8 +8,10 @@
#include <memory> #include <memory>
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "base/optional.h"
#include "gpu/command_buffer/service/shared_context_state.h" #include "gpu/command_buffer/service/shared_context_state.h"
#include "gpu/command_buffer/service/shared_image_backing.h" #include "gpu/command_buffer/service/shared_image_backing.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "media/gpu/media_gpu_export.h" #include "media/gpu/media_gpu_export.h"
namespace gpu { namespace gpu {
...@@ -53,6 +55,10 @@ class MEDIA_GPU_EXPORT SharedImageVideo ...@@ -53,6 +55,10 @@ class MEDIA_GPU_EXPORT SharedImageVideo
// SharedContextState::ContextLostObserver implementation. // SharedContextState::ContextLostObserver implementation.
void OnContextLost() override; void OnContextLost() override;
// Returns ycbcr information. This is only valid in vulkan context and
// nullopt for other context.
base::Optional<gpu::VulkanYCbCrInfo> GetYcbcrInfo();
protected: protected:
std::unique_ptr<gpu::SharedImageRepresentationGLTexture> ProduceGLTexture( std::unique_ptr<gpu::SharedImageRepresentationGLTexture> ProduceGLTexture(
gpu::SharedImageManager* manager, gpu::SharedImageManager* manager,
...@@ -69,12 +75,13 @@ class MEDIA_GPU_EXPORT SharedImageVideo ...@@ -69,12 +75,13 @@ class MEDIA_GPU_EXPORT SharedImageVideo
private: private:
friend class SharedImageRepresentationGLTextureVideo; friend class SharedImageRepresentationGLTextureVideo;
friend class SharedImageRepresentationVideoSkiaGL; friend class SharedImageRepresentationVideoSkiaGL;
friend class SharedImageRepresentationVideoSkiaVk;
scoped_refptr<CodecImage> codec_image_; scoped_refptr<CodecImage> codec_image_;
// |abstract_texture_| is only used for legacy mailbox. // |abstract_texture_| is only used for legacy mailbox.
std::unique_ptr<gpu::gles2::AbstractTexture> abstract_texture_; std::unique_ptr<gpu::gles2::AbstractTexture> abstract_texture_;
scoped_refptr<gpu::SharedContextState> shared_context_state_; scoped_refptr<gpu::SharedContextState> context_state_;
DISALLOW_COPY_AND_ASSIGN(SharedImageVideo); DISALLOW_COPY_AND_ASSIGN(SharedImageVideo);
}; };
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/callback.h" #include "base/callback.h"
#include "gpu/command_buffer/service/mailbox_manager.h" #include "gpu/command_buffer/service/mailbox_manager.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "media/gpu/android/codec_image_group.h" #include "media/gpu/android/codec_image_group.h"
#include "media/gpu/android/promotion_hint_aggregator.h" #include "media/gpu/android/promotion_hint_aggregator.h"
#include "media/gpu/media_gpu_export.h" #include "media/gpu/media_gpu_export.h"
...@@ -50,6 +51,9 @@ class MEDIA_GPU_EXPORT SharedImageVideoProvider { ...@@ -50,6 +51,9 @@ class MEDIA_GPU_EXPORT SharedImageVideoProvider {
// Mailbox to which this shared image is bound. // Mailbox to which this shared image is bound.
gpu::Mailbox mailbox; gpu::Mailbox mailbox;
// Sampler conversion information which is used in vulkan context.
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
// Release callback. When this is called (or dropped), the image will be // Release callback. When this is called (or dropped), the image will be
// considered unused. // considered unused.
ReleaseCB release_cb; ReleaseCB release_cb;
......
...@@ -284,6 +284,7 @@ void VideoFrameFactoryImpl::OnImageReady( ...@@ -284,6 +284,7 @@ void VideoFrameFactoryImpl::OnImageReady(
pixel_format, mailbox_holders, VideoFrame::ReleaseMailboxCB(), coded_size, pixel_format, mailbox_holders, VideoFrame::ReleaseMailboxCB(), coded_size,
visible_rect, natural_size, timestamp); visible_rect, natural_size, timestamp);
frame->set_ycbcr_info(record.ycbcr_info);
// If, for some reason, we failed to create a frame, then fail. Note that we // If, for some reason, we failed to create a frame, then fail. Note that we
// don't need to call |release_cb|; dropping it is okay since the api says so. // don't need to call |release_cb|; dropping it is okay since the api says so.
if (!frame) { if (!frame) {
...@@ -432,6 +433,7 @@ void GpuSharedImageVideoFactory::CreateImage( ...@@ -432,6 +433,7 @@ void GpuSharedImageVideoFactory::CreateImage(
SharedImageVideoProvider::ImageRecord record; SharedImageVideoProvider::ImageRecord record;
record.mailbox = mailbox; record.mailbox = mailbox;
record.release_cb = std::move(release_cb); record.release_cb = std::move(release_cb);
record.ycbcr_info = ycbcr_info_;
std::move(image_ready_cb).Run(std::move(record), std::move(codec_image)); std::move(image_ready_cb).Run(std::move(record), std::move(codec_image));
} }
...@@ -499,7 +501,10 @@ bool GpuSharedImageVideoFactory::CreateImageInternal( ...@@ -499,7 +501,10 @@ bool GpuSharedImageVideoFactory::CreateImageInternal(
std::move(texture), std::move(shared_context), std::move(texture), std::move(shared_context),
false /* is_thread_safe */); false /* is_thread_safe */);
// Register it with shared image mailbox as well as legacy mailbox. This if (!ycbcr_info_)
ycbcr_info_ = shared_image->GetYcbcrInfo();
// Register it with shared image mailbox as well as legacy mailbox. This
// keeps |shared_image| around until its destruction cb is called. // keeps |shared_image| around until its destruction cb is called.
// NOTE: Currently none of the video mailbox consumer uses shared image // NOTE: Currently none of the video mailbox consumer uses shared image
// mailbox. // mailbox.
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "gpu/command_buffer/service/gles2_cmd_decoder.h" #include "gpu/command_buffer/service/gles2_cmd_decoder.h"
#include "gpu/command_buffer/service/shared_image_representation.h" #include "gpu/command_buffer/service/shared_image_representation.h"
#include "gpu/command_buffer/service/texture_manager.h" #include "gpu/command_buffer/service/texture_manager.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "gpu/ipc/service/command_buffer_stub.h" #include "gpu/ipc/service/command_buffer_stub.h"
#include "media/base/video_frame.h" #include "media/base/video_frame.h"
#include "media/gpu/android/codec_image.h" #include "media/gpu/android/codec_image.h"
...@@ -36,7 +37,7 @@ class MEDIA_GPU_EXPORT VideoFrameFactoryImpl : public VideoFrameFactory { ...@@ -36,7 +37,7 @@ class MEDIA_GPU_EXPORT VideoFrameFactoryImpl : public VideoFrameFactory {
public: public:
// Callback used to return a mailbox and release callback for an image. The // Callback used to return a mailbox and release callback for an image. The
// release callback may be dropped without being run, and the image will be // release callback may be dropped without being run, and the image will be
// cleaned up properly. The releae callback may be called from any thread. // cleaned up properly. The release callback may be called from any thread.
using ImageReadyCB = using ImageReadyCB =
base::OnceCallback<void(gpu::Mailbox mailbox, base::OnceCallback<void(gpu::Mailbox mailbox,
VideoFrame::ReleaseMailboxCB release_cb)>; VideoFrame::ReleaseMailboxCB release_cb)>;
...@@ -164,6 +165,10 @@ class GpuSharedImageVideoFactory ...@@ -164,6 +165,10 @@ class GpuSharedImageVideoFactory
// replace this when SetImageGroup() is called. // replace this when SetImageGroup() is called.
scoped_refptr<CodecImageGroup> image_group_; scoped_refptr<CodecImageGroup> image_group_;
// Sampler conversion information which is used in vulkan context. This is
// constant for all the frames in a video and hence we cache it.
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info_;
THREAD_CHECKER(thread_checker_); THREAD_CHECKER(thread_checker_);
base::WeakPtrFactory<GpuSharedImageVideoFactory> weak_factory_; base::WeakPtrFactory<GpuSharedImageVideoFactory> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(GpuSharedImageVideoFactory); DISALLOW_COPY_AND_ASSIGN(GpuSharedImageVideoFactory);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
module media.mojom; module media.mojom;
import "gpu/ipc/common/mailbox_holder.mojom"; import "gpu/ipc/common/mailbox_holder.mojom";
import "gpu/ipc/common/vulkan_ycbcr_info.mojom";
import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/values.mojom"; import "mojo/public/mojom/base/values.mojom";
import "ui/gfx/geometry/mojo/geometry.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom";
...@@ -298,6 +299,7 @@ struct SharedBufferVideoFrameData { ...@@ -298,6 +299,7 @@ struct SharedBufferVideoFrameData {
struct MailboxVideoFrameData { struct MailboxVideoFrameData {
// Size must be kept in sync with media::VideoFrame::kMaxPlanes. // Size must be kept in sync with media::VideoFrame::kMaxPlanes.
array<gpu.mojom.MailboxHolder, 4> mailbox_holder; array<gpu.mojom.MailboxHolder, 4> mailbox_holder;
gpu.mojom.VulkanYCbCrInfo? ycbcr_data;
}; };
struct PipelineStatistics { struct PipelineStatistics {
......
...@@ -53,7 +53,8 @@ media::mojom::VideoFrameDataPtr MakeVideoFrameData( ...@@ -53,7 +53,8 @@ media::mojom::VideoFrameDataPtr MakeVideoFrameData(
for (size_t i = 0; i < num_planes; i++) for (size_t i = 0; i < num_planes; i++)
mailbox_holder[i] = input->mailbox_holder(i); mailbox_holder[i] = input->mailbox_holder(i);
return media::mojom::VideoFrameData::NewMailboxData( return media::mojom::VideoFrameData::NewMailboxData(
media::mojom::MailboxVideoFrameData::New(std::move(mailbox_holder))); media::mojom::MailboxVideoFrameData::New(
std::move(mailbox_holder), std::move(input->ycbcr_info())));
} }
NOTREACHED() << "Unsupported VideoFrame conversion"; NOTREACHED() << "Unsupported VideoFrame conversion";
...@@ -133,9 +134,14 @@ bool StructTraits<media::mojom::VideoFrameDataView, ...@@ -133,9 +134,14 @@ bool StructTraits<media::mojom::VideoFrameDataView,
for (size_t i = 0; i < media::VideoFrame::kMaxPlanes; i++) for (size_t i = 0; i < media::VideoFrame::kMaxPlanes; i++)
mailbox_holder_array[i] = mailbox_holder[i]; mailbox_holder_array[i] = mailbox_holder[i];
base::Optional<gpu::VulkanYCbCrInfo> ycbcr_info;
if (!mailbox_data.ReadYcbcrData(&ycbcr_info))
return false;
frame = media::VideoFrame::WrapNativeTextures( frame = media::VideoFrame::WrapNativeTextures(
format, mailbox_holder_array, media::VideoFrame::ReleaseMailboxCB(), format, mailbox_holder_array, media::VideoFrame::ReleaseMailboxCB(),
coded_size, visible_rect, natural_size, timestamp); coded_size, visible_rect, natural_size, timestamp);
frame->set_ycbcr_info(ycbcr_info);
} else { } else {
// TODO(sandersd): Switch on the union tag to avoid this ugliness? // TODO(sandersd): Switch on the union tag to avoid this ugliness?
NOTREACHED(); NOTREACHED();
......
...@@ -6,8 +6,10 @@ ...@@ -6,8 +6,10 @@
#define MEDIA_MOJO_INTERFACES_VIDEO_FRAME_STRUCT_TRAITS_H_ #define MEDIA_MOJO_INTERFACES_VIDEO_FRAME_STRUCT_TRAITS_H_
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/optional.h"
#include "base/values.h" #include "base/values.h"
#include "gpu/ipc/common/mailbox_holder_struct_traits.h" #include "gpu/ipc/common/mailbox_holder_struct_traits.h"
#include "gpu/ipc/common/vulkan_ycbcr_info_mojom_traits.h"
#include "media/base/ipc/media_param_traits_macros.h" #include "media/base/ipc/media_param_traits_macros.h"
#include "media/base/video_frame.h" #include "media/base/video_frame.h"
#include "media/mojo/interfaces/media_types.mojom.h" #include "media/mojo/interfaces/media_types.mojom.h"
...@@ -60,6 +62,11 @@ struct StructTraits<media::mojom::VideoFrameDataView, ...@@ -60,6 +62,11 @@ struct StructTraits<media::mojom::VideoFrameDataView,
return input->ColorSpace(); return input->ColorSpace();
} }
static const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info(
const scoped_refptr<media::VideoFrame>& input) {
return input->ycbcr_info();
}
static media::mojom::VideoFrameDataPtr data( static media::mojom::VideoFrameDataPtr data(
const scoped_refptr<media::VideoFrame>& input); const scoped_refptr<media::VideoFrame>& input);
......
...@@ -639,7 +639,7 @@ void VideoResourceUpdater::AppendQuads(viz::RenderPass* render_pass, ...@@ -639,7 +639,7 @@ void VideoResourceUpdater::AppendQuads(viz::RenderPass* render_pass,
stream_video_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect, stream_video_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
needs_blending, frame_resources_[0].id, needs_blending, frame_resources_[0].id,
frame_resources_[0].size_in_pixels, uv_top_left, frame_resources_[0].size_in_pixels, uv_top_left,
uv_bottom_right); uv_bottom_right, frame->ycbcr_info());
for (viz::ResourceId resource_id : stream_video_quad->resources) { for (viz::ResourceId resource_id : stream_video_quad->resources) {
resource_provider_->ValidateResource(resource_id); resource_provider_->ValidateResource(resource_id);
} }
......
...@@ -6,4 +6,5 @@ include_rules = [ ...@@ -6,4 +6,5 @@ include_rules = [
"+third_party/skia/include", "+third_party/skia/include",
"+ui/gfx", "+ui/gfx",
"+ui/latency/mojo", "+ui/latency/mojo",
"+gpu/ipc/common/vulkan_ycbcr_info.h"
] ]
...@@ -109,7 +109,8 @@ bool StructTraits<viz::mojom::StreamVideoQuadStateDataView, viz::DrawQuad>:: ...@@ -109,7 +109,8 @@ bool StructTraits<viz::mojom::StreamVideoQuadStateDataView, viz::DrawQuad>::
&quad->overlay_resources.size_in_pixels &quad->overlay_resources.size_in_pixels
[viz::StreamVideoDrawQuad::kResourceIdIndex]) && [viz::StreamVideoDrawQuad::kResourceIdIndex]) &&
data.ReadUvTopLeft(&quad->uv_top_left) && data.ReadUvTopLeft(&quad->uv_top_left) &&
data.ReadUvBottomRight(&quad->uv_bottom_right); data.ReadUvBottomRight(&quad->uv_bottom_right) &&
data.ReadYcbcrInfo(&quad->ycbcr_info);
} }
// static // static
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "components/viz/common/quads/tile_draw_quad.h" #include "components/viz/common/quads/tile_draw_quad.h"
#include "components/viz/common/quads/video_hole_draw_quad.h" #include "components/viz/common/quads/video_hole_draw_quad.h"
#include "components/viz/common/quads/yuv_video_draw_quad.h" #include "components/viz/common/quads/yuv_video_draw_quad.h"
#include "gpu/ipc/common/vulkan_ycbcr_info.h"
#include "gpu/ipc/common/vulkan_ycbcr_info_mojom_traits.h"
#include "services/viz/public/cpp/compositing/filter_operation_struct_traits.h" #include "services/viz/public/cpp/compositing/filter_operation_struct_traits.h"
#include "services/viz/public/cpp/compositing/filter_operations_struct_traits.h" #include "services/viz/public/cpp/compositing/filter_operations_struct_traits.h"
#include "services/viz/public/cpp/compositing/shared_quad_state_struct_traits.h" #include "services/viz/public/cpp/compositing/shared_quad_state_struct_traits.h"
...@@ -300,6 +302,13 @@ struct StructTraits<viz::mojom::StreamVideoQuadStateDataView, viz::DrawQuad> { ...@@ -300,6 +302,13 @@ struct StructTraits<viz::mojom::StreamVideoQuadStateDataView, viz::DrawQuad> {
return quad->uv_bottom_right; return quad->uv_bottom_right;
} }
static const base::Optional<gpu::VulkanYCbCrInfo>& ycbcr_info(
const viz::DrawQuad& input) {
const viz::StreamVideoDrawQuad* quad =
viz::StreamVideoDrawQuad::MaterialCast(&input);
return quad->ycbcr_info;
}
static bool Read(viz::mojom::StreamVideoQuadStateDataView data, static bool Read(viz::mojom::StreamVideoQuadStateDataView data,
viz::DrawQuad* out); viz::DrawQuad* out);
}; };
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
module viz.mojom; module viz.mojom;
import "gpu/ipc/common/vulkan_ycbcr_info.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/viz/public/interfaces/compositing/surface_range.mojom"; import "services/viz/public/interfaces/compositing/surface_range.mojom";
import "services/viz/public/interfaces/compositing/shared_quad_state.mojom"; import "services/viz/public/interfaces/compositing/shared_quad_state.mojom";
...@@ -61,6 +62,7 @@ struct StreamVideoQuadState { ...@@ -61,6 +62,7 @@ struct StreamVideoQuadState {
gfx.mojom.Size resource_size_in_pixels; gfx.mojom.Size resource_size_in_pixels;
gfx.mojom.PointF uv_top_left; gfx.mojom.PointF uv_top_left;
gfx.mojom.PointF uv_bottom_right; gfx.mojom.PointF uv_bottom_right;
gpu.mojom.VulkanYCbCrInfo? ycbcr_info;
}; };
struct SurfaceQuadState { struct SurfaceQuadState {
......
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