1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200
|
/*
* Copyright (C) 2013-2018 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "ImageBufferBackendHandle.h"
#include <WebCore/FloatRect.h>
#include <WebCore/IOSurface.h>
#include <WebCore/Region.h>
#include <wtf/MachSendRight.h>
#include <wtf/MonotonicTime.h>
OBJC_CLASS CALayer;
// FIXME: Make PlatformCALayerRemote.cpp Objective-C so we can include WebLayer.h here and share the typedef.
namespace WebCore {
class NativeImage;
class ThreadSafeImageBufferFlusher;
typedef Vector<WebCore::FloatRect, 5> RepaintRectList;
}
namespace WebKit {
class PlatformCALayerRemote;
class RemoteLayerBackingStoreCollection;
class RemoteLayerBackingStore {
WTF_MAKE_NONCOPYABLE(RemoteLayerBackingStore);
WTF_MAKE_FAST_ALLOCATED;
public:
RemoteLayerBackingStore(PlatformCALayerRemote*);
~RemoteLayerBackingStore();
enum class Type : uint8_t {
IOSurface,
Bitmap
};
enum class IncludeDisplayList : bool { No, Yes };
void ensureBackingStore(Type, WebCore::FloatSize, float scale, bool deepColor, bool isOpaque, IncludeDisplayList);
void setNeedsDisplay(const WebCore::IntRect);
void setNeedsDisplay();
void setContents(WTF::MachSendRight&& surfaceHandle);
// Returns true if the backing store changed.
bool display();
WebCore::FloatSize size() const { return m_size; }
float scale() const { return m_scale; }
WebCore::PixelFormat pixelFormat() const;
Type type() const { return m_type; }
bool isOpaque() const { return m_isOpaque; }
unsigned bytesPerPixel() const;
PlatformCALayerRemote* layer() const { return m_layer; }
enum class LayerContentsType { IOSurface, CAMachPort };
void applyBackingStoreToLayer(CALayer *, LayerContentsType, bool replayCGDisplayListsIntoBackingStore);
void encode(IPC::Encoder&) const;
static WARN_UNUSED_RETURN bool decode(IPC::Decoder&, RemoteLayerBackingStore&);
void enumerateRectsBeingDrawn(WebCore::GraphicsContext&, void (^)(WebCore::FloatRect));
bool hasFrontBuffer() const
{
return m_contentsBufferHandle || !!m_frontBuffer.imageBuffer;
}
// Just for RemoteBackingStoreCollection.
void applySwappedBuffers(RefPtr<WebCore::ImageBuffer>&& front, RefPtr<WebCore::ImageBuffer>&& back, RefPtr<WebCore::ImageBuffer>&& secondaryBack, bool frontBufferNeedsDisplay);
void swapToValidFrontBuffer();
Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> takePendingFlushers();
enum class BufferType {
Front,
Back,
SecondaryBack
};
void willMakeBufferVolatile(BufferType);
void didMakeFrontBufferNonVolatile(WebCore::VolatilityState);
RefPtr<WebCore::ImageBuffer> bufferForType(BufferType) const;
// Returns true if it was able to fulfill the request. This can fail when trying to mark an in-use surface as volatile.
bool setBufferVolatility(BufferType, bool isVolatile);
MonotonicTime lastDisplayTime() const { return m_lastDisplayTime; }
void clearBackingStore();
private:
RemoteLayerBackingStoreCollection* backingStoreCollection() const;
void drawInContext(WebCore::GraphicsContext&);
struct Buffer {
RefPtr<WebCore::ImageBuffer> imageBuffer;
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
RefPtr<WebCore::ImageBuffer> displayListImageBuffer;
#endif
// FIXME: This flag needs to be part of ImageBuffer[Backend]. Currently it's not correctly maintained
// in the GPU Process code path.
bool isVolatile = false;
explicit operator bool() const
{
return !!imageBuffer;
}
void discard();
};
bool setBufferVolatile(Buffer&);
WebCore::VolatilityState setBufferNonVolatile(Buffer&);
void swapBuffers();
bool supportsPartialRepaint() const;
PlatformCALayerRemote* m_layer;
WebCore::FloatSize m_size;
float m_scale { 1.0f };
bool m_isOpaque { false };
WebCore::Region m_dirtyRegion;
// Used in the WebContent Process.
Buffer m_frontBuffer;
Buffer m_backBuffer;
Buffer m_secondaryBackBuffer;
// Used in the UI Process.
std::optional<ImageBufferBackendHandle> m_bufferHandle;
// FIXME: This should be removed and m_bufferHandle should be used to ref the buffer once ShareableBitmap::Handle
// can be encoded multiple times. http://webkit.org/b/234169
std::optional<MachSendRight> m_contentsBufferHandle;
#if ENABLE(CG_DISPLAY_LIST_BACKED_IMAGE_BUFFER)
std::optional<ImageBufferBackendHandle> m_displayListBufferHandle;
#endif
Vector<std::unique_ptr<WebCore::ThreadSafeImageBufferFlusher>> m_frontBufferFlushers;
Type m_type;
IncludeDisplayList m_includeDisplayList { IncludeDisplayList::No };
bool m_deepColor { false };
WebCore::RepaintRectList m_paintingRects;
MonotonicTime m_lastDisplayTime;
};
} // namespace WebKit
namespace WTF {
template<> struct EnumTraits<WebKit::RemoteLayerBackingStore::Type> {
using values = EnumValues<
WebKit::RemoteLayerBackingStore::Type,
WebKit::RemoteLayerBackingStore::Type::IOSurface,
WebKit::RemoteLayerBackingStore::Type::Bitmap
>;
};
template<> struct EnumTraits<WebKit::RemoteLayerBackingStore::IncludeDisplayList> {
using values = EnumValues<
WebKit::RemoteLayerBackingStore::IncludeDisplayList,
WebKit::RemoteLayerBackingStore::IncludeDisplayList::No,
WebKit::RemoteLayerBackingStore::IncludeDisplayList::Yes
>;
};
} // namespace WTF
|