blob: 3876ae7378d7d703c531237cc2f5f0c9cffe957f [file] [log] [blame]
/*
* Copyright (C) 2009, 2014-2019 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
#if ENABLE(WEBGL) && PLATFORM(COCOA)
#include "IOSurface.h"
#include <memory>
namespace WebCore {
// An interface for implementing front buffer management of a 3-buffering swap
// chain of IOSurfaces.
// The implementor will own the IOSurfaces it uses for display.
// The client may attach metadata to each IOSurface and will receive the metadata
// back once the IOSurface has been displayed. However, the client may not neccessarily
// be able to obtain the IOSurface itself for reuse.
// Example use of the metadata is to use EGLSurface binding as the metadata. This way
// when the display client is done with the IOSurface display, the client can continue using
// the existing binding obtained through the buffer recycle logic.
class WEBCORE_EXPORT GraphicsContextGLIOSurfaceSwapChain {
public:
virtual ~GraphicsContextGLIOSurfaceSwapChain();
struct Buffer {
// The actual contents. Client transfers the ownership of the IOSurface.
std::unique_ptr<WebCore::IOSurface> surface;
// Producer specific metadata handle (such as EGLSurface). Client does not transfer the ownership.
void* handle { nullptr };
};
// Returns the metadata handle of last unused contents buffer.
// Client may recieve back also the ownership of the contents surface, in case it is available at the
// time of the call.
// Returns either:
// - Empty buffer if no buffer has been submitted.
// - Buffer with empty surface and non-empty metadata handle if the recycled buffer was available
// but the surface is still in use.
// - Surface and handle.
virtual Buffer recycleBuffer();
// Prepares the target for display with a contents buffer.
virtual void present(Buffer&&);
// Returns the most recent presented display buffer. The reference is valid until
// next present, recycleBuffer or detachClient call.
virtual const Buffer& displayBuffer() const;
// Marks the current display buffer to be in use and not eligble to recycling.
void markDisplayBufferInUse();
// Detaches the client and returns the current contents buffer metadata handle.
// The if multiple buffers have been submitted, recycleBuffer must have been called before calling
// this.
virtual void* detachClient();
protected:
Buffer m_displayBuffer;
Buffer m_spareBuffer;
bool m_displayBufferInUse = false;
};
}
#endif