haikuwebkit/Source/WTF/wtf/UnsafePointer.h

66 lines
2.5 KiB
C
Raw Permalink Normal View History

Performance: Skip texture upload if source image and destination texture haven't changed https://bugs.webkit.org/show_bug.cgi?id=178254 <rdar://problem/34968181> Reviewed by Dean Jackson. Source/WebCore: Update GraphicsContext3D to track which texture is bound to which texture unit, and also to track when those bound textures have their backing stores modified. This new "seed" value will be used to determine whether a given texture which has previously had image data uploaded to it needs to be re-updated. In VideoTextureCopierCV, track whether the texture's seed changed, whether the IOSurface is the same, whether the IOSurface's seed has changed, and whether the "flipY" parameter changed since the last time the copier was asked to upload to the texture. * platform/graphics/GraphicsContext3D.h: (WebCore::GraphicsContext3D::textureSeed): (WebCore::GraphicsContext3D::GraphicsContext3DState::currentBoundTexture): (WebCore::GraphicsContext3D::GraphicsContext3DState::boundTexture): (WebCore::GraphicsContext3D::GraphicsContext3DState::setBoundTexture): * platform/graphics/cv/VideoTextureCopierCV.cpp: (WebCore::VideoTextureCopierCV::copyImageToPlatformTexture): * platform/graphics/cv/VideoTextureCopierCV.h: (WebCore::VideoTextureCopierCV::lastTextureSeed): * platform/graphics/opengl/GraphicsContext3DOpenGLCommon.cpp: (WebCore::GraphicsContext3D::prepareTexture): (WebCore::GraphicsContext3D::bindTexture): (WebCore::GraphicsContext3D::texStorage2D): (WebCore::GraphicsContext3D::texStorage3D): (WebCore::GraphicsContext3D::framebufferTexture2D): (WebCore::GraphicsContext3D::texSubImage2D): (WebCore::GraphicsContext3D::compressedTexImage2D): (WebCore::GraphicsContext3D::compressedTexSubImage2D): (WebCore::GraphicsContext3D::createTexture): (WebCore::GraphicsContext3D::deleteTexture): (WebCore::GraphicsContext3D::texImage2DDirect): Source/WTF: Add a new class, UnsafePointer, for safely holding pointers to objects with uncontrolled lifetimes. * WTF.xcodeproj/project.pbxproj: * wtf/UnsafePointer.h: Added. (WTF::UnsafePointer::UnsafePointer): (WTF::UnsafePointer::operator== const): (WTF::UnsafePointer::operator!= const): (WTF::UnsafePointer::operator bool const): (WTF::operator==): (WTF::operator!=): Canonical link: https://commits.webkit.org/194522@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@223315 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-10-14 02:38:09 +00:00
/*
* Copyright (C) 2017 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. AND ITS CONTRIBUTORS ``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 ITS 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
namespace WTF {
// A UnsafePointer<> can be used to hold a pointer whose lifetime is not guaranteed
// and where the dereferencing of that pointer is therefore unsafe. Once assigned
// to an UnsafePoniter<>, the pointer itself cannot be extracted from the class, but
// the class can still be used to test for pointer equality.
template<typename T>
class UnsafePointer {
public:
typedef typename std::remove_pointer<T>::type ValueType;
typedef ValueType* PtrType;
UnsafePointer() : m_pointer(nullptr) { }
UnsafePointer(PtrType pointer) : m_pointer(pointer) { }
bool operator==(PtrType pointer) const { return pointer == m_pointer; }
bool operator!=(PtrType pointer) const { return pointer != m_pointer; }
operator bool() const { return m_pointer; }
private:
PtrType m_pointer;
};
template<typename T>
bool operator==(typename UnsafePointer<T>::PtrType barePointer, const UnsafePointer<T>& unsafePointer)
{
return unsafePointer == barePointer;
}
template<typename T>
bool operator!=(typename UnsafePointer<T>::PtrType barePointer, const UnsafePointer<T>& unsafePointer)
{
return unsafePointer != barePointer;
}
} // namespace WTF
using WTF::UnsafePointer;