summaryrefslogtreecommitdiffstats
path: root/WebCore
diff options
context:
space:
mode:
authorNicolas Roard <nicolas@android.com>2010-12-08 14:47:40 -0800
committerNicolas Roard <nicolas@android.com>2010-12-08 14:49:38 -0800
commitca545d559ae83b77f092246a390b463ff7b6901d (patch)
treec1f2ce0c93c7f5c8a16a4e6e762b13418012f950 /WebCore
parent1f77d3c65df83217526caa2170b295c52a30416f (diff)
downloadexternal_webkit-ca545d559ae83b77f092246a390b463ff7b6901d.zip
external_webkit-ca545d559ae83b77f092246a390b463ff7b6901d.tar.gz
external_webkit-ca545d559ae83b77f092246a390b463ff7b6901d.tar.bz2
Add a DeleteTextureOperation class and use it in SharedTexture
Change-Id: If0fd058911d84263b4f6257bf19cf6b2132c029a
Diffstat (limited to 'WebCore')
-rw-r--r--WebCore/platform/graphics/android/DeleteTextureOperation.h61
-rw-r--r--WebCore/platform/graphics/android/PaintTileSetOperation.h61
-rw-r--r--WebCore/platform/graphics/android/SharedTexture.cpp16
-rw-r--r--WebCore/platform/graphics/android/TexturesGenerator.cpp26
-rw-r--r--WebCore/platform/graphics/android/TilesManager.h5
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);