diff options
Diffstat (limited to 'gpu/command_buffer/service/gles2_cmd_decoder.cc')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index ed6e000..f0162d6 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -465,6 +465,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, const char* allowed_extensions, const std::vector<int32>& attribs); virtual void Destroy(); + virtual bool MapExternalResource(resource_type::ResourceType resource_type, + uint32 resource_source_id, + GLES2Decoder* source_decoder, + uint32 resource_dest_id); virtual bool SetParent(GLES2Decoder* parent_decoder, uint32 parent_texture_id); virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size); @@ -588,6 +592,11 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, return (info && !info->IsDeleted()) ? info : NULL; } + // Adds the texture info for the given texture. + void AddTextureInfo(GLuint client_id, TextureManager::TextureInfo* info) { + texture_manager()->AddTextureInfo(feature_info_, client_id, info); + } + // Deletes the texture info for the given texture. void RemoveTextureInfo(GLuint client_id) { texture_manager()->RemoveTextureInfo(feature_info_, client_id); @@ -2089,8 +2098,10 @@ void GLES2DecoderImpl::DeleteTexturesHelper( if (info->IsAttachedToFramebuffer()) { state_dirty_ = true; } - GLuint service_id = info->service_id(); - glDeleteTextures(1, &service_id); + if (info->owner() == group_->texture_manager()) { + GLuint service_id = info->service_id(); + glDeleteTextures(1, &service_id); + } RemoveTextureInfo(client_ids[ii]); } } @@ -2470,6 +2481,37 @@ void GLES2DecoderImpl::Destroy() { offscreen_saved_color_texture_.reset(); } +bool GLES2DecoderImpl::MapExternalResource( + resource_type::ResourceType resource_type, + uint32 resource_source_id, + GLES2Decoder* source_decoder, + uint32 resource_dest_id) { + GLES2DecoderImpl* source_decoder_impl = static_cast<GLES2DecoderImpl*>( + source_decoder); + + if (resource_type != resource_type::kTexture) + return false; + + if (!source_decoder) + return false; + + // The client should already have created the texture in the source context + // group and flushed. + TextureManager::TextureInfo* source_info = + source_decoder_impl->GetTextureInfo(resource_source_id); + if (!source_info) + return false; + + // Delete or unmap any existing texture with this ID. + DeleteTexturesHelper(1, &resource_dest_id); + + // Add the source texture info to this group's manager with the + // requested id. + AddTextureInfo(resource_dest_id, source_info); + + return true; +} + bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, uint32 new_parent_texture_id) { if (!offscreen_saved_color_texture_.get()) @@ -2502,8 +2544,8 @@ bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, feature_info_, new_parent_texture_id); TextureManager::TextureInfo* info = - new_parent_impl->CreateTextureInfo(new_parent_texture_id, service_id); - info->SetNotOwned(); + new TextureManager::TextureInfo(service_id); + new_parent_impl->AddTextureInfo(new_parent_texture_id, info); new_parent_impl->texture_manager()->SetInfoTarget(info, GL_TEXTURE_2D); parent_ = new_parent_impl->AsWeakPtr(); |