// 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 #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "content/common/gpu/gpu_command_buffer_stub.h" #include "content/common/gpu/image_transport_surface.h" #include "gpu/command_buffer/common/mailbox.h" #include "gpu/command_buffer/service/texture_manager.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_surface.h" namespace content { class GpuChannelManager; class TextureImageTransportSurface : public ImageTransportSurface, public GpuCommandBufferStub::DestructionObserver, public gfx::GLSurface { public: TextureImageTransportSurface(GpuChannelManager* manager, GpuCommandBufferStub* stub, const gfx::GLSurfaceHandle& handle); // gfx::GLSurface implementation. virtual bool Initialize() OVERRIDE; virtual void Destroy() OVERRIDE; virtual bool DeferDraws() OVERRIDE; virtual bool IsOffscreen() OVERRIDE; virtual bool SwapBuffers() OVERRIDE; virtual gfx::Size GetSize() OVERRIDE; virtual void* GetHandle() OVERRIDE; virtual unsigned GetFormat() OVERRIDE; virtual bool SupportsPostSubBuffer() OVERRIDE; virtual unsigned int GetBackingFrameBufferObject() OVERRIDE; virtual bool PostSubBuffer(int x, int y, int width, int height) OVERRIDE; virtual bool 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( const AcceleratedSurfaceMsg_BufferPresented_Params& params) OVERRIDE; virtual void OnResize(gfx::Size size, float scale_factor) OVERRIDE; virtual void SetLatencyInfo( const std::vector& latency_info) OVERRIDE; virtual void WakeUpGpu() OVERRIDE; // GpuCommandBufferStub::DestructionObserver implementation. virtual void OnWillDestroyStub() OVERRIDE; private: gfx::Size backbuffer_size() const { DCHECK(backbuffer_.get()); GLsizei width = 0; GLsizei height = 0; backbuffer_->texture()->GetLevelSize(GL_TEXTURE_2D, 0, &width, &height); return gfx::Size(width, height); } virtual ~TextureImageTransportSurface(); void CreateBackTexture(); void AttachBackTextureToFBO(); void ReleaseBackTexture(); void ReleaseFrontTexture(); void BufferPresentedImpl(const gpu::Mailbox& mailbox_name); // The framebuffer that represents this surface (service id). Allocated lazily // in OnMakeCurrent. uint32 fbo_id_; // The current backbuffer. scoped_refptr backbuffer_; scoped_refptr frontbuffer_; // The mailbox name for the current backbuffer texture. Needs to be unique per // GL texture and is invalid while service_id is zero. gpu::Mailbox back_mailbox_; gpu::Mailbox front_mailbox_; // The current size of the GLSurface. Used to disambiguate from the current // texture size which might be outdated (since we use two buffers). gfx::Size current_size_; float scale_factor_; // Whether or not the command buffer stub has been destroyed. bool stub_destroyed_; bool backbuffer_suggested_allocation_; bool frontbuffer_suggested_allocation_; scoped_ptr helper_; gfx::GLSurfaceHandle handle_; // The offscreen surface used to make the context current. However note that // the actual rendering is always redirected to an FBO. scoped_refptr surface_; // Whether a SwapBuffers is pending. bool is_swap_buffers_pending_; // Whether we unscheduled command buffer because of pending SwapBuffers. bool did_unschedule_; // Holds a reference to the mailbox manager for cleanup. scoped_refptr mailbox_manager_; std::vector latency_info_; DISALLOW_COPY_AND_ASSIGN(TextureImageTransportSurface); }; } // namespace content #endif // CONTENT_COMMON_GPU_TEXTURE_IMAGE_TRANSPORT_SURFACE_H_