[CG] Have Canvas use the IOSurfacePool
[WebKit-https.git] / Source / WebCore / platform / graphics / cocoa / IOSurface.h
1 /*
2  * Copyright (C) 2014 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IOSurface_h
27 #define IOSurface_h
28
29 #if USE(IOSURFACE)
30
31 #include "GraphicsContext.h"
32 #include "IntSize.h"
33 #include <wtf/PassRefPtr.h>
34
35 namespace WebCore {
36
37 class MachSendRight;
38
39 class IOSurface final {
40 public:
41     WEBCORE_EXPORT static std::unique_ptr<IOSurface> create(IntSize, ColorSpace);
42     WEBCORE_EXPORT static std::unique_ptr<IOSurface> create(IntSize, IntSize contextSize, ColorSpace);
43     WEBCORE_EXPORT static std::unique_ptr<IOSurface> createFromSendRight(const MachSendRight&, ColorSpace);
44     static std::unique_ptr<IOSurface> createFromSurface(IOSurfaceRef, ColorSpace);
45     WEBCORE_EXPORT static std::unique_ptr<IOSurface> createFromImage(CGImageRef);
46
47     static IntSize maximumSize();
48
49     WEBCORE_EXPORT MachSendRight createSendRight() const;
50
51     // Any images created from a surface need to be released before releasing
52     // the surface, or an expensive GPU readback can result.
53     WEBCORE_EXPORT RetainPtr<CGImageRef> createImage();
54
55     IOSurfaceRef surface() const { return m_surface.get(); }
56     WEBCORE_EXPORT GraphicsContext& ensureGraphicsContext();
57     WEBCORE_EXPORT CGContextRef ensurePlatformContext();
58
59     enum class SurfaceState {
60         Valid,
61         Empty
62     };
63
64     // Querying volatility can be expensive, so in cases where the surface is
65     // going to be used immediately, use the return value of setIsVolatile to
66     // determine whether the data was purged, instead of first calling state() or isVolatile().
67     SurfaceState state() const;
68     bool isVolatile() const;
69
70     // setIsVolatile only has an effect on iOS and OS 10.9 and above.
71     WEBCORE_EXPORT SurfaceState setIsVolatile(bool);
72
73     IntSize size() const { return m_size; }
74     size_t totalBytes() const { return m_totalBytes; }
75     ColorSpace colorSpace() const { return m_colorSpace; }
76
77     WEBCORE_EXPORT bool isInUse() const;
78
79     // The graphics context cached on the surface counts as a "user", so to get
80     // an accurate result from isInUse(), it needs to be released.
81     WEBCORE_EXPORT void releaseGraphicsContext();
82
83 private:
84     IOSurface(IntSize, ColorSpace);
85     IOSurface(IntSize, IntSize contextSize, ColorSpace);
86     IOSurface(IOSurfaceRef, ColorSpace);
87
88     static std::unique_ptr<IOSurface> surfaceFromPool(IntSize, IntSize contextSize, ColorSpace);
89     IntSize contextSize() const { return m_contextSize; }
90     void setContextSize(IntSize);
91
92     ColorSpace m_colorSpace;
93     IntSize m_size;
94     IntSize m_contextSize;
95     size_t m_totalBytes;
96
97     OwnPtr<GraphicsContext> m_graphicsContext;
98     RetainPtr<CGContextRef> m_cgContext;
99
100     RetainPtr<IOSurfaceRef> m_surface;
101 };
102
103 } // namespace WebCore
104
105 #endif // USE(IOSURFACE)
106
107 #endif // IOSurface_h