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