1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CONTENT_COMMON_GPU_IMAGE_TRANSPORT_SURFACE_FBO_MAC_H_
6 #define CONTENT_COMMON_GPU_IMAGE_TRANSPORT_SURFACE_FBO_MAC_H_
8 #include "base/mac/scoped_cftyperef.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "content/common/gpu/gpu_command_buffer_stub.h"
11 #include "content/common/gpu/image_transport_surface.h"
12 #include "ui/gl/gl_bindings.h"
16 // We are backed by an offscreen surface for the purposes of creating
17 // a context, but use FBOs to render to texture. The texture may be backed by
18 // an IOSurface, or it may be presented to the screen via a CALayer, depending
19 // on the StorageProvider class specified.
20 class ImageTransportSurfaceFBO
21 : public gfx::GLSurface,
22 public ImageTransportSurface,
23 public GpuCommandBufferStub::DestructionObserver {
25 // The interface through which storage for the color buffer of the FBO is
27 class StorageProvider {
29 virtual ~StorageProvider() {}
30 // IOSurfaces cause too much address space fragmentation if they are
31 // allocated on every resize. This gets a rounded size for allocation.
32 virtual gfx::Size GetRoundedSize(gfx::Size size) = 0;
34 // Allocate the storage for the color buffer. The specified context is
35 // current, and there is a texture bound to GL_TEXTURE_RECTANGLE_ARB.
36 virtual bool AllocateColorBufferStorage(
37 CGLContextObj context, GLuint texture,
38 gfx::Size size, float scale_factor) = 0;
40 // Free the storage allocated in the AllocateColorBufferStorage call. The
41 // GL texture that was bound has already been deleted by the caller.
42 virtual void FreeColorBufferStorage() = 0;
44 // Swap buffers and return the handle for the surface to send to the browser
45 // process to display.
46 virtual void SwapBuffers(const gfx::Size& size, float scale_factor) = 0;
48 // Indicate that the backbuffer will be written to.
49 virtual void WillWriteToBackbuffer() = 0;
51 // Indicate that the backbuffer has been discarded and should not be seen
53 virtual void DiscardBackbuffer() = 0;
55 // Called once for every SwapBuffers call when the IPC for the present has
56 // been processed by the browser.
57 virtual void SwapBuffersAckedByBrowser() = 0;
60 ImageTransportSurfaceFBO(GpuChannelManager* manager,
61 GpuCommandBufferStub* stub,
62 gfx::PluginWindowHandle handle);
64 // GLSurface implementation
65 virtual bool Initialize() OVERRIDE;
66 virtual void Destroy() OVERRIDE;
67 virtual bool DeferDraws() OVERRIDE;
68 virtual bool IsOffscreen() OVERRIDE;
69 virtual bool SwapBuffers() OVERRIDE;
70 virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE;
71 virtual bool SupportsPostSubBuffer() OVERRIDE;
72 virtual gfx::Size GetSize() OVERRIDE;
73 virtual void* GetHandle() OVERRIDE;
74 virtual void* GetDisplay() OVERRIDE;
75 virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE;
76 virtual unsigned int GetBackingFrameBufferObject() OVERRIDE;
77 virtual bool SetBackbufferAllocation(bool allocated) OVERRIDE;
78 virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE;
80 // Called when the context may continue to make forward progress after a swap.
81 void SendSwapBuffers(uint64 surface_handle,
82 const gfx::Size pixel_size,
86 // ImageTransportSurface implementation
87 virtual void OnBufferPresented(
88 const AcceleratedSurfaceMsg_BufferPresented_Params& params) OVERRIDE;
89 virtual void OnResize(gfx::Size size, float scale_factor) OVERRIDE;
90 virtual void SetLatencyInfo(
91 const std::vector<ui::LatencyInfo>&) OVERRIDE;
92 virtual void WakeUpGpu() OVERRIDE;
94 // GpuCommandBufferStub::DestructionObserver implementation.
95 virtual void OnWillDestroyStub() OVERRIDE;
98 virtual ~ImageTransportSurfaceFBO() OVERRIDE;
100 void AdjustBufferAllocation();
101 void DestroyFramebuffer();
102 void CreateFramebuffer();
104 scoped_ptr<StorageProvider> storage_provider_;
106 // Tracks the current buffer allocation state.
107 bool backbuffer_suggested_allocation_;
108 bool frontbuffer_suggested_allocation_;
112 GLuint depth_stencil_renderbuffer_id_;
113 bool has_complete_framebuffer_;
115 // Weak pointer to the context that this was last made current to.
116 gfx::GLContext* context_;
119 gfx::Size rounded_size_;
122 // Whether or not we've successfully made the surface current once.
125 // Whether a SwapBuffers IPC needs to be sent to the browser.
126 bool is_swap_buffers_send_pending_;
127 std::vector<ui::LatencyInfo> latency_info_;
129 scoped_ptr<ImageTransportHelper> helper_;
131 DISALLOW_COPY_AND_ASSIGN(ImageTransportSurfaceFBO);
134 } // namespace content
136 #endif // CONTENT_COMMON_GPU_IMAGE_TRANSPORT_SURFACE_MAC_H_