cbcf56cde2d1e28810588bcecdb5b4da0b4d2b51
[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     enum class Format {
42         RGBA,
43         YUV422,
44         RGB10,
45         RGB10A8,
46     };
47
48     WEBCORE_EXPORT static std::unique_ptr<IOSurface> create(IntSize, ColorSpace, Format = Format::RGBA);
49     WEBCORE_EXPORT static std::unique_ptr<IOSurface> create(IntSize, IntSize contextSize, ColorSpace, Format = Format::RGBA);
50     WEBCORE_EXPORT static std::unique_ptr<IOSurface> createFromSendRight(const MachSendRight&, ColorSpace);
51     static std::unique_ptr<IOSurface> createFromSurface(IOSurfaceRef, ColorSpace);
52     WEBCORE_EXPORT static std::unique_ptr<IOSurface> createFromImage(CGImageRef);
53
54     WEBCORE_EXPORT static void moveToPool(std::unique_ptr<IOSurface>&&);
55
56     static IntSize maximumSize();
57
58     WEBCORE_EXPORT MachSendRight createSendRight() const;
59
60     // Any images created from a surface need to be released before releasing
61     // the surface, or an expensive GPU readback can result.
62     WEBCORE_EXPORT RetainPtr<CGImageRef> createImage();
63
64     IOSurfaceRef surface() const { return m_surface.get(); }
65     WEBCORE_EXPORT GraphicsContext& ensureGraphicsContext();
66     WEBCORE_EXPORT CGContextRef ensurePlatformContext();
67
68     enum class SurfaceState {
69         Valid,
70         Empty
71     };
72
73     // Querying volatility can be expensive, so in cases where the surface is
74     // going to be used immediately, use the return value of setIsVolatile to
75     // determine whether the data was purged, instead of first calling state() or isVolatile().
76     SurfaceState state() const;
77     bool isVolatile() const;
78
79     // setIsVolatile only has an effect on iOS and OS 10.9 and above.
80     WEBCORE_EXPORT SurfaceState setIsVolatile(bool);
81
82     IntSize size() const { return m_size; }
83     size_t totalBytes() const { return m_totalBytes; }
84     ColorSpace colorSpace() const { return m_colorSpace; }
85     WEBCORE_EXPORT Format format() const;
86
87     WEBCORE_EXPORT bool isInUse() const;
88
89     // The graphics context cached on the surface counts as a "user", so to get
90     // an accurate result from isInUse(), it needs to be released.
91     WEBCORE_EXPORT void releaseGraphicsContext();
92
93 #if PLATFORM(IOS)
94     WEBCORE_EXPORT void copyToSurface(IOSurface&);
95     WEBCORE_EXPORT static void convertToFormat(std::unique_ptr<WebCore::IOSurface>&& inSurface, Format, std::function<void(std::unique_ptr<WebCore::IOSurface>)>);
96 #endif
97
98 private:
99     IOSurface(IntSize, ColorSpace, Format);
100     IOSurface(IntSize, IntSize contextSize, ColorSpace, Format);
101     IOSurface(IOSurfaceRef, ColorSpace);
102
103     static std::unique_ptr<IOSurface> surfaceFromPool(IntSize, IntSize contextSize, ColorSpace, Format);
104     IntSize contextSize() const { return m_contextSize; }
105     void setContextSize(IntSize);
106
107     ColorSpace m_colorSpace;
108     IntSize m_size;
109     IntSize m_contextSize;
110     size_t m_totalBytes;
111
112     std::unique_ptr<GraphicsContext> m_graphicsContext;
113     RetainPtr<CGContextRef> m_cgContext;
114
115     RetainPtr<IOSurfaceRef> m_surface;
116 };
117
118 } // namespace WebCore
119
120 #endif // USE(IOSURFACE)
121
122 #endif // IOSurface_h