Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
=================================================================== |
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 89700) |
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
@@ -712,10 +712,10 @@ |
const gfx::Size& size, |
const DisallowedExtensions& disallowed_extensions, |
const char* allowed_extensions, |
- const std::vector<int32>& attribs, |
- GLES2Decoder* parent, |
- uint32 parent_client_texture_id); |
+ const std::vector<int32>& attribs); |
virtual void Destroy(); |
+ virtual bool SetParent(GLES2Decoder* parent_decoder, |
+ uint32 parent_texture_id); |
virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size); |
virtual bool UpdateOffscreenFrameBufferSize(); |
virtual bool MakeCurrent(); |
@@ -1890,9 +1890,7 @@ |
const gfx::Size& size, |
const DisallowedExtensions& disallowed_extensions, |
const char* allowed_extensions, |
- const std::vector<int32>& attribs, |
- GLES2Decoder* parent, |
- uint32 parent_client_texture_id) { |
+ const std::vector<int32>& attribs) { |
DCHECK(context); |
DCHECK(!context_.get()); |
@@ -1906,11 +1904,6 @@ |
// Take ownership of the GLContext. |
context_ = context; |
- // Keep only a weak pointer to the parent so we don't unmap its client |
- // frame buffer after it has been destroyed. |
- if (parent) |
- parent_ = static_cast<GLES2DecoderImpl*>(parent)->AsWeakPtr(); |
- |
if (!MakeCurrent()) { |
LOG(ERROR) << "GLES2DecoderImpl::Initialize failed because " |
<< "MakeCurrent failed."; |
@@ -2068,16 +2061,6 @@ |
offscreen_saved_color_texture_.reset(new Texture(this)); |
offscreen_saved_color_texture_->Create(); |
- // Map the ID of the saved offscreen texture into the parent so that |
- // it can reference it. |
- if (parent_) { |
- GLuint service_id = offscreen_saved_color_texture_->id(); |
- TextureManager::TextureInfo* info = |
- parent_->CreateTextureInfo(parent_client_texture_id, service_id); |
- info->SetNotOwned(); |
- parent_->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D); |
- } |
- |
// Allocate the render buffers at their initial size and check the status |
// of the frame buffers is okay. |
pending_offscreen_size_ = size; |
@@ -2558,6 +2541,8 @@ |
if (group_.get()) |
group_->set_have_context(have_context); |
+ SetParent(NULL, 0); |
+ |
if (have_context) { |
if (current_program_) { |
program_manager()->UnuseProgram(shader_manager(), current_program_); |
@@ -2571,20 +2556,8 @@ |
glDeleteBuffersARB(1, &fixed_attrib_buffer_id_); |
} |
- // Remove the saved frame buffer mapping from the parent decoder. The |
- // parent pointer is a weak pointer so it will be null if the parent has |
- // already been destroyed. |
- if (parent_) { |
- // First check the texture has been mapped into the parent. This might not |
- // be the case if initialization failed midway through. |
- GLuint service_id = offscreen_saved_color_texture_->id(); |
- GLuint client_id = 0; |
- if (parent_->texture_manager()->GetClientId(service_id, &client_id)) { |
- parent_->texture_manager()->RemoveTextureInfo(feature_info_, client_id); |
- } |
- |
+ if (copy_texture_to_parent_texture_fb_) |
glDeleteFramebuffersEXT(1, ©_texture_to_parent_texture_fb_); |
- } |
if (offscreen_target_frame_buffer_.get()) |
offscreen_target_frame_buffer_->Destroy(); |
@@ -2636,6 +2609,40 @@ |
offscreen_saved_color_texture_.reset(); |
} |
+bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, |
+ uint32 new_parent_texture_id) { |
+ // Remove the saved frame buffer mapping from the parent decoder. The |
+ // parent pointer is a weak pointer so it will be null if the parent has |
+ // already been destroyed. |
+ if (parent_) { |
+ // First check the texture has been mapped into the parent. This might not |
+ // be the case if initialization failed midway through. |
+ GLuint service_id = offscreen_saved_color_texture_->id(); |
+ GLuint client_id = 0; |
+ if (parent_->texture_manager()->GetClientId(service_id, &client_id)) { |
+ parent_->texture_manager()->RemoveTextureInfo(feature_info_, client_id); |
+ } |
+ } |
+ |
+ GLES2DecoderImpl* new_parent_impl = static_cast<GLES2DecoderImpl*>( |
+ new_parent); |
+ if (new_parent_impl) { |
+ // Map the ID of the saved offscreen texture into the parent so that |
+ // it can reference it. |
+ GLuint service_id = offscreen_saved_color_texture_->id(); |
+ TextureManager::TextureInfo* info = |
+ new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id); |
+ info->SetNotOwned(); |
+ new_parent_impl->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D); |
+ |
+ parent_ = new_parent_impl->AsWeakPtr(); |
+ } else { |
+ parent_.reset(); |
+ } |
+ |
+ return true; |
+} |
+ |
void GLES2DecoderImpl::ResizeOffscreenFrameBuffer(const gfx::Size& size) { |
// We can't resize the render buffers immediately because there might be a |
// partial frame rendered into them and we don't want the tail end of that |