Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index ace0b153fffaacc9b1d6f81ffbe5a990095eb732..c0243eaa59d179cb0167380d1b9d5e7dffd86f8e 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -595,6 +595,7 @@ class GLES2DecoderImpl : public GLES2Decoder, public ErrorStateClient { |
const std::vector<int32_t>& attribs) override; |
void Destroy(bool have_context) override; |
void SetSurface(const scoped_refptr<gfx::GLSurface>& surface) override; |
+ void ReleaseSurface() override; |
void ProduceFrontBuffer(const Mailbox& mailbox) override; |
bool ResizeOffscreenFrameBuffer(const gfx::Size& size) override; |
void UpdateParentTextureInfo(); |
@@ -3771,6 +3772,7 @@ void GLES2DecoderImpl::DeleteTransformFeedbacksHelper( |
} |
bool GLES2DecoderImpl::MakeCurrent() { |
+ DCHECK(surface_); |
if (!context_.get()) |
return false; |
@@ -4339,11 +4341,22 @@ void GLES2DecoderImpl::Destroy(bool have_context) { |
void GLES2DecoderImpl::SetSurface( |
const scoped_refptr<gfx::GLSurface>& surface) { |
DCHECK(context_->IsCurrent(NULL)); |
- DCHECK(surface_.get()); |
+ DCHECK(surface); |
surface_ = surface; |
RestoreCurrentFramebufferBindings(); |
} |
+void GLES2DecoderImpl::ReleaseSurface() { |
+ if (!context_.get()) |
+ return; |
+ if (WasContextLost()) { |
+ DLOG(ERROR) << " GLES2DecoderImpl: Trying to release lost context."; |
+ return; |
+ } |
+ context_->ReleaseCurrent(surface_.get()); |
+ surface_ = nullptr; |
+} |
+ |
void GLES2DecoderImpl::ProduceFrontBuffer(const Mailbox& mailbox) { |
if (!offscreen_saved_color_texture_.get()) { |
LOG(ERROR) << "Called ProduceFrontBuffer on a non-offscreen context"; |