Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
=================================================================== |
--- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 86168) |
+++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy) |
@@ -38,6 +38,7 @@ |
#include "gpu/GLES2/gles2_command_buffer.h" |
#include "ui/gfx/gl/gl_context.h" |
#include "ui/gfx/gl/gl_implementation.h" |
+#include "ui/gfx/gl/gl_surface.h" |
#if !defined(GL_DEPTH24_STENCIL8) |
#define GL_DEPTH24_STENCIL8 0x88F0 |
@@ -671,7 +672,8 @@ |
virtual const char* GetCommandName(unsigned int command_id) const; |
// Overridden from GLES2Decoder. |
- virtual bool Initialize(gfx::GLContext* context, |
+ virtual bool Initialize(gfx::GLSurface* surface, |
+ gfx::GLContext* context, |
const gfx::Size& size, |
const DisallowedExtensions& disallowed_extensions, |
const char* allowed_extensions, |
@@ -684,6 +686,7 @@ |
virtual bool MakeCurrent(); |
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 void SetResizeCallback(Callback1<gfx::Size>::Type* callback); |
@@ -1337,6 +1340,7 @@ |
#undef GLES2_CMD_OP |
// The GL context this decoder renders to on behalf of the client. |
+ scoped_ptr<gfx::GLSurface> surface_; |
scoped_ptr<gfx::GLContext> context_; |
// The ContextGroup for this decoder uses to track resources. |
@@ -1827,6 +1831,7 @@ |
} |
bool GLES2DecoderImpl::Initialize( |
+ gfx::GLSurface* surface, |
gfx::GLContext* context, |
const gfx::Size& size, |
const DisallowedExtensions& disallowed_extensions, |
@@ -1837,6 +1842,11 @@ |
DCHECK(context); |
DCHECK(!context_.get()); |
+ // Take ownership of the GLSurface. TODO(apatrick): the decoder should not |
+ // own the surface. It should be possible to freely switch the surface the |
+ // context renders to. |
+ surface_.reset(surface); |
+ |
// Take ownership of the GLContext. |
context_.reset(context); |
@@ -1895,7 +1905,7 @@ |
glActiveTexture(GL_TEXTURE0); |
CHECK_GL_ERROR(); |
- if (context_->IsOffscreen()) { |
+ if (surface_->IsOffscreen()) { |
ContextCreationAttribParser attrib_parser; |
if (!attrib_parser.Parse(attribs)) |
return false; |
@@ -2203,7 +2213,7 @@ |
// } // anonymous namespace |
bool GLES2DecoderImpl::MakeCurrent() { |
- return context_.get() ? context_->MakeCurrent() : false; |
+ return context_.get() ? context_->MakeCurrent(surface_.get()) : false; |
} |
void GLES2DecoderImpl::RestoreCurrentRenderbufferBindings() { |
@@ -2274,7 +2284,7 @@ |
} else if (offscreen_target_frame_buffer_.get()) { |
return offscreen_size_; |
} else { |
- return context_->GetSize(); |
+ return surface_->GetSize(); |
} |
} |
@@ -2768,7 +2778,7 @@ |
} |
info->MarkAsValid(); |
} else { |
- service_id = context_->GetBackingFrameBufferObject(); |
+ service_id = 0; |
} |
if (target == GL_FRAMEBUFFER || target == GL_DRAW_FRAMEBUFFER_EXT) { |
@@ -6384,7 +6394,7 @@ |
} |
} else { |
TRACE_EVENT1("gpu", "GLContext::SwapBuffers", "frame", this_frame_number); |
- if (!context_->SwapBuffers()) { |
+ if (!surface_->SwapBuffers()) { |
LOG(ERROR) << "Context lost because SwapBuffers failed."; |
return error::kLostContext; |
} |