| 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 343ee83bfc09647526c2c700ba1e6c8632fd8f22..fc7e5ec4bf370933a39cd3ebca0a647539d8b82e 100644
|
| --- a/content/common/gpu/image_transport_surface_fbo_mac.mm
|
| +++ b/content/common/gpu/image_transport_surface_fbo_mac.mm
|
| @@ -28,7 +28,8 @@
|
| context_(NULL),
|
| scale_factor_(1.f),
|
| made_current_(false),
|
| - is_swap_buffers_send_pending_(false) {
|
| + is_swap_buffers_pending_(false),
|
| + did_unschedule_(false) {
|
| if (ui::RemoteLayerAPISupported())
|
| storage_provider_.reset(new CALayerStorageProvider(this));
|
| else
|
| @@ -61,9 +62,17 @@
|
| }
|
|
|
| bool ImageTransportSurfaceFBO::DeferDraws() {
|
| - storage_provider_->WillWriteToBackbuffer();
|
| - // We should not have a pending send when we are drawing the next frame.
|
| - DCHECK(!is_swap_buffers_send_pending_);
|
| + // 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;
|
| + }
|
| return false;
|
| }
|
|
|
| @@ -92,8 +101,6 @@
|
| return true;
|
| backbuffer_suggested_allocation_ = allocation;
|
| AdjustBufferAllocation();
|
| - if (!allocation)
|
| - storage_provider_->DiscardBackbuffer();
|
| return true;
|
| }
|
|
|
| @@ -123,22 +130,18 @@
|
| 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 = surface_handle;
|
| - params.size = pixel_size;
|
| - params.scale_factor = scale_factor;
|
| + params.surface_handle = storage_provider_->GetSurfaceHandle();
|
| + params.size = GetSize();
|
| + params.scale_factor = scale_factor_;
|
| params.latency_info.swap(latency_info_);
|
| helper_->SendAcceleratedSurfaceBuffersSwapped(params);
|
| - is_swap_buffers_send_pending_ = false;
|
| +
|
| + DCHECK(!is_swap_buffers_pending_);
|
| + is_swap_buffers_pending_ = true;
|
| +
|
| + storage_provider_->WillSwapBuffers();
|
| + return true;
|
| }
|
|
|
| bool ImageTransportSurfaceFBO::PostSubBuffer(
|
| @@ -167,7 +170,16 @@
|
| void ImageTransportSurfaceFBO::OnBufferPresented(
|
| const AcceleratedSurfaceMsg_BufferPresented_Params& params) {
|
| context_->share_group()->SetRendererID(params.renderer_id);
|
| - storage_provider_->SwapBuffersAckedByBrowser();
|
| + 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);
|
| + }
|
| }
|
|
|
| void ImageTransportSurfaceFBO::OnResize(gfx::Size size,
|
|
|