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

Unified Diff: content/common/gpu/image_transport_surface_fbo_mac.mm

Issue 696823002: Fix content scaling bug on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 | « content/common/gpu/image_transport_surface_fbo_mac.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/image_transport_surface_fbo_mac.mm
diff --git a/content/common/gpu/image_transport_surface_fbo_mac.mm b/content/common/gpu/image_transport_surface_fbo_mac.mm
index 37bb4d357db237ed31187ac4f10fbc13d9124bb3..6af794d552ee1360c5dfaee96b8bf2f473ab0555 100644
--- a/content/common/gpu/image_transport_surface_fbo_mac.mm
+++ b/content/common/gpu/image_transport_surface_fbo_mac.mm
@@ -75,7 +75,7 @@ bool ImageTransportSurfaceFBO::OnMakeCurrent(gfx::GLContext* context) {
if (made_current_)
return true;
- OnResize(gfx::Size(1, 1), 1.f);
+ AllocateOrResizeFramebuffer(gfx::Size(1, 1), 1.f);
made_current_ = true;
return true;
@@ -110,7 +110,7 @@ void ImageTransportSurfaceFBO::AdjustBufferAllocation() {
has_complete_framebuffer_) {
DestroyFramebuffer();
} else if (backbuffer_suggested_allocation_ && !has_complete_framebuffer_) {
- CreateFramebuffer();
+ AllocateOrResizeFramebuffer(pixel_size_, scale_factor_);
}
}
@@ -122,7 +122,7 @@ bool ImageTransportSurfaceFBO::SwapBuffers() {
// It is the responsibility of the storage provider to send the swap IPC.
is_swap_buffers_send_pending_ = true;
- storage_provider_->SwapBuffers(size_, scale_factor_);
+ storage_provider_->SwapBuffers(pixel_size_, scale_factor_);
return true;
}
@@ -155,7 +155,7 @@ bool ImageTransportSurfaceFBO::SupportsPostSubBuffer() {
}
gfx::Size ImageTransportSurfaceFBO::GetSize() {
- return size_;
+ return pixel_size_;
}
void* ImageTransportSurfaceFBO::GetHandle() {
@@ -172,17 +172,15 @@ void ImageTransportSurfaceFBO::OnBufferPresented(
storage_provider_->SwapBuffersAckedByBrowser(params.disable_throttling);
}
-void ImageTransportSurfaceFBO::OnResize(gfx::Size size,
+void ImageTransportSurfaceFBO::OnResize(gfx::Size pixel_size,
float scale_factor) {
TRACE_EVENT2("gpu", "ImageTransportSurfaceFBO::OnResize",
- "old_width", size_.width(), "new_width", size.width());
+ "old_size", pixel_size_.ToString(),
+ "new_size", pixel_size.ToString());
// Caching |context_| from OnMakeCurrent. It should still be current.
DCHECK(context_->IsCurrent(this));
- size_ = size;
- scale_factor_ = scale_factor;
-
- CreateFramebuffer();
+ AllocateOrResizeFramebuffer(pixel_size, scale_factor);
}
void ImageTransportSurfaceFBO::SetLatencyInfo(
@@ -229,18 +227,29 @@ void ImageTransportSurfaceFBO::DestroyFramebuffer() {
has_complete_framebuffer_ = false;
}
-void ImageTransportSurfaceFBO::CreateFramebuffer() {
- gfx::Size new_rounded_size = storage_provider_->GetRoundedSize(size_);
+void ImageTransportSurfaceFBO::AllocateOrResizeFramebuffer(
+ const gfx::Size& new_pixel_size, float new_scale_factor) {
+ gfx::Size new_rounded_pixel_size =
+ storage_provider_->GetRoundedSize(new_pixel_size);
- // Only recreate surface when the rounded up size has changed.
- if (has_complete_framebuffer_ && new_rounded_size == rounded_size_)
- return;
+ // Only recreate the surface's storage when the rounded up size has changed,
+ // or the scale factor has changed.
+ bool needs_new_storage =
+ !has_complete_framebuffer_ ||
+ new_rounded_pixel_size != rounded_pixel_size_ ||
+ new_scale_factor != scale_factor_;
- TRACE_EVENT2("gpu", "ImageTransportSurfaceFBO::CreateFramebuffer",
- "width", new_rounded_size.width(),
- "height", new_rounded_size.height());
+ // Save the new storage parameters.
+ pixel_size_ = new_pixel_size;
+ rounded_pixel_size_ = new_rounded_pixel_size;
+ scale_factor_ = new_scale_factor;
+
+ if (!needs_new_storage)
+ return;
- rounded_size_ = new_rounded_size;
+ TRACE_EVENT2("gpu", "ImageTransportSurfaceFBO::AllocateOrResizeFramebuffer",
+ "width", new_rounded_pixel_size.width(),
+ "height", new_rounded_pixel_size.height());
// GL_TEXTURE_RECTANGLE_ARB is the best supported render target on
// Mac OS X and is required for IOSurface interoperability.
@@ -286,7 +295,8 @@ void ImageTransportSurfaceFBO::CreateFramebuffer() {
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT,
depth_stencil_renderbuffer_id_);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT,
- rounded_size_.width(), rounded_size_.height());
+ rounded_pixel_size_.width(),
+ rounded_pixel_size_.height());
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
GL_STENCIL_ATTACHMENT_EXT,
GL_RENDERBUFFER_EXT,
@@ -301,7 +311,7 @@ void ImageTransportSurfaceFBO::CreateFramebuffer() {
bool allocated_color_buffer = storage_provider_->AllocateColorBufferStorage(
static_cast<CGLContextObj>(context_->GetHandle()), texture_id_,
- rounded_size_, scale_factor_);
+ rounded_pixel_size_, scale_factor_);
if (!allocated_color_buffer) {
DLOG(ERROR) << "Failed to allocate color buffer storage.";
DestroyFramebuffer();
« no previous file with comments | « content/common/gpu/image_transport_surface_fbo_mac.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698