Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
=================================================================== |
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 137438) |
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
@@ -482,7 +482,9 @@ |
const DisallowedFeatures& disallowed_features, |
const char* allowed_extensions, |
const std::vector<int32>& attribs); |
- virtual void Destroy(); |
+ virtual void Destroy(bool have_context); |
+ virtual void SetSurface( |
+ const scoped_refptr<gfx::GLSurface>& surface) OVERRIDE; |
virtual bool SetParent(GLES2Decoder* parent_decoder, |
uint32 parent_texture_id); |
virtual bool ResizeOffscreenFrameBuffer(const gfx::Size& size); |
@@ -491,7 +493,6 @@ |
virtual void ReleaseCurrent(); |
virtual GLES2Util* GetGLES2Util() { return &util_; } |
virtual gfx::GLContext* GetGLContext() { return context_.get(); } |
- virtual gfx::GLSurface* GetGLSurface() { return surface_.get(); } |
virtual ContextGroup* GetContextGroup() { return group_.get(); } |
virtual QueryManager* GetQueryManager() { return query_manager_.get(); } |
virtual bool ProcessPendingQueries(); |
@@ -1984,7 +1985,7 @@ |
const DisallowedFeatures& disallowed_features, |
const char* allowed_extensions, |
const std::vector<int32>& attribs) { |
- DCHECK(context); |
+ DCHECK(context->IsCurrent(surface.get())); |
DCHECK(!context_.get()); |
if (CommandLine::ForCurrentProcess()->HasSwitch( |
@@ -2000,29 +2001,17 @@ |
compile_shader_always_succeeds_ = CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kCompileShaderAlwaysSucceeds); |
- // Take ownership of the GLSurface. TODO(apatrick): once the parent / child |
- // context is retired, the decoder should not take an initial surface as |
- // an argument to this function. |
- // Maybe create a short lived offscreen GLSurface for the purpose of |
- // initializing the decoder's GLContext. |
- surface_ = surface; |
- // Take ownership of the GLContext. |
+ // Take ownership of the context and surface. The surface can be replaced with |
+ // SetSurface. |
context_ = context; |
+ surface_ = surface; |
- if (!MakeCurrent()) { |
- LOG(ERROR) << "GLES2DecoderImpl::Initialize failed because " |
- << "MakeCurrent failed."; |
- group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
- Destroy(); |
- return false; |
- } |
- |
if (!group_->Initialize(disallowed_features, allowed_extensions)) { |
LOG(ERROR) << "GpuScheduler::InitializeCommon failed because group " |
<< "failed to initialize."; |
group_ = NULL; // Must not destroy ContextGroup if it is not initialized. |
- Destroy(); |
+ Destroy(true); |
return false; |
} |
CHECK_GL_ERROR(); |
@@ -2209,7 +2198,7 @@ |
// of the frame buffers is okay. |
if (!ResizeOffscreenFrameBuffer(size)) { |
LOG(ERROR) << "Could not allocate offscreen buffer storage."; |
- Destroy(); |
+ Destroy(true); |
return false; |
} |
@@ -2315,7 +2304,7 @@ |
SH_VERTEX_SHADER, shader_spec, &resources, |
implementation_type, function_behavior)) { |
LOG(ERROR) << "Could not initialize vertex shader translator."; |
- Destroy(); |
+ Destroy(true); |
return false; |
} |
fragment_translator_.reset(new ShaderTranslator); |
@@ -2323,7 +2312,7 @@ |
SH_FRAGMENT_SHADER, shader_spec, &resources, |
implementation_type, function_behavior)) { |
LOG(ERROR) << "Could not initialize fragment shader translator."; |
- Destroy(); |
+ Destroy(true); |
return false; |
} |
return true; |
@@ -2508,13 +2497,15 @@ |
// } // anonymous namespace |
bool GLES2DecoderImpl::MakeCurrent() { |
- bool result = context_.get() ? context_->MakeCurrent(surface_.get()) : false; |
- if (result && WasContextLost()) { |
+ if (!context_.get() || !context_->MakeCurrent(surface_.get())) |
+ return false; |
+ |
+ if (WasContextLost()) { |
LOG(ERROR) << " GLES2DecoderImpl: Context lost during MakeCurrent."; |
- result = false; |
+ return false; |
} |
- return result; |
+ return true; |
} |
void GLES2DecoderImpl::ReleaseCurrent() { |
@@ -2741,8 +2732,8 @@ |
return false; |
} |
-void GLES2DecoderImpl::Destroy() { |
- bool have_context = context_.get() && MakeCurrent(); |
+void GLES2DecoderImpl::Destroy(bool have_context) { |
+ DCHECK(!have_context || context_->IsCurrent(NULL)); |
ChildList children = children_; |
for (ChildList::iterator it = children.begin(); it != children.end(); ++it) |
@@ -2850,6 +2841,14 @@ |
#endif |
} |
+void GLES2DecoderImpl::SetSurface( |
+ const scoped_refptr<gfx::GLSurface>& surface) { |
+ DCHECK(context_->IsCurrent(NULL)); |
+ DCHECK(surface_.get()); |
+ surface_ = surface; |
+ RestoreCurrentFramebufferBindings(); |
+} |
+ |
bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, |
uint32 new_parent_texture_id) { |
if (!offscreen_saved_color_texture_.get()) |