Deletion of shader and program objects after use.
authoruzair.jaleel <uzair.jaleel@samsung.com>
Tue, 1 Sep 2015 06:03:16 +0000 (11:33 +0530)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 10 Jul 2018 07:55:23 +0000 (07:55 +0000)
Currently both shader objects and program objects are created for
each new instance of RWHV and never deleted. We need to detach and
delete our shader objects as soon as possible. That way the driver
can free up all the memory it is using to hold a copy of the shader
source and unlinked object code, which can be quite substantial.

M42 patch: http://165.213.202.130/gerrit/#/c/86240/

Bug: http://web.sec.samsung.net/bugzilla/show_bug.cgi?id=14812

Reviewed by: a1.gomes, sns.park, venu.musham

Change-Id: I2242557f7f5ab7db662af5f3c1c87a6e38087935
Signed-off-by: uzair.jaleel <uzair.jaleel@samsung.com>
tizen_src/chromium_impl/content/browser/renderer_host/render_widget_host_view_efl.cc

index c177832..2bc1cb1 100755 (executable)
@@ -278,6 +278,19 @@ void RenderWidgetHostViewEfl::InitAsChild(gfx::NativeView parent_view) {
   Init_EvasGL(width, height);
 }
 
+#if defined(NDEBUG)
+#define GL_CHECK_HELPER(code, msg) \
+  ((code), false)
+#else
+static GLenum g_gl_err;
+#define GL_CHECK_HELPER(code, msg) \
+  (((void)(code), ((g_gl_err = evas_gl_api_->glGetError()) == GL_NO_ERROR)) ? false : \
+      ((LOG(ERROR) << "GL Error: " << g_gl_err << "    " << msg), true))
+#endif
+
+#define GL_CHECK(code) GL_CHECK_HELPER(code, "")
+#define GL_CHECK_STATUS(msg) GL_CHECK_HELPER(1, msg)
+
 RenderWidgetHostViewEfl::~RenderWidgetHostViewEfl() {
   if (im_context_)
     delete im_context_;
@@ -323,6 +336,9 @@ RenderWidgetHostViewEfl::~RenderWidgetHostViewEfl() {
 
   if (context_factory_)
     delete context_factory_;
+
+  if (evas_gl_api_)
+    GL_CHECK(evas_gl_api_->glDeleteProgram(program_id_));
 }
 
 gfx::Point RenderWidgetHostViewEfl::ConvertPointInViewPix(gfx::Point point) {
@@ -352,19 +368,6 @@ static const char kFragmentShaderSourceSimple[] =
   "  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
   "}                                                   \n";
 
-#if defined(NDEBUG)
-#define GL_CHECK_HELPER(code, msg) \
-  ((code), false)
-#else
-static GLenum g_gl_err;
-#define GL_CHECK_HELPER(code, msg) \
-  (((void)(code), ((g_gl_err = evas_gl_api_->glGetError()) == GL_NO_ERROR)) ? false : \
-      ((LOG(ERROR) << "GL Error: " << g_gl_err << "    " << msg), true))
-#endif
-
-#define GL_CHECK(code) GL_CHECK_HELPER(code, "")
-#define GL_CHECK_STATUS(msg) GL_CHECK_HELPER(1, msg)
-
 static void GLCheckProgramHelper(Evas_GL_API* api, GLuint program,
                                  const char* file, int line) {
   GLint status;
@@ -376,6 +379,7 @@ static void GLCheckProgramHelper(Evas_GL_API* api, GLuint program,
     api->glGetProgramInfoLog(program, buf_length, &length, log.get());
     LOG(ERROR) << "GL program link failed in: " << file << ":" << line
                << ": " << log.get();
+    api->glDeleteProgram(program);
   }
 }
 
@@ -393,6 +397,7 @@ static void GLCheckShaderHelper(
     api->glGetShaderInfoLog(shader, buf_length, &length, log.get());
     LOG(ERROR) << "GL shader compile failed in " << file << ":" << line
                << ": " << log.get();
+    api->glDeleteShader(shader);
   }
 }
 
@@ -442,6 +447,10 @@ void RenderWidgetHostViewEfl::initializeProgram() {
   GL_CHECK(evas_gl_api_->glAttachShader(program_id_, fragmentShader));
   GL_CHECK(evas_gl_api_->glLinkProgram(program_id_));
   GLCheckProgram(evas_gl_api_, program_id_);
+  GL_CHECK(evas_gl_api_->glDetachShader(program_id_, vertexShader));
+  GL_CHECK(evas_gl_api_->glDetachShader(program_id_, fragmentShader));
+  GL_CHECK(evas_gl_api_->glDeleteShader(vertexShader));
+  GL_CHECK(evas_gl_api_->glDeleteShader(fragmentShader));
 
   GL_CHECK(position_attrib_ = evas_gl_api_->glGetAttribLocation(program_id_, "a_position"));
   GL_CHECK(texcoord_attrib_ = evas_gl_api_->glGetAttribLocation(program_id_, "a_texCoord"));