From a5ffb7c279df240a07658953e1bd5df6d0480cb6 Mon Sep 17 00:00:00 2001 From: Nicolas Roard Date: Mon, 4 Oct 2010 13:37:38 -0700 Subject: GL rendering (without layers) This is a two-parts CL, Its counterpart is https://android-git.corp.google.com/g/#change,64863 Change-Id: I40fcf3b7b6d28b887b101219c973070aeefbb777 --- .../android/BackedDoubleBufferedTexture.cpp | 164 +++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp (limited to 'WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp') diff --git a/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp new file mode 100644 index 0000000..448be78 --- /dev/null +++ b/WebCore/platform/graphics/android/BackedDoubleBufferedTexture.cpp @@ -0,0 +1,164 @@ +/* + * Copyright 2010, The Android Open Source Project + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER 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 "BackedDoubleBufferedTexture.h" + +#include "BaseTile.h" +#include "GLUtils.h" + +#define LOG_NDEBUG 1 +#define LOG_TAG "BackedDoubleBufferedTexture.cpp" +#include + +namespace WebCore { + +BackedDoubleBufferedTexture::BackedDoubleBufferedTexture(uint32_t w, uint32_t h, + SkBitmap::Config config) + : DoubleBufferedTexture(eglGetCurrentContext()), + m_canvas(0), + m_width(0), + m_height(0), + m_usedLevel(-1), + m_owner(0), + m_painter(0), + m_busy(false) +{ + setBitmap(w, h, config); +} + +BackedDoubleBufferedTexture::~BackedDoubleBufferedTexture() +{ + m_bitmap.reset(); + delete m_canvas; +} + +void BackedDoubleBufferedTexture::setBitmap(uint32_t w, uint32_t h, SkBitmap::Config config) +{ + if ((m_width == w) && (m_height == h)) + return; + m_width = w; + m_height = h; + m_bitmap.reset(); + m_bitmap.setConfig(config, m_width, m_height); + m_bitmap.allocPixels(); + m_bitmap.eraseColor(0); + m_bitmap.eraseARGB(255, 255, 0, 0); + delete m_canvas; + m_canvas = new SkCanvas(m_bitmap); +} + +void BackedDoubleBufferedTexture::update(TextureInfo* textureInfo, PaintingInfo& info) +{ + if (!m_width && !m_height) + return; + + if (textureInfo && textureInfo->m_textureId) { + if (textureInfo->m_width && textureInfo->m_height + && (m_width != textureInfo->m_width) + && (m_height != textureInfo->m_height)) { + GLUtils::deleteTexture(&textureInfo->m_textureId); + glGenTextures(1, &textureInfo->m_textureId); + textureInfo->m_width = 0; + textureInfo->m_height = 0; + } + + if (!textureInfo->m_width && !textureInfo->m_height) + GLUtils::createTextureWithBitmap(textureInfo->m_textureId, m_bitmap); + else + GLUtils::updateTextureWithBitmap(textureInfo->m_textureId, m_bitmap); + + if ((m_width != textureInfo->m_width) + && (m_height != textureInfo->m_height)) { + textureInfo->m_width = m_width; + textureInfo->m_height = m_height; + } + } + m_varLock.lock(); + if (textureInfo->m_textureId == m_textureA.getSourceTextureId()) + m_paintingInfoA = info; + if (textureInfo->m_textureId == m_textureB.getSourceTextureId()) + m_paintingInfoB = info; + m_varLock.unlock(); +} + +// Compare the current texture displayed with some PaintingInfo. +bool BackedDoubleBufferedTexture::consumerTextureUpToDate(PaintingInfo& info) +{ + android::Mutex::Autolock lock(m_varLock); + if (getReadableTexture() == &m_textureA) + return info == m_paintingInfoA; + return info == m_paintingInfoB; +} + +bool BackedDoubleBufferedTexture::consumerTextureSimilar(PaintingInfo& info) +{ + android::Mutex::Autolock lock(m_varLock); + if (getReadableTexture() == &m_textureA) + return info.similar(m_paintingInfoA); + return info.similar(m_paintingInfoB); +} + +void BackedDoubleBufferedTexture::setOwner(BaseTile* owner) +{ + android::Mutex::Autolock lock(m_varLock); + if (m_owner != owner) { + if (m_owner) + m_owner->removeTexture(); + m_owner = owner; + } +} + +bool BackedDoubleBufferedTexture::acquire(BaseTile* owner) +{ + android::Mutex::Autolock lock(m_varLock); + if (m_busy) + return false; + + if (m_owner != owner) { + if (m_owner) + m_owner->removeTexture(); + m_owner = owner; + } + return true; +} + +void BackedDoubleBufferedTexture::setPainter(BaseTile* painter) +{ + android::Mutex::Autolock lock(m_varLock); + m_painter = painter; +} + +bool BackedDoubleBufferedTexture::acquireForPainting() +{ + android::Mutex::Autolock lock(m_varLock); + if (!m_busy) { + m_busy = true; + return true; + } + return false; +} + +} // namespace WebCore -- cgit v1.1