15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Canvas2DLayerBridge_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Canvas2DLayerBridge_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SkDeferredCanvas.h" 3081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "SkImage.h" 31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntSize.h" 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBufferSurface.h" 345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebExternalTextureLayer.h" 355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebExternalTextureLayerClient.h" 365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebExternalTextureMailbox.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2.h" 387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/DoublyLinkedList.h" 397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassOwnPtr.h" 40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "wtf/RefCounted.h" 417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RefPtr.h" 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class Canvas2DLayerBridgeTest; 448abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 468abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 47aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochclass ImageBuffer; 48e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class WebGraphicsContext3D; 49e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class WebGraphicsContext3DProvider; 50aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch 51e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)class PLATFORM_EXPORT Canvas2DLayerBridge : public WebExternalTextureLayerClient, public SkDeferredCanvas::NotificationClient, public DoublyLinkedListNode<Canvas2DLayerBridge>, public RefCounted<Canvas2DLayerBridge> { 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WTF_MAKE_NONCOPYABLE(Canvas2DLayerBridge); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 54a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) static PassRefPtr<Canvas2DLayerBridge> create(const IntSize&, OpacityMode, int msaaSampleCount); 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~Canvas2DLayerBridge(); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 58e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) // WebExternalTextureLayerClient implementation. 59e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual bool prepareMailbox(WebExternalTextureMailbox*, WebExternalBitmap*) OVERRIDE; 60e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) virtual void mailboxReleased(const WebExternalTextureMailbox&, bool lostResource) OVERRIDE; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // SkDeferredCanvas::NotificationClient implementation 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void prepareForDraw() OVERRIDE; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void storageAllocatedForRecordingChanged(size_t) OVERRIDE; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void flushedDrawCommands() OVERRIDE; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void skippedPendingDrawCommands() OVERRIDE; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 68a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) // ImageBufferSurface implementation 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci void finalizeFrame(const FloatRect &dirtyRect); 70e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void willAccessPixels(); 71a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) SkCanvas* canvas() const { return m_canvas.get(); } 72aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch bool checkSurfaceValid(); 73aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch bool restoreSurface(); 74e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebLayer* layer() const; 75a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) Platform3DObject getBackingTexture(); 76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) bool isAccelerated() const { return true; } 7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void setIsHidden(bool); 78aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch void setImageBuffer(ImageBuffer* imageBuffer) { m_imageBuffer = imageBuffer; } 79a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Methods used by Canvas2DLayerManager 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual size_t freeMemoryIfPossible(size_t); // virtual for mocking 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void flush(); // virtual for mocking 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual size_t storageAllocatedForRecording(); // virtual for faking 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) size_t bytesAllocated() const { return m_bytesAllocated; } 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void limitPendingFrames(); 8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void freeReleasedMailbox(); 8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool hasReleasedMailbox() const; 8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) void freeTransientResources(); 8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool hasTransientResources() const; 9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool isHidden() { return m_isHidden; } 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 92a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) void beginDestruction(); 93fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 95e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Canvas2DLayerBridge(PassOwnPtr<WebGraphicsContext3DProvider>, PassOwnPtr<SkDeferredCanvas>, PassRefPtr<SkSurface>, int, OpacityMode); 96e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void setRateLimitingEnabled(bool); 9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool releasedMailboxHasExpired(); 98e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebGraphicsContext3D* context(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 100a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) OwnPtr<SkDeferredCanvas> m_canvas; 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch RefPtr<SkSurface> m_surface; 102e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) OwnPtr<WebExternalTextureLayer> m_layer; 103e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) OwnPtr<WebGraphicsContext3DProvider> m_contextProvider; 104aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch ImageBuffer* m_imageBuffer; 105f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) int m_msaaSampleCount; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_bytesAllocated; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_didRecordDrawCommand; 108aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch bool m_isSurfaceValid; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_framesPending; 11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) int m_framesSinceMailboxRelease; 1118abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) bool m_destructionInProgress; 112e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch bool m_rateLimitingEnabled; 11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) bool m_isHidden; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) friend class WTF::DoublyLinkedListNode<Canvas2DLayerBridge>; 116a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) friend class ::Canvas2DLayerBridgeTest; 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Canvas2DLayerBridge* m_next; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Canvas2DLayerBridge* m_prev; 11981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 12081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) enum MailboxStatus { 12181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxInUse, 12281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxReleased, 12381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxAvailable, 12481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) }; 12581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 12681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) struct MailboxInfo { 127e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WebExternalTextureMailbox m_mailbox; 12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtr<SkImage> m_image; 12981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxStatus m_status; 1308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) RefPtr<Canvas2DLayerBridge> m_parentLayerBridge; 13181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 13281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxInfo(const MailboxInfo&); 13381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxInfo() {} 13481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) }; 13581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) MailboxInfo* createMailboxInfo(); 13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) MailboxInfo* releasedMailboxInfo(); 13781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) 13881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) uint32_t m_lastImageId; 13981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles) Vector<MailboxInfo> m_mailboxes; 14009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) int m_releasedMailboxInfoIndex; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace blink 144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 146