Make WebCore::IOSurface have single ownership instead of refcounting
[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> createFromSendRight(const MachSendRight&, ColorSpace);
43     static std::unique_ptr<IOSurface> createFromSurface(IOSurfaceRef, ColorSpace);
44     WEBCORE_EXPORT static std::unique_ptr<IOSurface> createFromImage(CGImageRef);
45
46     static IntSize maximumSize();
47
48     WEBCORE_EXPORT MachSendRight createSendRight() const;
49
50     // Any images created from a surface need to be released before releasing
51     // the surface, or an expensive GPU readback can result.
52     WEBCORE_EXPORT RetainPtr<CGImageRef> createImage();
53
54     IOSurfaceRef surface() const { return m_surface.get(); }
55     WEBCORE_EXPORT GraphicsContext& ensureGraphicsContext();
56     WEBCORE_EXPORT CGContextRef ensurePlatformContext();
57
58     enum class SurfaceState {
59         Valid,
60         Empty
61     };
62
63     // Querying volatility can be expensive, so in cases where the surface is
64     // going to be used immediately, use the return value of setIsVolatile to
65     // determine whether the data was purged, instead of first calling state() or isVolatile().
66     SurfaceState state() const;
67     bool isVolatile() const;
68
69     // setIsVolatile only has an effect on iOS and OS 10.9 and above.
70     WEBCORE_EXPORT SurfaceState setIsVolatile(bool);
71
72     IntSize size() const { return m_size; }
73     size_t totalBytes() const { return m_totalBytes; }
74     ColorSpace colorSpace() const { return m_colorSpace; }
75
76     WEBCORE_EXPORT bool isInUse() const;
77
78     // The graphics context cached on the surface counts as a "user", so to get
79     // an accurate result from isInUse(), it needs to be released.
80     WEBCORE_EXPORT void releaseGraphicsContext();
81
82 private:
83     IOSurface(IntSize, ColorSpace);
84     IOSurface(IOSurfaceRef, ColorSpace);
85
86     ColorSpace m_colorSpace;
87     IntSize m_size;
88     size_t m_totalBytes;
89
90     OwnPtr<GraphicsContext> m_graphicsContext;
91     RetainPtr<CGContextRef> m_cgContext;
92
93     RetainPtr<IOSurfaceRef> m_surface;
94 };
95
96 } // namespace WebCore
97
98 #endif // USE(IOSURFACE)
99
100 #endif // IOSurface_h