diff options
5 files changed, 139 insertions, 30 deletions
diff --git a/WebCore/platform/graphics/android/DeleteTextureOperation.h b/WebCore/platform/graphics/android/DeleteTextureOperation.h new file mode 100644 index 0000000..32717a0 --- /dev/null +++ b/WebCore/platform/graphics/android/DeleteTextureOperation.h @@ -0,0 +1,61 @@ +/* + * 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. + */ + +#ifndef DeleteTextureOperation_h +#define DeleteTextureOperation_h + +#include "GLUtils.h" +#include "QueuedOperation.h" + +namespace WebCore { + +class DeleteTextureOperation : public QueuedOperation { + public: + DeleteTextureOperation(GLuint textureId, EGLImageKHR eglImage) + : QueuedOperation(QueuedOperation::DeleteTexture, 0) + , m_textureId(textureId) + , m_eglImage(eglImage) {} + virtual bool operator==(const QueuedOperation* operation) + { + if (operation->type() != type()) + return false; + const DeleteTextureOperation* op = static_cast<const DeleteTextureOperation*>(operation); + return op->m_textureId == m_textureId; + } + virtual void run() + { + if (m_textureId) + GLUtils::deleteTexture(&m_textureId); + if (m_eglImage) + eglDestroyImageKHR(eglGetCurrentDisplay(), m_eglImage); + } + private: + GLuint m_textureId; + EGLImageKHR m_eglImage; +}; + +} + +#endif // DeleteTextureOperation_h diff --git a/WebCore/platform/graphics/android/PaintTileSetOperation.h b/WebCore/platform/graphics/android/PaintTileSetOperation.h new file mode 100644 index 0000000..fba7220 --- /dev/null +++ b/WebCore/platform/graphics/android/PaintTileSetOperation.h @@ -0,0 +1,61 @@ +/* + * 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. + */ + +#ifndef PaintTileSetOperation_h +#define PaintTileSetOperation_h + +#include "QueuedOperation.h" +#include "TileSet.h" + +namespace WebCore { + +class PaintTileSetOperation : public QueuedOperation { + public: + PaintTileSetOperation(TileSet* set) + : QueuedOperation(QueuedOperation::PaintTileSet, set->page()) + , m_set(set) {} + virtual ~PaintTileSetOperation() + { + delete m_set; + } + virtual bool operator==(const QueuedOperation* operation) + { + if (operation->type() != type()) + return false; + const PaintTileSetOperation* op = static_cast<const PaintTileSetOperation*>(operation); + return op->m_set == m_set; + } + virtual void run() + { + if (m_set) + m_set->paint(); + } + private: + TileSet* m_set; +}; + +} + +#endif // PaintTileSetOperation_h diff --git a/WebCore/platform/graphics/android/SharedTexture.cpp b/WebCore/platform/graphics/android/SharedTexture.cpp index b9f71c9..56f9279 100644 --- a/WebCore/platform/graphics/android/SharedTexture.cpp +++ b/WebCore/platform/graphics/android/SharedTexture.cpp @@ -24,7 +24,9 @@ */ #include "config.h" +#include "DeleteTextureOperation.h" #include "SharedTexture.h" +#include "TilesManager.h" #include "GLUtils.h" #define LOG_NDEBUG 1 @@ -71,14 +73,18 @@ SharedTexture::SharedTexture() { } // called by the consumer when it no longer wants to consume and after it has -// terminated all providers. It is up to the providers to terminate their -// textures in the case that EGLImages are used +// terminated all providers. If EGLImages are used, we schedule a delete +// operation (see DeleteTextureOperation.h) to the textures generation thread. SharedTexture::~SharedTexture() { if (m_supportsEGLImage) { - eglDestroyImageKHR(m_display, m_eglImage); - glDeleteTextures(1, &m_targetTexture.m_textureId); + GLUtils::deleteTexture(&m_targetTexture.m_textureId); + // We need to delete the EGLImage and the source texture + // in the textures generation thread. + DeleteTextureOperation* operation = new DeleteTextureOperation( + m_sourceTexture.m_textureId, m_eglImage); + TilesManager::instance()->scheduleOperation(operation); } else { - glDeleteTextures(1, &m_sourceTexture.m_textureId); + GLUtils::deleteTexture(&m_sourceTexture.m_textureId); } } diff --git a/WebCore/platform/graphics/android/TexturesGenerator.cpp b/WebCore/platform/graphics/android/TexturesGenerator.cpp index 7760fdd..836dd64 100644 --- a/WebCore/platform/graphics/android/TexturesGenerator.cpp +++ b/WebCore/platform/graphics/android/TexturesGenerator.cpp @@ -29,6 +29,7 @@ #if USE(ACCELERATED_COMPOSITING) #include "GLUtils.h" +#include "PaintTileSetOperation.h" #include "TilesManager.h" #ifdef DEBUG @@ -49,31 +50,6 @@ namespace WebCore { -class PaintTileSetOperation : public QueuedOperation { - public: - PaintTileSetOperation(TileSet* set) - : QueuedOperation(QueuedOperation::PaintTileSet, set->page()) - , m_set(set) {} - virtual ~PaintTileSetOperation() - { - delete m_set; - } - virtual bool operator==(const QueuedOperation* operation) - { - if (operation->type() != type()) - return false; - const PaintTileSetOperation* op = static_cast<const PaintTileSetOperation*>(operation); - return op->m_set == m_set; - } - virtual void run() - { - if (m_set) - m_set->paint(); - } - private: - TileSet* m_set; -}; - void TexturesGenerator::schedulePaintForTileSet(TileSet* set) { PaintTileSetOperation* operation = new PaintTileSetOperation(set); diff --git a/WebCore/platform/graphics/android/TilesManager.h b/WebCore/platform/graphics/android/TilesManager.h index 2ca2b49..1a3eb05 100644 --- a/WebCore/platform/graphics/android/TilesManager.h +++ b/WebCore/platform/graphics/android/TilesManager.h @@ -53,6 +53,11 @@ public: m_pixmapsGenerationThread->removeOperationsForPage(page); } + void scheduleOperation(QueuedOperation* operation) + { + m_pixmapsGenerationThread->scheduleOperation(operation); + } + ShaderProgram* shader() { return &m_shader; } BackedDoubleBufferedTexture* getAvailableTexture(BaseTile* owner); |