summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorsohan.jyoti@samsung.com <sohan.jyoti@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-31 15:01:24 +0000
committersohan.jyoti@samsung.com <sohan.jyoti@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-07-31 15:01:24 +0000
commitd2eaf52f4ae894c8da8b6856c20780fcaa53bd3c (patch)
tree2870a82512913e9c19115d0120b9f5e18bbb7de0 /gpu
parentff7fcb7bca105d8708d9499bb77822a1cac86edd (diff)
downloadchromium_src-d2eaf52f4ae894c8da8b6856c20780fcaa53bd3c.zip
chromium_src-d2eaf52f4ae894c8da8b6856c20780fcaa53bd3c.tar.gz
chromium_src-d2eaf52f4ae894c8da8b6856c20780fcaa53bd3c.tar.bz2
During image destroy, delete textures only if we have a GL context.
This adds Destroy function for ImageManager and invoke it from command decoder destroy path with GL context info. This is to ensure that when we destroy the image, textures to which the image is bound to, is deleted only if we have a GL context. BUG=375507 Review URL: https://codereview.chromium.org/301793003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@286811 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc5
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc2
-rw-r--r--gpu/command_buffer/service/image_manager.cc14
-rw-r--r--gpu/command_buffer/service/image_manager.h3
-rw-r--r--gpu/command_buffer/service/stream_texture_manager_in_process_android.cc4
-rw-r--r--gpu/command_buffer/service/texture_definition.cc5
6 files changed, 26 insertions, 7 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 7e2c083..8d33587 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3496,6 +3496,11 @@ void GLES2DecoderImpl::Destroy(bool have_context) {
vertex_array_manager_.reset();
}
+ if (image_manager_.get()) {
+ image_manager_->Destroy(have_context);
+ image_manager_.reset();
+ }
+
offscreen_target_frame_buffer_.reset();
offscreen_target_color_texture_.reset();
offscreen_target_color_render_buffer_.reset();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
index faf98aa..f3a5c0a 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_textures.cc
@@ -2275,8 +2275,8 @@ class MockGLImage : public gfx::GLImage {
MockGLImage() {}
// Overridden from gfx::GLImage:
- MOCK_METHOD0(Destroy, void());
MOCK_METHOD0(GetSize, gfx::Size());
+ MOCK_METHOD1(Destroy, void(bool));
MOCK_METHOD1(BindTexImage, bool(unsigned));
MOCK_METHOD1(ReleaseTexImage, void(unsigned));
MOCK_METHOD0(WillUseTexImage, void());
diff --git a/gpu/command_buffer/service/image_manager.cc b/gpu/command_buffer/service/image_manager.cc
index 953e3bc..46438c7 100644
--- a/gpu/command_buffer/service/image_manager.cc
+++ b/gpu/command_buffer/service/image_manager.cc
@@ -4,6 +4,7 @@
#include "gpu/command_buffer/service/image_manager.h"
+#include "base/logging.h"
#include "ui/gl/gl_image.h"
namespace gpu {
@@ -15,12 +16,23 @@ ImageManager::ImageManager() {
ImageManager::~ImageManager() {
}
+void ImageManager::Destroy(bool have_context) {
+ for (GLImageMap::const_iterator iter = images_.begin(); iter != images_.end();
+ ++iter)
+ iter->second.get()->Destroy(have_context);
+ images_.clear();
+}
+
void ImageManager::AddImage(gfx::GLImage* image, int32 service_id) {
+ DCHECK(images_.find(service_id) == images_.end());
images_[service_id] = image;
}
void ImageManager::RemoveImage(int32 service_id) {
- images_.erase(service_id);
+ GLImageMap::iterator iter = images_.find(service_id);
+ DCHECK(iter != images_.end());
+ iter->second.get()->Destroy(true);
+ images_.erase(iter);
}
gfx::GLImage* ImageManager::LookupImage(int32 service_id) {
diff --git a/gpu/command_buffer/service/image_manager.h b/gpu/command_buffer/service/image_manager.h
index eadf246..0a440f9e 100644
--- a/gpu/command_buffer/service/image_manager.h
+++ b/gpu/command_buffer/service/image_manager.h
@@ -23,12 +23,13 @@ class GPU_EXPORT ImageManager {
ImageManager();
~ImageManager();
+ void Destroy(bool have_context);
void AddImage(gfx::GLImage* image, int32 service_id);
void RemoveImage(int32 service_id);
gfx::GLImage* LookupImage(int32 service_id);
private:
- typedef base::hash_map<uint32, scoped_refptr<gfx::GLImage> > GLImageMap;
+ typedef base::hash_map<int32, scoped_refptr<gfx::GLImage> > GLImageMap;
GLImageMap images_;
DISALLOW_COPY_AND_ASSIGN(ImageManager);
diff --git a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
index a8ece57..738ef22 100644
--- a/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
+++ b/gpu/command_buffer/service/stream_texture_manager_in_process_android.cc
@@ -23,7 +23,7 @@ class GLImageImpl : public gfx::GLImage {
const base::Closure& release_callback);
// implement gfx::GLImage
- virtual void Destroy() OVERRIDE;
+ virtual void Destroy(bool have_context) OVERRIDE;
virtual gfx::Size GetSize() OVERRIDE;
virtual bool BindTexImage(unsigned target) OVERRIDE;
virtual void ReleaseTexImage(unsigned target) OVERRIDE;
@@ -50,7 +50,7 @@ GLImageImpl::~GLImageImpl() {
release_callback_.Run();
}
-void GLImageImpl::Destroy() {
+void GLImageImpl::Destroy(bool have_context) {
NOTREACHED();
}
diff --git a/gpu/command_buffer/service/texture_definition.cc b/gpu/command_buffer/service/texture_definition.cc
index 84ca103..7b1d1ae 100644
--- a/gpu/command_buffer/service/texture_definition.cc
+++ b/gpu/command_buffer/service/texture_definition.cc
@@ -30,7 +30,7 @@ class GLImageSync : public gfx::GLImage {
const gfx::Size& size);
// Implement GLImage.
- virtual void Destroy() OVERRIDE;
+ virtual void Destroy(bool have_context) OVERRIDE;
virtual gfx::Size GetSize() OVERRIDE;
virtual bool BindTexImage(unsigned target) OVERRIDE;
virtual void ReleaseTexImage(unsigned target) OVERRIDE;
@@ -63,7 +63,8 @@ GLImageSync::~GLImageSync() {
buffer_->RemoveClient(this);
}
-void GLImageSync::Destroy() {}
+void GLImageSync::Destroy(bool have_context) {
+}
gfx::Size GLImageSync::GetSize() {
return size_;