Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Unified Diff: components/exo/surface.cc

Issue 2032173002: exo: Allow updating cc::Surface viewport and crop state independently. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/exo/surface.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/exo/surface.cc
diff --git a/components/exo/surface.cc b/components/exo/surface.cc
index 08b8a187655d5653b73feec064e77f19ba1b565a..8b9389252da75ee759bcb4a3e658929f8d82762a 100644
--- a/components/exo/surface.cc
+++ b/components/exo/surface.cc
@@ -388,13 +388,21 @@ void Surface::PlaceSubSurfaceBelow(Surface* sub_surface, Surface* sibling) {
void Surface::SetViewport(const gfx::Size& viewport) {
TRACE_EVENT1("exo", "Surface::SetViewport", "viewport", viewport.ToString());
+ if (pending_viewport_ == viewport)
+ return;
+
pending_viewport_ = viewport;
+ changed_viewport_or_crop_ = true;
}
void Surface::SetCrop(const gfx::RectF& crop) {
TRACE_EVENT1("exo", "Surface::SetCrop", "crop", crop.ToString());
+ if (pending_crop_ == crop)
+ return;
+
pending_crop_ = crop;
+ changed_viewport_or_crop_ = true;
}
void Surface::SetOnlyVisibleOnSecureOutput(bool only_visible_on_secure_output) {
@@ -512,26 +520,45 @@ void Surface::CommitLayerContents() {
void Surface::CommitSurfaceContents() {
// We update contents if Attach() has been called since last commit.
if (has_pending_contents_) {
- has_pending_contents_ = false;
-
current_buffer_ = pending_buffer_;
pending_buffer_.reset();
- bool secure_output_only = pending_only_visible_on_secure_output_;
- pending_only_visible_on_secure_output_ = false;
-
- cc::TextureMailbox texture_mailbox;
- std::unique_ptr<cc::SingleReleaseCallback> texture_mailbox_release_callback;
if (current_buffer_) {
+ std::unique_ptr<cc::SingleReleaseCallback>
+ texture_mailbox_release_callback;
+
+ cc::TextureMailbox texture_mailbox;
texture_mailbox_release_callback = current_buffer_->ProduceTextureMailbox(
- &texture_mailbox, secure_output_only, false);
+ &texture_mailbox, pending_only_visible_on_secure_output_, false);
+ cc::TransferableResource resource;
+ resource.id = next_resource_id_++;
+ resource.format = cc::RGBA_8888;
+ resource.filter =
+ texture_mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR;
+ resource.size = texture_mailbox.size_in_pixels();
+ resource.mailbox_holder = gpu::MailboxHolder(texture_mailbox.mailbox(),
+ texture_mailbox.sync_token(),
+ texture_mailbox.target());
+ resource.is_overlay_candidate = texture_mailbox.is_overlay_candidate();
+
+ factory_owner_->release_callbacks_[resource.id] = std::make_pair(
+ factory_owner_, std::move(texture_mailbox_release_callback));
+ current_resource_ = resource;
+ } else {
+ current_resource_.id = 0;
+ current_resource_.size = gfx::Size();
}
+ }
+
+ if (has_pending_contents_ || changed_viewport_or_crop_) {
reveman 2016/06/03 19:06:51 Do we need this if statement and the new changed_v
+ has_pending_contents_ = false;
+ changed_viewport_or_crop_ = false;
cc::SurfaceId old_surface_id = surface_id_;
surface_id_ = factory_owner_->id_allocator_->GenerateId();
factory_owner_->surface_factory_->Create(surface_id_);
- gfx::Size buffer_size = texture_mailbox.size_in_pixels();
+ gfx::Size buffer_size = current_resource_.size;
gfx::SizeF scaled_buffer_size(
gfx::ScaleSize(gfx::SizeF(buffer_size), 1.0f / pending_buffer_scale_));
@@ -585,18 +612,7 @@ void Surface::CommitSurfaceContents() {
std::unique_ptr<cc::DelegatedFrameData> delegated_frame(
new cc::DelegatedFrameData);
- if (texture_mailbox_release_callback) {
- cc::TransferableResource resource;
- resource.id = next_resource_id_++;
- resource.format = cc::RGBA_8888;
- resource.filter =
- texture_mailbox.nearest_neighbor() ? GL_NEAREST : GL_LINEAR;
- resource.size = texture_mailbox.size_in_pixels();
- resource.mailbox_holder = gpu::MailboxHolder(texture_mailbox.mailbox(),
- texture_mailbox.sync_token(),
- texture_mailbox.target());
- resource.is_overlay_candidate = texture_mailbox.is_overlay_candidate();
-
+ if (current_resource_.id) {
cc::TextureDrawQuad* texture_quad =
render_pass->CreateAndAppendDrawQuad<cc::TextureDrawQuad>();
float vertex_opacity[4] = {1.0, 1.0, 1.0, 1.0};
@@ -610,14 +626,11 @@ void Surface::CommitSurfaceContents() {
opaque_rect = gfx::SkIRectToRect(pending_opaque_region_.getBounds());
}
- texture_quad->SetNew(quad_state, quad_rect, opaque_rect, quad_rect,
- resource.id, true, uv_top_left, uv_bottom_right,
- SK_ColorTRANSPARENT, vertex_opacity, false, false,
- secure_output_only);
-
- factory_owner_->release_callbacks_[resource.id] = std::make_pair(
- factory_owner_, std::move(texture_mailbox_release_callback));
- delegated_frame->resource_list.push_back(resource);
+ texture_quad->SetNew(
+ quad_state, quad_rect, opaque_rect, quad_rect, current_resource_.id,
+ true, uv_top_left, uv_bottom_right, SK_ColorTRANSPARENT,
+ vertex_opacity, false, false, pending_only_visible_on_secure_output_);
+ delegated_frame->resource_list.push_back(current_resource_);
} else {
cc::SolidColorDrawQuad* solid_quad =
render_pass->CreateAndAppendDrawQuad<cc::SolidColorDrawQuad>();
@@ -650,6 +663,10 @@ void Surface::CommitSurfaceContents() {
// Reset damage.
pending_damage_.setEmpty();
}
+
+ if (current_resource_.id)
reveman 2016/06/03 19:06:50 nit: please include this in the DCHECK, DCHECK(!cu
+ DCHECK(factory_owner_->release_callbacks_.count(current_resource_.id));
+
// Move pending frame callbacks to the end of active_frame_callbacks_
active_frame_callbacks_.splice(active_frame_callbacks_.end(),
pending_frame_callbacks_);
« no previous file with comments | « components/exo/surface.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698