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 fc7e5ec4bf370933a39cd3ebca0a647539d8b82e..343ee83bfc09647526c2c700ba1e6c8632fd8f22 100644 |
--- a/content/common/gpu/image_transport_surface_fbo_mac.mm |
+++ b/content/common/gpu/image_transport_surface_fbo_mac.mm |
@@ -28,8 +28,7 @@ ImageTransportSurfaceFBO::ImageTransportSurfaceFBO( |
context_(NULL), |
scale_factor_(1.f), |
made_current_(false), |
- is_swap_buffers_pending_(false), |
- did_unschedule_(false) { |
+ is_swap_buffers_send_pending_(false) { |
if (ui::RemoteLayerAPISupported()) |
storage_provider_.reset(new CALayerStorageProvider(this)); |
else |
@@ -62,17 +61,9 @@ void ImageTransportSurfaceFBO::Destroy() { |
} |
bool ImageTransportSurfaceFBO::DeferDraws() { |
- // The command buffer hit a draw/clear command that could clobber the |
- // IOSurface in use by an earlier SwapBuffers. If a Swap is pending, abort |
- // processing of the command by returning true and unschedule until the Swap |
- // Ack arrives. |
- if(did_unschedule_) |
- return true; // Still unscheduled, so just return true. |
- if (is_swap_buffers_pending_) { |
- did_unschedule_ = true; |
- helper_->SetScheduled(false); |
- return true; |
- } |
+ storage_provider_->WillWriteToBackbuffer(); |
+ // We should not have a pending send when we are drawing the next frame. |
+ DCHECK(!is_swap_buffers_send_pending_); |
piman
2014/08/27 22:13:05
Is that DCHECK also invalid while the TODO in CALa
ccameron
2014/08/27 22:46:08
This is still valid.
At the moment it is valid, b
|
return false; |
} |
@@ -101,6 +92,8 @@ bool ImageTransportSurfaceFBO::SetBackbufferAllocation(bool allocation) { |
return true; |
backbuffer_suggested_allocation_ = allocation; |
AdjustBufferAllocation(); |
+ if (!allocation) |
+ storage_provider_->DiscardBackbuffer(); |
return true; |
} |
@@ -130,18 +123,22 @@ bool ImageTransportSurfaceFBO::SwapBuffers() { |
return true; |
glFlush(); |
+ // 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_); |
+ return true; |
+} |
+ |
+void ImageTransportSurfaceFBO::SendSwapBuffers(uint64 surface_handle, |
+ const gfx::Size pixel_size, |
+ float scale_factor) { |
GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params; |
- params.surface_handle = storage_provider_->GetSurfaceHandle(); |
- params.size = GetSize(); |
- params.scale_factor = scale_factor_; |
+ params.surface_handle = surface_handle; |
+ params.size = pixel_size; |
+ params.scale_factor = scale_factor; |
params.latency_info.swap(latency_info_); |
helper_->SendAcceleratedSurfaceBuffersSwapped(params); |
- |
- DCHECK(!is_swap_buffers_pending_); |
- is_swap_buffers_pending_ = true; |
- |
- storage_provider_->WillSwapBuffers(); |
- return true; |
+ is_swap_buffers_send_pending_ = false; |
} |
bool ImageTransportSurfaceFBO::PostSubBuffer( |
@@ -170,16 +167,7 @@ void* ImageTransportSurfaceFBO::GetDisplay() { |
void ImageTransportSurfaceFBO::OnBufferPresented( |
const AcceleratedSurfaceMsg_BufferPresented_Params& params) { |
context_->share_group()->SetRendererID(params.renderer_id); |
- storage_provider_->CanFreeSwappedBuffer(); |
-} |
- |
-void ImageTransportSurfaceFBO::UnblockContextAfterPendingSwap() { |
- DCHECK(is_swap_buffers_pending_); |
- is_swap_buffers_pending_ = false; |
- if (did_unschedule_) { |
- did_unschedule_ = false; |
- helper_->SetScheduled(true); |
- } |
+ storage_provider_->SwapBuffersAckedByBrowser(); |
} |
void ImageTransportSurfaceFBO::OnResize(gfx::Size size, |