diff options
Diffstat (limited to 'gpu/command_buffer/service')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 75 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.h | 11 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_mock.h | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc | 2 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.cc | 17 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler.h | 8 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler_linux.cc | 13 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler_mac.cc | 13 | ||||
-rw-r--r-- | gpu/command_buffer/service/gpu_scheduler_win.cc | 13 |
9 files changed, 66 insertions, 93 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 28d6557..3207c70 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -712,10 +712,10 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, 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 @@ bool GLES2DecoderImpl::Initialize( 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 @@ bool GLES2DecoderImpl::Initialize( // 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 @@ bool GLES2DecoderImpl::Initialize( 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 @@ void GLES2DecoderImpl::Destroy() { 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 @@ void GLES2DecoderImpl::Destroy() { 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 @@ void GLES2DecoderImpl::Destroy() { 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 diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.h b/gpu/command_buffer/service/gles2_cmd_decoder.h index 699f85e..0551e5a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder.h @@ -65,10 +65,6 @@ class GLES2Decoder : public CommonDecoder { // allowed_extensions: A string in the same format as // glGetString(GL_EXTENSIONS) that lists the extensions this context // should allow. Passing NULL or "*" means allow all extensions. - // parent: the GLES2 decoder that can access this decoder's front buffer - // through a texture ID in its namespace. - // parent_client_texture_id: the texture ID of the front buffer in the - // parent's namespace. // Returns: // true if successful. virtual bool Initialize(const scoped_refptr<gfx::GLSurface>& surface, @@ -76,13 +72,14 @@ class GLES2Decoder : public CommonDecoder { const gfx::Size& size, const DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, - const std::vector<int32>& attribs, - GLES2Decoder* parent, - uint32 parent_client_texture_id) = 0; + const std::vector<int32>& attribs) = 0; // Destroys the graphics context. virtual void Destroy() = 0; + virtual bool SetParent(GLES2Decoder* parent_decoder, + uint32 parent_texture_id) = 0; + // Resize an offscreen frame buffer. virtual void ResizeOffscreenFrameBuffer(const gfx::Size& size) = 0; diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h index f775625..0a44ecf 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_mock.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_mock.h @@ -29,16 +29,15 @@ class MockGLES2Decoder : public GLES2Decoder { MockGLES2Decoder(); virtual ~MockGLES2Decoder(); - MOCK_METHOD8(Initialize, + MOCK_METHOD6(Initialize, bool(const scoped_refptr<gfx::GLSurface>& surface, const scoped_refptr<gfx::GLContext>& context, const gfx::Size& size, const DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, - const std::vector<int32>& attribs, - GLES2Decoder* parent, - uint32 parent_texture_id)); + const std::vector<int32>& attribs)); MOCK_METHOD0(Destroy, void()); + MOCK_METHOD2(SetParent, bool(GLES2Decoder* parent, uint32 parent_texture_id)); MOCK_METHOD1(ResizeOffscreenFrameBuffer, void(const gfx::Size& size)); MOCK_METHOD0(UpdateOffscreenFrameBufferSize, bool()); MOCK_METHOD0(MakeCurrent, bool()); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc index 9470d08..0f20e67 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc @@ -137,7 +137,7 @@ void GLES2DecoderTestBase::InitDecoder( decoder_.reset(GLES2Decoder::Create(surface_manager_.get(), group_.get())); decoder_->Initialize( surface_, context_, surface_->GetSize(), DisallowedExtensions(), - NULL, std::vector<int32>(), NULL, 0); + NULL, std::vector<int32>()); decoder_->set_engine(engine_.get()); EXPECT_CALL(*gl_, GenBuffersARB(_, _)) diff --git a/gpu/command_buffer/service/gpu_scheduler.cc b/gpu/command_buffer/service/gpu_scheduler.cc index b3711aa..d4ac593 100644 --- a/gpu/command_buffer/service/gpu_scheduler.cc +++ b/gpu/command_buffer/service/gpu_scheduler.cc @@ -66,9 +66,7 @@ bool GpuScheduler::InitializeCommon( const gfx::Size& size, const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, - const std::vector<int32>& attribs, - gles2::GLES2Decoder* parent_decoder, - uint32 parent_texture_id) { + const std::vector<int32>& attribs) { DCHECK(context); if (!context->MakeCurrent(surface)) @@ -111,9 +109,7 @@ bool GpuScheduler::InitializeCommon( size, disallowed_extensions, allowed_extensions, - attribs, - parent_decoder, - parent_texture_id)) { + attribs)) { LOG(ERROR) << "GpuScheduler::InitializeCommon failed because decoder " << "failed to initialize."; Destroy(); @@ -134,6 +130,15 @@ void GpuScheduler::DestroyCommon() { parser_.reset(); } +bool GpuScheduler::SetParent(GpuScheduler* parent_scheduler, + uint32 parent_texture_id) { + if (parent_scheduler) + return decoder_->SetParent(parent_scheduler->decoder_.get(), + parent_texture_id); + else + return decoder_->SetParent(NULL, 0); +} + #if defined(OS_MACOSX) namespace { const unsigned int kMaxOutstandingSwapBuffersCallsPerOnscreenContext = 1; diff --git a/gpu/command_buffer/service/gpu_scheduler.h b/gpu/command_buffer/service/gpu_scheduler.h index 78845df..31b6a95 100644 --- a/gpu/command_buffer/service/gpu_scheduler.h +++ b/gpu/command_buffer/service/gpu_scheduler.h @@ -63,13 +63,13 @@ class GpuScheduler : public CommandBufferEngine { const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, const std::vector<int32>& attribs, - GpuScheduler* parent, - uint32 parent_texture_id, gfx::GLShareGroup* share_group); void Destroy(); void DestroyCommon(); + bool SetParent(GpuScheduler* parent_scheduler, uint32 parent_texture_id); + void PutChanged(bool sync); // Sets whether commands should be processed by this scheduler. Setting to @@ -152,9 +152,7 @@ class GpuScheduler : public CommandBufferEngine { const gfx::Size& size, const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, - const std::vector<int32>& attribs, - gles2::GLES2Decoder* parent_decoder, - uint32 parent_texture_id); + const std::vector<int32>& attribs); private: diff --git a/gpu/command_buffer/service/gpu_scheduler_linux.cc b/gpu/command_buffer/service/gpu_scheduler_linux.cc index 84d821e..6adaba6 100644 --- a/gpu/command_buffer/service/gpu_scheduler_linux.cc +++ b/gpu/command_buffer/service/gpu_scheduler_linux.cc @@ -17,16 +17,7 @@ bool GpuScheduler::Initialize( const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, const std::vector<int32>& attribs, - GpuScheduler* parent, - uint32 parent_texture_id, gfx::GLShareGroup* share_group) { - // Get the parent decoder. - gles2::GLES2Decoder* parent_decoder = NULL; - if (parent) { - parent_decoder = parent->decoder_.get(); - DCHECK(parent_decoder); - } - // Create either a view or pbuffer based GLSurface. scoped_refptr<gfx::GLSurface> surface; if (window) @@ -54,9 +45,7 @@ bool GpuScheduler::Initialize( size, disallowed_extensions, allowed_extensions, - attribs, - parent_decoder, - parent_texture_id); + attribs); } void GpuScheduler::Destroy() { diff --git a/gpu/command_buffer/service/gpu_scheduler_mac.cc b/gpu/command_buffer/service/gpu_scheduler_mac.cc index 0e4d8d6..2835088 100644 --- a/gpu/command_buffer/service/gpu_scheduler_mac.cc +++ b/gpu/command_buffer/service/gpu_scheduler_mac.cc @@ -17,16 +17,7 @@ bool GpuScheduler::Initialize( const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, const std::vector<int32>& attribs, - GpuScheduler* parent, - uint32 parent_texture_id, gfx::GLShareGroup* share_group) { - // Get the parent decoder. - gles2::GLES2Decoder* parent_decoder = NULL; - if (parent) { - parent_decoder = parent->decoder_.get(); - DCHECK(parent_decoder); - } - scoped_refptr<gfx::GLSurface> surface( gfx::GLSurface::CreateOffscreenGLSurface(gfx::Size(1, 1))); if (!surface.get()) { @@ -69,9 +60,7 @@ bool GpuScheduler::Initialize( size, disallowed_extensions, allowed_extensions, - attribs, - parent_decoder, - parent_texture_id); + attribs); } void GpuScheduler::Destroy() { diff --git a/gpu/command_buffer/service/gpu_scheduler_win.cc b/gpu/command_buffer/service/gpu_scheduler_win.cc index a92d225..20e5382 100644 --- a/gpu/command_buffer/service/gpu_scheduler_win.cc +++ b/gpu/command_buffer/service/gpu_scheduler_win.cc @@ -19,16 +19,7 @@ bool GpuScheduler::Initialize( const gles2::DisallowedExtensions& disallowed_extensions, const char* allowed_extensions, const std::vector<int32>& attribs, - GpuScheduler* parent, - uint32 parent_texture_id, gfx::GLShareGroup* share_group) { - // Get the parent decoder. - gles2::GLES2Decoder* parent_decoder = NULL; - if (parent) { - parent_decoder = parent->decoder_.get(); - DCHECK(parent_decoder); - } - // Create either a view or pbuffer based GLSurface. scoped_refptr<gfx::GLSurface> surface; if (window) { @@ -57,9 +48,7 @@ bool GpuScheduler::Initialize( size, disallowed_extensions, allowed_extensions, - attribs, - parent_decoder, - parent_texture_id); + attribs); } void GpuScheduler::Destroy() { |