RemoteGraphicsContextGLCocoa.cpp [plain text]
#include "config.h"
#include "RemoteGraphicsContextGL.h"
#if ENABLE(GPU_PROCESS) && ENABLE(WEBGL) && PLATFORM(COCOA)
#include "GPUConnectionToWebProcess.h"
#include <WebCore/GraphicsContextGLIOSurfaceSwapChain.h>
#include <wtf/MachSendRight.h>
namespace WebKit {
using namespace WebCore;
namespace {
class RemoteGraphicsContextGLCocoa final : public RemoteGraphicsContextGL, private WebCore::GraphicsContextGLIOSurfaceSwapChain {
public:
RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes&, GPUConnectionToWebProcess&, GraphicsContextGLIdentifier);
~RemoteGraphicsContextGLCocoa() final = default;
void prepareForDisplay(CompletionHandler<void(WTF::MachSendRight&&)>&&) final;
Buffer recycleBuffer() final;
void present(Buffer) final;
const Buffer& displayBuffer() const final;
void* detachClient() final;
private:
GraphicsContextGLIOSurfaceSwapChain::Buffer m_displayBuffer;
};
}
std::unique_ptr<RemoteGraphicsContextGL> RemoteGraphicsContextGL::create(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& gpuConnectionToWebProcess, GraphicsContextGLIdentifier graphicsContextGLIdentifier)
{
return std::unique_ptr<RemoteGraphicsContextGL>(new RemoteGraphicsContextGLCocoa(attributes, gpuConnectionToWebProcess, graphicsContextGLIdentifier));
}
RemoteGraphicsContextGLCocoa::RemoteGraphicsContextGLCocoa(const WebCore::GraphicsContextGLAttributes& attributes, GPUConnectionToWebProcess& connection, GraphicsContextGLIdentifier identifier)
: RemoteGraphicsContextGL(attributes, connection, identifier, GraphicsContextGLOpenGL::createForGPUProcess(attributes, this))
{
}
GraphicsContextGLIOSurfaceSwapChain::Buffer RemoteGraphicsContextGLCocoa::recycleBuffer()
{
return WTFMove(m_displayBuffer);
}
void RemoteGraphicsContextGLCocoa::present(Buffer buffer)
{
ASSERT(!m_displayBuffer.surface);
m_displayBuffer = WTFMove(buffer);
}
const GraphicsContextGLIOSurfaceSwapChain::Buffer& RemoteGraphicsContextGLCocoa::displayBuffer() const
{
return m_displayBuffer;
}
void* RemoteGraphicsContextGLCocoa::detachClient()
{
return std::exchange(m_displayBuffer.handle, nullptr);
}
void RemoteGraphicsContextGLCocoa::prepareForDisplay(CompletionHandler<void(WTF::MachSendRight&&)>&& completionHandler)
{
m_context->prepareForDisplay();
auto displayBuffer = WTFMove(m_displayBuffer.surface);
MachSendRight sendRight;
if (displayBuffer)
sendRight = displayBuffer->createSendRight();
completionHandler(WTFMove(sendRight));
}
}
#endif