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