Commit 5cd222d7 authored by CJ DiMeglio's avatar CJ DiMeglio Committed by Commit Bot

Obtains ExternalResources for VideoFrameSubmitter.

The result of this CL should be that the frames submitted by the
VideoFrameSubmitter now have complete information and thus should show
up on the screen.

This CL accomplishes this mainly through a refactor of VideoLayerImpl
shared functions into VideoResourceUpdater, making them accessible to
VideoFrameSubmitter.

Bug: 746182
Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: I6cfe9d181e3cde4c13299c42df40ab73480a0587
Reviewed-on: https://chromium-review.googlesource.com/701917Reviewed-by: default avatarenne <enne@chromium.org>
Reviewed-by: default avatarFrank Liberato <liberato@chromium.org>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: CJ DiMeglio <lethalantidote@chromium.org>
Cr-Commit-Position: refs/heads/master@{#519952}
parent 70fed8a6
...@@ -106,37 +106,7 @@ bool VideoLayerImpl::WillDraw(DrawMode draw_mode, ...@@ -106,37 +106,7 @@ bool VideoLayerImpl::WillDraw(DrawMode draw_mode,
layer_tree_impl()->resource_provider(), layer_tree_impl()->resource_provider(),
layer_tree_impl()->settings().use_stream_video_draw_quad)); layer_tree_impl()->settings().use_stream_video_draw_quad));
} }
updater_->ObtainFrameResources(frame_);
VideoFrameExternalResources external_resources =
updater_->CreateExternalResourcesFromVideoFrame(frame_);
frame_resource_type_ = external_resources.type;
if (external_resources.type ==
VideoFrameExternalResources::SOFTWARE_RESOURCE) {
DCHECK_GT(external_resources.software_resource, viz::kInvalidResourceId);
software_resource_ = external_resources.software_resource;
software_release_callback_ =
std::move(external_resources.software_release_callback);
return true;
}
frame_resource_offset_ = external_resources.offset;
frame_resource_multiplier_ = external_resources.multiplier;
frame_bits_per_channel_ = external_resources.bits_per_channel;
DCHECK_EQ(external_resources.resources.size(),
external_resources.release_callbacks.size());
ResourceProvider::ResourceIdArray resource_ids;
resource_ids.reserve(external_resources.resources.size());
for (size_t i = 0; i < external_resources.resources.size(); ++i) {
unsigned resource_id = resource_provider->ImportResource(
external_resources.resources[i],
viz::SingleReleaseCallback::Create(
std::move(external_resources.release_callbacks[i])));
frame_resources_.push_back(
FrameResource(resource_id, external_resources.resources[i].size));
resource_ids.push_back(resource_id);
}
return true; return true;
} }
...@@ -165,153 +135,20 @@ void VideoLayerImpl::AppendQuads(viz::RenderPass* render_pass, ...@@ -165,153 +135,20 @@ void VideoLayerImpl::AppendQuads(viz::RenderPass* render_pass,
break; break;
} }
viz::SharedQuadState* shared_quad_state =
render_pass->CreateAndAppendSharedQuadState();
gfx::Rect rotated_size_rect(rotated_size);
shared_quad_state->SetAll(transform, rotated_size_rect, visible_layer_rect(),
clip_rect(), is_clipped(), contents_opaque(),
draw_opacity(), SkBlendMode::kSrcOver,
GetSortingContextId());
AppendDebugBorderQuad(render_pass, rotated_size_rect, shared_quad_state,
append_quads_data);
gfx::Rect quad_rect(rotated_size);
gfx::Rect visible_rect = frame_->visible_rect();
bool needs_blending = !contents_opaque();
gfx::Size coded_size = frame_->coded_size();
Occlusion occlusion_in_video_space = Occlusion occlusion_in_video_space =
draw_properties() draw_properties()
.occlusion_in_content_space.GetOcclusionWithGivenDrawTransform( .occlusion_in_content_space.GetOcclusionWithGivenDrawTransform(
transform); transform);
gfx::Rect visible_quad_rect = gfx::Rect visible_quad_rect =
occlusion_in_video_space.GetUnoccludedContentRect(quad_rect); occlusion_in_video_space.GetUnoccludedContentRect(
gfx::Rect(rotated_size));
if (visible_quad_rect.IsEmpty()) if (visible_quad_rect.IsEmpty())
return; return;
const float tex_width_scale = updater_->AppendQuads(render_pass, frame_, transform, rotated_size,
static_cast<float>(visible_rect.width()) / coded_size.width(); visible_layer_rect(), clip_rect(), is_clipped(),
const float tex_height_scale = contents_opaque(), draw_opacity(),
static_cast<float>(visible_rect.height()) / coded_size.height(); GetSortingContextId(), visible_quad_rect);
switch (frame_resource_type_) {
// TODO(danakj): Remove this, hide it in the hardware path.
case VideoFrameExternalResources::SOFTWARE_RESOURCE: {
DCHECK_EQ(frame_resources_.size(), 0u);
DCHECK_GT(software_resource_, viz::kInvalidResourceId);
bool premultiplied_alpha = true;
gfx::PointF uv_top_left(0.f, 0.f);
gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale);
float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
bool flipped = false;
bool nearest_neighbor = false;
auto* texture_quad =
render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>();
texture_quad->SetNew(
shared_quad_state, quad_rect, visible_quad_rect, needs_blending,
software_resource_, premultiplied_alpha, uv_top_left, uv_bottom_right,
SK_ColorTRANSPARENT, opacity, flipped, nearest_neighbor, false);
ValidateQuadResources(texture_quad);
break;
}
case VideoFrameExternalResources::YUV_RESOURCE: {
const gfx::Size ya_tex_size = coded_size;
int u_width = media::VideoFrame::Columns(
media::VideoFrame::kUPlane, frame_->format(), coded_size.width());
int u_height = media::VideoFrame::Rows(
media::VideoFrame::kUPlane, frame_->format(), coded_size.height());
gfx::Size uv_tex_size(u_width, u_height);
if (frame_->HasTextures()) {
if (frame_->format() == media::PIXEL_FORMAT_NV12) {
DCHECK_EQ(2u, frame_resources_.size());
} else {
DCHECK_EQ(media::PIXEL_FORMAT_I420, frame_->format());
DCHECK_EQ(3u,
frame_resources_.size()); // Alpha is not supported yet.
}
} else {
DCHECK_GE(frame_resources_.size(), 3u);
DCHECK(frame_resources_.size() <= 3 ||
ya_tex_size == media::VideoFrame::PlaneSize(
frame_->format(), media::VideoFrame::kAPlane,
coded_size));
}
// Compute the UV sub-sampling factor based on the ratio between
// |ya_tex_size| and |uv_tex_size|.
float uv_subsampling_factor_x =
static_cast<float>(ya_tex_size.width()) / uv_tex_size.width();
float uv_subsampling_factor_y =
static_cast<float>(ya_tex_size.height()) / uv_tex_size.height();
gfx::RectF ya_tex_coord_rect(visible_rect);
gfx::RectF uv_tex_coord_rect(
visible_rect.x() / uv_subsampling_factor_x,
visible_rect.y() / uv_subsampling_factor_y,
visible_rect.width() / uv_subsampling_factor_x,
visible_rect.height() / uv_subsampling_factor_y);
auto* yuv_video_quad =
render_pass->CreateAndAppendDrawQuad<viz::YUVVideoDrawQuad>();
yuv_video_quad->SetNew(
shared_quad_state, quad_rect, visible_quad_rect, needs_blending,
ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size,
frame_resources_[0].id, frame_resources_[1].id,
frame_resources_.size() > 2 ? frame_resources_[2].id
: frame_resources_[1].id,
frame_resources_.size() > 3 ? frame_resources_[3].id : 0,
frame_->ColorSpace(), frame_resource_offset_,
frame_resource_multiplier_, frame_bits_per_channel_);
yuv_video_quad->require_overlay = frame_->metadata()->IsTrue(
media::VideoFrameMetadata::REQUIRE_OVERLAY);
ValidateQuadResources(yuv_video_quad);
break;
}
case VideoFrameExternalResources::RGBA_RESOURCE:
case VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE:
case VideoFrameExternalResources::RGB_RESOURCE: {
DCHECK_EQ(frame_resources_.size(), 1u);
if (frame_resources_.size() < 1u)
break;
bool premultiplied_alpha =
frame_resource_type_ ==
VideoFrameExternalResources::RGBA_PREMULTIPLIED_RESOURCE;
gfx::PointF uv_top_left(0.f, 0.f);
gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale);
float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
bool flipped = false;
bool nearest_neighbor = false;
auto* texture_quad =
render_pass->CreateAndAppendDrawQuad<viz::TextureDrawQuad>();
texture_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
needs_blending, frame_resources_[0].id,
premultiplied_alpha, uv_top_left, uv_bottom_right,
SK_ColorTRANSPARENT, opacity, flipped,
nearest_neighbor, false);
texture_quad->set_resource_size_in_pixels(coded_size);
ValidateQuadResources(texture_quad);
break;
}
case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: {
DCHECK_EQ(frame_resources_.size(), 1u);
if (frame_resources_.size() < 1u)
break;
gfx::Transform scale;
scale.Scale(tex_width_scale, tex_height_scale);
auto* stream_video_quad =
render_pass->CreateAndAppendDrawQuad<viz::StreamVideoDrawQuad>();
stream_video_quad->SetNew(shared_quad_state, quad_rect, visible_quad_rect,
needs_blending, frame_resources_[0].id,
frame_resources_[0].size_in_pixels, scale);
ValidateQuadResources(stream_video_quad);
break;
}
case VideoFrameExternalResources::NONE:
NOTIMPLEMENTED();
break;
}
} }
void VideoLayerImpl::DidDraw(LayerTreeResourceProvider* resource_provider) { void VideoLayerImpl::DidDraw(LayerTreeResourceProvider* resource_provider) {
...@@ -319,17 +156,7 @@ void VideoLayerImpl::DidDraw(LayerTreeResourceProvider* resource_provider) { ...@@ -319,17 +156,7 @@ void VideoLayerImpl::DidDraw(LayerTreeResourceProvider* resource_provider) {
DCHECK(frame_.get()); DCHECK(frame_.get());
if (frame_resource_type_ == updater_->ReleaseFrameResources();
VideoFrameExternalResources::SOFTWARE_RESOURCE) {
DCHECK_GT(software_resource_, viz::kInvalidResourceId);
std::move(software_release_callback_).Run(gpu::SyncToken(), false);
software_resource_ = viz::kInvalidResourceId;
} else {
for (const FrameResource& resource : frame_resources_)
resource_provider->RemoveImportedResource(resource.id);
frame_resources_.clear();
}
provider_client_impl_->PutCurrentFrame(); provider_client_impl_->PutCurrentFrame();
frame_ = nullptr; frame_ = nullptr;
......
...@@ -63,23 +63,6 @@ class CC_EXPORT VideoLayerImpl : public LayerImpl { ...@@ -63,23 +63,6 @@ class CC_EXPORT VideoLayerImpl : public LayerImpl {
media::VideoRotation video_rotation_; media::VideoRotation video_rotation_;
std::unique_ptr<VideoResourceUpdater> updater_; std::unique_ptr<VideoResourceUpdater> updater_;
VideoFrameExternalResources::ResourceType frame_resource_type_;
float frame_resource_offset_;
float frame_resource_multiplier_;
uint32_t frame_bits_per_channel_;
struct FrameResource {
FrameResource(viz::ResourceId id, gfx::Size size_in_pixels)
: id(id), size_in_pixels(size_in_pixels) {}
viz::ResourceId id;
gfx::Size size_in_pixels;
};
std::vector<FrameResource> frame_resources_;
// TODO(danakj): Remove these, use TransferableResource for software path too.
unsigned software_resource_ = viz::kInvalidResourceId;
// Called once for software_resource_.
viz::ReleaseCallback software_release_callback_;
DISALLOW_COPY_AND_ASSIGN(VideoLayerImpl); DISALLOW_COPY_AND_ASSIGN(VideoLayerImpl);
}; };
......
This diff is collapsed.
...@@ -29,12 +29,18 @@ class PaintCanvasVideoRenderer; ...@@ -29,12 +29,18 @@ class PaintCanvasVideoRenderer;
class VideoFrame; class VideoFrame;
} }
namespace gfx {
class Rect;
class Transform;
} // namespace gfx
namespace viz { namespace viz {
class ContextProvider; class ContextProvider;
class RenderPass;
} }
namespace cc { namespace cc {
class ResourceProvider; class LayerTreeResourceProvider;
class CC_EXPORT VideoFrameExternalResources { class CC_EXPORT VideoFrameExternalResources {
public: public:
...@@ -50,7 +56,6 @@ class CC_EXPORT VideoFrameExternalResources { ...@@ -50,7 +56,6 @@ class CC_EXPORT VideoFrameExternalResources {
SOFTWARE_RESOURCE SOFTWARE_RESOURCE
}; };
ResourceType type = NONE; ResourceType type = NONE;
std::vector<viz::TransferableResource> resources; std::vector<viz::TransferableResource> resources;
std::vector<viz::ReleaseCallback> release_callbacks; std::vector<viz::ReleaseCallback> release_callbacks;
...@@ -77,7 +82,7 @@ class CC_EXPORT VideoFrameExternalResources { ...@@ -77,7 +82,7 @@ class CC_EXPORT VideoFrameExternalResources {
class CC_EXPORT VideoResourceUpdater { class CC_EXPORT VideoResourceUpdater {
public: public:
VideoResourceUpdater(viz::ContextProvider* context_provider, VideoResourceUpdater(viz::ContextProvider* context_provider,
ResourceProvider* resource_provider, LayerTreeResourceProvider* resource_provider,
bool use_stream_video_draw_quad); bool use_stream_video_draw_quad);
~VideoResourceUpdater(); ~VideoResourceUpdater();
...@@ -88,6 +93,20 @@ class CC_EXPORT VideoResourceUpdater { ...@@ -88,6 +93,20 @@ class CC_EXPORT VideoResourceUpdater {
use_r16_for_testing_ = use_r16_for_testing; use_r16_for_testing_ = use_r16_for_testing;
} }
void ObtainFrameResources(scoped_refptr<media::VideoFrame> video_frame);
void ReleaseFrameResources();
void AppendQuads(viz::RenderPass* render_pass,
scoped_refptr<media::VideoFrame> frame,
gfx::Transform transform,
gfx::Size rotated_size,
gfx::Rect visible_layer_rect,
gfx::Rect clip_rect,
bool is_clipped,
bool context_opaque,
float draw_opacity,
int sorting_context_id,
gfx::Rect visible_quad_rect);
private: private:
class PlaneResource { class PlaneResource {
public: public:
...@@ -178,12 +197,30 @@ class CC_EXPORT VideoResourceUpdater { ...@@ -178,12 +197,30 @@ class CC_EXPORT VideoResourceUpdater {
bool lost_resource); bool lost_resource);
viz::ContextProvider* context_provider_; viz::ContextProvider* context_provider_;
ResourceProvider* resource_provider_; LayerTreeResourceProvider* resource_provider_;
const bool use_stream_video_draw_quad_; const bool use_stream_video_draw_quad_;
std::unique_ptr<media::PaintCanvasVideoRenderer> video_renderer_; std::unique_ptr<media::PaintCanvasVideoRenderer> video_renderer_;
std::vector<uint8_t> upload_pixels_; std::vector<uint8_t> upload_pixels_;
bool use_r16_for_testing_ = false; bool use_r16_for_testing_ = false;
VideoFrameExternalResources::ResourceType frame_resource_type_;
// TODO(danakj): Remove these, use TransferableResource for software path too.
unsigned software_resource_ = viz::kInvalidResourceId;
// Called once for |software_resource_|.
viz::ReleaseCallback software_release_callback_;
float frame_resource_offset_;
float frame_resource_multiplier_;
uint32_t frame_bits_per_channel_;
struct FrameResource {
FrameResource(viz::ResourceId id, gfx::Size size_in_pixels)
: id(id), size_in_pixels(size_in_pixels) {}
viz::ResourceId id;
gfx::Size size_in_pixels;
};
std::vector<FrameResource> frame_resources_;
// Recycle resources so that we can reduce the number of allocations and // Recycle resources so that we can reduce the number of allocations and
// data transfers. // data transfers.
ResourceList all_resources_; ResourceList all_resources_;
......
...@@ -100,11 +100,14 @@ class VideoResourceUpdaterTest : public testing::Test { ...@@ -100,11 +100,14 @@ class VideoResourceUpdaterTest : public testing::Test {
void SetUp() override { void SetUp() override {
testing::Test::SetUp(); testing::Test::SetUp();
shared_bitmap_manager_.reset(new SharedBitmapManagerAllocationCounter()); shared_bitmap_manager_.reset(new SharedBitmapManagerAllocationCounter());
resource_provider3d_ = FakeResourceProvider::Create( resource_provider3d_ =
context_provider_.get(), shared_bitmap_manager_.get(), FakeResourceProvider::CreateLayerTreeResourceProvider(
high_bit_for_testing_); context_provider_.get(), shared_bitmap_manager_.get(), nullptr,
resource_provider_software_ = FakeResourceProvider::Create( high_bit_for_testing_);
nullptr, shared_bitmap_manager_.get(), high_bit_for_testing_); resource_provider_software_ =
FakeResourceProvider::CreateLayerTreeResourceProvider(
nullptr, shared_bitmap_manager_.get(), nullptr,
high_bit_for_testing_);
} }
scoped_refptr<media::VideoFrame> CreateTestYUVVideoFrame() { scoped_refptr<media::VideoFrame> CreateTestYUVVideoFrame() {
...@@ -242,8 +245,8 @@ class VideoResourceUpdaterTest : public testing::Test { ...@@ -242,8 +245,8 @@ class VideoResourceUpdaterTest : public testing::Test {
WebGraphicsContext3DUploadCounter* context3d_; WebGraphicsContext3DUploadCounter* context3d_;
scoped_refptr<TestContextProvider> context_provider_; scoped_refptr<TestContextProvider> context_provider_;
std::unique_ptr<SharedBitmapManagerAllocationCounter> shared_bitmap_manager_; std::unique_ptr<SharedBitmapManagerAllocationCounter> shared_bitmap_manager_;
std::unique_ptr<ResourceProvider> resource_provider3d_; std::unique_ptr<LayerTreeResourceProvider> resource_provider3d_;
std::unique_ptr<ResourceProvider> resource_provider_software_; std::unique_ptr<LayerTreeResourceProvider> resource_provider_software_;
gpu::SyncToken release_sync_token_; gpu::SyncToken release_sync_token_;
bool high_bit_for_testing_ = false; bool high_bit_for_testing_ = false;
}; };
......
...@@ -36,11 +36,13 @@ class FakeResourceProvider : public ResourceProvider { ...@@ -36,11 +36,13 @@ class FakeResourceProvider : public ResourceProvider {
CreateLayerTreeResourceProvider( CreateLayerTreeResourceProvider(
viz::ContextProvider* context_provider, viz::ContextProvider* context_provider,
viz::SharedBitmapManager* shared_bitmap_manager, viz::SharedBitmapManager* shared_bitmap_manager,
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr) { gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr,
bool high_bit_for_testing = false) {
viz::ResourceSettings resource_settings; viz::ResourceSettings resource_settings;
resource_settings.texture_id_allocation_chunk_size = 1; resource_settings.texture_id_allocation_chunk_size = 1;
resource_settings.buffer_to_texture_target_map = resource_settings.buffer_to_texture_target_map =
viz::DefaultBufferToTextureTargetMapForTesting(); viz::DefaultBufferToTextureTargetMapForTesting();
resource_settings.high_bit_for_testing = high_bit_for_testing;
return std::make_unique<LayerTreeResourceProvider>( return std::make_unique<LayerTreeResourceProvider>(
context_provider, shared_bitmap_manager, gpu_memory_buffer_manager, context_provider, shared_bitmap_manager, gpu_memory_buffer_manager,
true, resource_settings); true, resource_settings);
......
...@@ -1325,7 +1325,7 @@ class VideoGLRendererPixelTest : public cc::GLRendererPixelTest { ...@@ -1325,7 +1325,7 @@ class VideoGLRendererPixelTest : public cc::GLRendererPixelTest {
GLRendererPixelTest::SetUp(); GLRendererPixelTest::SetUp();
bool use_stream_video_draw_quad = false; bool use_stream_video_draw_quad = false;
video_resource_updater_ = std::make_unique<cc::VideoResourceUpdater>( video_resource_updater_ = std::make_unique<cc::VideoResourceUpdater>(
output_surface_->context_provider(), resource_provider_.get(), child_context_provider_.get(), child_resource_provider_.get(),
use_stream_video_draw_quad); use_stream_video_draw_quad);
} }
......
...@@ -11,8 +11,15 @@ ...@@ -11,8 +11,15 @@
#include "cc/resources/video_resource_updater.h" #include "cc/resources/video_resource_updater.h"
#include "components/viz/common/quads/render_pass.h" #include "components/viz/common/quads/render_pass.h"
#include "components/viz/common/quads/solid_color_draw_quad.h" #include "components/viz/common/quads/solid_color_draw_quad.h"
#include "components/viz/common/quads/texture_draw_quad.h"
#include "components/viz/common/quads/yuv_video_draw_quad.h"
#include "media/base/video_frame.h"
#include "platform/wtf/WeakPtr.h" #include "platform/wtf/WeakPtr.h"
namespace cc {
class VideoFrameExternalResources;
} // namespace cc
namespace blink { namespace blink {
VideoFrameResourceProvider::VideoFrameResourceProvider( VideoFrameResourceProvider::VideoFrameResourceProvider(
...@@ -44,36 +51,41 @@ void VideoFrameResourceProvider::Initialize( ...@@ -44,36 +51,41 @@ void VideoFrameResourceProvider::Initialize(
context_provider_ = media_context_provider; context_provider_ = media_context_provider;
viz::ContextProvider::ScopedContextLock lock(context_provider_); viz::ContextProvider::ScopedContextLock lock(context_provider_);
// TODO(lethalantidote): Get real value for delegated_sync_points_required.
resource_provider_ = std::make_unique<cc::LayerTreeResourceProvider>( resource_provider_ = std::make_unique<cc::LayerTreeResourceProvider>(
media_context_provider, shared_bitmap_manager_, media_context_provider, shared_bitmap_manager_,
gpu_memory_buffer_manager_, false, settings_.resource_settings); gpu_memory_buffer_manager_, true, settings_.resource_settings);
resource_updater_ = std::make_unique<cc::VideoResourceUpdater>( resource_updater_ = std::make_unique<cc::VideoResourceUpdater>(
media_context_provider, resource_provider_.get(), media_context_provider, resource_provider_.get(),
settings_.use_stream_video_draw_quad); settings_.use_stream_video_draw_quad);
} }
void VideoFrameResourceProvider::AppendQuads(viz::RenderPass* render_pass) { void VideoFrameResourceProvider::AppendQuads(
gfx::Rect rect(0, 0, 10000, 10000); viz::RenderPass* render_pass,
gfx::Rect visible_rect(0, 0, 10000, 10000); scoped_refptr<media::VideoFrame> frame) {
viz::ContextProvider::ScopedContextLock lock(context_provider_);
resource_updater_->ObtainFrameResources(frame);
// TODO(lethalantidote) : update with true value;
bool contents_opaque = true;
gfx::Rect visible_layer_rect = gfx::Rect(frame->coded_size());
gfx::Rect clip_rect = gfx::Rect(frame->coded_size());
bool is_clipped = false; bool is_clipped = false;
bool are_contents_opaque = true; float draw_opacity = 1.0f;
viz::SharedQuadState* shared_state = int sorting_context_id = 0;
render_pass->CreateAndAppendSharedQuadState();
shared_state->SetAll(gfx::Transform(), rect, rect, rect, is_clipped, // Internal to this compositor frame, this video quad is never occluded,
are_contents_opaque, 1, SkBlendMode::kSrcOver, 0); // thus the full quad is visible.
viz::SolidColorDrawQuad* solid_color_quad = gfx::Rect visible_quad_rect = gfx::Rect(frame->coded_size());
render_pass->CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
// Fluxuate colors for placeholder testing. resource_updater_->AppendQuads(
static int r = 0; render_pass, frame, gfx::Transform(), frame->coded_size(),
static int g = 0; visible_layer_rect, clip_rect, is_clipped, contents_opaque, draw_opacity,
static int b = 0; sorting_context_id, visible_quad_rect);
r++; }
g += 2;
b += 3; void VideoFrameResourceProvider::ReleaseFrameResources() {
solid_color_quad->SetNew(shared_state, rect, visible_rect, viz::ContextProvider::ScopedContextLock lock(context_provider_);
SkColorSetRGB(r % 255, g % 255, b % 255), false); resource_updater_->ReleaseFrameResources();
} }
void VideoFrameResourceProvider::PrepareSendToParent( void VideoFrameResourceProvider::PrepareSendToParent(
......
...@@ -37,7 +37,8 @@ class PLATFORM_EXPORT VideoFrameResourceProvider { ...@@ -37,7 +37,8 @@ class PLATFORM_EXPORT VideoFrameResourceProvider {
virtual void ObtainContextProvider(); virtual void ObtainContextProvider();
virtual void Initialize(viz::ContextProvider*); virtual void Initialize(viz::ContextProvider*);
virtual void AppendQuads(viz::RenderPass*); virtual void AppendQuads(viz::RenderPass*, scoped_refptr<media::VideoFrame>);
virtual void ReleaseFrameResources();
virtual void PrepareSendToParent( virtual void PrepareSendToParent(
const cc::LayerTreeResourceProvider::ResourceIdArray& resource_ids, const cc::LayerTreeResourceProvider::ResourceIdArray& resource_ids,
......
...@@ -116,7 +116,7 @@ void VideoFrameSubmitter::SubmitFrame( ...@@ -116,7 +116,7 @@ void VideoFrameSubmitter::SubmitFrame(
render_pass->SetNew(1, gfx::Rect(video_frame->coded_size()), render_pass->SetNew(1, gfx::Rect(video_frame->coded_size()),
gfx::Rect(video_frame->coded_size()), gfx::Transform()); gfx::Rect(video_frame->coded_size()), gfx::Transform());
render_pass->filters = cc::FilterOperations(); render_pass->filters = cc::FilterOperations();
resource_provider_->AppendQuads(render_pass.get()); resource_provider_->AppendQuads(render_pass.get(), video_frame);
compositor_frame.metadata.begin_frame_ack = begin_frame_ack; compositor_frame.metadata.begin_frame_ack = begin_frame_ack;
compositor_frame.metadata.device_scale_factor = 1; compositor_frame.metadata.device_scale_factor = 1;
compositor_frame.metadata.may_contain_video = true; compositor_frame.metadata.may_contain_video = true;
...@@ -129,12 +129,12 @@ void VideoFrameSubmitter::SubmitFrame( ...@@ -129,12 +129,12 @@ void VideoFrameSubmitter::SubmitFrame(
} }
resource_provider_->PrepareSendToParent(resources, resource_provider_->PrepareSendToParent(resources,
&compositor_frame.resource_list); &compositor_frame.resource_list);
compositor_frame.render_pass_list.push_back(std::move(render_pass)); compositor_frame.render_pass_list.push_back(std::move(render_pass));
// TODO(lethalantidote): Address third/fourth arg in SubmitCompositorFrame. // TODO(lethalantidote): Address third/fourth arg in SubmitCompositorFrame.
compositor_frame_sink_->SubmitCompositorFrame( compositor_frame_sink_->SubmitCompositorFrame(
current_local_surface_id_, std::move(compositor_frame), nullptr, 0); current_local_surface_id_, std::move(compositor_frame), nullptr, 0);
resource_provider_->ReleaseFrameResources();
} }
void VideoFrameSubmitter::OnBeginFrame(const viz::BeginFrameArgs& args) { void VideoFrameSubmitter::OnBeginFrame(const viz::BeginFrameArgs& args) {
......
...@@ -88,7 +88,9 @@ class MockVideoFrameResourceProvider ...@@ -88,7 +88,9 @@ class MockVideoFrameResourceProvider
~MockVideoFrameResourceProvider() = default; ~MockVideoFrameResourceProvider() = default;
MOCK_METHOD1(Initialize, void(viz::ContextProvider*)); MOCK_METHOD1(Initialize, void(viz::ContextProvider*));
MOCK_METHOD1(AppendQuads, void(viz::RenderPass*)); MOCK_METHOD2(AppendQuads,
void(viz::RenderPass*, scoped_refptr<media::VideoFrame>));
MOCK_METHOD0(ReleaseFrameResources, void());
MOCK_METHOD2(PrepareSendToParent, MOCK_METHOD2(PrepareSendToParent,
void(const cc::LayerTreeResourceProvider::ResourceIdArray&, void(const cc::LayerTreeResourceProvider::ResourceIdArray&,
std::vector<viz::TransferableResource>*)); std::vector<viz::TransferableResource>*));
...@@ -112,6 +114,11 @@ class VideoFrameSubmitterTest : public ::testing::Test { ...@@ -112,6 +114,11 @@ class VideoFrameSubmitterTest : public ::testing::Test {
context_provider_->BindToCurrentThread(); context_provider_->BindToCurrentThread();
} }
void SetUp() override {
MakeSubmitter();
scoped_task_environment_.RunUntilIdle();
}
void MakeSubmitter() { void MakeSubmitter() {
resource_provider_ = resource_provider_ =
new StrictMock<MockVideoFrameResourceProvider>(context_provider_.get()); new StrictMock<MockVideoFrameResourceProvider>(context_provider_.get());
...@@ -183,8 +190,9 @@ TEST_F(VideoFrameSubmitterTest, ...@@ -183,8 +190,9 @@ TEST_F(VideoFrameSubmitterTest,
EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _)); EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _));
EXPECT_CALL(*provider_, PutCurrentFrame()); EXPECT_CALL(*provider_, PutCurrentFrame());
EXPECT_CALL(*sink_, SetNeedsBeginFrame(false)); EXPECT_CALL(*sink_, SetNeedsBeginFrame(false));
EXPECT_CALL(*resource_provider_, AppendQuads(_)); EXPECT_CALL(*resource_provider_, AppendQuads(_, _));
EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _)); EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _));
EXPECT_CALL(*resource_provider_, ReleaseFrameResources());
submitter_->StopUsingProvider(); submitter_->StopUsingProvider();
...@@ -220,8 +228,9 @@ TEST_F(VideoFrameSubmitterTest, DidReceiveFrameSubmitsFrame) { ...@@ -220,8 +228,9 @@ TEST_F(VideoFrameSubmitterTest, DidReceiveFrameSubmitsFrame) {
gfx::Size(8, 8), base::TimeDelta()))); gfx::Size(8, 8), base::TimeDelta())));
EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _)); EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _));
EXPECT_CALL(*provider_, PutCurrentFrame()); EXPECT_CALL(*provider_, PutCurrentFrame());
EXPECT_CALL(*resource_provider_, AppendQuads(_)); EXPECT_CALL(*resource_provider_, AppendQuads(_, _));
EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _)); EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _));
EXPECT_CALL(*resource_provider_, ReleaseFrameResources());
submitter_->DidReceiveFrame(); submitter_->DidReceiveFrame();
scoped_task_environment_.RunUntilIdle(); scoped_task_environment_.RunUntilIdle();
...@@ -243,8 +252,9 @@ TEST_F(VideoFrameSubmitterTest, OnBeginFrameSubmitsFrame) { ...@@ -243,8 +252,9 @@ TEST_F(VideoFrameSubmitterTest, OnBeginFrameSubmitsFrame) {
gfx::Size(8, 8), base::TimeDelta()))); gfx::Size(8, 8), base::TimeDelta())));
EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _)); EXPECT_CALL(*sink_, DoSubmitCompositorFrame(_, _));
EXPECT_CALL(*provider_, PutCurrentFrame()); EXPECT_CALL(*provider_, PutCurrentFrame());
EXPECT_CALL(*resource_provider_, AppendQuads(_)); EXPECT_CALL(*resource_provider_, AppendQuads(_, _));
EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _)); EXPECT_CALL(*resource_provider_, PrepareSendToParent(_, _));
EXPECT_CALL(*resource_provider_, ReleaseFrameResources());
viz::BeginFrameArgs args = begin_frame_source_->CreateBeginFrameArgs( viz::BeginFrameArgs args = begin_frame_source_->CreateBeginFrameArgs(
BEGINFRAME_FROM_HERE, now_src_.get()); BEGINFRAME_FROM_HERE, now_src_.get());
......
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