diff options
author | Liang Qi <liang.qi@qt.io> | 2016-08-13 13:53:51 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2016-08-13 13:53:59 +0200 |
commit | 820205e604a5f281238c23464638fdff72b969d1 (patch) | |
tree | c6f6723449d1b11e8d540752e50e3c2e11613f33 /src/plugins/android/src/common | |
parent | 03d55888942feac26054978ce4e7c6edd4611eda (diff) | |
parent | c30eeb5b7486caa31cdb0f9279de2f78fed89c54 (diff) |
Merge remote-tracking branch 'origin/5.6' into 5.7
Change-Id: I3204cdf695f4b47730a88a7c41fc7a6de967b161
Diffstat (limited to 'src/plugins/android/src/common')
-rw-r--r-- | src/plugins/android/src/common/qandroidvideooutput.cpp | 82 | ||||
-rw-r--r-- | src/plugins/android/src/common/qandroidvideooutput.h | 16 |
2 files changed, 47 insertions, 51 deletions
diff --git a/src/plugins/android/src/common/qandroidvideooutput.cpp b/src/plugins/android/src/common/qandroidvideooutput.cpp index a5cd3580b..1d0df27f2 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.cpp +++ b/src/plugins/android/src/common/qandroidvideooutput.cpp @@ -66,6 +66,22 @@ static const GLfloat g_texture_data[] = { 0.f, 1.f }; +void OpenGLResourcesDeleter::deleteTextureHelper(quint32 id) +{ + if (id != 0) + glDeleteTextures(1, &id); +} + +void OpenGLResourcesDeleter::deleteFboHelper(void *fbo) +{ + delete reinterpret_cast<QOpenGLFramebufferObject *>(fbo); +} + +void OpenGLResourcesDeleter::deleteShaderProgramHelper(void *prog) +{ + delete reinterpret_cast<QOpenGLShaderProgram *>(prog); +} + class AndroidTextureVideoBuffer : public QAbstractVideoBuffer { @@ -130,40 +146,6 @@ private: QImage m_image; }; - -class OpenGLResourcesDeleter : public QObject -{ -public: - OpenGLResourcesDeleter() - : m_textureID(0) - , m_fbo(0) - , m_program(0) - { } - - ~OpenGLResourcesDeleter() - { - glDeleteTextures(1, &m_textureID); - delete m_fbo; - delete m_program; - } - - void setTexture(quint32 id) { - if (m_textureID) - glDeleteTextures(1, &m_textureID); - - m_textureID = id; - } - - void setFbo(QOpenGLFramebufferObject *fbo) { m_fbo = fbo; } - void setShaderProgram(QOpenGLShaderProgram *prog) { m_program = prog; } - -private: - quint32 m_textureID; - QOpenGLFramebufferObject *m_fbo; - QOpenGLShaderProgram *m_program; -}; - - QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QObject *parent) : QAndroidVideoOutput(parent) , m_surface(0) @@ -171,7 +153,6 @@ QAndroidTextureVideoOutput::QAndroidTextureVideoOutput(QObject *parent) , m_externalTex(0) , m_fbo(0) , m_program(0) - , m_glDeleter(0) , m_surfaceTextureCanAttachToContext(QtAndroidPrivate::androidSdkVersion() >= 16) { @@ -181,8 +162,12 @@ QAndroidTextureVideoOutput::~QAndroidTextureVideoOutput() { clearSurfaceTexture(); - if (m_glDeleter) + if (!m_glDeleter.isNull()) { // Make sure all of these are deleted on the render thread. + m_glDeleter->deleteFbo(m_fbo); + m_glDeleter->deleteShaderProgram(m_program); + m_glDeleter->deleteTexture(m_externalTex); m_glDeleter->deleteLater(); + } } QAbstractVideoSurface *QAndroidTextureVideoOutput::surface() const @@ -229,8 +214,7 @@ bool QAndroidTextureVideoOutput::initSurfaceTexture() // for the GL render thread to call us back to do it. if (QOpenGLContext::currentContext()) { glGenTextures(1, &m_externalTex); - m_glDeleter = new OpenGLResourcesDeleter; - m_glDeleter->setTexture(m_externalTex); + m_glDeleter.reset(new OpenGLResourcesDeleter); } else if (!m_externalTex) { return false; } @@ -245,10 +229,9 @@ bool QAndroidTextureVideoOutput::initSurfaceTexture() } else { delete m_surfaceTexture; m_surfaceTexture = 0; - if (m_glDeleter) - m_glDeleter->deleteLater(); + if (!m_glDeleter.isNull()) + m_glDeleter->deleteTexture(m_externalTex); m_externalTex = 0; - m_glDeleter = 0; } return m_surfaceTexture != 0; @@ -263,8 +246,14 @@ void QAndroidTextureVideoOutput::clearSurfaceTexture() } // Also reset the attached OpenGL texture - if (m_surfaceTextureCanAttachToContext) + // Note: The Android SurfaceTexture class does not release the texture on deletion, + // only if detachFromGLContext() called (API level >= 16), so we'll do it manually, + // on the render thread. + if (m_surfaceTextureCanAttachToContext) { + if (!m_glDeleter.isNull()) + m_glDeleter->deleteTexture(m_externalTex); m_externalTex = 0; + } } AndroidSurfaceTexture *QAndroidTextureVideoOutput::surfaceTexture() @@ -394,19 +383,17 @@ void QAndroidTextureVideoOutput::createGLResources() Q_ASSERT(QOpenGLContext::currentContext() != NULL); if (!m_glDeleter) - m_glDeleter = new OpenGLResourcesDeleter; + m_glDeleter.reset(new OpenGLResourcesDeleter); if (m_surfaceTextureCanAttachToContext && !m_externalTex) { m_surfaceTexture->detachFromGLContext(); glGenTextures(1, &m_externalTex); m_surfaceTexture->attachToGLContext(m_externalTex); - m_glDeleter->setTexture(m_externalTex); } if (!m_fbo || m_fbo->size() != m_nativeSize) { delete m_fbo; m_fbo = new QOpenGLFramebufferObject(m_nativeSize); - m_glDeleter->setFbo(m_fbo); } if (!m_program) { @@ -437,8 +424,6 @@ void QAndroidTextureVideoOutput::createGLResources() m_program->bindAttributeLocation("vertexCoordsArray", 0); m_program->bindAttributeLocation("textureCoordArray", 1); m_program->link(); - - m_glDeleter->setShaderProgram(m_program); } } @@ -448,8 +433,7 @@ void QAndroidTextureVideoOutput::customEvent(QEvent *e) // This is running in the render thread (OpenGL enabled) if (!m_surfaceTextureCanAttachToContext && !m_externalTex) { glGenTextures(1, &m_externalTex); - m_glDeleter = new OpenGLResourcesDeleter; // will cleanup GL resources in the correct thread - m_glDeleter->setTexture(m_externalTex); + m_glDeleter.reset(new OpenGLResourcesDeleter); // We'll use this to cleanup GL resources in the correct thread emit readyChanged(true); } } diff --git a/src/plugins/android/src/common/qandroidvideooutput.h b/src/plugins/android/src/common/qandroidvideooutput.h index 67bac7052..a12db75a2 100644 --- a/src/plugins/android/src/common/qandroidvideooutput.h +++ b/src/plugins/android/src/common/qandroidvideooutput.h @@ -50,7 +50,6 @@ class AndroidSurfaceTexture; class AndroidSurfaceHolder; class QOpenGLFramebufferObject; class QOpenGLShaderProgram; -class OpenGLResourcesDeleter; class QAbstractVideoSurface; class QAndroidVideoOutput : public QObject @@ -75,6 +74,19 @@ protected: QAndroidVideoOutput(QObject *parent) : QObject(parent) { } }; +class OpenGLResourcesDeleter : public QObject +{ + Q_OBJECT +public: + void deleteTexture(quint32 id) { QMetaObject::invokeMethod(this, "deleteTextureHelper", Qt::AutoConnection, Q_ARG(quint32, id)); } + void deleteFbo(QOpenGLFramebufferObject *fbo) { QMetaObject::invokeMethod(this, "deleteFboHelper", Qt::AutoConnection, Q_ARG(void *, fbo)); } + void deleteShaderProgram(QOpenGLShaderProgram *prog) { QMetaObject::invokeMethod(this, "deleteShaderProgramHelper", Qt::AutoConnection, Q_ARG(void *, prog)); } + +private: + Q_INVOKABLE void deleteTextureHelper(quint32 id); + Q_INVOKABLE void deleteFboHelper(void *fbo); + Q_INVOKABLE void deleteShaderProgramHelper(void *prog); +}; class QAndroidTextureVideoOutput : public QAndroidVideoOutput { @@ -114,7 +126,7 @@ private: quint32 m_externalTex; QOpenGLFramebufferObject *m_fbo; QOpenGLShaderProgram *m_program; - OpenGLResourcesDeleter *m_glDeleter; + QScopedPointer<OpenGLResourcesDeleter, QScopedPointerDeleteLater> m_glDeleter; bool m_surfaceTextureCanAttachToContext; |