blob: 65954dd06e4d77d1218e0f7a52789b4cb309e503 [file] [log] [blame]
/*
* Copyright (C) 2021 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.
*/
#include "config.h"
#include "ANGLEUtilities.h"
#if ENABLE(WEBGL) && USE(ANGLE)
#include "ANGLEHeaders.h"
namespace WebCore {
#if !PLATFORM(COCOA)
bool platformIsANGLEAvailable()
{
return true;
}
#endif
ScopedRestoreTextureBinding::ScopedRestoreTextureBinding(GCGLenum bindingPointQuery, GCGLenum bindingPoint, bool condition)
{
ASSERT(bindingPoint != static_cast<GCGLenum>(0u));
if (condition) {
m_bindingPoint = bindingPoint;
GL_GetIntegerv(bindingPointQuery, reinterpret_cast<GCGLint*>(&m_bindingValue));
}
}
ScopedRestoreTextureBinding::~ScopedRestoreTextureBinding()
{
if (m_bindingPoint)
GL_BindTexture(m_bindingPoint, m_bindingValue);
}
ScopedBufferBinding::ScopedBufferBinding(GCGLenum bindingPoint, GCGLuint bindingValue, bool condition)
{
if (!condition)
return;
GL_GetIntegerv(query(bindingPoint), reinterpret_cast<GCGLint*>(&m_bindingValue));
if (bindingValue == m_bindingValue)
return;
m_bindingPoint = bindingPoint;
GL_BindBuffer(m_bindingPoint, bindingValue);
}
ScopedBufferBinding::~ScopedBufferBinding()
{
if (m_bindingPoint)
GL_BindBuffer(m_bindingPoint, m_bindingValue);
}
void ScopedRestoreReadFramebufferBinding::bindFramebuffer(GCGLuint bindingValue)
{
if (!m_bindingChanged && m_bindingValue == bindingValue)
return;
GL_BindFramebuffer(m_framebufferTarget, bindingValue);
m_bindingChanged = m_bindingValue != bindingValue;
}
ScopedRestoreReadFramebufferBinding::~ScopedRestoreReadFramebufferBinding()
{
if (m_bindingChanged)
GL_BindFramebuffer(m_framebufferTarget, m_bindingValue);
}
ScopedPixelStorageMode::ScopedPixelStorageMode(GCGLenum name, bool condition)
: m_name(condition ? name : 0)
{
if (m_name)
GL_GetIntegerv(m_name, &m_originalValue);
}
ScopedPixelStorageMode::ScopedPixelStorageMode(GCGLenum name, GCGLint value, bool condition)
: m_name(condition ? name : 0)
{
if (m_name) {
GL_GetIntegerv(m_name, &m_originalValue);
pixelStore(value);
}
}
ScopedPixelStorageMode::~ScopedPixelStorageMode()
{
if (m_name && m_valueChanged)
GL_PixelStorei(m_name, m_originalValue);
}
void ScopedPixelStorageMode::pixelStore(GCGLint value)
{
ASSERT(m_name);
if (!m_valueChanged && m_originalValue == value)
return;
GL_PixelStorei(m_name, value);
m_valueChanged = m_originalValue != value;
}
ScopedTexture::ScopedTexture()
{
GL_GenTextures(1, &m_object);
}
ScopedTexture::~ScopedTexture()
{
GL_DeleteTextures(1, &m_object);
}
ScopedFramebuffer::ScopedFramebuffer()
{
GL_GenFramebuffers(1, &m_object);
}
ScopedFramebuffer::~ScopedFramebuffer()
{
GL_DeleteFramebuffers(1, &m_object);
}
void ScopedGLFence::reset()
{
if (m_object) {
GL_DeleteSync(static_cast<GLsync>(m_object));
m_object = { };
}
}
void ScopedGLFence::fenceSync()
{
reset();
m_object = GL_FenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
}
ScopedGLCapability::ScopedGLCapability(GCGLenum capability, bool enable)
: m_capability(capability)
, m_original(GL_IsEnabled(m_capability) == enable ? std::nullopt : std::optional<bool>(!enable))
{
if (!m_original)
return;
if (enable)
GL_Enable(m_capability);
else
GL_Disable(m_capability);
}
ScopedGLCapability::~ScopedGLCapability()
{
if (!m_original)
return;
if (*m_original)
GL_Enable(m_capability);
else
GL_Disable(m_capability);
}
}
#endif