diff options
author | sohan.jyoti@samsung.com <sohan.jyoti@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-31 15:01:24 +0000 |
---|---|---|
committer | sohan.jyoti@samsung.com <sohan.jyoti@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-31 15:01:24 +0000 |
commit | d2eaf52f4ae894c8da8b6856c20780fcaa53bd3c (patch) | |
tree | 2870a82512913e9c19115d0120b9f5e18bbb7de0 /gpu | |
parent | ff7fcb7bca105d8708d9499bb77822a1cac86edd (diff) | |
download | chromium_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')
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_; |