| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_COMMON_GPU_TEXTURE_IMAGE_TRANSPORT_SURFACE_H_ |
| #define CONTENT_COMMON_GPU_TEXTURE_IMAGE_TRANSPORT_SURFACE_H_ |
| |
| #include "base/basictypes.h" |
| #include "base/memory/weak_ptr.h" |
| #include "content/common/gpu/gpu_command_buffer_stub.h" |
| #include "content/common/gpu/image_transport_surface.h" |
| #include "gpu/command_buffer/service/texture_manager.h" |
| #include "ui/gl/gl_surface.h" |
| |
| class GpuChannelManager; |
| |
| class TextureImageTransportSurface : |
| public ImageTransportSurface, |
| public GpuCommandBufferStub::DestructionObserver, |
| public gfx::GLSurface, |
| public base::SupportsWeakPtr<TextureImageTransportSurface> { |
| public: |
| TextureImageTransportSurface(GpuChannelManager* manager, |
| GpuCommandBufferStub* stub, |
| const gfx::GLSurfaceHandle& handle); |
| |
| // gfx::GLSurface implementation. |
| virtual bool Initialize() OVERRIDE; |
| virtual void Destroy() OVERRIDE; |
| virtual bool Resize(const gfx::Size& size) OVERRIDE; |
| virtual bool IsOffscreen() OVERRIDE; |
| virtual bool SwapBuffers() OVERRIDE; |
| virtual gfx::Size GetSize() OVERRIDE; |
| virtual void* GetHandle() OVERRIDE; |
| virtual unsigned GetFormat() OVERRIDE; |
| virtual std::string GetExtensions() OVERRIDE; |
| virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; |
| virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; |
| virtual bool OnMakeCurrent(gfx::GLContext* context) OVERRIDE; |
| virtual void SetBackbufferAllocation(bool allocated) OVERRIDE; |
| virtual void SetFrontbufferAllocation(bool allocated) OVERRIDE; |
| virtual void* GetShareHandle() OVERRIDE; |
| virtual void* GetDisplay() OVERRIDE; |
| virtual void* GetConfig() OVERRIDE; |
| |
| protected: |
| // ImageTransportSurface implementation. |
| virtual void OnBufferPresented( |
| uint32 sync_point) OVERRIDE; |
| virtual void OnResizeViewACK() OVERRIDE; |
| virtual void OnSetFrontSurfaceIsProtected( |
| bool is_protected, |
| uint32 protection_state_id) OVERRIDE; |
| virtual void OnResize(gfx::Size size) OVERRIDE; |
| |
| // GpuCommandBufferStub::DestructionObserver implementation. |
| virtual void OnWillDestroyStub(GpuCommandBufferStub* stub) OVERRIDE; |
| |
| private: |
| // A texture backing the front/back buffer in the parent stub. |
| struct Texture { |
| Texture(); |
| ~Texture(); |
| |
| // The client-side id in the parent stub. |
| uint32 client_id; |
| |
| // The currently allocated size. |
| gfx::Size size; |
| |
| // Whether or not that texture has been sent to the client yet. |
| bool sent_to_client; |
| |
| // The texture info in the parent stub. |
| gpu::gles2::TextureManager::TextureInfo::Ref info; |
| }; |
| |
| virtual ~TextureImageTransportSurface(); |
| void CreateBackTexture(const gfx::Size& size); |
| void AttachBackTextureToFBO(); |
| void ReleaseTexture(int id); |
| void ReleaseParentStub(); |
| void AdjustFrontBufferAllocation(); |
| void BufferPresentedImpl(); |
| int front() const { return front_; } |
| int back() const { return 1 - front_; } |
| |
| // The framebuffer that represents this surface (service id). Allocated lazily |
| // in OnMakeCurrent. |
| uint32 fbo_id_; |
| |
| // The front and back buffers. |
| Texture textures_[2]; |
| |
| gfx::Rect previous_damage_rect_; |
| |
| // Indicates which of the 2 above is the front buffer. |
| int front_; |
| |
| // Whether or not the command buffer stub has been destroyed. |
| bool stub_destroyed_; |
| |
| bool backbuffer_suggested_allocation_; |
| bool frontbuffer_suggested_allocation_; |
| |
| bool frontbuffer_is_protected_; |
| uint32 protection_state_id_; |
| |
| scoped_ptr<ImageTransportHelper> helper_; |
| gfx::GLSurfaceHandle handle_; |
| GpuCommandBufferStub* parent_stub_; |
| |
| // The offscreen surface used to make the context current. However note that |
| // the actual rendering is always redirected to an FBO. |
| scoped_refptr<GLSurface> surface_; |
| |
| DISALLOW_COPY_AND_ASSIGN(TextureImageTransportSurface); |
| }; |
| |
| #endif // CONTENT_COMMON_GPU_TEXTURE_IMAGE_TRANSPORT_SURFACE_H_ |