12fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/* 22fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Copyright (C) 2011 Apple Inc. All rights reserved. 32fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 42fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * Redistribution and use in source and binary forms, with or without 52fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * modification, are permitted provided that the following conditions 62fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * are met: 72fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 1. Redistributions of source code must retain the above copyright 82fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * notice, this list of conditions and the following disclaimer. 92fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 2. Redistributions in binary form must reproduce the above copyright 102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * notice, this list of conditions and the following disclaimer in the 112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * documentation and/or other materials provided with the distribution. 122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * 132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 152fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block * THE POSSIBILITY OF SUCH DAMAGE. 242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block */ 252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#ifndef ShareableSurface_h 272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#define ShareableSurface_h 282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <WebCore/IntSize.h> 302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/Noncopyable.h> 312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/PassRefPtr.h> 322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/RefCounted.h> 332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <wtf/RetainPtr.h> 342fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktypedef struct _CGLContextObject* CGLContextObj; 362fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktypedef struct __IOSurface* IOSurfaceRef; 372fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 382fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace CoreIPC { 392fc2651226baac27029e38c9d6ef883fa32084dbSteve Block class ArgumentDecoder; 402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block class ArgumentEncoder; 412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 432fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocknamespace WebKit { 442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 452fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass ShareableSurface : public RefCounted<ShareableSurface> { 462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockpublic: 472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block class Handle { 482fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WTF_MAKE_NONCOPYABLE(Handle); 492fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block public: 512fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Handle(); 522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ~Handle(); 532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void encode(CoreIPC::ArgumentEncoder*) const; 552fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static bool decode(CoreIPC::ArgumentDecoder*, Handle&); 562fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block private: 582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block friend class ShareableSurface; 592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 602fc2651226baac27029e38c9d6ef883fa32084dbSteve Block mutable mach_port_t m_port; 612fc2651226baac27029e38c9d6ef883fa32084dbSteve Block }; 622fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Create a shareable surface with the given size. Returns 0 on failure. 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static PassRefPtr<ShareableSurface> create(CGLContextObj, const WebCore::IntSize&); 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Create a shareable surface from a handle. Returns 0 on failure. 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static PassRefPtr<ShareableSurface> create(CGLContextObj, const Handle&); 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ~ShareableSurface(); 702fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool createHandle(Handle&); 722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 732fc2651226baac27029e38c9d6ef883fa32084dbSteve Block unsigned textureID(); 742fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 752fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void attach(); 762fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void detach(); 772fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 782fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockprivate: 792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block ShareableSurface(CGLContextObj, const WebCore::IntSize&, IOSurfaceRef); 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The OpenGL context. 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block CGLContextObj m_cglContextObj; 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The size of the surface. 852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WebCore::IntSize m_size; 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The ID of the texture. 882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block unsigned m_textureID; 892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The frame buffer object ID of the texture; used when the surface is used as a render destination. 912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block unsigned m_frameBufferObjectID; 922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RetainPtr<IOSurfaceRef> m_ioSurface; 942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}; 952fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} // namespace WebKit 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif // ShareableSurface_h 99