sdm: Fix Deinit for GPU WB.
Delete all context dependent resources before destroying context.
Ex: program_id, image buffer ids etc;
CRs-Fixed: 2573023
Change-Id: I675339ce840189b70b74abb2fc4bdcb9d3c240aa
diff --git a/composer/gl_color_convert.cpp b/composer/gl_color_convert.cpp
index 03f7377..f398059 100644
--- a/composer/gl_color_convert.cpp
+++ b/composer/gl_color_convert.cpp
@@ -35,7 +35,7 @@
namespace sdm {
GLColorConvert* GLColorConvert::GetInstance(GLRenderTarget target, bool secure) {
- GLColorConvertImpl* color_convert = new GLColorConvertImpl(target, secure);
+ GLColorConvertImpl* color_convert = new GLColorConvertImpl(target, secure);
if (color_convert == nullptr) {
DLOGE("Failed to create color convert instance for %d target %d secure", target, secure);
return nullptr;
diff --git a/composer/gl_common.cpp b/composer/gl_common.cpp
index c350d47..aa3bc45 100644
--- a/composer/gl_common.cpp
+++ b/composer/gl_common.cpp
@@ -147,12 +147,16 @@
return fd;
}
-void GLCommon::DestroyContext(const GLContext* ctx) {
+void GLCommon::DestroyContext(GLContext* ctx) {
DTRACE_SCOPED();
+
+ // Clear egl image buffers.
+ image_wrapper_.Deinit();
+
+ EGL(DeleteProgram(ctx->program_id));
EGL(eglMakeCurrent(ctx->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT));
EGL(eglDestroySurface(ctx->egl_display, ctx->egl_surface));
EGL(eglDestroyContext(ctx->egl_display, ctx->egl_context));
- EGL(DeleteProgram(ctx->program_id));
EGL(eglTerminate(ctx->egl_display));
}
diff --git a/composer/gl_common.h b/composer/gl_common.h
index 79af479..c77988b 100644
--- a/composer/gl_common.h
+++ b/composer/gl_common.h
@@ -60,7 +60,7 @@
virtual void SetProgram(uint32_t id);
virtual void SetDestinationBuffer(const private_handle_t *dst_hnd, const GLRect &dst_rect);
virtual void SetSourceBuffer(const private_handle_t *src_hnd);
- virtual void DestroyContext(const GLContext *ctx);
+ virtual void DestroyContext(GLContext *ctx);
virtual void DeleteProgram(uint32_t id);
virtual int WaitOnInputFence(int in_fence_fd);
virtual int CreateOutputFence();
diff --git a/gpu_tonemapper/EGLImageWrapper.cpp b/gpu_tonemapper/EGLImageWrapper.cpp
index 19bf093..b3730f0 100644
--- a/gpu_tonemapper/EGLImageWrapper.cpp
+++ b/gpu_tonemapper/EGLImageWrapper.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright 2015 The Android Open Source Project
@@ -122,6 +122,13 @@
EGLImageWrapper::~EGLImageWrapper()
//-----------------------------------------------------------------------------
{
+ Deinit();
+}
+
+//-----------------------------------------------------------------------------
+void EGLImageWrapper::Deinit()
+//-----------------------------------------------------------------------------
+{
if (eglImageBufferCache != 0) {
if (callback != 0) {
callback->mapClearPending = true;
diff --git a/gpu_tonemapper/EGLImageWrapper.h b/gpu_tonemapper/EGLImageWrapper.h
index ce1b344..dfcbca9 100644
--- a/gpu_tonemapper/EGLImageWrapper.h
+++ b/gpu_tonemapper/EGLImageWrapper.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
* Not a Contribution.
*
* Copyright 2015 The Android Open Source Project
@@ -57,6 +57,7 @@
EGLImageWrapper();
~EGLImageWrapper();
EGLImageBuffer* wrap(const void *pvt_handle);
+ void Deinit();
};
#endif // __TONEMAPPER_EGLIMAGEWRAPPER_H__